summaryrefslogtreecommitdiff
path: root/universal.c
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2010-10-13 11:09:02 +0100
committerNicholas Clark <nick@ccl4.org>2010-10-13 11:11:25 +0100
commit41e1f0ed87316699cf6574906797bee3dd759fb0 (patch)
treec7208be4f30fa556cc68852dee6ab31b9111f0f4 /universal.c
parenta13ded5516803d9baff49d9177619361dcc9d083 (diff)
downloadperl-41e1f0ed87316699cf6574906797bee3dd759fb0.tar.gz
XS_Tie_Hash_NamedCapture_DELETE should return a value.
The core's regexp implementation will always croak, but other pluggable engines may have read/write semantics, and hence return from their delete call. Note that STORE and EXISTS are called in void context, hence their return stack is discarded.
Diffstat (limited to 'universal.c')
-rw-r--r--universal.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/universal.c b/universal.c
index 5442f87e63..e66e0db9da 100644
--- a/universal.c
+++ b/universal.c
@@ -1314,6 +1314,9 @@ XS(XS_Tie_Hash_NamedCapture_STORE)
flags = (U32)SvUV(SvRV(MUTABLE_SV(ST(0))));
CALLREG_NAMED_BUFF_STORE(rx,ST(1), ST(2), flags);
+
+ /* Perl_magic_setpack calls us with G_DISCARD, so our return stack state
+ is thrown away. */
}
XS(XS_Tie_Hash_NamedCapture_DELETE)
@@ -1322,6 +1325,7 @@ XS(XS_Tie_Hash_NamedCapture_DELETE)
dXSARGS;
REGEXP * rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
U32 flags;
+ SV *ret;
if (items != 2)
croak_xs_usage(cv, "$key, $flags");
@@ -1332,7 +1336,10 @@ XS(XS_Tie_Hash_NamedCapture_DELETE)
SP -= items;
flags = (U32)SvUV(SvRV(MUTABLE_SV(ST(0))));
- CALLREG_NAMED_BUFF_DELETE(rx, ST(1), flags);
+ ret = CALLREG_NAMED_BUFF_DELETE(rx, ST(1), flags);
+
+ PUSHs(ret ? sv_2mortal(ret) : &PL_sv_undef);
+ XSRETURN(1);
}
XS(XS_Tie_Hash_NamedCapture_CLEAR)
@@ -1354,6 +1361,9 @@ XS(XS_Tie_Hash_NamedCapture_CLEAR)
flags = (U32)SvUV(SvRV(MUTABLE_SV(ST(0))));
CALLREG_NAMED_BUFF_CLEAR(rx, flags);
+
+ /* Perl_magic_wipepack calls us with G_DISCARD, so our return stack state
+ is thrown away. */
}
XS(XS_Tie_Hash_NamedCapture_EXISTS)