summaryrefslogtreecommitdiff
path: root/t/op/coresubs.t
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2011-08-24 09:09:58 -0700
committerFather Chrysostomos <sprout@cpan.org>2011-08-26 12:43:13 -0700
commitc72a562989087cf45b7abfdbbfb4a823adac1604 (patch)
treeee17c214b370828ec404011e889a3c7958aa632f /t/op/coresubs.t
parentd3e26383b699ba248aece0da481bcd07d3e4aa60 (diff)
downloadperl-c72a562989087cf45b7abfdbbfb4a823adac1604.tar.gz
&CORE::lock()
This commit allows &CORE::lock to be called through references and via ampersand syntax. It adds code to pp_coreargs for handling the OA_SCALARREF case, though what it adds is currently lock-specific. (Subsequent commits will address that.) Since lock returns the scalar passed to it, not a copy, &CORE::lock needs to use op_leavesublv, rather than op_leavesub. But it can’t be an lvalue sub, as &CORE::lock = 3 should be disallowed. So we use the sneaky trick of turning on the lvalue flag before attaching the op tree to the sub (which causes newATTRSUB to use op_leavesublv), and then turning it off afterwards.
Diffstat (limited to 't/op/coresubs.t')
-rw-r--r--t/op/coresubs.t33
1 files changed, 33 insertions, 0 deletions
diff --git a/t/op/coresubs.t b/t/op/coresubs.t
index 7a00694b7e..84fc223502 100644
--- a/t/op/coresubs.t
+++ b/t/op/coresubs.t
@@ -156,6 +156,30 @@ sub test_proto {
like $@, qr/^Type of arg 1 to &CORE::$o must be hash reference at /,
"&$o with non-hash arg with hash overload (which does not count)";
}
+ elsif ($p eq '\[$@%&*]') {
+ $tests += 5;
+
+ eval " &CORE::$o(1,2) ";
+ like $@, qr/^Too many arguments for $o at /,
+ "&$o with too many args";
+ eval " &CORE::$o() ";
+ like $@, qr/^Not enough arguments for $o at /,
+ "&$o with too few args";
+ eval " &CORE::$o(2) ";
+ like $@, qr/^Type of arg 1 to &CORE::$o must be reference to one of(?x:
+ ) \[\$\@%&\*] at /,
+ "&$o with non-ref arg";
+ eval " &CORE::$o(*STDOUT{IO}) ";
+ like $@, qr/^Type of arg 1 to &CORE::$o must be reference to one of(?x:
+ ) \[\$\@%&\*] at /,
+ "&$o with ioref arg";
+ my $class = ref *DATA{IO};
+ eval " &CORE::$o(bless(*DATA{IO}, 'hov')) ";
+ like $@, qr/^Type of arg 1 to &CORE::$o must be reference to one of(?x:
+ ) \[\$\@%&\*] at /,
+ "&$o with ioref arg with hash overload (which does not count)";
+ bless *DATA{IO}, $class;
+ }
else {
die "Please add tests for the $p prototype";
@@ -406,6 +430,15 @@ test_proto 'localtime';
&CORE::localtime;
pass '&localtime without args does not crash'; ++$tests;
+test_proto 'lock';
+$tests += 6;
+is \&mylock(\$foo), \$foo, '&lock retval when passed a scalar ref';
+lis [\&mylock(\$foo)], [\$foo], '&lock in list context';
+is &mylock(\@foo), \@foo, '&lock retval when passed an array ref';
+is &mylock(\%foo), \%foo, '&lock retval when passed a ash ref';
+is &mylock(\&foo), \&foo, '&lock retval when passed a code ref';
+is \&mylock(\*foo), \*foo, '&lock retval when passed a glob ref';
+
test_proto 'log';
test_proto "msg$_" for qw( ctl get rcv snd );