[ruby-dev:26530] removing static variables in parse.y
From:
nobuyoshi nakada <nobuyoshi.nakada@...>
Date:
2005-07-13 09:08:15 UTC
List:
ruby-dev #26530
なかだです。
スレッドセーフ化の準備というわけでもないですが、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はできる。
中田 伸悦