diff options
author | Florian Ragwitz <rafl@debian.org> | 2010-11-25 02:40:16 +0100 |
---|---|---|
committer | Florian Ragwitz <rafl@debian.org> | 2010-11-30 12:37:30 +0100 |
commit | 26ab20eec63c596b43c0d540691562ec6b160e7c (patch) | |
tree | a0b316706de00f77bb2ecaa027287caf2306079c /ext | |
parent | 39de7f53b474076d5a8e28b5b41fddefd29e45d7 (diff) | |
download | perl-26ab20eec63c596b43c0d540691562ec6b160e7c.tar.gz |
Add tests for sv_{,un}magicext and mg_findext
Diffstat (limited to 'ext')
-rw-r--r-- | ext/XS-APItest/APItest.xs | 30 | ||||
-rw-r--r-- | ext/XS-APItest/t/magic.t | 30 |
2 files changed, 60 insertions, 0 deletions
diff --git a/ext/XS-APItest/APItest.xs b/ext/XS-APItest/APItest.xs index 358159bb7d..325681ab5a 100644 --- a/ext/XS-APItest/APItest.xs +++ b/ext/XS-APItest/APItest.xs @@ -30,6 +30,8 @@ typedef struct { START_MY_CXT +MGVTBL vtbl_foo, vtbl_bar; + /* indirect functions to test the [pa]MY_CXT macros */ int @@ -2639,3 +2641,31 @@ BOOT: CV *asscv = get_cv("XS::APItest::postinc", 0); cv_set_call_checker(asscv, THX_ck_entersub_postinc, (SV*)asscv); } + +MODULE = XS::APItest PACKAGE = XS::APItest::Magic + +PROTOTYPES: DISABLE + +void +sv_magic_foo(SV *sv, SV *thingy) +ALIAS: + sv_magic_bar = 1 +CODE: + sv_magicext(SvRV(sv), NULL, PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo, (const char *)thingy, 0); + +SV * +mg_find_foo(SV *sv) +ALIAS: + mg_find_bar = 1 +CODE: + MAGIC *mg = mg_findext(SvRV(sv), PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo); + RETVAL = mg ? SvREFCNT_inc((SV *)mg->mg_ptr) : &PL_sv_undef; +OUTPUT: + RETVAL + +void +sv_unmagic_foo(SV *sv) +ALIAS: + sv_unmagic_bar = 1 +CODE: + sv_unmagicext(SvRV(sv), PERL_MAGIC_ext, ix ? &vtbl_bar : &vtbl_foo); diff --git a/ext/XS-APItest/t/magic.t b/ext/XS-APItest/t/magic.t new file mode 100644 index 0000000000..9dfb7c1b79 --- /dev/null +++ b/ext/XS-APItest/t/magic.t @@ -0,0 +1,30 @@ +use strict; +use warnings; +use Test::More; + +use XS::APItest; + +my $sv = bless {}, 'Moo'; +my $foo = 'affe'; +my $bar = 'tiger'; + +ok !mg_find_foo($sv), 'no foo magic yet'; +ok !mg_find_bar($sv), 'no bar magic yet'; + +sv_magic_foo($sv, $foo); +is mg_find_foo($sv), $foo, 'foo magic attached'; +ok !mg_find_bar($sv), '... but still no bar magic'; + +sv_magic_bar($sv, $bar); +is mg_find_foo($sv), $foo, 'foo magic still attached'; +is mg_find_bar($sv), $bar, '... and bar magic is there too'; + +sv_unmagic_foo($sv); +ok !mg_find_foo($sv), 'foo magic removed'; +is mg_find_bar($sv), $bar, '... but bar magic is still there'; + +sv_unmagic_bar($sv); +ok !mg_find_foo($sv), 'foo magic still removed'; +ok !mg_find_bar($sv), '... and bar magic is removed too'; + +done_testing; |