Class: YTLJit::VM::Node::SendElementRefNode
- Includes:
- SendUtil, 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 included from SendUtil
#compile_c_fixarg, #compile_c_fixarg_raw, #compile_c_vararg, #compile_ytl, #gen_eval_self, #signature
Methods inherited from SendNode
add_special_send_node, #check_signature_changed, #collect_candidate_type, #collect_candidate_type_block, #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 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_regident(context, slf) ⇒ Object
1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 |
# File 'lib/ytljit/vm_sendnode.rb', line 1609 def collect_candidate_type_regident(context, slf) cursig = context.to_signature case [slf.ruby_type] when [Array] fixtype = RubyType::BaseType.from_ruby_class(Fixnum) idxtype = @arguments[3].decide_type_once(cursig) if idxtype.ruby_type == Range or @arguments[4] then same_type(self, @arguments[2], cursig, cursig, context) return context end @arguments[3].add_type(cursig, fixtype) cidx = @arguments[3].get_constant_value # decide type again @arguments[2].type = nil slf = @arguments[2].decide_type_once(cursig) # p debug_info # p @arguments[2].type_list(cursig) epare = nil @arguments[2].element_node_list.each do |ele| if ele[3] == cidx and ele[2] != self and ele[0] == slf then epare2 = ele esig = epare2[1] enode = epare2[2] if enode.decide_type_once(esig).ruby_type != Object then epare = epare2 same_type(self, enode, cursig, esig, context) end end end if epare == nil then @arguments[2].element_node_list.each do |ele| if ele[3] == nil and ele[2] != self and ele[0] == slf then epare2 = ele esig = epare2[1] enode = epare2[2] if enode.decide_type_once(esig).ruby_type != Object then epare = epare2 same_type(self, enode, cursig, esig, context) end end end end =begin if epare == nil then @arguments[2].element_node_list.each do |ele| if ele[3] == cidx and ele[2] != self and ele[0].ruby_type == slf.ruby_type then epare2 = ele esig = epare2[1] enode = epare2[2] if enode.decide_type_once(esig).ruby_type != Object then epare = epare2 same_type(self, enode, cursig, esig, context) end end end end if epare == nil then nele = @arguments[2].element_node_list.select {|e| e[3] == nil} if nele.size == 1 then epare = nele[0] esig = epare[1] enode = epare[2] same_type(self, enode, cursig, esig, context) end end =end if epare == nil then if slf.have_element? and slf.element_type and slf.element_type[nil] and slf.element_type[nil][0] then add_type(cursig, slf.element_type[nil][0]) else p "foo" end end @type = nil when [Hash] cidx = @arguments[3].get_constant_value rtype = @arguments[2].decide_type_once(cursig) niltype = RubyType::BaseType.from_ruby_class(NilClass) @arguments[3].type = nil @arguments[3].add_type(cursig, niltype) @arguments[2].add_element_node(rtype, cursig, self, cidx, context) when [String] tt = RubyType::BaseType.from_ruby_class(String) add_type(cursig, tt) end context end |
#compile(context) ⇒ Object
1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 |
# File 'lib/ytljit/vm_sendnode.rb', line 1714 def compile(context) sig = context.to_signature asm = context.assembler # @arguments[2].type = nil rtype = @arguments[2].decide_type_once(sig) rrtype = rtype.ruby_type if rrtype == Array and !rtype.boxed and @arguments[2].is_escape != :global_export then context = gen_ref_element(context, @arguments[2], @arguments[3]) # @type = nil rtype = decide_type_once(sig) if rtype.ruby_type == Float and !rtype.boxed then asm.with_retry do asm.mov(XMM0, context.ret_reg) end context.ret_reg = XMM0 context.set_reg_content(XMM0, self) else asm.with_retry do asm.mov(RETR, context.ret_reg) end context.ret_reg = RETR context.set_reg_content(RETR, self) end @body.compile(context) else =begin p @arguments[2].type p @arguments[2].instance_eval {@type_list} p sig p @arguments[2].is_escape p debug_info =end super end end |