summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y40
1 files changed, 22 insertions, 18 deletions
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