From: nobu@... Date: 2004-10-02T17:22:35+09:00 Subject: [ruby-dev:24391] reentrant lvtbl なかだです。 lvtbl も parser_params に移動させてみました。 Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.347 diff -U2 -p -d -r1.347 parse.y --- parse.y 27 Sep 2004 06:02:27 -0000 1.347 +++ parse.y 2 Oct 2004 07:48:59 -0000 @@ -97,4 +97,13 @@ union tmpyystype { }; +struct local_vars { + ID *tbl; + int nofree; + int cnt; + int dlev; + struct RVarmap* dyna_vars; + struct local_vars *prev; +}; + /* Structure of Lexer Buffer: @@ -141,4 +150,5 @@ struct parser_params { int parser_lex_gets_ptr; VALUE (*parser_lex_gets) _((struct parser_params*,VALUE)); + struct local_vars *parser_lvtbl; #ifdef RIPPER int parser_ruby__end__seen; @@ -184,4 +194,5 @@ static int parser_yyerror _((struct pars #define lex_gets_ptr (parser->parser_lex_gets_ptr) #define lex_gets (parser->parser_lex_gets) +#define lvtbl (parser->parser_lvtbl) #ifdef RIPPER #define ruby__end__seen (parser->parser_ruby__end__seen) @@ -235,5 +246,6 @@ static NODE *new_super(); static NODE *new_yield(); -static NODE *gettable(); +static NODE *gettable_gen _((struct parser_params*,ID)); +#define gettable(id) gettable_gen(parser,id) static NODE *assignable_gen _((struct parser_params*,ID,NODE*)); #define assignable(id,node) assignable_gen(parser, id, node) @@ -250,20 +262,36 @@ static NODE *match_op_gen _((struct pars #define match_op(node1,node2) match_op_gen(parser, node1, node2) -static void local_push(); -static void local_pop(); -static int local_append(); -static int local_cnt(); -static int local_id(); -static ID *local_tbl(); -static ID internal_id(); +static void local_push_gen _((struct parser_params*,int)); +#define local_push(top) local_push_gen(parser,top) +static void local_pop_gen _((struct parser_params*)); +#define local_pop() local_pop_gen(parser) +static int local_append_gen _((struct parser_params*, ID)); +#define local_append(id) local_append_gen(parser, id) +static int local_cnt_gen _((struct parser_params*, ID)); +#define local_cnt(id) local_cnt_gen(parser, id) +static int local_id_gen _((struct parser_params*, ID)); +#define local_id(id) local_id_gen(parser, id) +static ID *local_tbl_gen _((struct parser_params*)); +#define local_tbl() local_tbl_gen(parser) +static ID internal_id _((void)); -static struct RVarmap *dyna_push(); -static void dyna_pop(); -static int dyna_in_block(); -static NODE *dyna_init(); +static struct RVarmap *dyna_push_gen _((struct parser_params*)); +#define dyna_push() dyna_push_gen(parser) +static void dyna_pop_gen _((struct parser_params*, struct RVarmap*)); +#define dyna_pop(vars) dyna_pop_gen(parser, vars) +static int dyna_in_block_gen _((struct parser_params*)); +#define dyna_in_block() dyna_in_block_gen(parser) +static NODE *dyna_init_gen _((struct parser_params*, NODE*, struct RVarmap *)); +#define dyna_init(node, pre) dyna_init_gen(parser, node, pre) -static void top_local_init(); -static void top_local_setup(); +static void top_local_init_gen _((struct parser_params*)); +#define top_local_init() top_local_init_gen(parser) +static void top_local_setup_gen _((struct parser_params*)); +#define top_local_setup() top_local_setup_gen(parser) +#else +#define remove_begin(node) (node) #endif /* !RIPPER */ +static int lvar_defined_gen _((struct parser_params*, ID)); +#define lvar_defined(id) lvar_defined_gen(parser, id) #define RE_OPTION_ONCE 0x80 @@ -4801,5 +4829,5 @@ dispose_string(str) VALUE str; { - free(RSTRING(str)->ptr); + xfree(RSTRING(str)->ptr); rb_gc_force_recycle(str); } @@ -5171,5 +5199,6 @@ ripper_arg_ambiguous(parser) static int -lvar_defined(id) +lvar_defined_gen(parser, id) + struct parser_params *parser; ID id; { @@ -6511,4 +6540,8 @@ block_append(head, tail) case NODE_LIT: case NODE_STR: + case NODE_SELF: + case NODE_TRUE: + case NODE_FALSE: + case NODE_NIL: parser_warning(h, "unused literal ignored"); return tail; @@ -6731,5 +6764,6 @@ match_op_gen(parser, node1, node2) static NODE* -gettable(id) +gettable_gen(parser, id) + struct parser_params *parser; ID id; { @@ -7527,15 +7561,7 @@ new_super(a) } -static struct local_vars { - ID *tbl; - int nofree; - int cnt; - int dlev; - struct RVarmap* dyna_vars; - struct local_vars *prev; -} *lvtbl; - static void -local_push(top) +local_push_gen(parser, top) + struct parser_params *parser; int top; { @@ -7558,19 +7584,21 @@ local_push(top) static void -local_pop() +local_pop_gen(parser) + struct parser_params *parser; { struct local_vars *local = lvtbl->prev; if (lvtbl->tbl) { - if (!lvtbl->nofree) free(lvtbl->tbl); + if (!lvtbl->nofree) xfree(lvtbl->tbl); else lvtbl->tbl[0] = lvtbl->cnt; } ruby_dyna_vars = lvtbl->dyna_vars; - free(lvtbl); + xfree(lvtbl); lvtbl = local; } static ID* -local_tbl() +local_tbl_gen(parser) + struct parser_params *parser; { lvtbl->nofree = 1; @@ -7579,5 +7607,6 @@ local_tbl() static int -local_append(id) +local_append_gen(parser, id) + struct parser_params *parser; ID id; { @@ -7600,5 +7629,6 @@ local_append(id) static int -local_cnt(id) +local_cnt_gen(parser, id) + struct parser_params *parser; ID id; { @@ -7614,5 +7644,6 @@ local_cnt(id) static int -local_id(id) +local_id_gen(parser, id) + struct parser_params *parser; ID id; { @@ -7627,5 +7658,6 @@ local_id(id) static void -top_local_init() +top_local_init_gen(parser) + struct parser_params *parser; { local_push(1); @@ -7645,5 +7677,6 @@ top_local_init() static void -top_local_setup() +top_local_setup_gen(parser) + struct parser_params *parser; { int len = lvtbl->cnt; @@ -7675,5 +7708,5 @@ top_local_setup() } if (ruby_scope->local_tbl && ruby_scope->local_vars[-1] == 0) { - free(ruby_scope->local_tbl); + xfree(ruby_scope->local_tbl); } ruby_scope->local_vars[-1] = 0; @@ -7685,5 +7718,6 @@ top_local_setup() static struct RVarmap* -dyna_push() +dyna_push_gen(parser) + struct parser_params *parser; { struct RVarmap* vars = ruby_dyna_vars; @@ -7695,5 +7729,6 @@ dyna_push() static void -dyna_pop(vars) +dyna_pop_gen(parser, vars) + struct parser_params *parser; struct RVarmap* vars; { @@ -7703,5 +7738,6 @@ dyna_pop(vars) static int -dyna_in_block() +dyna_in_block_gen(parser) + struct parser_params *parser; { return (lvtbl->dlev > 0); @@ -7709,5 +7745,6 @@ dyna_in_block() static NODE * -dyna_init(node, pre) +dyna_init_gen(parser, node, pre) + struct parser_params *parser; NODE *node; struct RVarmap *pre; @@ -8036,4 +8073,5 @@ special_local_set(c, val) { int cnt; + struct parser_params *parser = parser_new(); top_local_init(); @@ -8119,4 +8157,5 @@ parser_initialize(parser) parser->parser_lex_p = 0; parser->parser_lex_pend = 0; + parser->parser_lvtbl = 0; #ifdef RIPPER parser->parser_ruby_sourcefile = Qnil; @@ -8151,9 +8190,16 @@ parser_free(ptr) { struct parser_params *p = (struct parser_params*)ptr; + struct local_vars *local, *prev; if (p->parser_tokenbuf) { - free(p->parser_tokenbuf); + xfree(p->parser_tokenbuf); } - free(p); + for (local = p->parser_lvtbl; local; local = prev) { + if (local->tbl && !local->nofree) + xfree(local->tbl); + prev = local->prev; + xfree(local); + } + xfree(p); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦