Author: petdance Date: Fri Feb 22 21:20:25 2008 New Revision: 26003 Modified: trunk/compilers/imcc/imcc.l trunk/compilers/imcc/imclexer.c
Log: unreverted the macro_name str_dup patch. See http://rt.perl.org/rt3/Ticket/Display.html?id=50920 Modified: trunk/compilers/imcc/imcc.l ============================================================================== --- trunk/compilers/imcc/imcc.l (original) +++ trunk/compilers/imcc/imcc.l Fri Feb 22 21:20:25 2008 @@ -517,8 +517,11 @@ } <emit,INITIAL>{DOT}{LETTER}{LETTERDIGIT}* { - const char * const macro_name = yytext + 1; - const int type = pmc_type(interp, string_from_cstring(interp, macro_name, 0)); + /* See http://rt.perl.org/rt3/Ticket/Display.html?id=50920 for the saga of this bug. */ + /* For some reason, we have to dupe the macro name, instead of passing it around. */ + const char * const macro_name = str_dup(yytext + 1); + STRING * name_string = string_from_cstring(interp, macro_name, 0); + const int type = pmc_type(interp, name_string); if (type > 0) { const size_t len = 16; @@ -527,13 +530,17 @@ /* XXX: free valp->s if already used? Sounds like a good idea, but big segfaults if you do. */ valp->s = buf; + mem_sys_free(macro_name); return INTC; } if (!expand_macro(valp, interp, macro_name, yyscanner)) { + mem_sys_free(macro_name); yyless(1); return DOT; } + + mem_sys_free(macro_name); } <emit,INITIAL>{ID} { @@ -943,7 +950,7 @@ { int c, start_line; params_t params; - yyguts_t *yyg = (yyguts_t *)yyscanner; + yyguts_t * const yyg = (yyguts_t *)yyscanner; int start_cond = YY_START; int buffer_size = 0; int buffer_used = 0; @@ -1017,6 +1024,7 @@ ¶ms, IMCC_INFO(interp)->macro_buffer, start_line); mem_sys_free(IMCC_INFO(interp)->macro_buffer); + IMCC_INFO(interp)->macro_buffer = NULL; IMCC_INFO(interp)->cur_macro_name = NULL; return MACRO; @@ -1031,7 +1039,7 @@ if (f->params) { int i; for (i = 0; i < f->params->num_param; i++) { - if (strcmp(f->params->name[i], name) == 0) + if (STREQ(f->params->name[i], name)) return f->expansion.name[i]; } } Modified: trunk/compilers/imcc/imclexer.c ============================================================================== --- trunk/compilers/imcc/imclexer.c (original) +++ trunk/compilers/imcc/imclexer.c Fri Feb 22 21:20:25 2008 @@ -3888,8 +3888,11 @@ YY_RULE_SETUP #line 519 "compilers/imcc/imcc.l" { - const char * const macro_name = yytext + 1; - const int type = pmc_type(interp, string_from_cstring(interp, macro_name, 0)); + /* See http://rt.perl.org/rt3/Ticket/Display.html?id=50920 for the saga of this bug. */ + /* For some reason, we have to dupe the macro name, instead of passing it around. */ + const char * const macro_name = str_dup(yytext + 1); + STRING * name_string = string_from_cstring(interp, macro_name, 0); + const int type = pmc_type(interp, name_string); if (type > 0) { const size_t len = 16; @@ -3898,18 +3901,22 @@ /* XXX: free valp->s if already used? Sounds like a good idea, but big segfaults if you do. */ valp->s = buf; + mem_sys_free(macro_name); return INTC; } if (!expand_macro(valp, interp, macro_name, yyscanner)) { + mem_sys_free(macro_name); yyless(1); return DOT; } + + mem_sys_free(macro_name); } YY_BREAK case 118: YY_RULE_SETUP -#line 539 "compilers/imcc/imcc.l" +#line 546 "compilers/imcc/imcc.l" { if (!is_def) { SymReg *r = find_sym(interp, yytext); @@ -3939,32 +3946,32 @@ YY_BREAK case 119: YY_RULE_SETUP -#line 566 "compilers/imcc/imcc.l" +#line 573 "compilers/imcc/imcc.l" DUP_AND_RET(valp, FLOATC); YY_BREAK case 120: YY_RULE_SETUP -#line 567 "compilers/imcc/imcc.l" +#line 574 "compilers/imcc/imcc.l" DUP_AND_RET(valp, INTC); YY_BREAK case 121: YY_RULE_SETUP -#line 568 "compilers/imcc/imcc.l" +#line 575 "compilers/imcc/imcc.l" DUP_AND_RET(valp, INTC); YY_BREAK case 122: YY_RULE_SETUP -#line 569 "compilers/imcc/imcc.l" +#line 576 "compilers/imcc/imcc.l" DUP_AND_RET(valp, INTC); YY_BREAK case 123: YY_RULE_SETUP -#line 570 "compilers/imcc/imcc.l" +#line 577 "compilers/imcc/imcc.l" DUP_AND_RET(valp, INTC); YY_BREAK case 124: YY_RULE_SETUP -#line 572 "compilers/imcc/imcc.l" +#line 579 "compilers/imcc/imcc.l" { valp->s = str_dup(yytext); @@ -3977,7 +3984,7 @@ YY_BREAK case 125: YY_RULE_SETUP -#line 582 "compilers/imcc/imcc.l" +#line 589 "compilers/imcc/imcc.l" { valp->s = str_dup(yytext); @@ -3987,7 +3994,7 @@ YY_BREAK case 126: YY_RULE_SETUP -#line 589 "compilers/imcc/imcc.l" +#line 596 "compilers/imcc/imcc.l" { macro_frame_t *frame; @@ -4019,7 +4026,7 @@ YY_BREAK case 127: YY_RULE_SETUP -#line 618 "compilers/imcc/imcc.l" +#line 625 "compilers/imcc/imcc.l" { /* charset:"..." */ valp->s = str_dup(yytext); @@ -4030,7 +4037,7 @@ YY_BREAK case 128: YY_RULE_SETUP -#line 626 "compilers/imcc/imcc.l" +#line 633 "compilers/imcc/imcc.l" { if (valp) (valp)->s = yytext; return IREG; @@ -4038,7 +4045,7 @@ YY_BREAK case 129: YY_RULE_SETUP -#line 631 "compilers/imcc/imcc.l" +#line 638 "compilers/imcc/imcc.l" { if (valp) (valp)->s = yytext; return NREG; @@ -4046,7 +4053,7 @@ YY_BREAK case 130: YY_RULE_SETUP -#line 636 "compilers/imcc/imcc.l" +#line 643 "compilers/imcc/imcc.l" { if (valp) (valp)->s = yytext; return SREG; @@ -4054,7 +4061,7 @@ YY_BREAK case 131: YY_RULE_SETUP -#line 641 "compilers/imcc/imcc.l" +#line 648 "compilers/imcc/imcc.l" { if (valp) (valp)->s = yytext; return PREG; @@ -4062,7 +4069,7 @@ YY_BREAK case 132: YY_RULE_SETUP -#line 646 "compilers/imcc/imcc.l" +#line 653 "compilers/imcc/imcc.l" { IMCC_fataly(interp, E_SyntaxError, "'%s' is not a valid register name", yytext); @@ -4070,19 +4077,19 @@ YY_BREAK case 133: YY_RULE_SETUP -#line 652 "compilers/imcc/imcc.l" +#line 659 "compilers/imcc/imcc.l" /* skip */; YY_BREAK case 134: YY_RULE_SETUP -#line 654 "compilers/imcc/imcc.l" +#line 661 "compilers/imcc/imcc.l" { /* catch all except for state macro */ return yytext[0]; } YY_BREAK case YY_STATE_EOF(emit): -#line 659 "compilers/imcc/imcc.l" +#line 666 "compilers/imcc/imcc.l" { BEGIN(INITIAL); @@ -4095,18 +4102,18 @@ } YY_BREAK case YY_STATE_EOF(INITIAL): -#line 670 "compilers/imcc/imcc.l" +#line 677 "compilers/imcc/imcc.l" yyterminate(); YY_BREAK case 135: YY_RULE_SETUP -#line 672 "compilers/imcc/imcc.l" +#line 679 "compilers/imcc/imcc.l" DUP_AND_RET(valp, ENDM); YY_BREAK case 136: /* rule 136 can match eol */ YY_RULE_SETUP -#line 674 "compilers/imcc/imcc.l" +#line 681 "compilers/imcc/imcc.l" { IMCC_INFO(interp)->line++; DUP_AND_RET(valp, '\n'); @@ -4114,12 +4121,12 @@ YY_BREAK case 137: YY_RULE_SETUP -#line 679 "compilers/imcc/imcc.l" +#line 686 "compilers/imcc/imcc.l" return LABEL; YY_BREAK case 138: YY_RULE_SETUP -#line 681 "compilers/imcc/imcc.l" +#line 688 "compilers/imcc/imcc.l" { if (yylex(valp,yyscanner,interp) != LABEL) @@ -4145,7 +4152,7 @@ YY_BREAK case 139: YY_RULE_SETUP -#line 704 "compilers/imcc/imcc.l" +#line 711 "compilers/imcc/imcc.l" { if (valp) { const size_t len = strlen(IMCC_INFO(interp)->cur_macro_name) + yyleng + 12; @@ -4162,39 +4169,39 @@ YY_BREAK case 140: YY_RULE_SETUP -#line 718 "compilers/imcc/imcc.l" +#line 725 "compilers/imcc/imcc.l" /* skip leading ws */; YY_BREAK case 141: YY_RULE_SETUP -#line 719 "compilers/imcc/imcc.l" +#line 726 "compilers/imcc/imcc.l" DUP_AND_RET(valp, ' '); YY_BREAK case 142: YY_RULE_SETUP -#line 720 "compilers/imcc/imcc.l" +#line 727 "compilers/imcc/imcc.l" DUP_AND_RET(valp, IDENTIFIER); YY_BREAK case 143: YY_RULE_SETUP -#line 721 "compilers/imcc/imcc.l" +#line 728 "compilers/imcc/imcc.l" DUP_AND_RET(valp, MACRO); YY_BREAK case 144: YY_RULE_SETUP -#line 722 "compilers/imcc/imcc.l" +#line 729 "compilers/imcc/imcc.l" DUP_AND_RET(valp, yytext[0]); YY_BREAK case YY_STATE_EOF(macro): -#line 723 "compilers/imcc/imcc.l" +#line 730 "compilers/imcc/imcc.l" yyterminate(); YY_BREAK case 145: YY_RULE_SETUP -#line 725 "compilers/imcc/imcc.l" +#line 732 "compilers/imcc/imcc.l" ECHO; YY_BREAK -#line 4198 "compilers/imcc/imclexer.c" +#line 4205 "compilers/imcc/imclexer.c" case YY_STATE_EOF(pod): case YY_STATE_EOF(cmt1): case YY_STATE_EOF(cmt2): @@ -5396,7 +5403,7 @@ #define YYTABLES_NAME "yytables" -#line 725 "compilers/imcc/imcc.l" +#line 732 "compilers/imcc/imcc.l" @@ -5619,7 +5626,7 @@ { int c, start_line; params_t params; - yyguts_t *yyg = (yyguts_t *)yyscanner; + yyguts_t * const yyg = (yyguts_t *)yyscanner; int start_cond = YY_START; int buffer_size = 0; int buffer_used = 0; @@ -5693,6 +5700,7 @@ ¶ms, IMCC_INFO(interp)->macro_buffer, start_line); mem_sys_free(IMCC_INFO(interp)->macro_buffer); + IMCC_INFO(interp)->macro_buffer = NULL; IMCC_INFO(interp)->cur_macro_name = NULL; return MACRO; @@ -5707,7 +5715,7 @@ if (f->params) { int i; for (i = 0; i < f->params->num_param; i++) { - if (strcmp(f->params->name[i], name) == 0) + if (STREQ(f->params->name[i], name)) return f->expansion.name[i]; } }
