[#24536] 「Rubyの落し方」 v.s. ruby_1_8 — akira yamada / やまだあきら <akira@...>

<URL:http://jp.rubyist.net/magazine/?0002-RubyCore>

40 messages 2004/10/20
[#24541] Re: 「Rubyの落し方」 v.s. ruby_1_8 — Yukihiro Matsumoto <matz@...> 2004/10/20

まつもと ゆきひろです

[#24599] 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/26

2004-10-20 (水) の 21:38 +0900 に Yukihiro Matsumoto さんは書きました:

[#24605] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-26 (火) の 16:16 +0900 に akira yamada / やまだあきら さんは書きました:

[#24606] Re: 1.8.2 preview3? — Yukihiro Matsumoto <matz@...> 2004/10/27

まつもと ゆきひろです

[#24608] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 11:48 +0900 に Yukihiro Matsumoto さんは書きました:

[#24620] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 12:42 +0900 に akira yamada / やまだあきら さんは書きました:

[#24629] Re: 1.8.2 preview3? — Tanaka Akira <akr@...17n.org> 2004/10/29

In article <1098888819.9446.14.camel@rice.p.arika.org>,

[ruby-dev:24391] reentrant lvtbl

From: nobu@...
Date: 2004-10-02 08:22:35 UTC
List: ruby-dev #24391
なかだです。

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はできる。
    中田 伸悦

In This Thread

Prev Next