summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2024-01-12 14:21:35 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2024-01-12 14:53:14 -0800
commit475663f0399248011f2392817ef4d89ec07baae4 (patch)
tree1b04d2bcd4f64c20eae47a8b1ecf2246d35bbfa1
parent206388b19eb3e1d98ee77821a96705c97c86eb06 (diff)
Only intern constants upon compilation entry
Before this commit the Prism compiler would try to intern constants every time it re-entered. This pool of constants is "constant" (there is only one pool per parser instance), so we should do it only once: upon the top level entry to the compiler. This change does just that: it populates the interned constants once. Fixes: https://github.com/ruby/prism/issues/2152
-rw-r--r--iseq.c10
-rw-r--r--prism_compile.c9
-rw-r--r--tool/prism_btests4
3 files changed, 12 insertions, 11 deletions
diff --git a/iseq.c b/iseq.c
index f2911b43f2..3b87cdcc78 100644
--- a/iseq.c
+++ b/iseq.c
@@ -1430,10 +1430,20 @@ iseqw_s_compile_prism_compile(pm_parser_t *parser, VALUE opt, rb_iseq_t *iseq, V
pm_scope_node_t scope_node;
pm_scope_node_init(node, &scope_node, NULL, parser);
+
+ ID *constants = calloc(parser->constant_pool.size, sizeof(ID));
+ rb_encoding *encoding = rb_enc_find(parser->encoding->name);
+ for (uint32_t index = 0; index < parser->constant_pool.size; index++) {
+ pm_constant_t *constant = &parser->constant_pool.constants[index];
+ constants[index] = rb_intern3((const char *) constant->start, constant->length, encoding);
+ }
+ scope_node.constants = constants;
+
rb_iseq_compile_prism_node(iseq, &scope_node, parser);
finish_iseq_build(iseq);
pm_node_destroy(parser, node);
+ free(constants);
}
}
diff --git a/prism_compile.c b/prism_compile.c
index 3afc6ae5db..a9d417550f 100644
--- a/prism_compile.c
+++ b/prism_compile.c
@@ -6794,25 +6794,16 @@ rb_translate_prism(pm_parser_t *parser, rb_iseq_t *iseq, pm_scope_node_t *scope_
{
RUBY_ASSERT(ISEQ_COMPILE_DATA(iseq));
- ID *constants = calloc(parser->constant_pool.size, sizeof(ID));
- rb_encoding *encoding = rb_enc_find(parser->encoding->name);
- for (uint32_t index = 0; index < parser->constant_pool.size; index++) {
- pm_constant_t *constant = &parser->constant_pool.constants[index];
- constants[index] = rb_intern3((const char *) constant->start, constant->length, encoding);
- }
-
st_table *index_lookup_table = st_init_numtable();
pm_constant_id_list_t *locals = &scope_node->locals;
for (size_t i = 0; i < locals->size; i++) {
st_insert(index_lookup_table, locals->ids[i], i);
}
- scope_node->constants = constants;
scope_node->index_lookup_table = index_lookup_table;
pm_compile_node(iseq, (pm_node_t *)scope_node, ret, scope_node->base.location.start, false, (pm_scope_node_t *)scope_node);
iseq_set_sequence(iseq, ret);
- free(constants);
return Qnil;
}
diff --git a/tool/prism_btests b/tool/prism_btests
index 2eda5e624e..e14f0d3cf9 100644
--- a/tool/prism_btests
+++ b/tool/prism_btests
@@ -30,6 +30,6 @@
# ../src/bootstraptest/test_ractor.rb
# ../src/bootstraptest/test_syntax.rb
# ../src/bootstraptest/test_yjit.rb
-# ../src/bootstraptest/test_yjit_30k_ifelse.rb
-# ../src/bootstraptest/test_yjit_30k_methods.rb
+../src/bootstraptest/test_yjit_30k_ifelse.rb
+../src/bootstraptest/test_yjit_30k_methods.rb
# ../src/bootstraptest/test_yjit_rust_port.rb