summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/ruby/test_variable.rb7
-rw-r--r--version.h2
-rw-r--r--vm_eval.c10
3 files changed, 18 insertions, 1 deletions
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. */