Funny, malloc() implemented that way is UB and doesn't work in all cases, specially when passing pointers around dynamic loaded libraries or threads.
So exit() gets to call longjmp() which definitely can only be done in Assembly, back to step 1.
So exit() gets to call longjmp() which definitely can only be done in Assembly, back to step 1.
C was a guest language via MPW, and plugged into those APIs.