Bug #16334
Updated by ViugiNick (Nickolay Viuginov) about 5 years ago
I faced a strange distribution of line numbers in bytecode for multiline expressions like this: ``` class Test def method1 self end def method2 self end def method3 true end end def hello Test.new #bp here .method1 #bp here .method2 #bp here .method3 #bp here end ``` 2.3.7 bytecode: ``` == disasm: #<ISeq:hello@/home/viuignick/.RubyMine2019.2/config/scratches/scratch.rb> 0000 trace 8 ( 14) 0002 trace 1 ( 18) 0004 getinlinecache 11, <is:0> ( 15) 0007 getconstant :Test 0009 setinlinecache <is:0> 0011 opt_send_without_block <callinfo!mid:new, argc:0, ARGS_SIMPLE>, <callcache>( 16) 0014 opt_send_without_block <callinfo!mid:method1, argc:0, ARGS_SIMPLE>, <callcache>( 17) 0017 opt_send_without_block <callinfo!mid:method2, argc:0, ARGS_SIMPLE>, <callcache>( 18) 0020 opt_send_without_block <callinfo!mid:method3, argc:0, ARGS_SIMPLE>, <callcache> 0023 trace 16 ( 19) 0025 leave ( 18) ``` As you can see there is no trace line-event instuction for line №15, because of that debuggers will not stop there. Furthermore call of the method `new` is on the line #16(actually 15), method method1 is on the line 17(actually 16), method2 is on the line 18 (actually 19) 2.5.4 bytecode ``` 0000 getinlinecache 7, <is:0> ( 15)[LiCa] 0003 getconstant :Test 0005 setinlinecache <is:0> 0007 opt_send_without_block <callinfo!mid:new, argc:0, ARGS_SIMPLE>, <callcache>( 16) 0010 opt_send_without_block <callinfo!mid:method1, argc:0, ARGS_SIMPLE>, <callcache>( 17) 0013 opt_send_without_block <callinfo!mid:method2, argc:0, ARGS_SIMPLE>, <callcache>( 18) 0016 opt_send_without_block <callinfo!mid:method3, argc:0, ARGS_SIMPLE>, <callcache> 0019 leave ( 19)[Re] ``` The same situation to 2.5.* for ruby versions > 2.5.0 work fine: ``` == disasm: #<ISeq:hello@/home/viuignick/.RubyMine2019.2/config/scratches/scratch.rb:14 (14,0)-(19,3)> (catch: FALSE) 0000 opt_getinlinecache 7, <is:0> ( 15)[LiCa] 0003 getconstant :Test 0005 opt_setinlinecache <is:0> 0007 opt_send_without_block <callinfo!mid:new, argc:0, ARGS_SIMPLE>, <callcache> 0010 opt_send_without_block <callinfo!mid:method1, argc:0, ARGS_SIMPLE>, <callcache>( 16) 0013 opt_send_without_block <callinfo!mid:method2, argc:0, ARGS_SIMPLE>, <callcache>( 17) 0016 opt_send_without_block <callinfo!mid:method3, argc:0, ARGS_SIMPLE>, <callcache>( 18) 0019 leave ( 19)[Re] ```