From 4524780d1795e750e23896866eb447be2670ddcd Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Mon, 9 Sep 2019 09:37:06 -0700 Subject: Revert "Reverting node marking until I can fix GC problem." This reverts commit 092f31e7e23c0ee04df987f0c0f979d036971804. --- parse.y | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) (limited to 'parse.y') diff --git a/parse.y b/parse.y index a3b3cd7224..7e2cfe0854 100644 --- a/parse.y +++ b/parse.y @@ -298,9 +298,6 @@ struct parser_params { #endif }; -#define new_tmpbuf() \ - (rb_imemo_tmpbuf_t *)add_mark_object(p, rb_imemo_tmpbuf_auto_free_pointer(NULL)) - #define intern_cstr(n,l,en) rb_intern3(n,l,en) #define STR_NEW(ptr,len) rb_enc_str_new((ptr),(len),p->enc) @@ -347,7 +344,11 @@ add_mark_object(struct parser_params *p, VALUE obj) && !RB_TYPE_P(obj, T_NODE) /* Ripper jumbles NODE objects and other objects... */ #endif ) { +#ifdef RIPPER rb_ast_add_mark_object(p->ast, obj); +#else + RB_OBJ_WRITTEN(p->ast, Qundef, obj); +#endif } return obj; } @@ -2786,10 +2787,11 @@ 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); - rb_imemo_tmpbuf_t *tmpbuf = new_tmpbuf(); - ID *tbl = ALLOC_N(ID, 2); + ID *tbl = ALLOC_N(ID, 3); + VALUE tmpbuf = rb_imemo_tmpbuf_auto_free_pointer(tbl); + RB_OBJ_WRITTEN(p->ast, Qnil, tmpbuf); tbl[0] = 1 /* length of local var table */; tbl[1] = id /* internal id */; - tmpbuf->ptr = (VALUE *)tbl; + tbl[2] = tmpbuf; switch (nd_type($2)) { case NODE_LASGN: @@ -9355,7 +9357,7 @@ yylex(YYSTYPE *lval, YYLTYPE *yylloc, struct parser_params *p) static NODE* node_newnode(struct parser_params *p, enum node_type type, VALUE a0, VALUE a1, VALUE a2, const rb_code_location_t *loc) { - NODE *n = rb_ast_newnode(p->ast); + NODE *n = rb_ast_newnode(p->ast, type); rb_node_init(n, type, a0, a1, a2); @@ -9609,9 +9611,7 @@ literal_concat(struct parser_params *p, NODE *head, NODE *tail, const YYLTYPE *l goto append; } else { - nd_set_type(tail, NODE_LIST); - tail->nd_head = NEW_STR(tail->nd_lit, loc); - list_concat(head, tail); + list_concat(head, NEW_NODE(NODE_LIST, NEW_STR(tail->nd_lit, loc), tail->nd_alen, tail->nd_next, loc)); } break; @@ -11125,10 +11125,11 @@ new_args_tail(struct parser_params *p, NODE *kw_args, ID kw_rest_arg, ID block, int saved_line = p->ruby_sourceline; struct rb_args_info *args; NODE *node; - rb_imemo_tmpbuf_t *tmpbuf = new_tmpbuf(); args = ZALLOC(struct rb_args_info); - tmpbuf->ptr = (VALUE *)args; + VALUE tmpbuf = rb_imemo_tmpbuf_auto_free_pointer(args); + args->imemo = tmpbuf; + RB_OBJ_WRITTEN(p->ast, Qnil, tmpbuf); node = NEW_NODE(NODE_ARGS, 0, 0, args, &NULL_LOC); if (p->error_p) return node; @@ -11234,11 +11235,12 @@ new_array_pattern_tail(struct parser_params *p, NODE *pre_args, int has_rest, ID int saved_line = p->ruby_sourceline; struct rb_ary_pattern_info *apinfo; NODE *node; - rb_imemo_tmpbuf_t *tmpbuf = new_tmpbuf(); apinfo = ZALLOC(struct rb_ary_pattern_info); - tmpbuf->ptr = (VALUE *)apinfo; + VALUE tmpbuf = rb_imemo_tmpbuf_auto_free_pointer(apinfo); node = NEW_NODE(NODE_ARYPTN, 0, 0, apinfo, loc); + apinfo->imemo = tmpbuf; + RB_OBJ_WRITTEN(p->ast, Qnil, tmpbuf); apinfo->pre_args = pre_args; @@ -11623,11 +11625,9 @@ local_tbl(struct parser_params *p) int cnt = cnt_args + cnt_vars; int i, j; ID *buf; - rb_imemo_tmpbuf_t *tmpbuf = new_tmpbuf(); if (cnt <= 0) return 0; - buf = ALLOC_N(ID, cnt + 1); - tmpbuf->ptr = (void *)buf; + buf = ALLOC_N(ID, cnt + 2); 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) { @@ -11636,9 +11636,13 @@ local_tbl(struct parser_params *p) buf[j++] = id; } } - if (--j < cnt) tmpbuf->ptr = (void *)REALLOC_N(buf, ID, (cnt = j) + 1); + if (--j < cnt) REALLOC_N(buf, ID, (cnt = j) + 2); buf[0] = cnt; + VALUE tmpbuf = rb_imemo_tmpbuf_auto_free_pointer(buf); + buf[cnt + 1] = (ID)tmpbuf; + RB_OBJ_WRITTEN(p->ast, Qnil, tmpbuf); + return buf; } #endif -- cgit v1.2.3