1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Make RubyVM::InstructionSequence.compile_file use same encoding as load

This switches the internal function from rb_parser_compile_file_path
to rb_parser_load_file, which is the same internal method that
Kernel#load uses.

Fixes [Bug #17308]
This commit is contained in:
Jeremy Evans 2020-11-18 11:39:59 -08:00 committed by Koichi Sasada
parent fee0073726
commit 4a5c42db88
Notes: git 2020-11-19 07:13:15 +09:00
2 changed files with 17 additions and 1 deletions

2
iseq.c
View file

@ -1303,7 +1303,7 @@ iseqw_s_compile_file(int argc, VALUE *argv, VALUE self)
parser = rb_parser_new();
rb_parser_set_context(parser, NULL, FALSE);
ast = rb_parser_compile_file_path(parser, file, f, NUM2INT(line));
ast = (rb_ast_t *)rb_parser_load_file(parser, file);
if (!ast->body.root) exc = GET_EC()->errinfo;
rb_io_close(f);

View file

@ -98,6 +98,22 @@ class TestISeq < Test::Unit::TestCase
assert_include(RubyVM::InstructionSequence.of(obj.method(name)).disasm, name)
end
def test_compile_file_encoding
Tempfile.create(%w"test_iseq .rb") do |f|
f.puts "{ '\u00de' => 'Th', '\u00df' => 'ss', '\u00e0' => 'a' }"
f.close
previous_external = Encoding.default_external
Encoding.default_external = Encoding::US_ASCII
begin
load f.path
RubyVM::InstructionSequence.compile_file(f.path)
ensure
Encoding.default_external = previous_external
end
end
end
LINE_BEFORE_METHOD = __LINE__
def method_test_line_trace