diff options
author | yui-knk <[email protected]> | 2024-02-03 00:50:02 +0900 |
---|---|---|
committer | Yuichiro Kaneko <[email protected]> | 2024-02-09 14:20:17 +0900 |
commit | 33c1e082d0807db403a2d93cbf0a094c91179d74 () | |
tree | 84213018f402daec6fc167f206c4c3eb4551b699 | |
parent | f7a407cabda6eb787fb95fc6e3c1b2215b1aec19 (diff) |
Remove ruby object from string nodes
String nodes holds ruby string object on `VALUE nd_lit`. This commit changes it to `struct rb_parser_string *string` to reduce dependency on ruby object. Sometimes these strings are concatenated with other string therefore string concatenate functions are needed.
-rw-r--r-- | ast.c | 5 | ||||
-rw-r--r-- | compile.c | 25 | ||||
-rw-r--r-- | internal/ruby_parser.h | 3 | ||||
-rw-r--r-- | node.c | 38 | ||||
-rw-r--r-- | node_dump.c | 11 | ||||
-rw-r--r-- | parse.y | 634 | ||||
-rw-r--r-- | ruby_parser.c | 28 | ||||
-rw-r--r-- | rubyparser.h | 27 | ||||
-rw-r--r-- | universal_parser.c | 1 |
9 files changed, 595 insertions, 177 deletions
@@ -555,9 +555,10 @@ node_children(rb_ast_t *ast, const NODE *node) return rb_ary_new_from_node_args(ast, 2, RNODE_MATCH3(node)->nd_recv, RNODE_MATCH3(node)->nd_value); case NODE_MATCH: case NODE_LIT: case NODE_STR: case NODE_XSTR: - return rb_ary_new_from_args(1, RNODE_LIT(node)->nd_lit); case NODE_INTEGER: return rb_ary_new_from_args(1, rb_node_integer_literal_val(node)); case NODE_FLOAT: @@ -579,7 +580,7 @@ node_children(rb_ast_t *ast, const NODE *node) head = NEW_CHILD(ast, n->nd_head); next = NEW_CHILD(ast, n->nd_next); } - return rb_ary_new_from_args(3, RNODE_DSTR(node)->nd_lit, head, next); } case NODE_SYM: return rb_ary_new_from_args(1, rb_node_sym_string_val(node)); @@ -838,7 +838,7 @@ get_string_value(const NODE *node) { switch (nd_type(node)) { case NODE_STR: - return RNODE_STR(node)->nd_lit; case NODE_FILE: return rb_node_file_path_val(node); default: @@ -4310,7 +4310,7 @@ static int compile_dstr_fragments(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int *cntp) { const struct RNode_LIST *list = RNODE_DSTR(node)->nd_next; - VALUE lit = RNODE_DSTR(node)->nd_lit; LINK_ELEMENT *first_lit = 0; int cnt = 0; @@ -4331,7 +4331,7 @@ compile_dstr_fragments(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *cons while (list) { const NODE *const head = list->nd_head; if (nd_type_p(head, NODE_STR)) { - lit = rb_fstring(RNODE_STR(head)->nd_lit); ADD_INSN1(ret, head, putobject, lit); RB_OBJ_WRITTEN(iseq, Qundef, lit); lit = Qnil; @@ -4370,7 +4370,7 @@ compile_dstr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node) { int cnt; if (!RNODE_DSTR(node)->nd_next) { - VALUE lit = rb_fstring(RNODE_DSTR(node)->nd_lit); ADD_INSN1(ret, node, putstring, lit); RB_OBJ_WRITTEN(iseq, Qundef, lit); } @@ -4387,14 +4387,13 @@ compile_dregx(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, i int cnt; if (!RNODE_DREGX(node)->nd_next) { - VALUE match = RNODE_DREGX(node)->nd_lit; - if (RB_TYPE_P(match, T_REGEXP)) { - if (!popped) { - ADD_INSN1(ret, node, putobject, match); - RB_OBJ_WRITTEN(iseq, Qundef, match); - } - return COMPILE_OK; } } CHECK(compile_dstr_fragments(iseq, ret, node, &cnt)); @@ -5135,7 +5134,7 @@ rb_node_case_when_optimizable_literal(const NODE *const node) case NODE_LINE: return rb_node_line_lineno_val(node); case NODE_STR: - return rb_fstring(RNODE_STR(node)->nd_lit); case NODE_FILE: return rb_fstring(rb_node_file_path_val(node)); } @@ -10364,7 +10363,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const no } case NODE_XSTR:{ ADD_CALL_RECEIVER(ret, node); - VALUE str = rb_fstring(RNODE_XSTR(node)->nd_lit); ADD_INSN1(ret, node, putobject, str); RB_OBJ_WRITTEN(iseq, Qundef, str); ADD_CALL(ret, node, idBackquote, INT2FIX(1)); @@ -76,7 +76,10 @@ RUBY_SYMBOL_EXPORT_BEGIN VALUE rb_str_new_parser_string(rb_parser_string_t *str); RUBY_SYMBOL_EXPORT_END VALUE rb_node_sym_string_val(const NODE *); VALUE rb_node_line_lineno_val(const NODE *); VALUE rb_node_file_path_val(const NODE *); VALUE rb_node_encoding_val(const NODE *); @@ -172,6 +172,8 @@ struct rb_ast_local_table_link { static void parser_string_free(rb_ast_t *ast, rb_parser_string_t *str) { xfree(str); } @@ -179,9 +181,27 @@ static void free_ast_value(rb_ast_t *ast, void *ctx, NODE *node) { switch (nd_type(node)) { case NODE_SYM: parser_string_free(ast, RNODE_SYM(node)->string); break; case NODE_FILE: parser_string_free(ast, RNODE_FILE(node)->path); break; @@ -251,12 +271,6 @@ nodetype_markable_p(enum node_type type) switch (type) { case NODE_MATCH: case NODE_LIT: - case NODE_STR: - case NODE_XSTR: - case NODE_DSTR: - case NODE_DXSTR: - case NODE_DREGX: - case NODE_DSYM: return true; default: return false; @@ -363,12 +377,6 @@ mark_ast_value(rb_ast_t *ast, void *ctx, NODE *node) switch (nd_type(node)) { case NODE_MATCH: case NODE_LIT: - case NODE_STR: - case NODE_XSTR: - case NODE_DSTR: - case NODE_DXSTR: - case NODE_DREGX: - case NODE_DSYM: rb_gc_mark_movable(RNODE_LIT(node)->nd_lit); break; default: @@ -386,12 +394,6 @@ update_ast_value(rb_ast_t *ast, void *ctx, NODE *node) switch (nd_type(node)) { case NODE_MATCH: case NODE_LIT: - case NODE_STR: - case NODE_XSTR: - case NODE_DSTR: - case NODE_DXSTR: - case NODE_DREGX: - case NODE_DSYM: RNODE_LIT(node)->nd_lit = rb_gc_location(RNODE_LIT(node)->nd_lit); break; default: @@ -707,18 +707,19 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("literal"); ANN("format: [nd_lit]"); ANN("example: :sym, /foo/"); - goto lit; case NODE_STR: ANN("string literal"); ANN("format: [nd_lit]"); ANN("example: 'foo'"); - goto lit; case NODE_XSTR: ANN("xstring literal"); ANN("format: [nd_lit]"); ANN("example: `foo`"); - lit: - F_LIT(nd_lit, RNODE_LIT, "literal"); return; case NODE_INTEGER: @@ -777,7 +778,7 @@ dump_node(VALUE buf, VALUE indent, int comment, const NODE * node) ANN("format: [nd_lit]"); ANN("example: :\"foo#{ bar }baz\""); dlit: - F_LIT(nd_lit, RNODE_DSTR, "preceding string"); if (!RNODE_DSTR(node)->nd_next) return; F_NODE(nd_next->nd_head, RNODE_DSTR, "interpolation"); LAST_NODE; @@ -694,6 +694,8 @@ static void numparam_name(struct parser_params *p, ID id); #define intern_cstr(n,l,en) rb_intern3(n,l,en) #define STR_NEW(ptr,len) rb_enc_str_new((ptr),(len),p->enc) #define STR_NEW0() rb_enc_str_new(0,0,p->enc) #define STR_NEW2(ptr) rb_enc_str_new((ptr),strlen(ptr),p->enc) @@ -1122,11 +1124,11 @@ static rb_node_integer_t * rb_node_integer_new(struct parser_params *p, char* va static rb_node_float_t * rb_node_float_new(struct parser_params *p, char* val, const YYLTYPE *loc); static rb_node_rational_t * rb_node_rational_new(struct parser_params *p, char* val, int base, int seen_point, const YYLTYPE *loc); static rb_node_imaginary_t * rb_node_imaginary_new(struct parser_params *p, char* val, int base, int seen_point, enum rb_numeric_type, const YYLTYPE *loc); -static rb_node_str_t *rb_node_str_new(struct parser_params *p, VALUE nd_lit, const YYLTYPE *loc); -static rb_node_dstr_t *rb_node_dstr_new0(struct parser_params *p, VALUE nd_lit, long nd_alen, NODE *nd_next, const YYLTYPE *loc); -static rb_node_dstr_t *rb_node_dstr_new(struct parser_params *p, VALUE nd_lit, const YYLTYPE *loc); -static rb_node_xstr_t *rb_node_xstr_new(struct parser_params *p, VALUE nd_lit, const YYLTYPE *loc); -static rb_node_dxstr_t *rb_node_dxstr_new(struct parser_params *p, VALUE nd_lit, long nd_alen, NODE *nd_next, const YYLTYPE *loc); static rb_node_evstr_t *rb_node_evstr_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc); static rb_node_once_t *rb_node_once_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc); static rb_node_args_t *rb_node_args_new(struct parser_params *p, const YYLTYPE *loc); @@ -1158,7 +1160,7 @@ static rb_node_errinfo_t *rb_node_errinfo_new(struct parser_params *p, const YYL static rb_node_defined_t *rb_node_defined_new(struct parser_params *p, NODE *nd_head, const YYLTYPE *loc); static rb_node_postexe_t *rb_node_postexe_new(struct parser_params *p, NODE *nd_body, const YYLTYPE *loc); static rb_node_sym_t *rb_node_sym_new(struct parser_params *p, VALUE str, const YYLTYPE *loc); -static rb_node_dsym_t *rb_node_dsym_new(struct parser_params *p, VALUE nd_lit, long nd_alen, NODE *nd_next, const YYLTYPE *loc); static rb_node_attrasgn_t *rb_node_attrasgn_new(struct parser_params *p, NODE *nd_recv, ID nd_mid, NODE *nd_args, const YYLTYPE *loc); static rb_node_lambda_t *rb_node_lambda_new(struct parser_params *p, rb_node_args_t *nd_args, NODE *nd_body, const YYLTYPE *loc); static rb_node_aryptn_t *rb_node_aryptn_new(struct parser_params *p, NODE *pre_args, NODE *rest_arg, NODE *post_args, const YYLTYPE *loc); @@ -1492,9 +1494,9 @@ static rb_ast_id_table_t *local_tbl(struct parser_params*); static VALUE reg_compile(struct parser_params*, VALUE, int); static void reg_fragment_setenc(struct parser_params*, VALUE, int); -static int reg_fragment_check(struct parser_params*, VALUE, int); -static int literal_concat0(struct parser_params *p, VALUE head, VALUE tail); static NODE *heredoc_dedent(struct parser_params*,NODE*); static void check_literal_when(struct parser_params *p, NODE *args, const YYLTYPE *loc); @@ -2130,25 +2132,40 @@ get_nd_args(struct parser_params *p, NODE *node) } #endif #ifndef RIPPER static rb_parser_string_t * rb_parser_string_new(rb_parser_t *p, const char *ptr, long len) { - size_t size; rb_parser_string_t *str; if (len < 0) { rb_bug("negative string size (or size too big): %ld", len); } - size = offsetof(rb_parser_string_t, ptr) + len + 1; - str = xcalloc(1, size); if (ptr) { - memcpy(str->ptr, ptr, len); } - str->len = len; - str->ptr[len] = '\0'; return str; } @@ -2156,6 +2173,7 @@ static rb_parser_string_t * rb_parser_encoding_string_new(rb_parser_t *p, const char *ptr, long len, rb_encoding *enc) { rb_parser_string_t *str = rb_parser_string_new(p, ptr, len); str->enc = enc; return str; } @@ -2164,10 +2182,18 @@ rb_parser_encoding_string_new(rb_parser_t *p, const char *ptr, long len, rb_enco static void rb_parser_string_free(rb_parser_t *p, rb_parser_string_t *str) { xfree(str); } #ifndef RIPPER static char * rb_parser_string_end(rb_parser_string_t *str) { @@ -2179,29 +2205,354 @@ rb_parser_string_set_encoding(rb_parser_string_t *str, rb_encoding *enc) { str->enc = enc; } -long -rb_parser_string_length(rb_parser_string_t *str) { - return str->len; } -char * -rb_parser_string_pointer(rb_parser_string_t *str) { - return str->ptr; } -#endif static rb_encoding * -rb_parser_string_encoding(rb_parser_string_t *str) { - return str->enc; } -#ifndef RIPPER #ifndef UNIVERSAL_PARSER -# define PARSER_STRING_GETMEM(str, ptrvar, lenvar, encvar) \ ((ptrvar) = str->ptr, \ (lenvar) = str->len, \ (encvar) = str->enc) @@ -2213,8 +2564,8 @@ rb_parser_string_hash_cmp(rb_parser_string_t *str1, rb_parser_string_t *str2) const char *ptr1, *ptr2; rb_encoding *enc1, *enc2; - PARSER_STRING_GETMEM(str1, ptr1, len1, enc1); - PARSER_STRING_GETMEM(str2, ptr2, len2, enc2); return (len1 != len2 || enc1 != enc2 || @@ -6001,8 +6352,7 @@ strings : string /*%%%*/ NODE *node = $1; if (!node) { - node = NEW_STR(STR_NEW0(), &@$); - RB_OBJ_WRITTEN(p->ast, Qnil, RNODE_STR(node)->nd_lit); } else { node = evstr2dstr(p, node); @@ -6238,7 +6588,7 @@ regexp_contents: /* none */ case NODE_DSTR: break; default: - head = list_append(p, NEW_DSTR(Qnil, &@$), head); break; } $$ = list_append(p, head, tail); @@ -7140,8 +7490,7 @@ static enum yytokentype here_document(struct parser_params*,rb_strterm_heredoc_t } # define set_yylval_str(x) \ do { \ - set_yylval_node(NEW_STR(x, &_cur_loc)); \ - RB_OBJ_WRITTEN(p->ast, Qnil, x); \ } while(0) # define set_yylval_num(x) (yylval.num = (x)) # define set_yylval_id(x) (yylval.id = (x)) @@ -7460,7 +7809,7 @@ ruby_show_error_line(struct parser_params *p, VALUE errbuf, const YYLTYPE *yyllo const char *pre = "", *post = "", *pend; const char *code = "", *caret = ""; const char *lim; - const char *const pbeg = rb_parser_string_pointer(str); char *buf; long len; int i; @@ -7487,11 +7836,11 @@ ruby_show_error_line(struct parser_params *p, VALUE errbuf, const YYLTYPE *yyllo len = ptr_end - ptr; if (len > 4) { if (ptr > pbeg) { - ptr = rb_enc_prev_char(pbeg, ptr, pt, rb_parser_string_encoding(str)); if (ptr > pbeg) pre = "..."; } if (ptr_end < pend) { - ptr_end = rb_enc_prev_char(pt, ptr_end, pend, rb_parser_string_encoding(str)); if (ptr_end < pend) post = "..."; } } @@ -7510,7 +7859,7 @@ ruby_show_error_line(struct parser_params *p, VALUE errbuf, const YYLTYPE *yyllo rb_str_cat_cstr(mesg, "\n"); } else { - mesg = rb_enc_str_new(0, 0, rb_parser_string_encoding(str)); } if (!errbuf && rb_stderr_tty_p()) { #define CSI_BEGIN "\033[" @@ -8004,8 +8353,8 @@ add_delayed_token(struct parser_params *p, const char *tok, const char *end, int static void set_lastline(struct parser_params *p, rb_parser_string_t *str) { - p->lex.pbeg = p->lex.pcur = rb_parser_string_pointer(str); - p->lex.pend = p->lex.pcur + rb_parser_string_length(str); p->lex.lastline = str; } @@ -9104,8 +9453,8 @@ heredoc_restore(struct parser_params *p, rb_strterm_heredoc_t *here) p->lex.strterm = 0; line = here->lastline; p->lex.lastline = line; - p->lex.pbeg = rb_parser_string_pointer(line); - p->lex.pend = p->lex.pbeg + rb_parser_string_length(line); p->lex.pcur = p->lex.pbeg + here->offset + here->length + here->quote; p->lex.ptok = p->lex.pbeg + here->offset - here->quote; p->heredoc_end = p->ruby_sourceline; @@ -9116,13 +9465,10 @@ heredoc_restore(struct parser_params *p, rb_strterm_heredoc_t *here) } static int -dedent_string(struct parser_params *p, VALUE string, int width) { - char *str; - long len; int i, col = 0; - RSTRING_GETMEM(string, str, len); for (i = 0; i < len && col < width; i++) { if (str[i] == ' ') { col++; @@ -9136,23 +9482,39 @@ dedent_string(struct parser_params *p, VALUE string, int width) break; } } if (!i) return 0; - rb_str_modify(string); - str = RSTRING_PTR(string); - if (RSTRING_LEN(string) != len) - rb_fatal("literal string changed: %+"PRIsVALUE, string); MEMMOVE(str, str + i, char, len - i); - rb_str_set_len(string, len - i); return i; } -#ifndef RIPPER static NODE * heredoc_dedent(struct parser_params *p, NODE *root) { NODE *node, *str_node, *prev_node; int indent = p->heredoc_indent; - VALUE prev_lit = 0; if (indent <= 0) return root; p->heredoc_indent = 0; @@ -9162,7 +9524,7 @@ heredoc_dedent(struct parser_params *p, NODE *root) if (nd_type_p(root, NODE_LIST)) str_node = RNODE_LIST(root)->nd_head; while (str_node) { - VALUE lit = RNODE_LIT(str_node)->nd_lit; if (nd_fl_newline(str_node)) { dedent_string(p, lit, indent); } @@ -9359,7 +9721,7 @@ here_document(struct parser_params *p, rb_strterm_heredoc_t *here) rb_encoding *base_enc = 0; int bol; - eos = rb_parser_string_pointer(here->lastline) + here->offset; len = here->length; indent = (func = here->func) & STR_FUNC_INDENT; @@ -9415,7 +9777,7 @@ here_document(struct parser_params *p, rb_strterm_heredoc_t *here) if (!(func & STR_FUNC_EXPAND)) { do { - ptr = rb_parser_string_pointer(p->lex.lastline); ptr_end = p->lex.pend; if (ptr_end > ptr) { switch (ptr_end[-1]) { @@ -9979,7 +10341,7 @@ parser_prepare(struct parser_params *p) return; } pushback(p, c); - p->enc = rb_parser_string_encoding(p->lex.lastline); } #ifndef RIPPER @@ -12252,20 +12614,20 @@ rb_node_imaginary_new(struct parser_params *p, char* val, int base, int seen_poi } static rb_node_str_t * -rb_node_str_new(struct parser_params *p, VALUE nd_lit, const YYLTYPE *loc) { rb_node_str_t *n = NODE_NEWNODE(NODE_STR, rb_node_str_t, loc); - n->nd_lit = nd_lit; return n; } /* TODO; Use union for NODE_DSTR2 */ static rb_node_dstr_t * -rb_node_dstr_new0(struct parser_params *p, VALUE nd_lit, long nd_alen, NODE *nd_next, const YYLTYPE *loc) { rb_node_dstr_t *n = NODE_NEWNODE(NODE_DSTR, rb_node_dstr_t, loc); - n->nd_lit = nd_lit; n->as.nd_alen = nd_alen; n->nd_next = (rb_node_list_t *)nd_next; @@ -12273,25 +12635,25 @@ rb_node_dstr_new0(struct parser_params *p, VALUE nd_lit, long nd_alen, NODE *nd_ } static rb_node_dstr_t * -rb_node_dstr_new(struct parser_params *p, VALUE nd_lit, const YYLTYPE *loc) { - return rb_node_dstr_new0(p, nd_lit, 1, 0, loc); } static rb_node_xstr_t * -rb_node_xstr_new(struct parser_params *p, VALUE nd_lit, const YYLTYPE *loc) { rb_node_xstr_t *n = NODE_NEWNODE(NODE_XSTR, rb_node_xstr_t, loc); - n->nd_lit = nd_lit; return n; } static rb_node_dxstr_t * -rb_node_dxstr_new(struct parser_params *p, VALUE nd_lit, long nd_alen, NODE *nd_next, const YYLTYPE *loc) { rb_node_dxstr_t *n = NODE_NEWNODE(NODE_DXSTR, rb_node_dxstr_t, loc); - n->nd_lit = nd_lit; n->nd_alen = nd_alen; n->nd_next = (rb_node_list_t *)nd_next; @@ -12308,10 +12670,10 @@ rb_node_sym_new(struct parser_params *p, VALUE str, const YYLTYPE *loc) } static rb_node_dsym_t * -rb_node_dsym_new(struct parser_params *p, VALUE nd_lit, long nd_alen, NODE *nd_next, const YYLTYPE *loc) { rb_node_dsym_t *n = NODE_NEWNODE(NODE_DSYM, rb_node_dsym_t, loc); - n->nd_lit = nd_lit; n->nd_alen = nd_alen; n->nd_next = (rb_node_list_t *)nd_next; @@ -12854,31 +13216,31 @@ list_concat(NODE *head, NODE *tail) } static int -literal_concat0(struct parser_params *p, VALUE head, VALUE tail) { - if (NIL_P(tail)) return 1; - if (!rb_enc_compatible(head, tail)) { compile_error(p, "string literal encodings differ (%s / %s)", - rb_enc_name(rb_enc_get(head)), - rb_enc_name(rb_enc_get(tail))); - rb_str_resize(head, 0); - rb_str_resize(tail, 0); return 0; } - rb_str_buf_append(head, tail); return 1; } -static VALUE string_literal_head(struct parser_params *p, enum node_type htype, NODE *head) { - if (htype != NODE_DSTR) return Qfalse; if (RNODE_DSTR(head)->nd_next) { head = RNODE_LIST(RNODE_LIST(RNODE_DSTR(head)->nd_next)->as.nd_end)->nd_head; - if (!head || !nd_type_p(head, NODE_STR)) return Qfalse; } - const VALUE lit = RNODE_DSTR(head)->nd_lit; - ASSUME(lit != Qfalse); return lit; } @@ -12887,7 +13249,7 @@ static NODE * literal_concat(struct parser_params *p, NODE *head, NODE *tail, const YYLTYPE *loc) { enum node_type htype; - VALUE lit; if (!head) return tail; if (!tail) return head; @@ -12909,14 +13271,14 @@ literal_concat(struct parser_params *p, NODE *head, NODE *tail, const YYLTYPE *l } switch (nd_type(tail)) { case NODE_STR: - if ((lit = string_literal_head(p, htype, head)) != Qfalse) { htype = NODE_STR; } else { - lit = RNODE_DSTR(head)->nd_lit; } if (htype == NODE_STR) { - if (!literal_concat0(p, lit, RNODE_STR(tail)->nd_lit)) { error: rb_discard_node(p, head); rb_discard_node(p, tail); @@ -12931,13 +13293,15 @@ literal_concat(struct parser_params *p, NODE *head, NODE *tail, const YYLTYPE *l case NODE_DSTR: if (htype == NODE_STR) { - if (!literal_concat0(p, RNODE_STR(head)->nd_lit, RNODE_DSTR(tail)->nd_lit)) goto error; - RNODE_DSTR(tail)->nd_lit = RNODE_STR(head)->nd_lit; rb_discard_node(p, head); head = tail; } - else if (NIL_P(RNODE_DSTR(tail)->nd_lit)) { append: RNODE_DSTR(head)->as.nd_alen += RNODE_DSTR(tail)->as.nd_alen - 1; if (!RNODE_DSTR(head)->nd_next) { @@ -12949,14 +13313,16 @@ literal_concat(struct parser_params *p, NODE *head, NODE *tail, const YYLTYPE *l } rb_discard_node(p, tail); } - else if ((lit = string_literal_head(p, htype, head)) != Qfalse) { - if (!literal_concat0(p, lit, RNODE_DSTR(tail)->nd_lit)) goto error; - RNODE_DSTR(tail)->nd_lit = Qnil; goto append; } else { - list_concat(head, NEW_LIST2(NEW_STR(RNODE_DSTR(tail)->nd_lit, loc), RNODE_DSTR(tail)->as.nd_alen, (NODE *)RNODE_DSTR(tail)->nd_next, loc)); } break; @@ -12985,10 +13351,10 @@ str2dstr(struct parser_params *p, NODE *node) { NODE *new_node = (NODE *)NODE_NEW_INTERNAL(NODE_DSTR, rb_node_dstr_t); nd_copy_flag(new_node, node); - RNODE_DSTR(new_node)->nd_lit = RNODE_STR(node)->nd_lit; RNODE_DSTR(new_node)->as.nd_alen = 0; RNODE_DSTR(new_node)->nd_next = 0; - RNODE_STR(node)->nd_lit = 0; return new_node; } @@ -13023,9 +13389,7 @@ new_evstr(struct parser_params *p, NODE *node, const YYLTYPE *loc) static NODE * new_dstr(struct parser_params *p, NODE *node, const YYLTYPE *loc) { - VALUE lit = STR_NEW0(); - NODE *dstr = NEW_DSTR(lit, loc); - RB_OBJ_WRITTEN(p->ast, Qnil, lit); return list_append(p, dstr, node); } @@ -13328,7 +13692,7 @@ symbol_append(struct parser_params *p, NODE *symbols, NODE *symbol) nd_set_type(symbol, NODE_DSYM); break; case NODE_STR: - symbol = NEW_SYM(RNODE_LIT(symbol)->nd_lit, &RNODE(symbol)->nd_loc); break; default: compile_error(p, "unexpected node as symbol: %s", parser_node_name(type)); @@ -13341,7 +13705,6 @@ new_regexp(struct parser_params *p, NODE *node, int options, const YYLTYPE *loc) { struct RNode_LIST *list; NODE *prev; - VALUE lit; if (!node) { node = NEW_LIT(reg_compile(p, STR_NEW0(), options), loc); @@ -13351,33 +13714,30 @@ new_regexp(struct parser_params *p, NODE *node, int options, const YYLTYPE *loc) switch (nd_type(node)) { case NODE_STR: { - VALUE src = RNODE_STR(node)->nd_lit; - nd_set_type(node, NODE_LIT); - nd_set_loc(node, loc); - RB_OBJ_WRITTEN(p->ast, Qnil, RNODE_LIT(node)->nd_lit = reg_compile(p, src, options)); } break; default: - lit = STR_NEW0(); - node = NEW_DSTR0(lit, 1, NEW_LIST(node, loc), loc); - RB_OBJ_WRITTEN(p->ast, Qnil, lit); /* fall through */ case NODE_DSTR: nd_set_type(node, NODE_DREGX); nd_set_loc(node, loc); RNODE_DREGX(node)->nd_cflag = options & RE_OPTION_MASK; - if (!NIL_P(RNODE_DREGX(node)->nd_lit)) reg_fragment_check(p, RNODE_DREGX(node)->nd_lit, options); for (list = RNODE_DREGX(prev = node)->nd_next; list; list = RNODE_LIST(list->nd_next)) { NODE *frag = list->nd_head; enum node_type type = nd_type(frag); if (type == NODE_STR || (type == NODE_DSTR && !RNODE_DSTR(frag)->nd_next)) { - VALUE tail = RNODE_STR(frag)->nd_lit; - if (reg_fragment_check(p, tail, options) && prev && !NIL_P(RNODE_DREGX(prev)->nd_lit)) { - VALUE lit = prev == node ? RNODE_DREGX(prev)->nd_lit : RNODE_LIT(RNODE_LIST(prev)->nd_head)->nd_lit; if (!literal_concat0(p, lit, tail)) { return NEW_NIL(loc); /* dummy node on error */ } - rb_str_resize(tail, 0); RNODE_LIST(prev)->nd_next = list->nd_next; rb_discard_node(p, list->nd_head); rb_discard_node(p, (NODE *)list); @@ -13392,9 +13752,9 @@ new_regexp(struct parser_params *p, NODE *node, int options, const YYLTYPE *loc) } } if (!RNODE_DREGX(node)->nd_next) { - VALUE src = RNODE_DREGX(node)->nd_lit; - VALUE re = reg_compile(p, src, options); - RB_OBJ_WRITTEN(p->ast, Qnil, RNODE_DREGX(node)->nd_lit = re); } if (options & RE_OPTION_ONCE) { node = NEW_ONCE(node, loc); @@ -13415,9 +13775,7 @@ static NODE * new_xstring(struct parser_params *p, NODE *node, const YYLTYPE *loc) { if (!node) { - VALUE lit = STR_NEW0(); - NODE *xstr = NEW_XSTR(lit, loc); - RB_OBJ_WRITTEN(p->ast, Qnil, lit); return xstr; } switch (nd_type(node)) { @@ -13430,7 +13788,7 @@ new_xstring(struct parser_params *p, NODE *node, const YYLTYPE *loc) nd_set_loc(node, loc); break; default: - node = NEW_DXSTR(Qnil, 1, NEW_LIST(node, loc), loc); break; } return node; @@ -13445,9 +13803,6 @@ check_literal_when(struct parser_params *p, NODE *arg, const YYLTYPE *loc) lit = rb_node_case_when_optimizable_literal(arg); if (UNDEF_P(lit)) return; - if (nd_type_p(arg, NODE_STR)) { - RB_OBJ_WRITTEN(p->ast, Qnil, RNODE_STR(arg)->nd_lit = lit); - } if (NIL_P(p->case_labels)) { p->case_labels = rb_obj_hide(rb_hash_new()); @@ -14092,8 +14447,8 @@ shareable_literal_constant(struct parser_params *p, enum shareability shareable, return value; case NODE_STR: - lit = rb_fstring(RNODE_STR(value)->nd_lit); - nd_set_type(value, NODE_LIT); RB_OBJ_WRITE(p->ast, &RNODE_LIT(value)->nd_lit, lit); return value; @@ -15078,11 +15433,11 @@ dsym_node(struct parser_params *p, NODE *node, const YYLTYPE *loc) nd_set_loc(node, loc); break; case NODE_STR: - lit = RNODE_STR(node)->nd_lit; node = NEW_SYM(lit, loc); break; default: - node = NEW_DSYM(Qnil, 1, NEW_LIST(node, loc), loc); break; } return node; @@ -15114,7 +15469,7 @@ nd_st_key(struct parser_params *p, NODE *node) case NODE_LIT: return RNODE_LIT(node)->nd_lit; case NODE_STR: - return RNODE_STR(node)->nd_lit; case NODE_INTEGER: return rb_node_integer_literal_val(node); case NODE_FLOAT: @@ -15806,11 +16161,14 @@ reg_fragment_setenc(struct parser_params* p, VALUE str, int options) } static int -reg_fragment_check(struct parser_params* p, VALUE str, int options) -{ - VALUE err; - reg_fragment_setenc(p, str, options); - err = rb_reg_check_preprocess(str); if (err != Qnil) { err = rb_obj_as_string(err); compile_error(p, "%"PRIsVALUE, err); @@ -16417,7 +16775,21 @@ rb_ruby_ripper_parse0(rb_parser_t *p) int rb_ruby_ripper_dedent_string(rb_parser_t *p, VALUE string, int width) { - return dedent_string(p, string, width); } VALUE @@ -166,6 +166,12 @@ mbclen_charfound_p(int len) return MBCLEN_CHARFOUND_P(len); } static const char * enc_name(void *enc) { @@ -598,6 +604,7 @@ static const rb_parser_config_t rb_global_parser_config = { .enc_isalnum = enc_isalnum, .enc_precise_mbclen = enc_precise_mbclen, .mbclen_charfound_p = mbclen_charfound_p, .enc_name = enc_name, .enc_prev_char = enc_prev_char, .enc_get = enc_get, @@ -989,6 +996,13 @@ rb_node_imaginary_literal_val(const NODE *n) } VALUE rb_node_sym_string_val(const NODE *node) { rb_parser_string_t *str = RNODE_SYM(node)->string; @@ -996,6 +1010,20 @@ rb_node_sym_string_val(const NODE *node) } VALUE rb_node_line_lineno_val(const NODE *node) { return INT2FIX(node->nd_loc.beg_pos.lineno); @@ -37,12 +37,21 @@ /* * Parser String */ typedef struct rb_parser_string { rb_encoding *enc; /* Length of the string, not including terminating NUL character. */ long len; /* Pointer to the contents of the string. */ - char ptr[FLEX_ARY_LEN]; } rb_parser_string_t; /* @@ -605,7 +614,7 @@ typedef struct RNode_BACK_REF { long nd_nth; } rb_node_back_ref_t; -/* RNode_MATCH, RNode_LIT, RNode_STR and RNode_XSTR should be same structure */ typedef struct RNode_MATCH { NODE node; @@ -673,17 +682,18 @@ typedef struct RNode_IMAGINARY { enum rb_numeric_type type; } rb_node_imaginary_t; typedef struct RNode_STR { NODE node; - VALUE nd_lit; } rb_node_str_t; /* RNode_DSTR, RNode_DXSTR and RNode_DSYM should be same structure */ typedef struct RNode_DSTR { NODE node; - VALUE nd_lit; union { long nd_alen; struct RNode *nd_end; /* Second dstr node has this structure. See also RNode_LIST */ @@ -694,13 +704,13 @@ typedef struct RNode_DSTR { typedef struct RNode_XSTR { NODE node; - VALUE nd_lit; } rb_node_xstr_t; typedef struct RNode_DXSTR { NODE node; - VALUE nd_lit; long nd_alen; struct RNode_LIST *nd_next; } rb_node_dxstr_t; @@ -714,7 +724,7 @@ typedef struct RNode_EVSTR { typedef struct RNode_DREGX { NODE node; - VALUE nd_lit; ID nd_cflag; struct RNode_LIST *nd_next; } rb_node_dregx_t; @@ -950,7 +960,7 @@ typedef struct RNode_SYM { typedef struct RNode_DSYM { NODE node; - VALUE nd_lit; long nd_alen; struct RNode_LIST *nd_next; } rb_node_dsym_t; @@ -1329,6 +1339,7 @@ typedef struct rb_parser_config_struct { int (*enc_isalnum)(OnigCodePoint c, rb_encoding *enc); int (*enc_precise_mbclen)(const char *p, const char *e, rb_encoding *enc); int (*mbclen_charfound_p)(int len); const char *(*enc_name)(rb_encoding *enc); char *(*enc_prev_char)(const char *s, const char *p, const char *e, rb_encoding *enc); rb_encoding* (*enc_get)(VALUE obj); @@ -235,6 +235,7 @@ struct rb_imemo_tmpbuf_struct { #define rb_enc_isalnum p->config->enc_isalnum #define rb_enc_precise_mbclen p->config->enc_precise_mbclen #define MBCLEN_CHARFOUND_P p->config->mbclen_charfound_p #define rb_enc_name p->config->enc_name #define rb_enc_prev_char p->config->enc_prev_char #define rb_enc_get p->config->enc_get |