@@ -25,6 +25,43 @@ def visit_string_literal(node)
2525 end
2626 end
2727
28+ CALLDATA_FLAGS = {
29+ "ARGS_SPLAT" => CallData ::CALL_ARGS_SPLAT ,
30+ "ARGS_BLOCKARG" => CallData ::CALL_ARGS_BLOCKARG ,
31+ "FCALL" => CallData ::CALL_FCALL ,
32+ "VCALL" => CallData ::CALL_VCALL ,
33+ "ARGS_SIMPLE" => CallData ::CALL_ARGS_SIMPLE ,
34+ "BLOCKISEQ" => CallData ::CALL_BLOCKISEQ ,
35+ "KWARG" => CallData ::CALL_KWARG ,
36+ "KW_SPLAT" => CallData ::CALL_KW_SPLAT ,
37+ "TAILCALL" => CallData ::CALL_TAILCALL ,
38+ "SUPER" => CallData ::CALL_SUPER ,
39+ "ZSUPER" => CallData ::CALL_ZSUPER ,
40+ "OPT_SEND" => CallData ::CALL_OPT_SEND ,
41+ "KW_SPLAT_MUT" => CallData ::CALL_KW_SPLAT_MUT
42+ } . freeze
43+
44+ DEFINED_TYPES = [
45+ nil ,
46+ "nil" ,
47+ "instance-variable" ,
48+ "local-variable" ,
49+ "global-variable" ,
50+ "class variable" ,
51+ "constant" ,
52+ "method" ,
53+ "yield" ,
54+ "super" ,
55+ "self" ,
56+ "true" ,
57+ "false" ,
58+ "assignment" ,
59+ "expression" ,
60+ "ref" ,
61+ "func" ,
62+ "constant-from"
63+ ] . freeze
64+
2865 attr_reader :filepath
2966
3067 def initialize ( filepath )
@@ -105,7 +142,12 @@ def assemble_iseq(iseq, lines)
105142 assemble_iseq ( class_iseq , body )
106143 iseq . defineclass ( name , class_iseq , flags )
107144 when "defined"
108- raise NotImplementedError
145+ type , object , message = operands . split ( /,\s */ )
146+ iseq . defined (
147+ DEFINED_TYPES . index ( type ) ,
148+ parse_symbol ( object ) ,
149+ parse_string ( message )
150+ )
109151 when "definemethod"
110152 body = parse_nested ( lines [ line_index ..] )
111153 line_index += body . length
@@ -158,12 +200,13 @@ def assemble_iseq(iseq, lines)
158200 when "intern"
159201 iseq . intern
160202 when "invokeblock"
161- cdata = operands ? calldata ( operands ) : YARV . calldata ( nil , 0 )
162- iseq . invokeblock ( cdata )
203+ iseq . invokeblock (
204+ operands ? parse_calldata ( operands ) : YARV . calldata ( nil , 0 )
205+ )
163206 when "invokesuper"
164- cdata =
207+ calldata =
165208 if operands
166- calldata ( operands )
209+ parse_calldata ( operands )
167210 else
168211 YARV . calldata (
169212 nil ,
@@ -183,7 +226,7 @@ def assemble_iseq(iseq, lines)
183226 block_iseq
184227 end
185228
186- iseq . invokesuper ( cdata , block_iseq )
229+ iseq . invokesuper ( calldata , block_iseq )
187230 when "jump"
188231 iseq . jump ( labels [ operands ] )
189232 when "leave"
@@ -282,7 +325,7 @@ def assemble_iseq(iseq, lines)
282325 when "opt_reverse"
283326 iseq . send ( YARV . calldata ( :reverse ) )
284327 when "opt_send_without_block"
285- iseq . send ( calldata ( operands ) )
328+ iseq . send ( parse_calldata ( operands ) )
286329 when "opt_size"
287330 iseq . send ( YARV . calldata ( :size ) )
288331 when "opt_str_freeze"
@@ -316,7 +359,7 @@ def assemble_iseq(iseq, lines)
316359 block_iseq
317360 end
318361
319- iseq . send ( calldata ( operands ) , block_iseq )
362+ iseq . send ( parse_calldata ( operands ) , block_iseq )
320363 when "setblockparam"
321364 lookup = find_local ( iseq , operands )
322365 iseq . setblockparam ( lookup . index , lookup . level )
@@ -400,23 +443,7 @@ def parse_nested(lines)
400443 body . map! { |line | line . delete_prefix! ( " " ) || +"" }
401444 end
402445
403- CALLDATA_FLAGS = {
404- "ARGS_SPLAT" => CallData ::CALL_ARGS_SPLAT ,
405- "ARGS_BLOCKARG" => CallData ::CALL_ARGS_BLOCKARG ,
406- "FCALL" => CallData ::CALL_FCALL ,
407- "VCALL" => CallData ::CALL_VCALL ,
408- "ARGS_SIMPLE" => CallData ::CALL_ARGS_SIMPLE ,
409- "BLOCKISEQ" => CallData ::CALL_BLOCKISEQ ,
410- "KWARG" => CallData ::CALL_KWARG ,
411- "KW_SPLAT" => CallData ::CALL_KW_SPLAT ,
412- "TAILCALL" => CallData ::CALL_TAILCALL ,
413- "SUPER" => CallData ::CALL_SUPER ,
414- "ZSUPER" => CallData ::CALL_ZSUPER ,
415- "OPT_SEND" => CallData ::CALL_OPT_SEND ,
416- "KW_SPLAT_MUT" => CallData ::CALL_KW_SPLAT_MUT
417- } . freeze
418-
419- def calldata ( value )
446+ def parse_calldata ( value )
420447 message , argc_value , flags_value = value . split
421448 flags =
422449 if flags_value
0 commit comments