rsteinke has asked for the wisdom of the Perl Monks concerning the following question:

The perlcall manpage tells you that you need to wrap calls to Perl using the call_sv() and call_method() functions with the macros

ENTER; SAVETMPS; ... call_sv("some_func"); ... FREETMPS; LEAVE;

so Perl can dispose of any temporaries created in the call.

My question is, what are the roles of these two sets of macros? What part of the temporary handling is performed by the SAVETMPS/FREETMPS pair, and what part by the ENTER/LEAVE?

Replies are listed 'Best First'.
Re: ENTER vs. SAVETMPS
by samtregar (Abbot) on Jun 20, 2002 at 21:47 UTC
    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

Re: ENTER vs. SAVETMPS
by Matts (Deacon) on Jun 21, 2002 at 08:57 UTC
    ENTER/LEAVE is equivalent to perl's opening and closing curly brackets. It basically allows perl to free any lexicals.

    I think (but this one I'm not sure about) SAVETMPS/FREETMPS does the same but for local()ised package variables.