From 1f52abc52ff0a3a57a5a38e9858edaf90a2a8ef5 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 20 Sep 2012 12:17:08 -0500 Subject: error if a parameter is declared after a slurpy parameter --- Fun.xs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'Fun.xs') diff --git a/Fun.xs b/Fun.xs index 8cb7d2a..9630bdf 100644 --- a/Fun.xs +++ b/Fun.xs @@ -155,6 +155,7 @@ static OP *THX_parse_function_prototype(pTHX) { OP *myvars, *defaults, *get_args, *arg_assign; IV i = 0; + SV *seen_slurpy = NULL; demand_unichar('(', DEMAND_IMMEDIATE); @@ -176,19 +177,30 @@ static OP *THX_parse_function_prototype(pTHX) lex_read_space(0); next = lex_peek_unichar(0); if (next == '$') { - pad_op = newOP(OP_PADSV, 0); name = parse_scalar_varname(); + if (seen_slurpy) { + croak("Can't declare parameter %"SVf" after slurpy parameter %"SVf, name, seen_slurpy); + } + pad_op = newOP(OP_PADSV, 0); pad_op->op_targ = pad_add_my_scalar_sv(name); } else if (next == '@') { - pad_op = newOP(OP_PADAV, 0); name = parse_array_varname(); + if (seen_slurpy) { + croak("Can't declare parameter %"SVf" after slurpy parameter %"SVf, name, seen_slurpy); + } + pad_op = newOP(OP_PADAV, 0); pad_op->op_targ = pad_add_my_array_sv(name); + seen_slurpy = name; } else if (next == '%') { - pad_op = newOP(OP_PADHV, 0); name = parse_hash_varname(); + if (seen_slurpy) { + croak("Can't declare parameter %"SVf" after slurpy parameter %"SVf, name, seen_slurpy); + } + pad_op = newOP(OP_PADHV, 0); pad_op->op_targ = pad_add_my_hash_sv(name); + seen_slurpy = name; } else { croak("syntax error"); -- cgit v1.2.3-54-g00ecf