diff options
author | Nicholas Clark <nick@ccl4.org> | 2010-10-13 11:09:02 +0100 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2010-10-13 11:11:25 +0100 |
commit | 41e1f0ed87316699cf6574906797bee3dd759fb0 (patch) | |
tree | c7208be4f30fa556cc68852dee6ab31b9111f0f4 /universal.c | |
parent | a13ded5516803d9baff49d9177619361dcc9d083 (diff) | |
download | perl-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.c | 12 |
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) |