Class: YTLJit::VM::Node::CRubyInstanceVarRefNode

Inherits:
InstanceVarRefNode show all
Includes:
CommonCodeGen, TypeListWithoutSignature, UnboxedArrayUtil
Defined in:
lib/ytljit/vm_cruby_obj.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

BaseNode::ESCAPE_LEVEL

Instance Attribute Summary

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

#compile_object_unboxed

Methods included from CommonCodeGen

#dump_context, #gen_alloca, #gen_call, #gen_save_thepr

Methods included from TypeListWithoutSignature

#add_type, #set_type_list, #type_list, #type_list_initvar

Methods inherited from InstanceVarRefNode

#collect_candidate_type, #collect_info, #compile

Methods included from NodeUtil

#search_class_top, #search_end, #search_frame_info, #search_top

Methods inherited from BaseNode

#add_element_node, #add_element_node_backward, #add_element_node_backward_aux, #collect_candidate_type, #collect_info, #compile, #decide_type, #decide_type_core, #decide_type_once, #gen_type_inference_proc, #get_constant_value, #inference_type, #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

#inspect_by_graph

Constructor Details

#initialize(parent, name, mnode) ⇒ CRubyInstanceVarRefNode

Returns a new instance of CRubyInstanceVarRefNode.



9
10
11
12
# File 'lib/ytljit/vm_cruby_obj.rb', line 9

def initialize(parent, name, mnode)
  super
  @current_frame_info = search_frame_info
end

Instance Method Details

#compile_main(context) ⇒ Object



14
15
16
17
18
# File 'lib/ytljit/vm_cruby_obj.rb', line 14

def compile_main(context)
  slfoff = @current_frame_info.offset_arg(2, BPR)
  cursig = context.to_signature
  compile_main_aux(context, slfoff, cursig[2])
end

#compile_main_aux(context, slfcont, slftype) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/ytljit/vm_cruby_obj.rb', line 20

def compile_main_aux(context, slfcont, slftype)
  mivl = @class_top.end_nodes[0].modified_instance_var.keys
  off = mivl.index(@name)
  cursig = context.to_signature
  asm = context.assembler

  if !slftype.boxed then
    context.start_using_reg(TMPR2)
    asm.with_retry do
      asm.mov(TMPR2, slfcont)
    end
    context = gen_ref_element(context, nil, off)
    context.end_using_reg(TMPR2)
    rtype = decide_type_once(cursig)
    if rtype.ruby_type == Float and !rtype.boxed then
      asm.with_retry do
        asm.mov(XMM0, context.ret_reg)
      end
      context.ret_reg = XMM0
    else
      asm.with_retry do
        asm.mov(RETR, context.ret_reg)
      end
      context.ret_reg = RETR
    end
    return context
  end

  addr = lambda {
    a = address_of("ytl_ivar_get_boxing")
    $symbol_table[a] = "ytl_ivar_get_boxing"
    a
  }
  ivarget = OpVarMemAddress.new(addr)
  context.start_arg_reg
  asm.with_retry do
    asm.mov(FUNC_ARG[0], slfcont)
    asm.mov(FUNC_ARG[1], off)
  end
  context = gen_save_thepr(context)
  context = gen_call(context, ivarget, 2)

  context.end_arg_reg
  context.ret_reg = RETR
  context.ret_node = self
  decide_type_once(cursig)
  if !@type.boxed then 
    context = @type.to_box.gen_unboxing(context)
  end
  context
end