summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2011-03-08 16:46:36 +0000
committerNicholas Clark <nick@ccl4.org>2011-03-08 16:46:36 +0000
commitf8088870d3cebbc655e7ab8ab4e3f997db4e0fbe (patch)
tree082a4107624e47de1c0b8a1f0f6658677c13c5a3
parent557a446828803db33a91ae2124c09299dfc1d87a (diff)
downloadperl-f8088870d3cebbc655e7ab8ab4e3f997db4e0fbe.tar.gz
Convert Tie::Hash::NamedCapture::TIEHASH to XS.
-rw-r--r--ext/Tie-Hash-NamedCapture/NamedCapture.pm12
-rw-r--r--ext/Tie-Hash-NamedCapture/NamedCapture.xs20
2 files changed, 22 insertions, 10 deletions
diff --git a/ext/Tie-Hash-NamedCapture/NamedCapture.pm b/ext/Tie-Hash-NamedCapture/NamedCapture.pm
index 814e90dace..db86908a49 100644
--- a/ext/Tie-Hash-NamedCapture/NamedCapture.pm
+++ b/ext/Tie-Hash-NamedCapture/NamedCapture.pm
@@ -1,19 +1,13 @@
use strict;
package Tie::Hash::NamedCapture;
-our $VERSION = "0.07";
+our $VERSION = "0.08";
+
+sub TIEHASH;
require XSLoader;
XSLoader::load();
-my ($one, $all) = Tie::Hash::NamedCapture::flags();
-
-sub TIEHASH {
- my ($pkg, %arg) = @_;
- my $flag = $arg{all} ? $all : $one;
- bless \$flag => $pkg;
-}
-
tie %+, __PACKAGE__;
tie %-, __PACKAGE__, all => 1;
diff --git a/ext/Tie-Hash-NamedCapture/NamedCapture.xs b/ext/Tie-Hash-NamedCapture/NamedCapture.xs
index cd96c82818..73deacdc1b 100644
--- a/ext/Tie-Hash-NamedCapture/NamedCapture.xs
+++ b/ext/Tie-Hash-NamedCapture/NamedCapture.xs
@@ -18,6 +18,25 @@
MODULE = Tie::Hash::NamedCapture PACKAGE = Tie::Hash::NamedCapture
PROTOTYPES: DISABLE
+SV *
+TIEHASH(package, ...)
+ const char *package;
+ PREINIT:
+ UV flag = RXapif_ONE;
+ CODE:
+ mark += 2;
+ while(mark < sp) {
+ STRLEN len;
+ const char *p = SvPV_const(*mark, len);
+ if(memEQs(p, len, "all"))
+ flag = SvTRUE(mark[1]) ? RXapif_ALL : RXapif_ONE;
+ mark += 2;
+ }
+ RETVAL = newSV_type(SVt_RV);
+ sv_setuv(newSVrv(RETVAL, package), flag);
+ OUTPUT:
+ RETVAL
+
void
FETCH(...)
ALIAS:
@@ -94,4 +113,3 @@ flags(...)
EXTEND(SP, 2);
mPUSHu(RXapif_ONE);
mPUSHu(RXapif_ALL);
-