Class: YTLJit::VM::Node::RetArraySendNode
- Inherits:
-
RawSendNode
- Object
- BaseNode
- SendNode
- RawSendNode
- YTLJit::VM::Node::RetArraySendNode
- Includes:
- AbsArch, UnboxedArrayUtil
- Defined in:
- lib/ytljit/vm_sendnode.rb
Constant Summary
Constants included from AbsArch
AbsArch::AL, AbsArch::BL, AbsArch::CL, AbsArch::DL, AbsArch::FUNC_ARG, AbsArch::FUNC_ARG_YTL, AbsArch::FUNC_FLOAT_ARG, AbsArch::FUNC_FLOAT_ARG_YTL, AbsArch::INDIRECT_BPR, AbsArch::INDIRECT_RETR, AbsArch::INDIRECT_SPR, AbsArch::INDIRECT_TMPR, AbsArch::INDIRECT_TMPR2, AbsArch::INDIRECT_TMPR3
Constants included from SSE
SSE::XMM0, SSE::XMM1, SSE::XMM2, SSE::XMM3, SSE::XMM4, SSE::XMM5, SSE::XMM6, SSE::XMM7
Constants inherited from BaseNode
Instance Attribute Summary
Attributes inherited from SendNode
#arguments, #class_top, #current_exception_table, #frame_info, #func, #modified_instance_var, #modified_local_var, #next_node, #opt_flag, #result_cache, #seq_no, #yield_signature_cache
Attributes included from HaveChildlenMixin
Attributes inherited from BaseNode
#code_space, #debug_info, #element_node_list, #id, #is_escape, #parent, #ti_observee, #ti_observer, #type
Instance Method Summary collapse
Methods included from UnboxedArrayUtil
#compile_array_unboxed, #gen_ref_element, #gen_set_element
Methods included from UnboxedObjectUtil
Methods inherited from RawSendNode
Methods inherited from SendNode
add_special_send_node, #check_signature_changed, #collect_candidate_type, #collect_candidate_type_block, #collect_candidate_type_regident, #collect_info, #fill_result_cache, #get_constant_value, get_macro_tab, #get_send_method_node, get_user_defined_method_tab, #inherit_from_callee, #initialize, macro_expand, make_send_node, node, #search_signature, #traverse_childlen, #traverse_node
Methods included from SendUtil
#compile_c_fixarg, #compile_c_fixarg_raw, #compile_c_vararg, #compile_ytl, #gen_eval_self, #signature
Methods included from NodeUtil
#search_class_top, #search_end, #search_frame_info, #search_top
Methods included from SendNodeCodeGen
Methods included from CommonCodeGen
#dump_context, #gen_alloca, #gen_call, #gen_save_thepr
Methods included from OptFlagOp
#is_args_blockarg, #is_args_splat, #is_fcall, #is_opt_send, #is_super, #is_tailcall, #is_tailrecursion, #is_vcall
Methods included from HaveChildlenMixin
#initialize, #traverse_childlen
Methods inherited from BaseNode
#add_element_node, #add_element_node_backward, #add_element_node_backward_aux, #collect_candidate_type, #collect_info, #decide_type, #decide_type_core, #decide_type_once, #gen_type_inference_proc, #get_constant_value, #inference_type, #initialize, #marge_element_node, #marge_type, #same_type, #search_valid_signature, #set_escape_node, #set_escape_node_backward, #ti_add_observer, #ti_changed, #ti_del_link, #ti_reset, #ti_update
Methods included from TypeListWithSignature
#add_type, #set_type_list, #type_list, #type_list_initvar
Methods included from Inspect
Constructor Details
This class inherits a constructor from YTLJit::VM::Node::SendNode
Instance Method Details
#collect_candidate_type_body(context) ⇒ Object
2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 |
# File 'lib/ytljit/vm_sendnode.rb', line 2347 def collect_candidate_type_body(context) sig = context.to_signature tt = RubyType::BaseType.from_ruby_class(Array) if context.[:compile_array_as_uboxed] and @element_node_list.size > 1 and @element_node_list[1..-1].all? {|e| e[3] or e[2].class == BaseNode } then tt = tt.to_unbox end add_type(sig, tt) @type = nil tt = decide_type_once(sig) @arguments[1..-1].each_with_index do |anode, idx| add_element_node(tt, sig, anode, [idx], context) end context end |
#compile(context) ⇒ Object
2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 |
# File 'lib/ytljit/vm_sendnode.rb', line 2369 def compile(context) sig = context.to_signature rtype = decide_type_once(sig) rrtype = rtype.ruby_type if rrtype == Array and !rtype.boxed and @is_escape != :global_export then sizent = @element_node_list[1..-1].max_by {|a| a[3] ? a[3][0] : -1} siz = sizent[3][0] + 1 context = gen_alloca(context, siz) context.start_using_reg(TMPR2) asm = context.assembler asm.with_retry do asm.mov(TMPR2, THEPR) asm.mov(INDIRECT_TMPR2, siz) asm.add(TMPR2, 8) end context.set_reg_content(TMPR2, THEPR) @arguments[1..-1].each_with_index do |anode, idx| context = gen_set_element(context, nil, idx, anode) end asm.with_retry do asm.mov(RETR, TMPR2) end context.end_using_reg(TMPR2) context.ret_reg = RETR context.set_reg_content(RETR, self) context.ret_node = self @body.compile(context) else super end end |