From 35ba2783fe6b3316a6bbc6f00bf975ad7185d6e0 Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Thu, 23 Jul 2020 16:00:28 -0700 Subject: Use a linked list to eliminate imemo tmp bufs for managing local tables This patch changes local table memory to be managed by a linked list rather than via the garbage collector. It reduces allocations from the GC and also fixes a use-after-free bug in the concurrent-with-sweep compactor I'm working on. --- parse.y | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) (limited to 'parse.y') diff --git a/parse.y b/parse.y index ab71469a06..b29e7190eb 100644 --- a/parse.y +++ b/parse.y @@ -3050,11 +3050,9 @@ primary : literal ID id = internal_id(p); NODE *m = NEW_ARGS_AUX(0, 0, &NULL_LOC); NODE *args, *scope, *internal_var = NEW_DVAR(id, &@2); - VALUE tmpbuf = rb_imemo_tmpbuf_auto_free_pointer(); ID *tbl = ALLOC_N(ID, 3); - rb_imemo_tmpbuf_set_ptr(tmpbuf, tbl); tbl[0] = 1 /* length of local var table */; tbl[1] = id /* internal id */; - tbl[2] = tmpbuf; + rb_ast_add_local_table(p->ast, tbl); switch (nd_type($2)) { case NODE_LASGN: @@ -3074,7 +3072,6 @@ primary : literal /* {|*internal_id| = internal_id; ... } */ args = new_args(p, m, 0, id, 0, new_args_tail(p, 0, 0, 0, &@2), &@2); scope = NEW_NODE(NODE_SCOPE, tbl, $5, args, &@$); - RB_OBJ_WRITTEN(p->ast, Qnil, tmpbuf); $$ = NEW_FOR($4, scope, &@$); fixpos($$, $2); /*% %*/ @@ -12037,12 +12034,9 @@ local_tbl(struct parser_params *p) int cnt = cnt_args + cnt_vars; int i, j; ID *buf; - VALUE tbl = 0; if (cnt <= 0) return 0; - tbl = rb_imemo_tmpbuf_auto_free_pointer(); buf = ALLOC_N(ID, cnt + 2); - rb_imemo_tmpbuf_set_ptr(tbl, buf); MEMCPY(buf+1, p->lvtbl->args->tbl, ID, cnt_args); /* remove IDs duplicated to warn shadowing */ for (i = 0, j = cnt_args+1; i < cnt_vars; ++i) { @@ -12053,11 +12047,9 @@ local_tbl(struct parser_params *p) } if (--j < cnt) { REALLOC_N(buf, ID, (cnt = j) + 2); - rb_imemo_tmpbuf_set_ptr(tbl, buf); } buf[0] = cnt; - buf[cnt + 1] = (ID)tbl; - RB_OBJ_WRITTEN(p->ast, Qnil, tbl); + rb_ast_add_local_table(p->ast, buf); return buf; } -- cgit v1.2.3