From: "ko1 (Koichi Sasada)" Date: 2022-03-28T01:47:23+00:00 Subject: [ruby-core:108093] [Ruby master Feature#18660] Line event flags on instruction in method/block signature Issue #18660 has been updated by ko1 (Koichi Sasada). Status changed from Open to Closed I understand the request, but current specification is because of the current implementation (I don't have good idea to implement it without performance penalty). I have several ideas to do it (without performance penalty) but it needs big change, so I hesitate about it. (one idea is multi-head iseq) ---------------------------------------- Feature #18660: Line event flags on instruction in method/block signature https://bugs.ruby-lang.org/issues/18660#change-97055 * Author: hurricup (Alexandr Evstigneev) * Status: Closed * Priority: Normal ---------------------------------------- Ruby in question is 3.0.3. Not sure what behavior is on different versions, but presume the same. It's unclear why operations in signatures are not marked with `Li`, despite they may be a valid and meaningful code. Consider example: ``` class A def foo(some = BasicObject.new) yield end end A.new.foo {|a = BasicObject.new| 1 + a} ``` And here is the disasm of method iseq: ``` local table (size: 1, argc: 0 [opts: 1, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1]) [ 1] some@0 0000 opt_getinlinecache 9, ( 2) 0003 putobject true 0005 getconstant :BasicObject 0007 opt_setinlinecache 0009 opt_send_without_block 0011 setlocal_WC_0 some@0 0013 invokeblock ( 3)[LiCa] 0015 leave ( 4)[Re] ``` Here is the block iseq: ``` local table (size: 1, argc: 0 [opts: 1, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1]) [ 1] a@0 0000 opt_getinlinecache 9, ( 7) 0003 putobject true 0005 getconstant :BasicObject 0007 opt_setinlinecache 0009 opt_send_without_block 0011 setlocal_WC_0 a@0 0013 nop [Bc] 0014 putobject_INT2FIX_1_ [Li] 0015 getlocal_WC_0 a@0 0017 opt_plus 0019 nop 0020 leave ( 7)[Br] ``` And this is a bit confusing. 1. I would expect `Ca`/`Bc` events to be fired on the first instruction, not in the middle of `iseq` 2. I would expect `Li` to exist on pc=0 for the both method and block -- https://bugs.ruby-lang.org/ Unsubscribe: