By heap allocating stack frames I mean that each time you call a function, SML/NJ allocates space for that individual frame on the heap. It then uses the garbage collector to clean up frames after the function call has returned.
Smalltalk-80 did this too. Later implementations try to avoid it, but sometimes still do: