Correctly set node_id on iseq location
The iseq location object has a slot for node ids. parse.y was correctly populating that field but Prism was not. This commit populates the field with the ast node id for that iseq [Bug #21014]
This commit is contained in:
parent
4a78d74039
commit
63723c8d59
Notes:
git
2025-01-08 01:09:04 +00:00
2
iseq.c
2
iseq.c
@ -1072,7 +1072,7 @@ pm_iseq_new_with_opt(pm_scope_node_t *node, VALUE name, VALUE path, VALUE realpa
|
|||||||
.end_pos = { .lineno = (int) end.line, .column = (int) end.column }
|
.end_pos = { .lineno = (int) end.line, .column = (int) end.column }
|
||||||
};
|
};
|
||||||
|
|
||||||
prepare_iseq_build(iseq, name, path, realpath, first_lineno, &code_location, -1,
|
prepare_iseq_build(iseq, name, path, realpath, first_lineno, &code_location, node->ast_node->node_id,
|
||||||
parent, isolated_depth, type, node->script_lines == NULL ? Qnil : *node->script_lines, option);
|
parent, isolated_depth, type, node->script_lines == NULL ? Qnil : *node->script_lines, option);
|
||||||
|
|
||||||
struct pm_iseq_new_with_opt_data data = {
|
struct pm_iseq_new_with_opt_data data = {
|
||||||
|
@ -6486,7 +6486,7 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
|
|||||||
case ISEQ_TYPE_BLOCK: {
|
case ISEQ_TYPE_BLOCK: {
|
||||||
LABEL *start = ISEQ_COMPILE_DATA(iseq)->start_label = NEW_LABEL(0);
|
LABEL *start = ISEQ_COMPILE_DATA(iseq)->start_label = NEW_LABEL(0);
|
||||||
LABEL *end = ISEQ_COMPILE_DATA(iseq)->end_label = NEW_LABEL(0);
|
LABEL *end = ISEQ_COMPILE_DATA(iseq)->end_label = NEW_LABEL(0);
|
||||||
const pm_node_location_t block_location = { .line = body->location.first_lineno, .node_id = -1 };
|
const pm_node_location_t block_location = { .line = body->location.first_lineno, .node_id = scope_node->ast_node->node_id };
|
||||||
|
|
||||||
start->rescued = LABEL_RESCUE_BEG;
|
start->rescued = LABEL_RESCUE_BEG;
|
||||||
end->rescued = LABEL_RESCUE_END;
|
end->rescued = LABEL_RESCUE_END;
|
||||||
@ -6612,7 +6612,7 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!PM_NODE_TYPE_P(scope_node->ast_node, PM_ENSURE_NODE)) {
|
if (!PM_NODE_TYPE_P(scope_node->ast_node, PM_ENSURE_NODE)) {
|
||||||
const pm_node_location_t location = { .line = ISEQ_COMPILE_DATA(iseq)->last_line, .node_id = -1 };
|
const pm_node_location_t location = { .line = ISEQ_COMPILE_DATA(iseq)->last_line, .node_id = scope_node->ast_node->node_id };
|
||||||
PUSH_INSN(ret, location, leave);
|
PUSH_INSN(ret, location, leave);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,12 @@
|
|||||||
# This file is organized to match itemization in https://github.com/ruby/prism/issues/1335
|
# This file is organized to match itemization in https://github.com/ruby/prism/issues/1335
|
||||||
module Prism
|
module Prism
|
||||||
class TestCompilePrism < Test::Unit::TestCase
|
class TestCompilePrism < Test::Unit::TestCase
|
||||||
|
def test_iseq_has_node_id
|
||||||
|
code = "proc { <<END }\n hello\nEND"
|
||||||
|
iseq = RubyVM::InstructionSequence.compile_prism(code)
|
||||||
|
assert_operator iseq.to_a[4][:node_id], :>, -1
|
||||||
|
end
|
||||||
|
|
||||||
# Subclass is used for tests which need it
|
# Subclass is used for tests which need it
|
||||||
class Subclass; end
|
class Subclass; end
|
||||||
############################################################################
|
############################################################################
|
||||||
|
Loading…
x
Reference in New Issue
Block a user