diff --git a/test/ruby/test_variable.rb b/test/ruby/test_variable.rb index 86f2e4bb84..49fec2d40e 100644 --- a/test/ruby/test_variable.rb +++ b/test/ruby/test_variable.rb @@ -425,6 +425,13 @@ class TestVariable < Test::Unit::TestCase end end + def test_local_variables_encoding + α = 1 + b = binding + b.eval("".encode("us-ascii")) + assert_equal(%i[α b], b.local_variables) + end + private def with_kwargs_11(v1:, v2:, v3:, v4:, v5:, v6:, v7:, v8:, v9:, v10:, v11:) local_variables diff --git a/version.h b/version.h index c7e4308eb8..00e4d7f43f 100644 --- a/version.h +++ b/version.h @@ -11,7 +11,7 @@ # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR #define RUBY_VERSION_TEENY 1 #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR -#define RUBY_PATCHLEVEL 6 +#define RUBY_PATCHLEVEL 7 #include "ruby/version.h" #include "ruby/internal/abi.h" diff --git a/vm_eval.c b/vm_eval.c index eaf59f41a3..a8c12707ec 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -1690,6 +1690,8 @@ pm_eval_make_iseq(VALUE src, VALUE fname, int line, // scopes array refer to root nodes on the tree, and higher indexes are the // leaf nodes. iseq = parent; + rb_encoding *encoding = rb_enc_get(src); + for (int scopes_index = 0; scopes_index < scopes_count; scopes_index++) { VALUE iseq_value = (VALUE)iseq; int locals_count = ISEQ_BODY(iseq)->local_table_size; @@ -1711,6 +1713,14 @@ pm_eval_make_iseq(VALUE src, VALUE fname, int line, continue; } + // Check here if this local can be represented validly in the + // encoding of the source string. If it _cannot_, then it should + // not be added to the constant pool as it would not be able to + // be referenced anyway. + if (rb_enc_str_coderange_scan(name_obj, encoding) == ENC_CODERANGE_BROKEN) { + continue; + } + /* We need to duplicate the string because the Ruby string may * be embedded so compaction could move the string and the pointer * will change. */