summaryrefslogtreecommitdiff
path: root/pod/perlintern.pod
diff options
context:
space:
mode:
authorDave Mitchell <davem@fdisolutions.com>2003-02-26 14:49:47 +0000
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>2003-05-29 18:47:40 +0000
commitb5c19bd7c15bd02a18c3c2b80b6f602827ecdbcc (patch)
tree62bd6c218608670924b1f52603773478868e7f69 /pod/perlintern.pod
parentd3f88289ec6f15b80a5a99970a0ca8fd4c679869 (diff)
downloadperl-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.pod43
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