Class: YTLJit::VM::Node::SendElementAssignNode
- 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
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_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 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_regident(context, slf) ⇒ Object
1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 |
# File 'lib/ytljit/vm_sendnode.rb', line 1442 def collect_candidate_type_regident(context, slf) cursig = context.to_signature rtype = nil case [slf.ruby_type] when [Array] fixtype = RubyType::BaseType.from_ruby_class(Fixnum) val = @arguments[4] val.is_escape = :local_export @arguments[3].add_type(cursig, fixtype) cidx = @arguments[3].get_constant_value @arguments[2].type = nil slf = @arguments[2].decide_type_once(cursig) arg = [slf, cursig, val, cidx, context] @arguments[2].add_element_node_backward(arg) epare = nil @arguments[2].element_node_list.each do |ele| if ele[3] == cidx and ele[2] != self then epare = ele break end end if epare == nil then epare = @arguments[2].element_node_list[0] @arguments[2].element_node_list.each do |ele| if ele[3] == nil and ele[2] != self and ele[0] == slf then epare = ele break end end end esig = epare[1] enode = epare[2] if enode != self then same_type(self, enode, cursig, esig, context) end if slf.boxed then @arguments[4].set_escape_node_backward(:global_export) else @arguments[4].set_escape_node_backward(:local_export) end when [Hash] cidx = @arguments[3].get_constant_value @arguments[2].add_element_node(slf, cursig, self, cidx, context) niltype = RubyType::BaseType.from_ruby_class(NilClass) @arguments[3].type = nil @arguments[3].add_type(cursig, niltype) @arguments[4].type = nil @arguments[4].add_type(cursig, niltype) @arguments[3].set_escape_node_backward(:global_export) @arguments[4].set_escape_node_backward(:global_export) end context end |
#compile(context) ⇒ Object
1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 |
# File 'lib/ytljit/vm_sendnode.rb', line 1501 def compile(context) sig = context.to_signature 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_set_element(context, @arguments[2], @arguments[3], @arguments[4]) @body.compile(context) else super end end |