summaryrefslogtreecommitdiff
path: root/ruby_parser.c
diff options
context:
space:
mode:
authoryui-knk <[email protected]>2024-02-03 00:50:02 +0900
committerYuichiro Kaneko <[email protected]>2024-02-09 14:20:17 +0900
commit33c1e082d0807db403a2d93cbf0a094c91179d74 (patch)
tree84213018f402daec6fc167f206c4c3eb4551b699 /ruby_parser.c
parentf7a407cabda6eb787fb95fc6e3c1b2215b1aec19 (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.
Diffstat (limited to 'ruby_parser.c')
-rw-r--r--ruby_parser.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/ruby_parser.c b/ruby_parser.c
index 89b2a19d48..04a49da0ec 100644
--- a/ruby_parser.c
+++ b/ruby_parser.c
@@ -166,6 +166,12 @@ mbclen_charfound_p(int len)
return MBCLEN_CHARFOUND_P(len);
}
+static int
+mbclen_charfound_len(int len)
+{
+ return MBCLEN_CHARFOUND_LEN(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,
+ .mbclen_charfound_len = mbclen_charfound_len,
.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_str_string_val(const NODE *node)
+{
+ rb_parser_string_t *str = RNODE_STR(node)->string;
+ return rb_str_new_parser_string(str);
+}
+
+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_dstr_string_val(const NODE *node)
+{
+ rb_parser_string_t *str = RNODE_DSTR(node)->string;
+ return str ? rb_str_new_parser_string(str) : Qnil;
+}
+
+VALUE
+rb_node_dregx_string_val(const NODE *node)
+{
+ rb_parser_string_t *str = RNODE_DREGX(node)->string;
+ return rb_str_new_parser_string(str);
+}
+
+VALUE
rb_node_line_lineno_val(const NODE *node)
{
return INT2FIX(node->nd_loc.beg_pos.lineno);