[前][次][番号順一覧][スレッド一覧]

ruby-changes:57572

From: Aaron <ko1@a...>
Date: Fri, 6 Sep 2019 03:05:04 +0900 (JST)
Subject: [ruby-changes:57572] 8f096226e1 (master): Stash tmpbuffer inside internal structs

https://git.ruby-lang.org/ruby.git/commit/?id=8f096226e1

From 8f096226e1b76f95f4d853d3dea2bc75eeeb5244 Mon Sep 17 00:00:00 2001
From: Aaron Patterson <tenderlove@r...>
Date: Thu, 5 Sep 2019 11:04:43 -0700
Subject: Stash tmpbuffer inside internal structs

I guess those AST node were actually used for something, so we'd better
not touch them.  Instead this commit just puts the tmpbuffer inside a
different internal struct so that we can mark them.

diff --git a/node.c b/node.c
index 7c73bb8..d844473 100644
--- a/node.c
+++ b/node.c
@@ -1265,6 +1265,16 @@ mark_ast_value(void *ctx, NODE * node) https://github.com/ruby/ruby/blob/trunk/node.c#L1265
             }
             break;
         }
+        case NODE_ARYPTN:
+        {
+            struct rb_ary_pattern_info *apinfo = node->nd_apinfo;
+            rb_gc_mark(apinfo->imemo);
+        }
+        case NODE_ARGS:
+        {
+            struct rb_args_info *args = node->nd_ainfo;
+            rb_gc_mark(args->imemo);
+        }
         case NODE_LIT:
         case NODE_STR:
         case NODE_XSTR:
@@ -1272,8 +1282,6 @@ mark_ast_value(void *ctx, NODE * node) https://github.com/ruby/ruby/blob/trunk/node.c#L1282
         case NODE_DXSTR:
         case NODE_DREGX:
         case NODE_DSYM:
-        case NODE_ARGS:
-        case NODE_ARYPTN:
             rb_gc_mark(node->nd_lit);
             break;
         default:
diff --git a/node.h b/node.h
index 4e78b0f..220438e 100644
--- a/node.h
+++ b/node.h
@@ -452,12 +452,14 @@ struct rb_args_info { https://github.com/ruby/ruby/blob/trunk/node.h#L452
 
     NODE *opt_args;
     int no_kwarg;
+    VALUE imemo;
 };
 
 struct rb_ary_pattern_info {
     NODE *pre_args;
     NODE *rest_arg;
     NODE *post_args;
+    VALUE imemo;
 };
 
 struct parser_params;
diff --git a/parse.y b/parse.y
index 7a0bbe0..29b8628 100644
--- a/parse.y
+++ b/parse.y
@@ -11128,8 +11128,9 @@ new_args_tail(struct parser_params *p, NODE *kw_args, ID kw_rest_arg, ID block, https://github.com/ruby/ruby/blob/trunk/parse.y#L11128
 
     args = ZALLOC(struct rb_args_info);
     VALUE tmpbuf = rb_imemo_tmpbuf_auto_free_pointer(args);
+    args->imemo = tmpbuf;
     RB_OBJ_WRITTEN(p->ast, Qnil, tmpbuf);
-    node = NEW_NODE(NODE_ARGS, tmpbuf, 0, args, &NULL_LOC);
+    node = NEW_NODE(NODE_ARGS, 0, 0, args, &NULL_LOC);
     if (p->error_p) return node;
 
     args->block_arg      = block;
@@ -11237,7 +11238,8 @@ new_array_pattern_tail(struct parser_params *p, NODE *pre_args, int has_rest, ID https://github.com/ruby/ruby/blob/trunk/parse.y#L11238
 
     apinfo = ZALLOC(struct rb_ary_pattern_info);
     VALUE tmpbuf = rb_imemo_tmpbuf_auto_free_pointer(apinfo);
-    node = NEW_NODE(NODE_ARYPTN, tmpbuf, 0, apinfo, loc);
+    node = NEW_NODE(NODE_ARYPTN, 0, 0, apinfo, loc);
+    apinfo->imemo = tmpbuf;
     RB_OBJ_WRITTEN(p->ast, Qnil, tmpbuf);
 
     apinfo->pre_args = pre_args;
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]