diff options
| author | eileencodes <eileencodes@gmail.com> | 2023-12-13 12:49:37 -0500 |
|---|---|---|
| committer | Kevin Newton <kddnewton@gmail.com> | 2023-12-15 10:27:44 -0500 |
| commit | 049a9bd62f0907caa8d2eca6337cd2542a5c7726 (patch) | |
| tree | fb7ba781828de713ca5dc5390a66b04964b8c60c /test/ruby | |
| parent | 20f4f007644b841c71402a5ae64ee5373dc7b91a (diff) | |
[PRISM] Fix `compile_prism` when src is a file
`compile_prism` can take a source and file (and other arguments) or a
file as the source. `compile` checks if the source is a file and if it
is converts it. `compile_prism` is now doing the same thing.
On the Ruby side `compile` handles a file
[here](https://github.com/ruby/ruby/blob/master/iseq.c#L1159-L1162).
Before:
```
"********* Ruby *************"
== disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(26,21)>
local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
[ 1] name@0
0000 putstring "Prism" ( 25)[Li]
0002 setlocal name@0, 0
0005 putself ( 26)[Li]
0006 putobject "hello, "
0008 getlocal name@0, 0
0011 dup
0012 objtostring <calldata!mid:to_s, argc:0, FCALL|ARGS_SIMPLE>
0014 anytostring
0015 concatstrings 2
0017 send <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>, nil
0020 leave
hello, Prism
"********* PRISM *************"
./test.rb:13:in `compile_prism': wrong argument type File (expected String) (TypeError)
from ./test.rb:13:in `<main>'
make: *** [run] Error 1
```
After:
```
"********* Ruby *************"
== disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(26,21)>
local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
[ 1] name@0
0000 putstring "Prism" ( 25)[Li]
0002 setlocal name@0, 0
0005 putself ( 26)[Li]
0006 putobject "hello, "
0008 getlocal name@0, 0
0011 dup
0012 objtostring <calldata!mid:to_s, argc:0, FCALL|ARGS_SIMPLE>
0014 anytostring
0015 concatstrings 2
0017 send <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>, nil
0020 leave
"********* PRISM *************"
== disasm: #<ISeq:<compiled>@test_code.rb:24 (24,0)-(25,21)>
local table (size: 1, argc: 0 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1])
[ 1] name@0
0000 putstring "Prism" ( 24)[Li]
0002 setlocal name@0, 0
0005 putself ( 25)[Li]
0006 putobject "hello, "
0008 getlocal name@0, 0
0011 dup
0012 objtostring <calldata!mid:to_s, argc:0, FCALL|ARGS_SIMPLE>
0014 anytostring
0015 concatstrings 2
0017 send <calldata!mid:puts, argc:1, FCALL|ARGS_SIMPLE>, nil
0020 leave ( 24)
```
Fixes ruby/prism#1609
Diffstat (limited to 'test/ruby')
| -rw-r--r-- | test/ruby/test_iseq.rb | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/test/ruby/test_iseq.rb b/test/ruby/test_iseq.rb index f05d067ac2..b0896511d8 100644 --- a/test/ruby/test_iseq.rb +++ b/test/ruby/test_iseq.rb @@ -798,4 +798,15 @@ class TestISeq < Test::Unit::TestCase result = RubyVM::InstructionSequence.load_from_binary(iseq.to_binary).eval assert_equal expected, result, proc {sprintf("expected: %x, result: %x", expected, result)} end + + def test_compile_prism_with_file + Tempfile.create(%w"test_iseq .rb") do |f| + f.puts "name = 'Prism'; puts 'hello" + f.close + + assert_nothing_raised(SyntaxError) { + RubyVM::InstructionSequence.compile_prism(f.path) + } + end + end end |
