This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Re: [PATCH 5.00552] Overloaded <> and deref again
authorIlya Zakharevich <ilya@math.berkeley.edu>
Fri, 30 Oct 1998 18:36:20 +0000 (13:36 -0500)
committerGurusamy Sarathy <gsar@cpan.org>
Sat, 31 Oct 1998 09:40:31 +0000 (09:40 +0000)
Message-Id: <199810302336.SAA17336@monk.mps.ohio-state.edu>

p4raw-id: //depot/perl@2162

pp.h

diff --git a/pp.h b/pp.h
index 08e10a7..442fdc6 100644 (file)
--- a/pp.h
+++ b/pp.h
 #define AMG_CALLbinL(left,right,meth) \
             amagic_call(left,right,CAT2(meth,_amg),AMGf_noright)
 
-#define tryAMAGICunW(meth,set,shift) STMT_START { \
+#define tryAMAGICunW(meth,set,shift,ret) STMT_START { \
           if (PL_amagic_generation) { \
            SV* tmpsv; \
            SV* arg= sp[shift]; \
            if ((SvAMAGIC(arg))&&\
                (tmpsv=AMG_CALLun(arg,meth))) {\
               SPAGAIN; if (shift) sp += shift; \
-              set(tmpsv); RETURN; } \
+              set(tmpsv); ret; } \
          } \
        } STMT_END
 
 #define FORCE_SETs(sv) STMT_START { sv_setsv(TARG, (sv)); SETTARG; } STMT_END
 
 #define tryAMAGICun    tryAMAGICunSET
-#define tryAMAGICunSET(meth) tryAMAGICunW(meth,SETs,0)
+#define tryAMAGICunSET(meth) tryAMAGICunW(meth,SETs,0,RETURN)
 #define tryAMAGICunTARGET(meth, shift)                                 \
        { dSP; sp--;    /* get TARGET from below PL_stack_sp */         \
            { dTARGETSTACKED;                                           \
-               { dSP; tryAMAGICunW(meth,FORCE_SETs,shift);}}}
-#define setAGAIN(ref) sv = arg = ref; goto am_again;
-#define tryAMAGICunDEREF(meth) tryAMAGICunW(meth,setAGAIN,0)
+               { dSP; tryAMAGICunW(meth,FORCE_SETs,shift,RETURN);}}}
+
+#define setAGAIN(ref) sv = arg = ref;                                  \
+  if (!SvROK(ref))                                                     \
+      croak("Overloaded dereference did not return a reference");      \
+  goto am_again;
+
+#define tryAMAGICunDEREF(meth) tryAMAGICunW(meth,setAGAIN,0,)
 
 #define opASSIGN (PL_op->op_flags & OPf_STACKED)
 #define SETsv(sv)      STMT_START {                                    \