diff options
author | Dave Mitchell <davem@fdisolutions.com> | 2003-02-26 14:49:47 +0000 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2003-05-29 18:47:40 +0000 |
commit | b5c19bd7c15bd02a18c3c2b80b6f602827ecdbcc (patch) | |
tree | 62bd6c218608670924b1f52603773478868e7f69 /pod/perlintern.pod | |
parent | d3f88289ec6f15b80a5a99970a0ca8fd4c679869 (diff) | |
download | perl-b5c19bd7c15bd02a18c3c2b80b6f602827ecdbcc.tar.gz |
jumbo closure fix
Message-ID: <20030226144947.A14444@fdgroup.com>
p4raw-id: //depot/perl@19637
Diffstat (limited to 'pod/perlintern.pod')
-rw-r--r-- | pod/perlintern.pod | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/pod/perlintern.pod b/pod/perlintern.pod index c4bb1d5a01..2ae4a654dd 100644 --- a/pod/perlintern.pod +++ b/pod/perlintern.pod @@ -428,7 +428,8 @@ CV's can have CvPADLIST(cv) set to point to an AV. For these purposes "forms" are a kind-of CV, eval""s are too (except they're not callable at will and are always thrown away after the eval"" is done -executing). +executing). Require'd files are simply evals without any outer lexical +scope. XSUBs don't have CvPADLIST set - dXSTARG fetches values from PL_curpad, but that is really the callers pad (a slot of which is allocated by @@ -474,10 +475,14 @@ 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". In this case, -the name SV does not have a cop_seq range, since it is in scope -throughout. +If SvFAKE is set on the name SV, then that slot in the frame AV is +a REFCNT'ed reference to a lexical from "outside". In this case, +the name SV does not use NVX and IVX to store a cop_seq range, since it is +in scope throughout. Instead IVX stores some flags containing info about +the real lexical (is it declared in an anon, and is it capable of being +instantiated multiple times?), and for fake ANONs, NVX contains the index +within the parent's pad where the lexical's value is stored, to make +cloning quicker. If the 'name' is '&' the corresponding entry in frame AV is a CV representing a possible closure. @@ -538,14 +543,13 @@ Found in file pad.c =item pad_add_name -Create a new name in the current pad at the specified offset. +Create a new name and associated PADMY SV in the current pad; return the +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) @@ -589,12 +593,23 @@ 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 it's found in an outer one. innercv is the CV *inside* -the chain of outer CVs to be searched. If newoff is non-null, this is a -run-time cloning: don't add fake entries, just find the lexical and add a -ref to it at newoff in the current pad. - - PADOFFSET pad_findlex(char* name, PADOFFSET newoff, CV* innercv) +in the inner pads if it's found in an outer one. + +Returns the offset in the bottom pad of the lex or the fake lex. +cv is the CV in which to start the search, and seq is the current cop_seq +to match against. If warn is true, print appropriate warnings. The out_* +vars return values, and so are pointers to where the returned values +should be stored. out_capture, if non-null, requests that the innermost +instance of the lexical is captured; out_name_sv is set to the innermost +matched namesv or fake namesv; out_flags returns the flags normally +associated with the IVX field of a fake namesv. + +Note that pad_findlex() is recursive; it recurses up the chain of CVs, +then comes back down, adding fake entries as it goes. It has to be this way +because fake namesvs in anon protoypes have to store in NVX the index into +the parent pad. + + PADOFFSET pad_findlex(char *name, CV* cv, U32 seq, int warn, SV** out_capture, SV** out_name_sv, int *out_flags) =for hackers Found in file pad.c |