From: nobuyoshi nakada Date: 2005-07-13T18:08:15+09:00 Subject: [ruby-dev:26530] removing static variables in parse.y なかだです。 スレッドセーフ化の準備というわけでもないですが、parse.yから static変数を減らしてみました。といっても、実際には ruby__end__seenとruby_debug_linesだけですが。 あとはシンボルテーブルですが、実行環境を完全に独立させるわけで もない限り、これは共有すべきでしょう。 Sydneyはそこまで分けようとしてるのかな? Objectまで分けてるとこ ろを見ると。 Index: Makefile.in =================================================================== RCS file: /cvs/ruby/src/ruby/Makefile.in,v retrieving revision 1.72 diff -U2 -p -r1.72 Makefile.in --- Makefile.in 20 Apr 2005 14:22:57 -0000 1.72 +++ Makefile.in 13 Jul 2005 07:56:49 -0000 @@ -155,5 +155,5 @@ $(srcdir)/configure: $(srcdir)/configure lex.c: keywords @-$(RM) $@ - gperf -p -j1 -i 1 -g -o -t -N rb_reserved_word -k1,3,$$ $? > $@ || \ + gperf -C -p -j1 -i 1 -g -o -t -N rb_reserved_word -k1,3,$$ $? > $@ || \ cp "$(srcdir)/$@" . Index: keywords =================================================================== RCS file: /cvs/ruby/src/ruby/keywords,v retrieving revision 1.9 diff -U2 -p -r1.9 keywords --- keywords 8 Feb 2005 13:38:49 -0000 1.9 +++ keywords 13 Jul 2005 08:01:02 -0000 @@ -1,4 +1,4 @@ struct kwtable {char *name; int id[2]; enum lex_state_e state;}; -struct kwtable *rb_reserved_word _((const char *, unsigned int)); +const struct kwtable *rb_reserved_word _((const char *, unsigned int)); #ifndef RIPPER Index: lex.c =================================================================== RCS file: /cvs/ruby/src/ruby/lex.c,v retrieving revision 1.13 diff -U2 -p -r1.13 lex.c --- lex.c 8 Feb 2005 13:39:47 -0000 1.13 +++ lex.c 13 Jul 2005 08:01:11 -0000 @@ -1,6 +1,6 @@ /* C code produced by gperf version 2.7.2 */ -/* Command-line: gperf -p -j1 -i 1 -g -o -t -N rb_reserved_word -k'1,3,$' keywords */ +/* Command-line: gperf -C -p -j1 -i 1 -g -o -t -N rb_reserved_word -k'1,3,$' keywords */ struct kwtable {char *name; int id[2]; enum lex_state_e state;}; -struct kwtable *rb_reserved_word _((const char *, unsigned int)); +const struct kwtable *rb_reserved_word _((const char *, unsigned int)); #ifndef RIPPER ; @@ -25,5 +25,5 @@ hash (str, len) register unsigned int len; { - static unsigned char asso_values[] = + static const unsigned char asso_values[] = { 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, @@ -72,10 +72,10 @@ hash (str, len) __inline #endif -struct kwtable * +const struct kwtable * rb_reserved_word (str, len) register const char *str; register unsigned int len; { - static struct kwtable wordlist[] = + static const struct kwtable wordlist[] = { {""}, {""}, {""}, {""}, {""}, {""}, Index: node.h =================================================================== RCS file: /cvs/ruby/src/ruby/node.h,v retrieving revision 1.66 diff -U2 -p -r1.66 node.h --- node.h 16 Mar 2005 15:18:02 -0000 1.66 +++ node.h 13 Jul 2005 07:25:00 -0000 @@ -351,4 +351,11 @@ typedef struct RNode { #define NOEX_UNDEF NOEX_NOSUPER +VALUE rb_parser_new _((void)); +VALUE rb_parser_end_seen_p _((VALUE)); + +NODE *rb_parser_compile_cstr _((volatile VALUE, const char*, const char*, int, int)); +NODE *rb_parser_compile_string _((volatile VALUE, const char*, VALUE, int)); +NODE *rb_parser_compile_file _((volatile VALUE, const char*, VALUE, int)); + NODE *rb_compile_cstr _((const char*, const char*, int, int)); NODE *rb_compile_string _((const char*, VALUE, int)); Index: parse.y =================================================================== RCS file: /cvs/ruby/src/ruby/parse.y,v retrieving revision 1.388 diff -U2 -p -r1.388 parse.y --- parse.y 28 Jun 2005 13:08:32 -0000 1.388 +++ parse.y 13 Jul 2005 08:00:38 -0000 @@ -144,11 +144,12 @@ struct parser_params { VALUE (*parser_lex_gets) _((struct parser_params*,VALUE)); struct local_vars *parser_lvtbl; + int parser_ruby__end__seen; #ifndef RIPPER /* Ruby core only */ NODE *parser_eval_tree_begin; NODE *parser_eval_tree; + VALUE debug_lines; #else /* Ripper only */ - int parser_ruby__end__seen; int parser_ruby_sourceline; VALUE parser_ruby_sourcefile; @@ -199,8 +200,10 @@ static int parser_yyerror _((struct pars #define lex_gets (parser->parser_lex_gets) #define lvtbl (parser->parser_lvtbl) -#ifdef RIPPER #define ruby__end__seen (parser->parser_ruby__end__seen) +#ifdef RIPPER #define ruby_sourceline (parser->parser_ruby_sourceline) #define ruby_sourcefile (parser->parser_ruby_sourcefile) +#else +#define ruby_debug_lines (parser->debug_lines) #endif @@ -4438,7 +4441,4 @@ static void parser_prepare _((struct par #ifndef RIPPER -int ruby__end__seen; -static VALUE ruby_debug_lines; - static NODE* yycompile(parser, f, line) @@ -4547,5 +4547,16 @@ rb_compile_string(f, s, line) int line; { - VALUE volatile vparser = rb_parser_s_new(); + VALUE volatile vparser = rb_parser_new(); + + return rb_parser_compile_string(vparser, f, s, line); +} + +NODE* +rb_parser_compile_string(vparser, f, s, line) + volatile VALUE vparser; + const char *f; + VALUE s; + int line; +{ struct parser_params *parser; @@ -4568,4 +4579,13 @@ rb_compile_cstr(f, s, len, line) } +NODE* +rb_parser_compile_cstr(vparser, f, s, len, line) + volatile VALUE vparser; + const char *f, *s; + int len, line; +{ + return rb_parser_compile_string(vparser, f, rb_str_new(s, len), line); +} + static VALUE lex_io_gets _((struct parser_params *, VALUE)); static VALUE @@ -4583,5 +4603,16 @@ rb_compile_file(f, file, start) int start; { - VALUE volatile vparser = rb_parser_s_new(); + VALUE volatile vparser = rb_parser_new(); + + return rb_parser_compile_file(vparser, f, file, start); +} + +NODE* +rb_parser_compile_file(vparser, f, file, start) + volatile VALUE vparser; + const char *f; + VALUE file; + int start; +{ struct parser_params *parser; @@ -6670,5 +6701,5 @@ parser_yylex(parser) if (lex_state != EXPR_DOT) { - struct kwtable *kw; + const struct kwtable *kw; /* See if it is a reserved word. */ @@ -8156,5 +8187,4 @@ void rb_gc_mark_parser() { - rb_gc_mark(ruby_debug_lines); } @@ -8208,5 +8238,5 @@ rb_parser_while_loop(node, chop, split) } -static struct { +static const struct { ID token; char *name; @@ -8254,20 +8284,21 @@ static struct { }; -static st_table *sym_tbl; -static st_table *sym_rev_tbl; +static struct symbols { + ID last_id; + st_table *tbl; + st_table *rev; +} global_symbols = {tLAST_TOKEN}; void Init_sym() { - sym_tbl = st_init_strtable_with_size(200); - sym_rev_tbl = st_init_numtable_with_size(200); + global_symbols.tbl = st_init_strtable_with_size(200); + global_symbols.rev = st_init_numtable_with_size(200); } -static ID last_id = tLAST_TOKEN; - static ID internal_id() { - return ID_INTERNAL | (++last_id << ID_SCOPE_SHIFT); + return ID_INTERNAL | (++global_symbols.last_id << ID_SCOPE_SHIFT); } @@ -8280,5 +8311,5 @@ rb_intern(name) int last; - if (st_lookup(sym_tbl, (st_data_t)name, (st_data_t *)&id)) + if (st_lookup(global_symbols.tbl, (st_data_t)name, (st_data_t *)&id)) return id; @@ -8340,9 +8371,9 @@ rb_intern(name) } if (*m) id = ID_JUNK; - id |= ++last_id << ID_SCOPE_SHIFT; + id |= ++global_symbols.last_id << ID_SCOPE_SHIFT; id_regist: name = strdup(name); - st_add_direct(sym_tbl, (st_data_t)name, id); - st_add_direct(sym_rev_tbl, id, (st_data_t)name); + st_add_direct(global_symbols.tbl, (st_data_t)name, id); + st_add_direct(global_symbols.rev, id, (st_data_t)name); return id; } @@ -8363,5 +8394,5 @@ rb_id2name(id) } - if (st_lookup(sym_rev_tbl, id, (st_data_t *)&name)) + if (st_lookup(global_symbols.rev, id, (st_data_t *)&name)) return name; @@ -8416,7 +8447,7 @@ VALUE rb_sym_all_symbols() { - VALUE ary = rb_ary_new2(sym_tbl->num_entries); + VALUE ary = rb_ary_new2(global_symbols.tbl->num_entries); - st_foreach(sym_tbl, symbols_i, ary); + st_foreach(global_symbols.tbl, symbols_i, ary); return ary; } @@ -8467,5 +8498,5 @@ special_local_set(c, val) VALUE val; { - VALUE volatile vparser = rb_parser_s_new(); + VALUE volatile vparser = rb_parser_new(); struct parser_params *parser; int cnt; @@ -8549,4 +8580,5 @@ parser_initialize(parser) parser->parser_lex_pend = 0; parser->parser_lvtbl = 0; + parser->parser_ruby__end__seen = 0; #ifndef RIPPER parser->parser_eval_tree_begin = 0; @@ -8574,4 +8606,5 @@ parser_mark(ptr) rb_gc_mark((VALUE)p->parser_eval_tree_begin) ; rb_gc_mark((VALUE)p->parser_eval_tree) ; + rb_gc_mark(p->debug_lines); #else rb_gc_mark(p->parser_ruby_sourcefile); @@ -8613,6 +8646,6 @@ parser_new() } -static VALUE -rb_parser_s_new() +VALUE +rb_parser_new() { struct parser_params *p = parser_new(); @@ -8622,4 +8655,21 @@ rb_parser_s_new() #endif +/* + * call-seq: + * ripper#end_seen? -> Boolean + * + * Return if parsed source ended by +\_\_END\_\_+. + * This number starts from 1. + */ +VALUE +rb_parser_end_seen_p(vparser) + VALUE vparser; +{ + struct parser_params *parser; + + Data_Get_Struct(vparser, struct parser_params, parser); + return ruby__end__seen ? Qtrue : Qfalse; +} + #ifdef RIPPER #ifdef RIPPER_DEBUG @@ -8973,5 +9023,4 @@ ripper_initialize(argc, argv, self) parser->parser_ruby_sourcefile = fname; parser->parser_ruby_sourceline = NIL_P(lineno) ? 0 : NUM2INT(lineno) - 1; - parser->parser_ruby__end__seen = 0; return Qnil; @@ -9144,4 +9193,5 @@ Init_ripper() rb_define_method(Ripper, "column", ripper_column, 0); rb_define_method(Ripper, "lineno", ripper_lineno, 0); + rb_define_method(Ripper, "end_seen?", rb_parser_end_seen_p, 0); #ifdef RIPPER_DEBUG rb_define_method(rb_mKernel, "assert_Qundef", ripper_assert_Qundef, 2); Index: ruby.c =================================================================== RCS file: /cvs/ruby/src/ruby/ruby.c,v retrieving revision 1.104 diff -U2 -p -r1.104 ruby.c --- ruby.c 28 Jun 2005 13:08:32 -0000 1.104 +++ ruby.c 13 Jul 2005 07:13:07 -0000 @@ -389,5 +389,5 @@ require_libraries() ruby_current_node = 0; - rb_protect((VALUE (*)(VALUE))rb_require, (VALUE)list->name, &state); + rb_protect((VALUE (*)_((VALUE)))rb_require, (VALUE)list->name, &state); if (state) rb_jump_tag(state); tmp = list->next; @@ -865,6 +865,4 @@ proc_options(argc, argv) } -extern int ruby__end__seen; - static void load_file(fname, script) @@ -873,4 +871,5 @@ load_file(fname, script) { extern VALUE rb_stdin; + VALUE parser; VALUE f; int line_start = 1; @@ -985,6 +984,7 @@ load_file(fname, script) if (NIL_P(c)) return; } - ruby_eval_tree = rb_compile_file(fname, f, line_start); - if (script && ruby__end__seen) { + parser = rb_parser_new(); + ruby_eval_tree = rb_parser_compile_file(parser, fname, f, line_start); + if (script && rb_parser_end_seen_p(parser)) { rb_define_global_const("DATA", f); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦