in reply to ENTER vs. SAVETMPS

WARNING: I can't guarantee the veracity of this answer. I'm still mostly a novice when it comes to Perl internals.

Looking at the definition of ENTER and LEAVE I see:

#define ENTER push_scope() #define LEAVE pop_scope()

And SAVETMPS and FREETMPS are:

#define SAVETMPS save_int((int*)&PL_tmps_floor), PL_tmps_floor = PL_tm +ps_ix #define FREETMPS if (PL_tmps_ix > PL_tmps_floor) free_tmps()

So ENTER/LEAVE is responsible for managing the scope stack (growing it, adjusting pointers) and SAVETMPS/FREETMPS just handles the temp stack, and calls free_tmps() if needed.

I imagine that leaves you with more questions than you came in with, but I'll have to leave it at that. No time to dig further now...

-sam