diff options
Diffstat (limited to 'pod/perlintern.pod')
-rw-r--r-- | pod/perlintern.pod | 443 |
1 files changed, 440 insertions, 3 deletions
diff --git a/pod/perlintern.pod b/pod/perlintern.pod index c9cb5e7698..d256e7ec09 100644 --- a/pod/perlintern.pod +++ b/pod/perlintern.pod @@ -11,6 +11,208 @@ format but are not marked as part of the Perl API. In other words, B<they are not for use in extensions>! +=head1 Functions in file pad.h + + +=over 8 + +=item CX_CURPAD_SAVE + +Save the current pad in the given context block structure. + + void CX_CURPAD_SAVE(struct context) + +=for hackers +Found in file pad.h + +=item CX_CURPAD_SV + +Access the SV at offset po in the saved current pad in the given +context block structure (can be used as an lvalue). + + PAD * CX_CURPAD_SV(struct context, PADOFFSET po) + +=for hackers +Found in file pad.h + +=item PAD_BASE_SV + +Get the value from slot C<po> in the base (DEPTH=1) pad of a padlist + + SV * PAD_BASE_SV (PADLIST padlist, PADOFFSET po) + +=for hackers +Found in file pad.h + +=item PAD_CLONE_VARS + +|CLONE_PARAMS* param +Clone the state variables associated with running and compiling pads. + + void PAD_CLONE_VARS(PerlInterpreter *proto_perl \) + +=for hackers +Found in file pad.h + +=item PAD_COMPNAME_FLAGS + +Return the flags for the current compiling pad name +at offset C<po>. Assumes a valid slot entry. + + U32 PAD_COMPNAME_FLAGS(PADOFFSET po) + +=for hackers +Found in file pad.h + +=item PAD_COMPNAME_GEN + +The generation number of the name at offset C<po> in the current +compiling pad (lvalue). Note that C<SvCUR> is hijacked for this purpose. + + STRLEN PAD_COMPNAME_GEN(PADOFFSET po) + +=for hackers +Found in file pad.h + +=item PAD_COMPNAME_OURSTASH + +Return the stash associated with an C<our> variable. +Assumes the slot entry is a valid C<our> lexical. + + HV * PAD_COMPNAME_OURSTASH(PADOFFSET po) + +=for hackers +Found in file pad.h + +=item PAD_COMPNAME_PV + +Return the name of the current compiling pad name +at offset C<po>. Assumes a valid slot entry. + + char * PAD_COMPNAME_PV(PADOFFSET po) + +=for hackers +Found in file pad.h + +=item PAD_COMPNAME_TYPE + +Return the type (stash) of the current compiling pad name at offset +C<po>. Must be a valid name. Returns null if not typed. + + HV * PAD_COMPNAME_TYPE(PADOFFSET po) + +=for hackers +Found in file pad.h + +=item PAD_DUP + +Clone a padlist. + + void PAD_DUP(PADLIST dstpad, PADLIST srcpad, CLONE_PARAMS* param) + +=for hackers +Found in file pad.h + +=item PAD_SAVE_SETNULLPAD + +Save the current pad then set it to null. + + void PAD_SAVE_SETNULLPAD() + +=for hackers +Found in file pad.h + +=item PAD_SETSV + +Set the slot at offset C<po> in the current pad to C<sv> + + SV * PAD_SETSV (PADOFFSET po, SV* sv) + +=for hackers +Found in file pad.h + +=item PAD_SET_CUR + +Set the current pad to be pad C<n> in the padlist, saving +the previous current pad. + + void PAD_SET_CUR (PADLIST padlist, I32 n) + +=for hackers +Found in file pad.h + +=item PAD_SV + +Get the value at offset C<po> in the current pad + + void PAD_SV (PADOFFSET po) + +=for hackers +Found in file pad.h + +=item PAD_SVl + +Lightweight and lvalue version of C<PAD_SV>. +Get or set the value at offset C<po> in the current pad. +Unlike C<PAD_SV>, does not print diagnostics with -DX. +For internal use only. + + SV * PAD_SVl (PADOFFSET po) + +=for hackers +Found in file pad.h + +=item PAD_UPDATE_CURPAD + +Set PL_curpad from the value of PL_comppad. + + void PAD_UPDATE_CURPAD() + +=for hackers +Found in file pad.h + +=item SAVECLEARSV + +Clear the pointed to pad value on scope exit. (ie the runtime action of 'my') + + void SAVECLEARSV (SV **svp) + +=for hackers +Found in file pad.h + +=item SAVECOMPPAD + +save PL_comppad and PL_curpad + + void SAVECOMPPAD() + +=for hackers +Found in file pad.h + +=item SAVEFREEOP + +Free the op on scope exit. At the same time, reset PL_curpad + + + + + void SAVEFREEOP (OP *o) + +=for hackers +Found in file pad.h + +=item SAVEPADSV + +Save a pad slot (used to restore after an iteration) + + void SAVEPADSV (PADOFFSET po) + +=for hackers +Found in file pad.h + + +=back + =head1 Global Variables =over 8 @@ -177,8 +379,12 @@ but only by their index allocated at compile time (which is usually in PL_op->op_targ), wasting a name SV for them doesn't make sense. The SVs in the names AV have their PV being the name of the variable. -NV+1..IV inclusive is a range of cop_seq numbers for which the name is valid. -For typed lexicals name SV is SVt_PVMG and SvSTASH points at the type. +NV+1..IV inclusive is a range of cop_seq numbers for which the name is +valid. For typed lexicals name SV is SVt_PVMG and SvSTASH points at the +type. For C<our> lexicals, the type is SVt_PVGV, and GvSTASH points at the +stash of the associated global (so that duplicate C<our> delarations in the +same package can be detected). SvCUR is sometimes hijacked to +store the generation number during compilation. If SvFAKE is set on the name SV then slot in the frame AVs are a REFCNT'ed references to a lexical from "outside". @@ -191,7 +397,238 @@ become so if C<my sub foo {}> is implemented.) AV * CvPADLIST(CV *cv) =for hackers -Found in file cv.h +Found in file pad.c + +=item cv_clone + +Clone a CV: make a new CV which points to the same code etc, but which +has a newly-created pad done by copying the prototype pad and capturing +any outer lexicals. + + CV* cv_clone(CV* proto) + +=for hackers +Found in file pad.c + +=item cv_dump + +dump the contents of a CV + + void cv_dump(CV *cv, char *title) + +=for hackers +Found in file pad.c + +=item do_dump_pad + +Dump the contents of a padlist + + void do_dump_pad(I32 level, PerlIO *file, PADLIST *padlist, int full) + +=for hackers +Found in file pad.c + +=item intro_my + +"Introduce" my variables to visible status. + + U32 intro_my() + +=for hackers +Found in file pad.c + +=item pad_add_anon + +Add an anon code entry to the current compiling pad + + PADOFFSET pad_add_anon(SV* sv, OPCODE op_type) + +=for hackers +Found in file pad.c + +=item pad_add_name + +Create a new name in the current pad at the specified offset. +If C<typestash> is valid, the name is for a typed lexical; set the +name's stash to that value. +If C<ourstash> is valid, it's an our lexical, set the name's +GvSTASH to that value + +Also, if the name is @.. or %.., create a new array or hash for that slot + +If fake, it means we're cloning an existing entry + + PADOFFSET pad_add_name(char *name, HV* typestash, HV* ourstash, bool clone) + +=for hackers +Found in file pad.c + +=item pad_alloc + +Allocate a new my or tmp pad entry. For a my, simply push a null SV onto +the end of PL_comppad, but for a tmp, scan the pad from PL_padix upwards +for a slot which has no name and and no active value. + + PADOFFSET pad_alloc(I32 optype, U32 tmptype) + +=for hackers +Found in file pad.c + +=item pad_block_start + +Update the pad compilation state variables on entry to a new block + + void pad_block_start(int full) + +=for hackers +Found in file pad.c + +=item pad_check_dup + +Check for duplicate declarations: report any of: + * a my in the current scope with the same name; + * an our (anywhere in the pad) with the same name and the same stash + as C<ourstash> +C<is_our> indicates that the name to check is an 'our' declaration + + + void pad_check_dup(char* name, bool is_our, HV* ourstash) + +=for hackers +Found in file pad.c + +=item pad_findlex + +Find a named lexical anywhere in a chain of nested pads. Add fake entries +in the inner pads if its found in an outer one. + +If flags == FINDLEX_NOSEARCH we don't bother searching outer contexts. + + PADOFFSET pad_findlex(char* name, PADOFFSET newoff, U32 seq, CV* startcv, I32 cx_ix, I32 saweval, U32 flags) + +=for hackers +Found in file pad.c + +=item pad_findmy + +Given a lexical name, try to find it's offset, first in the current pad, +or failing that, in the pads of any lexically enclosing subs (including +the complications introduced by eval). If the name is found in an outer pad, then a fake entry is added to the current pad. +Returns the offset in the current pad, or NOT_IN_PAD on failure. + + PADOFFSET pad_findmy(char* name) + +=for hackers +Found in file pad.c + +=item pad_fixup_inner_anons + +For any anon CVs in the pad, change CvOUTSIDE of that CV from +old_cv to new_cv if necessary. + + void pad_fixup_inner_anons(PADLIST *padlist, CV *old_cv, CV *new_cv) + +=for hackers +Found in file pad.c + +=item pad_free + +Free the SV at offet po in the current pad. + + void pad_free(PADOFFSET po) + +=for hackers +Found in file pad.c + +=item pad_leavemy + +Cleanup at end of scope during compilation: set the max seq number for +lexicals in this scope and warn of any lexicals that never got introduced. + + void pad_leavemy() + +=for hackers +Found in file pad.c + +=item pad_new + +Create a new comnpiling padlist, saving and updating the various global +vars at the same time as creating the pad itself. The following flags +can be OR'ed together: + + padnew_CLONE this pad is for a cloned CV + padnew_SAVE save old globals + padnew_SAVESUB also save extra stuff for start of sub + + PADLIST* pad_new(padnew_flags flags) + +=for hackers +Found in file pad.c + +=item pad_push + +Push a new pad frame onto the padlist, unless there's already a pad at +this depth, in which case don't bother creating a new one. +If has_args is true, give the new pad an @_ in slot zero. + + void pad_push(PADLIST *padlist, int depth, int has_args) + +=for hackers +Found in file pad.c + +=item pad_reset + +Mark all the current temporaries for reuse + + void pad_reset() + +=for hackers +Found in file pad.c + +=item pad_setsv + +Set the entry at offset po in the current pad to sv. +Use the macro PAD_SETSV() rather than calling this function directly. + + void pad_setsv(PADOFFSET po, SV* sv) + +=for hackers +Found in file pad.c + +=item pad_swipe + +Abandon the tmp in the current pad at offset po and replace with a +new one. + + void pad_swipe(PADOFFSET po, bool refadjust) + +=for hackers +Found in file pad.c + +=item pad_tidy + +Tidy up a pad after we've finished compiling it: + * remove most stuff from the pads of anonsub prototypes; + * give it a @_; + * mark tmps as such. + + void pad_tidy(padtidy_type type) + +=for hackers +Found in file pad.c + +=item pad_undef + +Free the padlist associated with a CV. +If parts of it happen to be current, we null the relevant +PL_*pad* global vars so that we don't have any dangling references left. +We also repoint the CvOUTSIDE of any about-to-be-orphaned +inner subs to outercv. + + void pad_undef(CV* cv, CV* outercv) + +=for hackers +Found in file pad.c =back |