static SV *parser_fn(OP *(fn)(pTHX_ U32), bool named) { I32 floor; CV *code; U8 errors; ENTER; PL_curcop = &PL_compiling; SAVEVPTR(PL_op); SAVEI8(PL_parser->error_count); PL_parser->error_count = 0; floor = start_subparse(0, named ? 0 : CVf_ANON); code = newATTRSUB(floor, NULL, NULL, NULL, fn(aTHX_ 0)); errors = PL_parser->error_count; LEAVE; if (errors) { ++PL_parser->error_count; return newSV(0); } else { if (CvCLONE(code)) { code = cv_clone(code); } return newRV_inc((SV*)code); } }
CV * Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block) { return newATTRSUB(floor, o, proto, NULL, block); }