From 7d1d69cb1e59690060fc6368ef3969a206c87c50 Mon Sep 17 00:00:00 2001 From: David Mitchell Date: Fri, 6 Sep 2013 15:54:10 +0100 Subject: [PATCH] pp_goto: document the different branches Te various different forms of goto (and dump) take different branches through this big function. Document which branches handle which variants. Also document the use of OPf_SPECIAL in OP_DUMP. --- op.h | 1 + pp_ctl.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/op.h b/op.h index 038d908..08d46f9 100644 --- a/op.h +++ b/op.h @@ -143,6 +143,7 @@ Deprecated. Use C instead. - After ck_glob, use Perl glob function */ /* On OP_PADRANGE, push @_ */ + /* On OP_DUMP, has no label */ /* old names; don't use in new code, but don't break them, either */ #define OPf_LIST OPf_WANT_LIST diff --git a/pp_ctl.c b/pp_ctl.c index d091e29..24a8cd6 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -2776,7 +2776,7 @@ S_dofindlabel(pTHX_ OP *o, const char *label, STRLEN len, U32 flags, OP **opstac return 0; } -PP(pp_goto) +PP(pp_goto) /* also pp_dump */ { dVAR; dSP; OP *retop = NULL; @@ -2791,6 +2791,8 @@ PP(pp_goto) static const char* const must_have_label = "goto must have label"; if (PL_op->op_flags & OPf_STACKED) { + /* goto EXPR or goto &foo */ + SV * const sv = POPs; SvGETMAGIC(sv); @@ -2986,11 +2988,13 @@ PP(pp_goto) } } else { + /* goto EXPR */ label = SvPV_nomg_const(sv, label_len); label_flags = SvUTF8(sv); } } else if (!(PL_op->op_flags & OPf_SPECIAL)) { + /* goto LABEL or dump LABEL */ label = cPVOP->op_pv; label_flags = (cPVOP->op_private & OPpPV_IS_UTF8) ? SVf_UTF8 : 0; label_len = strlen(label); -- 2.7.4