From 1e22f62b2c6bb17153f0524ea3a1b684346a8988 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 18 Aug 2012 19:01:22 -0500 Subject: support anonymous functions --- Fun.xs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'Fun.xs') diff --git a/Fun.xs b/Fun.xs index 50e802b..561bbfa 100644 --- a/Fun.xs +++ b/Fun.xs @@ -183,14 +183,14 @@ static OP *parse_fun(pTHX_ GV *namegv, SV *psobj, U32 *flagsp) { I32 floor; SV *function_name = NULL; - OP *arg_assign = NULL, *block, *code; - - *flagsp |= CALLPARSER_STATEMENT; + OP *arg_assign = NULL, *block, *code, *name; floor = start_subparse(0, CVf_ANON); lex_read_space(0); - function_name = parse_idword(""); + if (isIDFIRST(*(PL_parser->bufptr))) { + function_name = parse_idword(""); + } lex_read_space(0); if (lex_peek_unichar(0) == '(') { @@ -209,10 +209,16 @@ static OP *parse_fun(pTHX_ GV *namegv, SV *psobj, U32 *flagsp) code = newANONSUB(floor, NULL, block); - SvREFCNT_inc(function_name); - return newLISTOP(OP_LIST, 0, - newSVOP(OP_CONST, 0, function_name), - code); + if (function_name) { + SvREFCNT_inc(function_name); + name = newSVOP(OP_CONST, 0, function_name); + *flagsp |= CALLPARSER_STATEMENT; + } + else { + name = newOP(OP_UNDEF, 0); + } + + return newLISTOP(OP_LIST, 0, name, code); } -- cgit v1.2.3-54-g00ecf