Project

General

Profile

Bug #20726

Updated by luke-gru (Luke Gruber) about 1 month ago

```ruby 
 # shareable_constant_value: literal 
 a = 'hi' 
 A = ['hello' => a] 
 p A 
 ``` 

 gives: 

 ``` 
 ./ruby -I../ruby/lib -I. -I.ext/x86_64-linux -I.ext/common -r./x86_64-linux-fake ../ruby/test.rb 

 -- raw disasm-------- 

    trace: 1 

    0000 putchilledstring       "hi"                                       (     3) 

    0002 setlocal_WC_0          3                                             (     3) 

    trace: 1 

    0004 newarray               1                                             (     4) 

    0006 putspecialobject       3                                             (     4) 

 *    0008 setconstant            :A                                            (     4) 

    trace: 1 

    0010 putself                                                            (     5) 

    0011 opt_getconstant_path [:A]                                          (     5) 

    0013 opt_send_without_block <calldata:p, 1>                             (     5) 

    0015 leave                                                              (     5) 

 --------------------- 

 ../ruby/test.rb:4: argument stack underflow (-1) 

 ../ruby/test.rb: compile error (SyntaxError) 
 ``` 

 This is due to a line in `compile.c`, function `compile_shareable_literal_constant`: 

 ```c 
 if (!RNODE_HASH(node)->nd_brace) { } 
 ``` 

 I'm not sure why this condition is there so I'm not confident in making a fix. Also, my git-fu isn't the best so I can't track down the right commit where it was added. 

 Expected: 

 It works just the same as when pragma `shareable_constant_value: literal` is not given. Which is to say, `[{'hello' => 'hi'}]` is is the value of `A`. 

Back