mirror of
https://github.com/ruby/ruby.git
synced 2025-09-15 08:33:58 +02:00
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.
This commit is contained in:
parent
f7a407cabd
commit
33c1e082d0
9 changed files with 598 additions and 180 deletions
38
node.c
38
node.c
|
@ -172,6 +172,8 @@ struct rb_ast_local_table_link {
|
|||
static void
|
||||
parser_string_free(rb_ast_t *ast, rb_parser_string_t *str)
|
||||
{
|
||||
if (!str) return;
|
||||
xfree(str->ptr);
|
||||
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_STR:
|
||||
parser_string_free(ast, RNODE_STR(node)->string);
|
||||
break;
|
||||
case NODE_DSTR:
|
||||
parser_string_free(ast, RNODE_DSTR(node)->string);
|
||||
break;
|
||||
case NODE_XSTR:
|
||||
parser_string_free(ast, RNODE_XSTR(node)->string);
|
||||
break;
|
||||
case NODE_DXSTR:
|
||||
parser_string_free(ast, RNODE_DXSTR(node)->string);
|
||||
break;
|
||||
case NODE_SYM:
|
||||
parser_string_free(ast, RNODE_SYM(node)->string);
|
||||
break;
|
||||
case NODE_DSYM:
|
||||
parser_string_free(ast, RNODE_DSYM(node)->string);
|
||||
break;
|
||||
case NODE_DREGX:
|
||||
parser_string_free(ast, RNODE_DREGX(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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue