summaryrefslogtreecommitdiff
path: root/pp.h
diff options
context:
space:
mode:
authorNick Ing-Simmons <nik@tiuk.ti.com>2000-09-02 16:48:35 +0000
committerNick Ing-Simmons <nik@tiuk.ti.com>2000-09-02 16:48:35 +0000
commitaacdac464b116367cebe4e1e19fd4b760789bbdf (patch)
treebca36ca0578598808aea076d3ec78a98a18a3409 /pp.h
parent191408b6bdd57092aaa9c8919d6d2c67efd76493 (diff)
downloadperl-aacdac464b116367cebe4e1e19fd4b760789bbdf.tar.gz
If overloaded %{} etc. return the object do not loop.
Thus sub deref { $_[0] } functions if object is wanted type. p4raw-id: //depot/perl@7009
Diffstat (limited to 'pp.h')
-rw-r--r--pp.h13
1 files changed, 8 insertions, 5 deletions
diff --git a/pp.h b/pp.h
index 7f396b20b6..029583a09b 100644
--- a/pp.h
+++ b/pp.h
@@ -147,7 +147,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 +185,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 +342,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)