Add S_save_pushptri32ptr() and use it to re-implement Perl_save_hints()
authorNicholas Clark <nick@ccl4.org>
Mon, 1 Dec 2008 11:27:31 +0000 (11:27 +0000)
committerDavid Mitchell <davem@iabyn.com>
Mon, 30 Mar 2009 14:16:12 +0000 (15:16 +0100)
and Perl_save_aelem().

p4raw-id: //depot/perl@34966

(cherry-picked from commit be84297eef8d269e574a1aac0dbf18f3c3b7341d,
but skipped re-implementing Perl_save_hints since the push order is
different between bleed and maint)

embed.fnc
embed.h
proto.h
scope.c

index 59f3f4d..06ffa1c 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -910,6 +910,10 @@ p  |void   |save_pushi32ptr|I32 i|NULLOK void *const ptr|const int type
 : Used by SAVESWITCHSTACK() in pp.c
 p      |void   |save_pushptrptr|NULLOK void *const ptr1 \
                                |NULLOK void *const ptr2|const int type
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+s      |void   |save_pushptri32ptr|NULLOK void *const ptr1|const I32 i \
+                               |NULLOK void *const ptr2|const int type
+#endif
 : Used in perly.y
 p      |OP*    |sawparens      |NULLOK OP* o
 : Used in perly.y
diff --git a/embed.h b/embed.h
index 74d4431..4bbc953 100644 (file)
--- a/embed.h
+++ b/embed.h
 #ifdef PERL_CORE
 #define save_pushi32ptr                Perl_save_pushi32ptr
 #define save_pushptrptr                Perl_save_pushptrptr
+#endif
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define save_pushptri32ptr     S_save_pushptri32ptr
+#endif
+#endif
+#ifdef PERL_CORE
 #define sawparens              Perl_sawparens
 #define scalar                 Perl_scalar
 #define scalarkids             Perl_scalarkids
 #ifdef PERL_CORE
 #define save_pushi32ptr(a,b,c) Perl_save_pushi32ptr(aTHX_ a,b,c)
 #define save_pushptrptr(a,b,c) Perl_save_pushptrptr(aTHX_ a,b,c)
+#endif
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+#ifdef PERL_CORE
+#define save_pushptri32ptr(a,b,c,d)    S_save_pushptri32ptr(aTHX_ a,b,c,d)
+#endif
+#endif
+#ifdef PERL_CORE
 #define sawparens(a)           Perl_sawparens(aTHX_ a)
 #define scalar(a)              Perl_scalar(aTHX_ a)
 #define scalarkids(a)          Perl_scalarkids(aTHX_ a)
diff --git a/proto.h b/proto.h
index 772c8bd..69a4ec3 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -2925,6 +2925,9 @@ PERL_CALLCONV SV* Perl_save_svref(pTHX_ SV** sptr)
 PERL_CALLCONV void     Perl_save_pushptr(pTHX_ void *const ptr, const int type);
 PERL_CALLCONV void     Perl_save_pushi32ptr(pTHX_ I32 i, void *const ptr, const int type);
 PERL_CALLCONV void     Perl_save_pushptrptr(pTHX_ void *const ptr1, void *const ptr2, const int type);
+#if defined(PERL_IN_SCOPE_C) || defined(PERL_DECL_PROT)
+STATIC void    S_save_pushptri32ptr(pTHX_ void *const ptr1, const I32 i, void *const ptr2, const int type);
+#endif
 PERL_CALLCONV OP*      Perl_sawparens(pTHX_ OP* o);
 PERL_CALLCONV OP*      Perl_scalar(pTHX_ OP* o);
 PERL_CALLCONV OP*      Perl_scalarkids(pTHX_ OP* o);
diff --git a/scope.c b/scope.c
index c0a1ddb..39e4468 100644 (file)
--- a/scope.c
+++ b/scope.c
@@ -554,6 +554,17 @@ Perl_save_hints(pTHX)
     SSPUSHINT(SAVEt_HINTS);
 }
 
+static void
+S_save_pushptri32ptr(pTHX_ void *const ptr1, const I32 i, void *const ptr2,
+                       const int type)
+{
+    SSCHECK(4);
+    SSPUSHPTR(ptr1);
+    SSPUSHINT(i);
+    SSPUSHPTR(ptr2);
+    SSPUSHINT(type);
+}
+
 void
 Perl_save_aelem(pTHX_ AV *av, I32 idx, SV **sptr)
 {
@@ -563,11 +574,8 @@ Perl_save_aelem(pTHX_ AV *av, I32 idx, SV **sptr)
     PERL_ARGS_ASSERT_SAVE_AELEM;
 
     SvGETMAGIC(*sptr);
-    SSCHECK(4);
-    SSPUSHPTR(SvREFCNT_inc_simple(av));
-    SSPUSHINT(idx);
-    SSPUSHPTR(SvREFCNT_inc(*sptr));
-    SSPUSHINT(SAVEt_AELEM);
+    save_pushptri32ptr(SvREFCNT_inc_simple(av), idx, SvREFCNT_inc(*sptr),
+                      SAVEt_AELEM);
     /* if it gets reified later, the restore will have the wrong refcnt */
     if (!AvREAL(av) && AvREIFY(av))
        SvREFCNT_inc_void(*sptr);