summaryrefslogtreecommitdiff
path: root/op.c
diff options
context:
space:
mode:
authorDavid Golden <dagolden@cpan.org>2010-09-12 20:26:43 -0400
committerDavid Golden <dagolden@cpan.org>2010-10-21 09:23:58 -0400
commitc035a075a240f10383292128a8d3f3746c4ac857 (patch)
treea245d8f117b9636fe740448118a753e5457978c8 /op.c
parent9061a8f72941979d02cbccb5cb18a2034813b6a7 (diff)
downloadperl-c035a075a240f10383292128a8d3f3746c4ac857.tar.gz
Add single-term prototype
The C<+> prototype is a special alternative to C<$> that will act like C<\[@%]> when given a literal array or hash variable, but will otherwise force scalar context on the argument. This is useful for functions which should accept either a literal array or an array reference as the argument: sub smartpush (+@) { my $aref = shift; die "Not an array or arrayref" unless ref $aref eq 'ARRAY'; push @$aref, @_; } When using the C<+> prototype, your function must check that the argument is of an acceptable type.
Diffstat (limited to 'op.c')
-rw-r--r--op.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/op.c b/op.c
index ac9a41e9d2..469d48d0bd 100644
--- a/op.c
+++ b/op.c
@@ -8735,6 +8735,18 @@ Perl_ck_entersub_args_proto(pTHX_ OP *entersubop, GV *namegv, SV *protosv)
}
scalar(aop);
break;
+ case '+':
+ proto++;
+ arg++;
+ if (o3->op_type == OP_RV2AV ||
+ o3->op_type == OP_PADAV ||
+ o3->op_type == OP_RV2HV ||
+ o3->op_type == OP_PADHV
+ ) {
+ goto wrapref;
+ }
+ scalar(aop);
+ break;
case '[': case ']':
goto oops;
break;