This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[patch] GvSHARED
[perl5.git] / pp.h
diff --git a/pp.h b/pp.h
index 7f396b2..d58d187 100644 (file)
--- a/pp.h
+++ b/pp.h
@@ -1,6 +1,6 @@
 /*    pp.h
  *
- *    Copyright (c) 1991-2000, Larry Wall
+ *    Copyright (c) 1991-2001, Larry Wall
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
@@ -33,6 +33,13 @@ L<perlcall>.
 Declares a local copy of perl's stack pointer for the XSUB, available via
 the C<SP> macro.  See C<SP>.
 
+=for apidoc ms||djSP
+
+Declare Just C<SP>. This is actually identical to C<dSP>, and declares
+a local copy of perl's stack pointer, available via the C<SP> macro.
+See C<SP>.  (Available for backward source code compatibility with the
+old (Perl 5.005) thread model.)
+
 =for apidoc Ams||dMARK
 Declare a stack marker variable, C<mark>, for the XSUB.  See C<MARK> and
 C<dORIGMARK>.
@@ -46,9 +53,9 @@ The original stack mark for the XSUB.  See C<dORIGMARK>.
 =for apidoc Ams||SPAGAIN
 Refetch the stack pointer.  Used after a callback.  See L<perlcall>.
 
-=cut
-*/
+=cut */
 
+#undef SP /* Solaris 2.7 i386 has this in /usr/include/sys/reg.h */
 #define SP sp
 #define MARK mark
 #define TARG targ
@@ -61,7 +68,7 @@ Refetch the stack pointer.  Used after a callback.  See L<perlcall>.
 #define POPMARK                (*PL_markstack_ptr--)
 
 #define djSP           register SV **sp = PL_stack_sp
-#define dSP            dTHR; djSP
+#define dSP            djSP
 #define dMARK          register SV **mark = PL_stack_base + POPMARK
 #define dORIGMARK      I32 origmark = mark - PL_stack_base
 #define SETORIGMARK    origmark = mark - PL_stack_base
@@ -126,6 +133,8 @@ Pops a long off the stack.
 #endif
 
 #define TOPs           (*sp)
+#define TOPm1s         (*(sp-1))
+#define TOPp1s         (*(sp+1))
 #define TOPp           (SvPV(TOPs, PL_na))             /* deprecated */
 #define TOPpx          (SvPV(TOPs, n_a))
 #define TOPn           (SvNV(TOPs))
@@ -147,7 +156,7 @@ used, guarantees that there is room for at least C<nitems> to be pushed
 onto the stack.
 
 =for apidoc Am|void|PUSHs|SV* sv
-Push an SV onto the stack.  The stack must have room for this element. 
+Push an SV onto the stack.  The stack must have room for this element.
 Does not handle 'set' magic.  See C<XPUSHs>.
 
 =for apidoc Am|void|PUSHp|char* str|STRLEN len
@@ -185,7 +194,7 @@ Push an integer onto the stack, extending the stack if necessary.  Handles
 'set' magic. See C<PUSHi>.
 
 =for apidoc Am|void|XPUSHu|UV uv
-Push an unsigned integer onto the stack, extending the stack if necessary. 
+Push an unsigned integer onto the stack, extending the stack if necessary.
 See C<PUSHu>.
 
 =cut
@@ -342,10 +351,13 @@ See C<PUSHu>.
            { dTARGETSTACKED;                                           \
                { dSP; tryAMAGICunW(meth,FORCE_SETs,shift,RETURN);}}}
 
-#define setAGAIN(ref) sv = arg = ref;                                  \
-  if (!SvROK(ref))                                                     \
+#define setAGAIN(ref) sv = ref;                                                        \
+  if (!SvROK(ref))                                                             \
       Perl_croak(aTHX_ "Overloaded dereference did not return a reference");   \
-  goto am_again;
+  if (ref != arg && SvRV(ref) != SvRV(arg)) {                                  \
+      arg = ref;                                                               \
+      goto am_again;                                                           \
+  }
 
 #define tryAMAGICunDEREF(meth) tryAMAGICunW(meth,setAGAIN,0,(void)0)
 
@@ -370,3 +382,10 @@ See C<PUSHu>.
     SvREFCNT_dec(tmpRef);                   \
     SvRV(rv)=AMG_CALLun(rv,copy);        \
   } } STMT_END
+
+/*
+=for apidoc mU||LVRET
+True if this op will be the return value of an lvalue subroutine
+
+=cut */
+#define LVRET ((PL_op->op_private & OPpMAYBE_LVSUB) && is_lvalue_sub())