Skip to content

Commit 7b2ae8d

Browse files
committed
[Bug #20969] Pass assignable from ripper
For the universal parser, `rb_reg_named_capture_assign_iter_impl` function is shared between the parser and ripper. However `parser_params` struct is partially different, and `assignable` function depends on that part indirectly.
1 parent a586753 commit 7b2ae8d

File tree

5 files changed

+30
-9
lines changed

5 files changed

+30
-9
lines changed

internal/parse.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,9 @@ void rb_parser_string_free(rb_parser_t *p, rb_parser_string_t *str);
7979
int rb_parser_dvar_defined_ref(struct parser_params*, ID, ID**);
8080
ID rb_parser_internal_id(struct parser_params*);
8181
int rb_parser_reg_fragment_check(struct parser_params*, rb_parser_string_t*, int);
82-
int rb_reg_named_capture_assign_iter_impl(struct parser_params *p, const char *s, long len, rb_encoding *enc, NODE **succ_block, const rb_code_location_t *loc);
82+
int rb_reg_named_capture_assign_iter_impl(struct parser_params *p, const char *s, long len, rb_encoding *enc, NODE **succ_block, const rb_code_location_t *loc, rb_parser_assignable_func assignable);
8383
int rb_parser_local_defined(struct parser_params *p, ID id, const struct rb_iseq_struct *iseq);
84+
NODE *rb_parser_assignable(struct parser_params *p, ID id, NODE *val, const YYLTYPE *loc);
8485

8586
RUBY_SYMBOL_EXPORT_END
8687

parse.y

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ syntax_error_new(void)
7676
}
7777
#endif
7878

79-
static NODE *reg_named_capture_assign(struct parser_params* p, VALUE regexp, const YYLTYPE *loc);
79+
static NODE *reg_named_capture_assign(struct parser_params* p, VALUE regexp, const YYLTYPE *loc, rb_parser_assignable_func assignable);
8080

8181
#define compile_callback rb_suppress_tracing
8282
#endif /* !UNIVERSAL_PARSER */
@@ -12916,7 +12916,7 @@ match_op(struct parser_params *p, NODE *node1, NODE *node2, const YYLTYPE *op_lo
1291612916
const VALUE lit = rb_node_regx_string_val(n);
1291712917
if (!NIL_P(lit)) {
1291812918
NODE *match = NEW_MATCH2(node1, node2, loc);
12919-
RNODE_MATCH2(match)->nd_args = reg_named_capture_assign(p, lit, loc);
12919+
RNODE_MATCH2(match)->nd_args = reg_named_capture_assign(p, lit, loc, assignable);
1292012920
nd_set_line(match, line);
1292112921
return match;
1292212922
}
@@ -15402,6 +15402,7 @@ typedef struct {
1540215402
rb_encoding *enc;
1540315403
NODE *succ_block;
1540415404
const YYLTYPE *loc;
15405+
rb_parser_assignable_func assignable;
1540515406
} reg_named_capture_assign_t;
1540615407

1540715408
static int
@@ -15414,18 +15415,19 @@ reg_named_capture_assign_iter(const OnigUChar *name, const OnigUChar *name_end,
1541415415
long len = name_end - name;
1541515416
const char *s = (const char *)name;
1541615417

15417-
return rb_reg_named_capture_assign_iter_impl(p, s, len, enc, &arg->succ_block, arg->loc);
15418+
return rb_reg_named_capture_assign_iter_impl(p, s, len, enc, &arg->succ_block, arg->loc, arg->assignable);
1541815419
}
1541915420

1542015421
static NODE *
15421-
reg_named_capture_assign(struct parser_params* p, VALUE regexp, const YYLTYPE *loc)
15422+
reg_named_capture_assign(struct parser_params* p, VALUE regexp, const YYLTYPE *loc, rb_parser_assignable_func assignable)
1542215423
{
1542315424
reg_named_capture_assign_t arg;
1542415425

1542515426
arg.parser = p;
1542615427
arg.enc = rb_enc_get(regexp);
1542715428
arg.succ_block = 0;
1542815429
arg.loc = loc;
15430+
arg.assignable = assignable;
1542915431
onig_foreach_name(RREGEXP_PTR(regexp), reg_named_capture_assign_iter, &arg);
1543015432

1543115433
if (!arg.succ_block) return 0;
@@ -15434,9 +15436,15 @@ reg_named_capture_assign(struct parser_params* p, VALUE regexp, const YYLTYPE *l
1543415436
#endif
1543515437

1543615438
#ifndef RIPPER
15439+
NODE *
15440+
rb_parser_assignable(struct parser_params *p, ID id, NODE *val, const YYLTYPE *loc)
15441+
{
15442+
return assignable(p, id, val, loc);
15443+
}
15444+
1543715445
int
1543815446
rb_reg_named_capture_assign_iter_impl(struct parser_params *p, const char *s, long len,
15439-
rb_encoding *enc, NODE **succ_block, const rb_code_location_t *loc)
15447+
rb_encoding *enc, NODE **succ_block, const rb_code_location_t *loc, rb_parser_assignable_func assignable)
1544015448
{
1544115449
ID var;
1544215450
NODE *node, *succ;

ruby_parser.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ typedef struct {
197197
rb_encoding *enc;
198198
NODE *succ_block;
199199
const rb_code_location_t *loc;
200+
rb_parser_assignable_func assignable;
200201
} reg_named_capture_assign_t;
201202

202203
static int
@@ -210,18 +211,20 @@ reg_named_capture_assign_iter(const OnigUChar *name, const OnigUChar *name_end,
210211
long len = name_end - name;
211212
const char *s = (const char *)name;
212213

213-
return rb_reg_named_capture_assign_iter_impl(p, s, len, enc, &arg->succ_block, loc);
214+
return rb_reg_named_capture_assign_iter_impl(p, s, len, enc, &arg->succ_block, loc, arg->assignable);
214215
}
215216

216217
static NODE *
217-
reg_named_capture_assign(struct parser_params* p, VALUE regexp, const rb_code_location_t *loc)
218+
reg_named_capture_assign(struct parser_params* p, VALUE regexp, const rb_code_location_t *loc,
219+
rb_parser_assignable_func assignable)
218220
{
219221
reg_named_capture_assign_t arg;
220222

221223
arg.parser = p;
222224
arg.enc = rb_enc_get(regexp);
223225
arg.succ_block = 0;
224226
arg.loc = loc;
227+
arg.assignable = assignable;
225228
onig_foreach_name(RREGEXP_PTR(regexp), reg_named_capture_assign_iter, &arg);
226229

227230
if (!arg.succ_block) return 0;

rubyparser.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1171,6 +1171,8 @@ typedef struct parser_params rb_parser_t;
11711171
typedef struct rb_imemo_tmpbuf_struct rb_imemo_tmpbuf_t;
11721172
#endif
11731173

1174+
typedef NODE *(*rb_parser_assignable_func)(struct parser_params *p, ID id, NODE *val, const rb_code_location_t *loc);
1175+
11741176
#ifdef UNIVERSAL_PARSER
11751177
typedef struct rb_parser_config_struct {
11761178
/* Memory */
@@ -1188,7 +1190,7 @@ typedef struct rb_parser_config_struct {
11881190

11891191
// VALUE rb_suppress_tracing(VALUE (*func)(VALUE), VALUE arg);
11901192
VALUE (*compile_callback)(VALUE (*func)(VALUE), VALUE arg);
1191-
NODE *(*reg_named_capture_assign)(struct parser_params* p, VALUE regexp, const rb_code_location_t *loc);
1193+
NODE *(*reg_named_capture_assign)(struct parser_params* p, VALUE regexp, const rb_code_location_t *loc, rb_parser_assignable_func assignable);
11921194

11931195
/* Variable */
11941196
VALUE (*attr_get)(VALUE obj, ID id);

test/ripper/test_ripper.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,13 @@ def test_dedent_string
148148
assert_nothing_raised { Ripper.lex src }
149149
end
150150

151+
def test_assignable_in_regexp
152+
assert_separately(%w(-rripper), "", "#{<<~"begin;"}\n#{<<~'end;'}")
153+
begin;
154+
assert_nil(Ripper.parse('/(?<_1>)/ =~ s'))
155+
end;
156+
end
157+
151158
def test_no_memory_leak
152159
assert_no_memory_leak(%w(-rripper), "", "#{<<~'end;'}", rss: true)
153160
2_000_000.times do

0 commit comments

Comments
 (0)