diff options
author | Nicholas Clark <nick@ccl4.org> | 2011-03-08 16:46:36 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2011-03-08 16:46:36 +0000 |
commit | f8088870d3cebbc655e7ab8ab4e3f997db4e0fbe (patch) | |
tree | 082a4107624e47de1c0b8a1f0f6658677c13c5a3 | |
parent | 557a446828803db33a91ae2124c09299dfc1d87a (diff) | |
download | perl-f8088870d3cebbc655e7ab8ab4e3f997db4e0fbe.tar.gz |
Convert Tie::Hash::NamedCapture::TIEHASH to XS.
-rw-r--r-- | ext/Tie-Hash-NamedCapture/NamedCapture.pm | 12 | ||||
-rw-r--r-- | ext/Tie-Hash-NamedCapture/NamedCapture.xs | 20 |
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); - |