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
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_regident, #collect_info, #fill_result_cache, #get_constant_value, get_macro_tab, #get_send_method_node, get_user_defined_method_tab, #initialize, macro_expand, make_send_node, node, #search_signature, #traverse_childlen
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, #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, #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
1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 |
# File 'lib/ytljit/vm_sendnode.rb', line 1930 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] } 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
1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 |
# File 'lib/ytljit/vm_sendnode.rb', line 1952 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 siz = ((@element_node_list[1..-1].max_by {|a| a[3][0]})[3][0]) + 1 context = gen_alloca(context, siz) context.start_using_reg(TMPR2) asm = context.assembler asm.with_retry do asm.mov(TMPR2, THEPR) end @arguments[1..-1].each_with_index do |anode, idx| context.start_using_reg(TMPR2) context = gen_set_element(context, nil, idx, anode) context.end_using_reg(TMPR2) 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 |