summaryrefslogtreecommitdiff
path: root/op.c
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2010-09-13 13:38:27 +0100
committerNicholas Clark <nick@ccl4.org>2010-09-13 13:51:34 +0100
commit340458b54f884968f1f78789d57137d34f239152 (patch)
tree15e17778e6954141e3f00ec51b25d3f08bd194df /op.c
parent704f71be23bfe26b12807102a4880855eef362d0 (diff)
downloadperl-340458b54f884968f1f78789d57137d34f239152.tar.gz
In Perl_ck_subr(), hoist the if (proto) check outside of the while loop.
Prototype checking is currently 165 lines of code. The rest of the while loop is 19, including comments. It's much easier to see how prototype checking fits into the structure this way, *and* it avoids a repeated if check inside a loop.
Diffstat (limited to 'op.c')
-rw-r--r--op.c54
1 files changed, 37 insertions, 17 deletions
diff --git a/op.c b/op.c
index 83800e12b7..e3d821367b 100644
--- a/op.c
+++ b/op.c
@@ -8447,17 +8447,38 @@ Perl_ck_subr(pTHX_ OP *o)
o->op_private |= (PL_hints & HINT_STRICT_REFS);
if (PERLDB_SUB && PL_curstash != PL_debstash)
o->op_private |= OPpENTERSUB_DB;
- while (o2 != cvop) {
- OP* o3;
- if (PL_madskills && o2->op_type == OP_STUB) {
+ if (!proto) {
+ while (o2 != cvop) {
+ OP* o3;
+ if (PL_madskills && o2->op_type == OP_STUB) {
+ o2 = o2->op_sibling;
+ continue;
+ }
+ if (PL_madskills && o2->op_type == OP_NULL)
+ o3 = ((UNOP*)o2)->op_first;
+ else
+ o3 = o2;
+ /* Yes, this while loop is duplicated. But it's a lot clearer
+ to see what is going on without that massive switch(*proto)
+ block just here. */
+ list(o2); /* This is only called if !proto */
+
+ mod(o2, OP_ENTERSUB);
+ prev = o2;
o2 = o2->op_sibling;
- continue;
- }
- if (PL_madskills && o2->op_type == OP_NULL)
- o3 = ((UNOP*)o2)->op_first;
- else
- o3 = o2;
- if (proto) {
+ } /* while */
+ } else {
+ while (o2 != cvop) {
+ OP* o3;
+ if (PL_madskills && o2->op_type == OP_STUB) {
+ o2 = o2->op_sibling;
+ continue;
+ }
+ if (PL_madskills && o2->op_type == OP_NULL)
+ o3 = ((UNOP*)o2)->op_first;
+ else
+ o3 = o2;
+
if (proto >= proto_end)
return too_many_arguments(o, gv_ename(namegv));
@@ -8621,13 +8642,12 @@ Perl_ck_subr(pTHX_ OP *o)
Perl_croak(aTHX_ "Malformed prototype for %s: %"SVf,
gv_ename(namegv), SVfARG(cv));
}
- }
- else
- list(o2);
- mod(o2, OP_ENTERSUB);
- prev = o2;
- o2 = o2->op_sibling;
- } /* while */
+
+ mod(o2, OP_ENTERSUB);
+ prev = o2;
+ o2 = o2->op_sibling;
+ } /* while */
+ }
if (o2 == cvop && proto && *proto == '_') {
/* generate an access to $_ */
o2 = newDEFSVOP();