ytljit 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/extconf.rb +1 -1
- data/ext/memory.c +3 -3
- data/ext/ytljit.c +87 -48
- data/ext/ytljit.h +2 -0
- data/lib/ytljit/asm.rb +44 -8
- data/lib/ytljit/asmext.rb +1 -1
- data/lib/ytljit/asmext_x64.rb +18 -34
- data/lib/ytljit/asmext_x86.rb +15 -13
- data/lib/ytljit/asmutil.rb +4 -0
- data/lib/ytljit/instruction.rb +8 -1
- data/lib/ytljit/instruction_ia.rb +27 -16
- data/lib/ytljit/instruction_x64.rb +1 -3
- data/lib/ytljit/util.rb +29 -0
- data/lib/ytljit/vm.rb +464 -135
- data/lib/ytljit/vm_codegen.rb +111 -30
- data/lib/ytljit/vm_cruby_obj.rb +12 -10
- data/lib/ytljit/vm_inline_method.rb +32 -4
- data/lib/ytljit/vm_sendnode.rb +292 -38
- data/lib/ytljit/vm_trans.rb +221 -25
- data/lib/ytljit/vm_type.rb +6 -1
- data/lib/ytljit/vm_type_gen.rb +102 -20
- data/test/test_assemble2.rb +11 -8
- metadata +3 -3
data/lib/ytljit/vm.rb
CHANGED
@@ -110,7 +110,7 @@ LocalVarNode
|
|
110
110
|
if @my_element_node == nil then
|
111
111
|
@my_element_node = BaseNode.new(self)
|
112
112
|
end
|
113
|
-
@element_node_list = [[sig, @my_element_node]]
|
113
|
+
@element_node_list = [[sig, @my_element_node, nil]]
|
114
114
|
end
|
115
115
|
end
|
116
116
|
end
|
@@ -137,7 +137,7 @@ LocalVarNode
|
|
137
137
|
if @my_element_node == nil then
|
138
138
|
@my_element_node = BaseNode.new(self)
|
139
139
|
end
|
140
|
-
@element_node_list = [[sig, @my_element_node]]
|
140
|
+
@element_node_list = [[sig, @my_element_node, nil]]
|
141
141
|
end
|
142
142
|
end
|
143
143
|
end
|
@@ -173,9 +173,12 @@ LocalVarNode
|
|
173
173
|
@my_element_node = nil
|
174
174
|
@type_inference_proc = cs
|
175
175
|
@type_cache = nil
|
176
|
+
@is_escape = false
|
176
177
|
|
177
178
|
@ti_observer = {}
|
178
179
|
@ti_observee = []
|
180
|
+
|
181
|
+
@debug_info = nil
|
179
182
|
end
|
180
183
|
|
181
184
|
attr_accessor :parent
|
@@ -184,10 +187,13 @@ LocalVarNode
|
|
184
187
|
|
185
188
|
attr_accessor :type
|
186
189
|
attr_accessor :element_node_list
|
190
|
+
attr_accessor :is_escape
|
187
191
|
|
188
192
|
attr :ti_observer
|
189
193
|
attr :ti_observee
|
190
194
|
|
195
|
+
attr_accessor :debug_info
|
196
|
+
|
191
197
|
def collect_info(context)
|
192
198
|
if is_a?(HaveChildlenMixin) then
|
193
199
|
traverse_childlen {|rec|
|
@@ -296,6 +302,8 @@ LocalVarNode
|
|
296
302
|
dst.ti_changed
|
297
303
|
context.convergent = false
|
298
304
|
end
|
305
|
+
|
306
|
+
dst.is_escape ||= src.is_escape
|
299
307
|
end
|
300
308
|
|
301
309
|
def same_type(dst, src, dsig, ssig, context)
|
@@ -319,15 +327,27 @@ LocalVarNode
|
|
319
327
|
ti_update(dst, src, dsig, ssig, context)
|
320
328
|
end
|
321
329
|
|
322
|
-
def add_element_node(sig, enode, context)
|
330
|
+
def add_element_node(sig, enode, index, context)
|
323
331
|
slfetnode = @element_node_list
|
324
332
|
unless slfetnode.include?(enode)
|
325
|
-
@element_node_list
|
333
|
+
if @element_node_list == nil and index != nil then
|
334
|
+
@element_node_list.push [sig, enode, nil]
|
335
|
+
end
|
336
|
+
@element_node_list.push [sig, enode, index]
|
326
337
|
orgsig = @element_node_list[0][0]
|
327
338
|
orgnode = @element_node_list[0][1]
|
328
339
|
if orgnode != enode then
|
329
340
|
same_type(orgnode, enode, orgsig, sig, context)
|
330
341
|
end
|
342
|
+
if index != nil then
|
343
|
+
@element_node_list.each do |orgsig, orgnode, orgindex|
|
344
|
+
if orgindex == index and
|
345
|
+
orgnode != enode then
|
346
|
+
same_type(orgnode, enode, orgsig, sig, context)
|
347
|
+
end
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
331
351
|
ti_changed
|
332
352
|
# context.convergent = false
|
333
353
|
end
|
@@ -338,17 +358,18 @@ LocalVarNode
|
|
338
358
|
context
|
339
359
|
end
|
340
360
|
|
341
|
-
def decide_type_core(tlist)
|
361
|
+
def decide_type_core(tlist, local_cache = {})
|
342
362
|
tlist = tlist.select {|e| e.class != RubyType::DefaultType0 }
|
343
363
|
case tlist.size
|
344
364
|
when 0
|
345
365
|
RubyType::DefaultType0.new
|
346
366
|
|
347
367
|
when 1
|
368
|
+
local_cache[self] = tlist[0]
|
348
369
|
if tlist[0].have_element? then
|
349
370
|
sig = @element_node_list[0][0]
|
350
371
|
node = @element_node_list[0][1]
|
351
|
-
node.decide_type_once(sig)
|
372
|
+
node.decide_type_once(sig, local_cache)
|
352
373
|
tlist[0].element_type = node.type
|
353
374
|
end
|
354
375
|
tlist[0]
|
@@ -360,18 +381,25 @@ LocalVarNode
|
|
360
381
|
else
|
361
382
|
tlist[1]
|
362
383
|
end
|
384
|
+
|
363
385
|
else
|
364
386
|
RubyType::DefaultType0.new
|
365
387
|
end
|
366
388
|
end
|
367
389
|
|
368
|
-
def decide_type_once(sig)
|
390
|
+
def decide_type_once(sig, local_cache = {})
|
391
|
+
if local_cache[self] then
|
392
|
+
return local_cache[self]
|
393
|
+
end
|
394
|
+
|
369
395
|
if @type.equal?(nil) or @type.is_a?(RubyType::DefaultType0) then
|
370
396
|
tlist = type_list(sig).flatten.uniq
|
371
|
-
@type = decide_type_core(tlist)
|
397
|
+
@type = decide_type_core(tlist, local_cache)
|
372
398
|
else
|
373
399
|
@type
|
374
400
|
end
|
401
|
+
|
402
|
+
@type
|
375
403
|
end
|
376
404
|
|
377
405
|
def decide_type(sig)
|
@@ -511,9 +539,7 @@ LocalVarNode
|
|
511
539
|
context.start_using_reg(TMPR2)
|
512
540
|
|
513
541
|
context = gen_make_argv(context) do |context, rarg|
|
514
|
-
context.
|
515
|
-
context.start_using_reg(FUNC_ARG[1])
|
516
|
-
context.start_using_reg(FUNC_ARG[2])
|
542
|
+
context.start_arg_reg
|
517
543
|
|
518
544
|
context.cpustack_pushn(3 * AsmType::MACHINE_WORD.size)
|
519
545
|
casm = context.assembler
|
@@ -521,27 +547,25 @@ LocalVarNode
|
|
521
547
|
casm.mov(FUNC_ARG[0], rarg.size) # argc
|
522
548
|
casm.mov(FUNC_ARG[1], TMPR2) # argv
|
523
549
|
end
|
524
|
-
context.set_reg_content(FUNC_ARG[0], nil)
|
525
|
-
context.set_reg_content(FUNC_ARG[1], TMPR2)
|
550
|
+
context.set_reg_content(FUNC_ARG[0].dst_opecode, nil)
|
551
|
+
context.set_reg_content(FUNC_ARG[1].dst_opecode, TMPR2)
|
526
552
|
|
527
553
|
# Method Select
|
528
554
|
# it is legal. use TMPR2 for method select
|
529
|
-
# use
|
555
|
+
# use PTMPR for store self
|
530
556
|
context = @func.compile(context)
|
531
557
|
fnc = context.ret_reg
|
532
558
|
casm.with_retry do
|
533
559
|
casm.mov(FUNC_ARG[2], context.ret_reg2) # self
|
534
560
|
end
|
535
|
-
context.set_reg_content(FUNC_ARG[2], context.ret_node)
|
561
|
+
context.set_reg_content(FUNC_ARG[2].dst_opecode, context.ret_node)
|
536
562
|
|
537
563
|
context = gen_call(context, fnc, 3)
|
538
564
|
context.cpustack_popn(3 * AsmType::MACHINE_WORD.size)
|
539
|
-
|
540
|
-
context.end_using_reg(FUNC_ARG[2])
|
541
|
-
context.end_using_reg(FUNC_ARG[1])
|
542
|
-
context.end_using_reg(FUNC_ARG[0])
|
565
|
+
context.end_arg_reg
|
543
566
|
context.end_using_reg(TMPR2)
|
544
567
|
context.ret_reg = RETR
|
568
|
+
context.set_reg_content(context.ret_reg, self)
|
545
569
|
context.ret_node = self
|
546
570
|
|
547
571
|
decide_type_once(context.to_signature)
|
@@ -557,9 +581,7 @@ LocalVarNode
|
|
557
581
|
fnc = nil
|
558
582
|
numarg = @arguments.size - 2
|
559
583
|
|
560
|
-
|
561
|
-
context.start_using_reg(FUNC_ARG[i])
|
562
|
-
end
|
584
|
+
context.start_arg_reg
|
563
585
|
context.cpustack_pushn(numarg * AsmType::MACHINE_WORD.size)
|
564
586
|
|
565
587
|
argpos = 0
|
@@ -575,14 +597,15 @@ LocalVarNode
|
|
575
597
|
# Self
|
576
598
|
# Method Select
|
577
599
|
# it is legal. use TMPR2 for method select
|
578
|
-
# use
|
600
|
+
# use PTMPR for store self
|
579
601
|
context = @func.compile(context)
|
580
602
|
fnc = context.ret_reg
|
581
603
|
casm = context.assembler
|
582
604
|
casm.with_retry do
|
583
605
|
casm.mov(FUNC_ARG[0], context.ret_reg2)
|
584
606
|
end
|
585
|
-
context.set_reg_content(FUNC_ARG[0],
|
607
|
+
context.set_reg_content(FUNC_ARG[0].dst_opecode,
|
608
|
+
context.ret_node)
|
586
609
|
else
|
587
610
|
# other arg.
|
588
611
|
context = arg.compile(context)
|
@@ -593,7 +616,8 @@ LocalVarNode
|
|
593
616
|
casm.with_retry do
|
594
617
|
casm.mov(FUNC_ARG[argpos], context.ret_reg)
|
595
618
|
end
|
596
|
-
context.set_reg_content(FUNC_ARG[argpos],
|
619
|
+
context.set_reg_content(FUNC_ARG[argpos].dst_opecode,
|
620
|
+
context.ret_node)
|
597
621
|
end
|
598
622
|
argpos = argpos + 1
|
599
623
|
cursrc = cursrc + 1
|
@@ -602,11 +626,10 @@ LocalVarNode
|
|
602
626
|
context = gen_call(context, fnc, numarg)
|
603
627
|
|
604
628
|
context.cpustack_popn(numarg * AsmType::MACHINE_WORD.size)
|
605
|
-
|
606
|
-
context.end_using_reg(FUNC_ARG[numarg - i - 1])
|
607
|
-
end
|
629
|
+
context.end_arg_reg
|
608
630
|
context.end_using_reg(fnc)
|
609
631
|
context.ret_reg = RETR
|
632
|
+
context.set_reg_content(context.ret_reg, self)
|
610
633
|
|
611
634
|
decide_type_once(context.to_signature)
|
612
635
|
if !@type.boxed then
|
@@ -620,9 +643,8 @@ LocalVarNode
|
|
620
643
|
fnc = nil
|
621
644
|
numarg = @arguments.size
|
622
645
|
|
623
|
-
|
624
|
-
|
625
|
-
end
|
646
|
+
context.start_arg_reg
|
647
|
+
context.start_arg_reg(FUNC_ARG_YTL)
|
626
648
|
context.cpustack_pushn(numarg * 8)
|
627
649
|
|
628
650
|
# push prev env
|
@@ -633,12 +655,12 @@ LocalVarNode
|
|
633
655
|
casm.mov(TMPR, prevenv)
|
634
656
|
casm.mov(FUNC_ARG_YTL[0], TMPR)
|
635
657
|
end
|
636
|
-
context.set_reg_content(FUNC_ARG_YTL[0], prevenv)
|
658
|
+
context.set_reg_content(FUNC_ARG_YTL[0].dst_opecode, prevenv)
|
637
659
|
else
|
638
660
|
casm.with_retry do
|
639
661
|
casm.mov(FUNC_ARG_YTL[0], BPR)
|
640
662
|
end
|
641
|
-
context.set_reg_content(FUNC_ARG_YTL[0], BPR)
|
663
|
+
context.set_reg_content(FUNC_ARG_YTL[0].dst_opecode, BPR)
|
642
664
|
end
|
643
665
|
|
644
666
|
# block
|
@@ -647,6 +669,7 @@ LocalVarNode
|
|
647
669
|
|
648
670
|
# compile block with other code space and context
|
649
671
|
tcontext = context.dup
|
672
|
+
tcontext.prev_context = context
|
650
673
|
@arguments[1].compile(tcontext)
|
651
674
|
|
652
675
|
casm = context.assembler
|
@@ -658,34 +681,77 @@ LocalVarNode
|
|
658
681
|
casm.with_retry do
|
659
682
|
casm.mov(FUNC_ARG_YTL[i + 3], context.ret_reg)
|
660
683
|
end
|
661
|
-
context.set_reg_content(FUNC_ARG_YTL[i + 3],
|
684
|
+
context.set_reg_content(FUNC_ARG_YTL[i + 3].dst_opecode,
|
685
|
+
context.ret_node)
|
662
686
|
end
|
663
687
|
|
664
688
|
casm.with_retry do
|
665
689
|
entry = @arguments[1].code_space.var_base_immidiate_address
|
666
690
|
casm.mov(FUNC_ARG_YTL[1], entry)
|
667
691
|
end
|
668
|
-
context.set_reg_content(FUNC_ARG_YTL[1], nil)
|
692
|
+
context.set_reg_content(FUNC_ARG_YTL[1].dst_opecode, nil)
|
669
693
|
|
670
694
|
# self
|
671
695
|
# Method Select
|
672
696
|
# it is legal. use TMPR2 for method select
|
673
|
-
# use
|
697
|
+
# use PTMPR for store self
|
674
698
|
context = @func.compile(context)
|
675
699
|
fnc = context.ret_reg
|
676
700
|
casm = context.assembler
|
677
701
|
casm.with_retry do
|
678
702
|
casm.mov(FUNC_ARG_YTL[2], context.ret_reg2)
|
679
703
|
end
|
680
|
-
context.set_reg_content(FUNC_ARG_YTL[2], @arguments[2])
|
704
|
+
context.set_reg_content(FUNC_ARG_YTL[2].dst_opecode, @arguments[2])
|
681
705
|
|
682
706
|
context = gen_call(context, fnc, numarg)
|
683
707
|
|
684
708
|
context.cpustack_popn(numarg * 8)
|
685
|
-
|
686
|
-
|
709
|
+
context.end_arg_reg
|
710
|
+
context.end_arg_reg(FUNC_ARG_YTL)
|
711
|
+
context.end_using_reg(fnc)
|
712
|
+
context
|
713
|
+
end
|
714
|
+
|
715
|
+
def compile_c_fixarg_raw(context)
|
716
|
+
context = @func.compile(context)
|
717
|
+
fnc = context.ret_reg
|
718
|
+
numarg = @arguments.size
|
719
|
+
|
720
|
+
context.start_arg_reg
|
721
|
+
context.cpustack_pushn(numarg * AsmType::MACHINE_WORD.size)
|
722
|
+
|
723
|
+
@arguments.each_with_index do |arg, argpos|
|
724
|
+
# p "#{@func.name} #{argpos}"
|
725
|
+
context = arg.compile(context)
|
726
|
+
rtype = context.ret_node.decide_type_once(context.to_signature)
|
727
|
+
|
728
|
+
atype = @func.arg_type[argpos]
|
729
|
+
if atype == :"..." or atype == nil then
|
730
|
+
if @func.arg_type.last == :"..." then
|
731
|
+
atype = @func.arg_type[-2]
|
732
|
+
end
|
733
|
+
end
|
734
|
+
if atype == :VALUE then
|
735
|
+
context = rtype.gen_boxing(context)
|
736
|
+
end
|
737
|
+
|
738
|
+
casm = context.assembler
|
739
|
+
casm.with_retry do
|
740
|
+
casm.mov(FUNC_ARG[argpos], context.ret_reg)
|
741
|
+
end
|
742
|
+
context.set_reg_content(FUNC_ARG[argpos].dst_opecode,
|
743
|
+
context.ret_node)
|
687
744
|
end
|
745
|
+
|
746
|
+
context = gen_call(context, fnc, numarg)
|
747
|
+
|
748
|
+
context.cpustack_popn(numarg * AsmType::MACHINE_WORD.size)
|
749
|
+
context.end_arg_reg
|
688
750
|
context.end_using_reg(fnc)
|
751
|
+
context.ret_reg = RETR
|
752
|
+
context.set_reg_content(context.ret_reg, self)
|
753
|
+
|
754
|
+
decide_type_once(context.to_signature)
|
689
755
|
context
|
690
756
|
end
|
691
757
|
end
|
@@ -761,21 +827,59 @@ LocalVarNode
|
|
761
827
|
end
|
762
828
|
end
|
763
829
|
|
764
|
-
def
|
830
|
+
def add_arg_to_args(args, addnum)
|
831
|
+
if args.is_a?(Integer) then
|
832
|
+
args = args + addnum
|
833
|
+
elsif args.is_a?(Array) then
|
834
|
+
args = args.dup
|
835
|
+
args[0] += addnum
|
836
|
+
args[3] += addnum if args[3] >= 0
|
837
|
+
args[4] += addnum if args[4] >= 0
|
838
|
+
args[5] += addnum if args[5] >= 0
|
839
|
+
else
|
840
|
+
raise "Unkonwn args #{args}"
|
841
|
+
end
|
842
|
+
|
843
|
+
args
|
844
|
+
end
|
845
|
+
|
846
|
+
def construct_frame_info(locals, argnum, args)
|
765
847
|
finfo = LocalFrameInfoNode.new(self)
|
766
|
-
finfo.system_num =
|
848
|
+
finfo.system_num = 5 # BP ON Stack, HP, ET, BP, RET
|
849
|
+
|
850
|
+
argc = args
|
851
|
+
opt_label = []
|
852
|
+
rest_index = -1
|
853
|
+
post_len = -1
|
854
|
+
post_start = -1
|
855
|
+
block_index = -1
|
856
|
+
simple = -1
|
857
|
+
if args.is_a?(Array) then
|
858
|
+
argc = args[0]
|
859
|
+
opt_label = args[1]
|
860
|
+
post_len = args[2]
|
861
|
+
post_start = args[3]
|
862
|
+
rest_index = args[4]
|
863
|
+
block_index = args[5]
|
864
|
+
simple = args[6]
|
865
|
+
end
|
767
866
|
|
768
|
-
#
|
867
|
+
# 5means BP, HP, Exception Tag, BP and SP
|
769
868
|
lsize = locals.size + finfo.system_num
|
770
869
|
|
771
870
|
# construct frame
|
772
871
|
frame_layout = Array.new(lsize)
|
773
|
-
i = 0
|
774
872
|
fargstart = lsize - argnum
|
873
|
+
i = 0
|
775
874
|
argnum.times do
|
776
|
-
|
875
|
+
kind = :arg
|
876
|
+
if i == rest_index then
|
877
|
+
kind = :rest_arg
|
878
|
+
end
|
879
|
+
lnode = LocalVarNode.new(finfo, locals[i], fargstart + i,
|
880
|
+
kind)
|
777
881
|
frame_layout[fargstart + i] = lnode
|
778
|
-
i
|
882
|
+
i = i + 1
|
779
883
|
end
|
780
884
|
|
781
885
|
curpos = fargstart - 1
|
@@ -786,7 +890,10 @@ LocalVarNode
|
|
786
890
|
:OLD_BP, curpos)
|
787
891
|
curpos -= 1
|
788
892
|
frame_layout[curpos] = SystemValueNode.new(finfo,
|
789
|
-
:
|
893
|
+
:EXPTAG, curpos)
|
894
|
+
curpos -= 1
|
895
|
+
frame_layout[curpos] = SystemValueNode.new(finfo,
|
896
|
+
:TMPHEAP, curpos)
|
790
897
|
curpos -= 1
|
791
898
|
frame_layout[curpos] = SystemValueNode.new(finfo,
|
792
899
|
:OLD_BPSTACK, curpos)
|
@@ -794,7 +901,7 @@ LocalVarNode
|
|
794
901
|
j = 0
|
795
902
|
lvarnum = lsize - finfo.system_num
|
796
903
|
while i < lvarnum do
|
797
|
-
lnode = LocalVarNode.new(finfo, locals[i], j)
|
904
|
+
lnode = LocalVarNode.new(finfo, locals[i], j, :local_var)
|
798
905
|
frame_layout[j] = lnode
|
799
906
|
i += 1
|
800
907
|
j += 1
|
@@ -803,6 +910,7 @@ LocalVarNode
|
|
803
910
|
finfo.argument_num = argnum
|
804
911
|
|
805
912
|
@body = finfo
|
913
|
+
finfo.init_after_construct
|
806
914
|
finfo
|
807
915
|
end
|
808
916
|
|
@@ -849,6 +957,10 @@ LocalVarNode
|
|
849
957
|
end
|
850
958
|
end
|
851
959
|
|
960
|
+
def compile_init(context)
|
961
|
+
context
|
962
|
+
end
|
963
|
+
|
852
964
|
def compile(context)
|
853
965
|
oldcs = context.code_space
|
854
966
|
@code_spaces.each do |sig, cs|
|
@@ -857,6 +969,7 @@ LocalVarNode
|
|
857
969
|
context = super(context)
|
858
970
|
context.reset_using_reg
|
859
971
|
context = gen_method_prologue(context)
|
972
|
+
context = compile_init(context)
|
860
973
|
context = @body.compile(context)
|
861
974
|
context.current_method_signature.pop
|
862
975
|
end
|
@@ -885,12 +998,13 @@ LocalVarNode
|
|
885
998
|
context
|
886
999
|
end
|
887
1000
|
|
888
|
-
def construct_frame_info(locals, argnum)
|
1001
|
+
def construct_frame_info(locals, argnum, args)
|
889
1002
|
locals.unshift :_self
|
890
1003
|
locals.unshift :_block
|
891
1004
|
locals.unshift :_prev_env
|
892
1005
|
argnum += 3
|
893
|
-
|
1006
|
+
args = add_arg_to_args(args, 3)
|
1007
|
+
super(locals, argnum, args)
|
894
1008
|
end
|
895
1009
|
end
|
896
1010
|
|
@@ -922,7 +1036,7 @@ LocalVarNode
|
|
922
1036
|
@constant_tab = {}
|
923
1037
|
@method_tab = {}
|
924
1038
|
@klass_object = klassobj
|
925
|
-
@klassclass = ClassClassWrapper.
|
1039
|
+
@klassclass = ClassClassWrapper.instance(@klass_object)
|
926
1040
|
@klassclass_node = nil # Lazy
|
927
1041
|
RubyType::define_wraped_class(@klassclass,
|
928
1042
|
RubyType::RubyTypeBoxed)
|
@@ -931,6 +1045,12 @@ LocalVarNode
|
|
931
1045
|
end
|
932
1046
|
end
|
933
1047
|
|
1048
|
+
attr :klass_object
|
1049
|
+
attr :constant_tab
|
1050
|
+
attr :method_tab
|
1051
|
+
attr :klassclass
|
1052
|
+
attr :klassclass_node
|
1053
|
+
|
934
1054
|
def collect_info(context)
|
935
1055
|
context.modified_local_var.push [{}]
|
936
1056
|
context.modified_instance_var = Hash.new
|
@@ -943,21 +1063,14 @@ LocalVarNode
|
|
943
1063
|
end
|
944
1064
|
end
|
945
1065
|
|
946
|
-
def collect_candidate_type(context, signode, sig)
|
947
|
-
super
|
948
|
-
if @klassclass_node then
|
949
|
-
@klassclass_node.collect_candidate_type(context, signode, sig)
|
950
|
-
else
|
951
|
-
context
|
952
|
-
end
|
953
|
-
end
|
954
|
-
|
955
1066
|
def make_klassclass_node
|
956
|
-
|
957
|
-
|
958
|
-
|
959
|
-
|
960
|
-
|
1067
|
+
if @klassclass_node == nil then
|
1068
|
+
clsclsnode = ClassTopNode.new(self,
|
1069
|
+
@klassclass,
|
1070
|
+
@klassclass.name)
|
1071
|
+
clsclsnode.body = DummyNode.new
|
1072
|
+
@klassclass_node = clsclsnode
|
1073
|
+
end
|
961
1074
|
end
|
962
1075
|
|
963
1076
|
def get_method_tab(klassobj = @klass_object)
|
@@ -1007,16 +1120,13 @@ LocalVarNode
|
|
1007
1120
|
[nil, nil]
|
1008
1121
|
end
|
1009
1122
|
|
1010
|
-
|
1011
|
-
attr :constant_tab
|
1012
|
-
attr :method_tab
|
1013
|
-
|
1014
|
-
def construct_frame_info(locals, argnum)
|
1123
|
+
def construct_frame_info(locals, argnum, args)
|
1015
1124
|
locals.unshift :_self
|
1016
1125
|
locals.unshift :_block
|
1017
1126
|
locals.unshift :_prev_env
|
1018
1127
|
argnum += 3
|
1019
|
-
|
1128
|
+
args = add_arg_to_args(args, 3)
|
1129
|
+
super(locals, argnum, args)
|
1020
1130
|
end
|
1021
1131
|
|
1022
1132
|
def collect_candidate_type(context, signode, sig)
|
@@ -1033,30 +1143,42 @@ LocalVarNode
|
|
1033
1143
|
context.push_signature(signode, self)
|
1034
1144
|
context = @body.collect_candidate_type(context)
|
1035
1145
|
context.pop_signature
|
1036
|
-
|
1146
|
+
|
1147
|
+
if @klassclass_node then
|
1148
|
+
@klassclass_node.collect_candidate_type(context, signode, sig)
|
1149
|
+
else
|
1150
|
+
context
|
1151
|
+
end
|
1037
1152
|
end
|
1038
1153
|
|
1039
1154
|
def compile(context)
|
1040
1155
|
context = super(context)
|
1041
1156
|
|
1042
|
-
|
1157
|
+
sig = context.to_signature.dup
|
1158
|
+
sig[2] = @type
|
1159
|
+
=begin
|
1160
|
+
pp sig
|
1161
|
+
pp @name
|
1162
|
+
pp @code_spaces.map{|a| a[0]}
|
1163
|
+
=end
|
1164
|
+
|
1165
|
+
cs = self.find_cs_by_signature(sig)
|
1043
1166
|
if cs then
|
1044
1167
|
asm = context.assembler
|
1045
|
-
add = lambda { @
|
1168
|
+
add = lambda { @klass_object.address }
|
1046
1169
|
var_klassclass = OpVarImmidiateAddress.new(add)
|
1047
|
-
context.
|
1048
|
-
context.start_using_reg(FUNC_ARG[1])
|
1049
|
-
context.start_using_reg(FUNC_ARG[2])
|
1170
|
+
context.start_arg_reg
|
1050
1171
|
asm.with_retry do
|
1051
1172
|
asm.mov(FUNC_ARG_YTL[0], BPR)
|
1052
1173
|
asm.mov(FUNC_ARG_YTL[1], 4)
|
1053
1174
|
asm.mov(FUNC_ARG_YTL[2], var_klassclass)
|
1054
1175
|
end
|
1176
|
+
context.set_reg_content(FUNC_ARG_YTL[0].dst_opecode, BPR)
|
1177
|
+
context.set_reg_content(FUNC_ARG_YTL[1].dst_opecode, nil)
|
1178
|
+
context.set_reg_content(FUNC_ARG_YTL[2].dst_opecode, self)
|
1055
1179
|
add = cs.var_base_address
|
1056
1180
|
context = gen_call(context, add, 3)
|
1057
|
-
context.
|
1058
|
-
context.end_using_reg(FUNC_ARG[1])
|
1059
|
-
context.end_using_reg(FUNC_ARG[0])
|
1181
|
+
context.end_arg_reg
|
1060
1182
|
end
|
1061
1183
|
|
1062
1184
|
context
|
@@ -1069,6 +1191,12 @@ LocalVarNode
|
|
1069
1191
|
|
1070
1192
|
class TopTopNode<ClassTopNode
|
1071
1193
|
include MethodTopCodeGen
|
1194
|
+
@@frame_struct_tab = {}
|
1195
|
+
@@local_object_area = Runtime::Arena.new
|
1196
|
+
|
1197
|
+
def self.get_frame_struct_tab
|
1198
|
+
@@frame_struct_tab
|
1199
|
+
end
|
1072
1200
|
|
1073
1201
|
def initialize(parent, klassobj, name = :top)
|
1074
1202
|
super
|
@@ -1077,6 +1205,7 @@ LocalVarNode
|
|
1077
1205
|
@asm_tab = {}
|
1078
1206
|
@id.push 0
|
1079
1207
|
|
1208
|
+
@frame_struct_array = []
|
1080
1209
|
@unwind_proc = CodeSpace.new
|
1081
1210
|
@init_node = nil
|
1082
1211
|
init_unwind_proc
|
@@ -1086,6 +1215,13 @@ LocalVarNode
|
|
1086
1215
|
attr_accessor :init_node
|
1087
1216
|
attr :code_space_tab
|
1088
1217
|
attr :asm_tab
|
1218
|
+
attr :frame_struct_array
|
1219
|
+
|
1220
|
+
def make_frame_struct_tab
|
1221
|
+
@frame_struct_array.each do |vkey, val|
|
1222
|
+
@@frame_struct_tab[vkey.value] = val
|
1223
|
+
end
|
1224
|
+
end
|
1089
1225
|
|
1090
1226
|
def traverse_childlen
|
1091
1227
|
if @init_node then
|
@@ -1130,12 +1266,21 @@ LocalVarNode
|
|
1130
1266
|
super(context, signode, sig)
|
1131
1267
|
end
|
1132
1268
|
|
1269
|
+
def compile_init(context)
|
1270
|
+
ar = @@local_object_area
|
1271
|
+
aa = (ar.address + ar.size) & (~0xf)
|
1272
|
+
asm = context.assembler
|
1273
|
+
asm.with_retry do
|
1274
|
+
asm.mov(THEPR, aa)
|
1275
|
+
end
|
1276
|
+
context
|
1277
|
+
end
|
1278
|
+
|
1133
1279
|
def compile(context)
|
1134
1280
|
if @init_node then
|
1135
1281
|
context = @init_node.compile(context)
|
1136
1282
|
end
|
1137
|
-
|
1138
|
-
context
|
1283
|
+
super(context)
|
1139
1284
|
end
|
1140
1285
|
end
|
1141
1286
|
|
@@ -1149,6 +1294,12 @@ LocalVarNode
|
|
1149
1294
|
@system_num = nil
|
1150
1295
|
@previous_frame = search_previous_frame(parent)
|
1151
1296
|
@offset_cache = {}
|
1297
|
+
@local_area_size = nil
|
1298
|
+
@alloca_area_size = 0
|
1299
|
+
end
|
1300
|
+
|
1301
|
+
def init_after_construct
|
1302
|
+
@local_area_size = compute_local_area_size
|
1152
1303
|
end
|
1153
1304
|
|
1154
1305
|
def search_previous_frame(mtop)
|
@@ -1184,9 +1335,11 @@ LocalVarNode
|
|
1184
1335
|
@frame_layout.inject(0) {|sum, slot| sum += slot.size}
|
1185
1336
|
end
|
1186
1337
|
|
1187
|
-
def
|
1338
|
+
def compute_local_area_size
|
1188
1339
|
localnum = @frame_layout.size - @argument_num - @system_num
|
1189
|
-
@frame_layout[0, localnum].inject(0) {|sum, slot|
|
1340
|
+
@frame_layout[0, localnum].inject(0) {|sum, slot|
|
1341
|
+
sum += slot.size
|
1342
|
+
}
|
1190
1343
|
end
|
1191
1344
|
|
1192
1345
|
def real_offset(off)
|
@@ -1207,7 +1360,7 @@ LocalVarNode
|
|
1207
1360
|
obyte += @frame_layout[i].size
|
1208
1361
|
end
|
1209
1362
|
|
1210
|
-
obyte - local_area_size
|
1363
|
+
obyte - @local_area_size
|
1211
1364
|
end
|
1212
1365
|
|
1213
1366
|
def offset_arg(n, basereg)
|
@@ -1226,6 +1379,12 @@ LocalVarNode
|
|
1226
1379
|
rc
|
1227
1380
|
end
|
1228
1381
|
|
1382
|
+
def alloca(size)
|
1383
|
+
# base = -offset_by_byte(0)
|
1384
|
+
@alloca_area_size += size
|
1385
|
+
-(@local_area_size + @alloca_area_size)
|
1386
|
+
end
|
1387
|
+
|
1229
1388
|
def collect_candidate_type(context)
|
1230
1389
|
traverse_childlen {|rec|
|
1231
1390
|
context = rec.collect_candidate_type(context)
|
@@ -1234,26 +1393,30 @@ LocalVarNode
|
|
1234
1393
|
|
1235
1394
|
def compile(context)
|
1236
1395
|
context = super(context)
|
1237
|
-
siz = local_area_size
|
1396
|
+
siz = @local_area_size + @alloca_area_size
|
1238
1397
|
if siz != 0 then
|
1239
1398
|
asm = context.assembler
|
1240
1399
|
asm.with_retry do
|
1241
1400
|
asm.sub(SPR, siz)
|
1242
1401
|
end
|
1243
|
-
context.cpustack_pushn(siz)
|
1244
1402
|
end
|
1245
|
-
|
1403
|
+
context.cpustack_pushn(siz)
|
1404
|
+
context = @body.compile(context)
|
1405
|
+
context.cpustack_popn(siz)
|
1406
|
+
context
|
1246
1407
|
end
|
1247
1408
|
end
|
1248
1409
|
|
1249
1410
|
class LocalVarNode<BaseNode
|
1250
|
-
def initialize(parent, name, offset)
|
1411
|
+
def initialize(parent, name, offset, kind)
|
1251
1412
|
super(parent)
|
1252
1413
|
@name = name
|
1253
1414
|
@offset = offset
|
1415
|
+
@kind = kind
|
1254
1416
|
end
|
1255
1417
|
|
1256
1418
|
attr :name
|
1419
|
+
attr :kind
|
1257
1420
|
|
1258
1421
|
def size
|
1259
1422
|
8
|
@@ -1387,6 +1550,7 @@ LocalVarNode
|
|
1387
1550
|
end
|
1388
1551
|
|
1389
1552
|
def collect_candidate_type(context)
|
1553
|
+
@is_escape = true
|
1390
1554
|
context = @value_node.collect_candidate_type(context)
|
1391
1555
|
cursig = context.to_signature
|
1392
1556
|
same_type(self, @value_node, cursig, cursig, context)
|
@@ -1440,7 +1604,6 @@ LocalVarNode
|
|
1440
1604
|
if vnode then
|
1441
1605
|
cursig = context.to_signature
|
1442
1606
|
same_type(self, vnode, cursig, cursig, context)
|
1443
|
-
same_type(vnode, self, cursig, cursig, context)
|
1444
1607
|
end
|
1445
1608
|
end
|
1446
1609
|
context
|
@@ -1448,9 +1611,9 @@ LocalVarNode
|
|
1448
1611
|
|
1449
1612
|
def compile(context)
|
1450
1613
|
context = super(context)
|
1451
|
-
context.set_reg_content(TMPR, self)
|
1452
1614
|
context.ret_node = self
|
1453
1615
|
context.ret_reg = RETR
|
1616
|
+
context.set_reg_content(RETR, self)
|
1454
1617
|
context
|
1455
1618
|
end
|
1456
1619
|
end
|
@@ -1535,6 +1698,7 @@ LocalVarNode
|
|
1535
1698
|
end
|
1536
1699
|
end
|
1537
1700
|
|
1701
|
+
context.set_reg_content(context.ret_reg, self)
|
1538
1702
|
context
|
1539
1703
|
end
|
1540
1704
|
|
@@ -1683,6 +1847,61 @@ LocalVarNode
|
|
1683
1847
|
include HaveChildlenMixin
|
1684
1848
|
end
|
1685
1849
|
|
1850
|
+
# Multiplexer of node (Using YARV stack operation)
|
1851
|
+
class MultiplexNode<BaseNode
|
1852
|
+
include HaveChildlenMixin
|
1853
|
+
include NodeUtil
|
1854
|
+
|
1855
|
+
def initialize(node)
|
1856
|
+
super(node.parent)
|
1857
|
+
@node = node
|
1858
|
+
@first_compile = true
|
1859
|
+
@res_area = nil
|
1860
|
+
end
|
1861
|
+
|
1862
|
+
def traverse_childlen
|
1863
|
+
yield @node
|
1864
|
+
end
|
1865
|
+
|
1866
|
+
def collect_info(context)
|
1867
|
+
tnode = search_frame_info
|
1868
|
+
offset = tnode.alloca(8)
|
1869
|
+
@res_area = OpIndirect.new(BPR, offset)
|
1870
|
+
@node.collect_info(context)
|
1871
|
+
end
|
1872
|
+
|
1873
|
+
def collect_candidate_type(context)
|
1874
|
+
sig = context.to_signature
|
1875
|
+
same_type(self, @node, sig, sig, context)
|
1876
|
+
same_type(@node, self, sig, sig, context)
|
1877
|
+
@node.collect_candidate_type(context)
|
1878
|
+
end
|
1879
|
+
|
1880
|
+
def compile(context)
|
1881
|
+
if @first_compile then
|
1882
|
+
context = @node.compile(context)
|
1883
|
+
asm = context.assembler
|
1884
|
+
asm.with_retry do
|
1885
|
+
asm.mov(@res_area, context.ret_reg)
|
1886
|
+
end
|
1887
|
+
context.set_reg_content(@res_area, self)
|
1888
|
+
@first_compile = false
|
1889
|
+
|
1890
|
+
context
|
1891
|
+
else
|
1892
|
+
asm = context.assembler
|
1893
|
+
asm.with_retry do
|
1894
|
+
asm.mov(RETR, @res_area)
|
1895
|
+
end
|
1896
|
+
context.set_reg_content(@res_area, self)
|
1897
|
+
context.ret_reg = RETR
|
1898
|
+
context.ret_node = self
|
1899
|
+
|
1900
|
+
context
|
1901
|
+
end
|
1902
|
+
end
|
1903
|
+
end
|
1904
|
+
|
1686
1905
|
# Literal
|
1687
1906
|
class LiteralNode<BaseNode
|
1688
1907
|
include TypeListWithoutSignature
|
@@ -1702,14 +1921,22 @@ LocalVarNode
|
|
1702
1921
|
end
|
1703
1922
|
|
1704
1923
|
sig = context.to_signature
|
1705
|
-
add_type(sig, @type)
|
1706
1924
|
case @value
|
1707
1925
|
when Array
|
1926
|
+
add_type(sig, @type)
|
1708
1927
|
@value.each do |ele|
|
1709
1928
|
etype = RubyType::BaseType.from_object(ele)
|
1710
1929
|
@element_node_list[0][1].add_type(sig, etype)
|
1711
1930
|
end
|
1931
|
+
|
1932
|
+
when Range
|
1933
|
+
@type = @type.to_box
|
1934
|
+
add_type(sig, @type)
|
1935
|
+
|
1936
|
+
else
|
1937
|
+
add_type(sig, @type)
|
1712
1938
|
end
|
1939
|
+
|
1713
1940
|
context
|
1714
1941
|
end
|
1715
1942
|
|
@@ -1741,6 +1968,7 @@ LocalVarNode
|
|
1741
1968
|
context.ret_reg = XMM0
|
1742
1969
|
end
|
1743
1970
|
context.ret_node = self
|
1971
|
+
context.set_reg_content(context.ret_reg, self)
|
1744
1972
|
|
1745
1973
|
else
|
1746
1974
|
if @var_value == nil then
|
@@ -1751,6 +1979,7 @@ LocalVarNode
|
|
1751
1979
|
context.ret_node = self
|
1752
1980
|
context.ret_reg = @var_value
|
1753
1981
|
context = @type.gen_copy(context)
|
1982
|
+
context.set_reg_content(context.ret_reg, self)
|
1754
1983
|
end
|
1755
1984
|
|
1756
1985
|
context
|
@@ -1780,10 +2009,13 @@ LocalVarNode
|
|
1780
2009
|
dmylit = LiteralNode.new(self, nil)
|
1781
2010
|
arg = [dmylit, dmylit, @define]
|
1782
2011
|
sig = []
|
2012
|
+
cursig = context.to_signature
|
1783
2013
|
arg.each do |ele|
|
1784
|
-
ele.decide_type_once(
|
2014
|
+
ele.decide_type_once(cursig)
|
1785
2015
|
sig.push ele.type
|
1786
2016
|
end
|
2017
|
+
type = RubyType::BaseType.from_ruby_class(@define.klassclass)
|
2018
|
+
sig[2] = type
|
1787
2019
|
context = @define.collect_candidate_type(context, arg, sig)
|
1788
2020
|
|
1789
2021
|
@body.collect_candidate_type(context)
|
@@ -1852,24 +2084,73 @@ LocalVarNode
|
|
1852
2084
|
context = super(context)
|
1853
2085
|
asm = context.assembler
|
1854
2086
|
# You can crash when you use yield in block.
|
1855
|
-
# You can fix this bug for traversing
|
2087
|
+
# You can fix this bug for traversing PTMPR for method top.
|
1856
2088
|
# But is is little troublesome. So it is not supported.
|
1857
2089
|
prevenv = @frame_info.offset_arg(0, BPR)
|
1858
2090
|
# offset of self is common, so it no nessery traverse prev frame
|
1859
2091
|
# for @frame_info.
|
1860
|
-
slfarg = @frame_info.offset_arg(2,
|
2092
|
+
slfarg = @frame_info.offset_arg(2, PTMPR)
|
1861
2093
|
asm.with_retry do
|
1862
|
-
asm.mov(
|
1863
|
-
asm.mov(
|
2094
|
+
asm.mov(PTMPR, prevenv)
|
2095
|
+
asm.mov(PTMPR, slfarg)
|
1864
2096
|
end
|
1865
|
-
context.ret_reg2 =
|
2097
|
+
context.ret_reg2 = PTMPR
|
1866
2098
|
|
1867
2099
|
context.ret_reg = @frame_info.offset_arg(1, BPR)
|
1868
2100
|
context.ret_node = self
|
2101
|
+
context.set_reg_content(context.ret_reg, self)
|
2102
|
+
context
|
2103
|
+
end
|
2104
|
+
end
|
2105
|
+
|
2106
|
+
class CApiCommonNode<BaseNode
|
2107
|
+
include NodeUtil
|
2108
|
+
include SendUtil
|
2109
|
+
|
2110
|
+
def initialize(parent, name, atype, rtype = :VALUE)
|
2111
|
+
super(parent)
|
2112
|
+
@name = name
|
2113
|
+
@frame_info = search_frame_info
|
2114
|
+
@arg_type = atype
|
2115
|
+
@ret_type = rtype
|
2116
|
+
end
|
2117
|
+
|
2118
|
+
attr :name
|
2119
|
+
attr :frame_info
|
2120
|
+
attr :arg_type
|
2121
|
+
attr :ret_type
|
2122
|
+
|
2123
|
+
def collect_candidate_type(context)
|
2124
|
+
context
|
2125
|
+
end
|
2126
|
+
|
2127
|
+
def method_top_node(ctop, slf)
|
2128
|
+
nil
|
2129
|
+
end
|
2130
|
+
|
2131
|
+
def compile(context)
|
2132
|
+
context = super(context)
|
2133
|
+
context.ret_reg = OpMemAddress.new(address_of(@name))
|
2134
|
+
context.ret_node = self
|
2135
|
+
context.set_reg_content(context.ret_reg, self)
|
1869
2136
|
context
|
1870
2137
|
end
|
1871
2138
|
end
|
1872
2139
|
|
2140
|
+
# C API (fix arguments)
|
2141
|
+
class FixArgCApiNode<CApiCommonNode
|
2142
|
+
def calling_convention(context)
|
2143
|
+
:c_fixarg_raw
|
2144
|
+
end
|
2145
|
+
end
|
2146
|
+
|
2147
|
+
# C API (variable arguments)
|
2148
|
+
class VarArgCApiNode<CApiCommonNode
|
2149
|
+
def calling_convention(context)
|
2150
|
+
:c_vararg_raw
|
2151
|
+
end
|
2152
|
+
end
|
2153
|
+
|
1873
2154
|
# Method name
|
1874
2155
|
class MethodSelectNode<BaseNode
|
1875
2156
|
def initialize(parent, val)
|
@@ -1885,6 +2166,11 @@ LocalVarNode
|
|
1885
2166
|
@send_node = sendnode
|
1886
2167
|
if sendnode.is_fcall or sendnode.is_vcall then
|
1887
2168
|
@reciever = @parent.class_top
|
2169
|
+
if @reciever == @parent.search_top and
|
2170
|
+
!@reciever.is_a?(TopTopNode) then
|
2171
|
+
@reciever.make_klassclass_node
|
2172
|
+
@reciever = @reciever.klassclass_node
|
2173
|
+
end
|
1888
2174
|
else
|
1889
2175
|
@reciever = sendnode.arguments[2]
|
1890
2176
|
end
|
@@ -1900,7 +2186,7 @@ LocalVarNode
|
|
1900
2186
|
|
1901
2187
|
def method_top_node(ctop, slf)
|
1902
2188
|
if slf then
|
1903
|
-
ctop.search_method_with_super(@name, slf.
|
2189
|
+
ctop.search_method_with_super(@name, slf.ruby_type_raw)[0]
|
1904
2190
|
else
|
1905
2191
|
ctop.search_method_with_super(@name)[0]
|
1906
2192
|
end
|
@@ -1913,17 +2199,20 @@ LocalVarNode
|
|
1913
2199
|
@calling_convention = :ytl
|
1914
2200
|
else
|
1915
2201
|
# reciever = Object
|
1916
|
-
|
1917
|
-
|
2202
|
+
recobj = @reciever.klass_object
|
2203
|
+
if recobj.is_a?(ClassClassWrapper) then
|
2204
|
+
recobj = recobj.value
|
2205
|
+
end
|
2206
|
+
if recobj then
|
2207
|
+
addr = recobj.method_address_of(@name)
|
1918
2208
|
if addr then
|
1919
|
-
recobj = @reciever.klass_object
|
1920
2209
|
if variable_argument?(recobj.method(@name).parameters) then
|
1921
2210
|
@calling_convention = :c_vararg
|
1922
2211
|
else
|
1923
2212
|
@calling_convention = :c_fixarg
|
1924
2213
|
end
|
1925
2214
|
else
|
1926
|
-
raise "Unkown method - #{@name}"
|
2215
|
+
raise "Unkown method - #{recobj}##{@name}"
|
1927
2216
|
@calling_convention = :c
|
1928
2217
|
end
|
1929
2218
|
else
|
@@ -1931,12 +2220,12 @@ LocalVarNode
|
|
1931
2220
|
end
|
1932
2221
|
end
|
1933
2222
|
else
|
1934
|
-
@reciever.decide_type_once(context.to_signature)
|
1935
|
-
|
1936
|
-
rklass = rtype.ruby_type
|
2223
|
+
rtype = @reciever.decide_type_once(context.to_signature)
|
2224
|
+
rklass = rtype.ruby_type_raw
|
1937
2225
|
knode = ClassTopNode.get_class_top_node(rklass)
|
1938
2226
|
if knode and knode.search_method_with_super(@name)[0] then
|
1939
2227
|
@calling_convention = :ytl
|
2228
|
+
@ruby_reciever = rklass
|
1940
2229
|
else
|
1941
2230
|
slfval = @reciever.get_constant_value
|
1942
2231
|
mth = nil
|
@@ -1948,8 +2237,26 @@ LocalVarNode
|
|
1948
2237
|
end
|
1949
2238
|
end
|
1950
2239
|
if slfval == nil or mth == nil then
|
1951
|
-
|
1952
|
-
|
2240
|
+
if rklass.is_a?(ClassClassWrapper) then
|
2241
|
+
rklass = rklass.value
|
2242
|
+
end
|
2243
|
+
begin
|
2244
|
+
mth = rklass.instance_method(@name)
|
2245
|
+
rescue NameError
|
2246
|
+
p @parent.debug_info
|
2247
|
+
p context.to_signature
|
2248
|
+
p @name
|
2249
|
+
# p @reciever.func.reciever.class
|
2250
|
+
p @reciever.instance_eval {@type_list }
|
2251
|
+
=begin
|
2252
|
+
mc = @reciever.get_send_method_node(context.to_signature)[0]
|
2253
|
+
iv = mc.end_nodes[0].parent.value_node
|
2254
|
+
p iv.instance_eval {@name}
|
2255
|
+
p iv.instance_eval {@type_list}
|
2256
|
+
=end
|
2257
|
+
raise
|
2258
|
+
end
|
2259
|
+
@ruby_reciever = rtype.ruby_type_raw
|
1953
2260
|
end
|
1954
2261
|
|
1955
2262
|
if variable_argument?(mth.parameters) then
|
@@ -1969,18 +2276,22 @@ LocalVarNode
|
|
1969
2276
|
slfop = @parent.frame_info.offset_arg(2, BPR)
|
1970
2277
|
asm = context.assembler
|
1971
2278
|
asm.with_retry do
|
1972
|
-
asm.mov(
|
2279
|
+
asm.mov(PTMPR, slfop)
|
1973
2280
|
end
|
1974
|
-
context.ret_reg2 =
|
2281
|
+
context.ret_reg2 = PTMPR
|
1975
2282
|
mtop = @reciever.search_method_with_super(@name)[0]
|
1976
2283
|
if mtop then
|
1977
2284
|
sig = @parent.signature(context)
|
1978
2285
|
cs = mtop.find_cs_by_signature(sig)
|
1979
2286
|
context.ret_reg = cs.var_base_address
|
1980
2287
|
else
|
1981
|
-
|
2288
|
+
recobj = @reciever.klass_object
|
2289
|
+
if recobj.is_a?(ClassClassWrapper) then
|
2290
|
+
recobj = recobj.value
|
2291
|
+
end
|
2292
|
+
if recobj then
|
1982
2293
|
addr = lambda {
|
1983
|
-
|
2294
|
+
recobj.method_address_of(@name)
|
1984
2295
|
}
|
1985
2296
|
if addr.call then
|
1986
2297
|
context.ret_reg = OpVarMemAddress.new(addr)
|
@@ -1997,13 +2308,16 @@ LocalVarNode
|
|
1997
2308
|
end
|
1998
2309
|
else
|
1999
2310
|
context = @reciever.compile(context)
|
2000
|
-
context.ret_node.decide_type_once(context.to_signature)
|
2001
|
-
rtype = context.ret_node.type
|
2311
|
+
rtype = context.ret_node.decide_type_once(context.to_signature)
|
2002
2312
|
if @calling_convention != :ytl then
|
2003
2313
|
context = rtype.gen_boxing(context)
|
2314
|
+
rtype = rtype.to_box
|
2315
|
+
elsif !rtype.boxed then
|
2316
|
+
context = rtype.gen_unboxing(context)
|
2004
2317
|
end
|
2005
2318
|
recval = context.ret_reg
|
2006
|
-
|
2319
|
+
rrtype = rtype.ruby_type_raw
|
2320
|
+
knode = ClassTopNode.get_class_top_node(rrtype)
|
2007
2321
|
mtop = nil
|
2008
2322
|
|
2009
2323
|
if rtype.is_a?(RubyType::DefaultType0) then
|
@@ -2014,8 +2328,7 @@ LocalVarNode
|
|
2014
2328
|
meaddrof = OpMemAddress.new(addr)
|
2015
2329
|
|
2016
2330
|
context.start_using_reg(TMPR2)
|
2017
|
-
context.
|
2018
|
-
context.start_using_reg(FUNC_ARG[1])
|
2331
|
+
context.start_arg_reg
|
2019
2332
|
|
2020
2333
|
asm = context.assembler
|
2021
2334
|
asm.with_retry do
|
@@ -2026,20 +2339,22 @@ LocalVarNode
|
|
2026
2339
|
asm.mov(FUNC_ARG[1], mnval)
|
2027
2340
|
asm.call_with_arg(meaddrof, 2)
|
2028
2341
|
asm.mov(TMPR2, RETR)
|
2029
|
-
asm.pop(
|
2342
|
+
asm.pop(PTMPR)
|
2030
2343
|
end
|
2031
|
-
context.
|
2344
|
+
context.set_reg_content(FUNC_ARG_YTL[0].dst_opecode, nil)
|
2345
|
+
context.set_reg_content(FUNC_ARG_YTL[1].dst_opecode, self)
|
2346
|
+
context.ret_reg2 = PTMPR
|
2032
2347
|
|
2033
|
-
context.
|
2034
|
-
context.end_using_reg(FUNC_ARG[0])
|
2348
|
+
context.end_arg_reg
|
2035
2349
|
|
2036
2350
|
context.ret_node = self
|
2037
2351
|
context.set_reg_content(RETR, self)
|
2038
2352
|
context.set_reg_content(TMPR2, self)
|
2039
|
-
context.set_reg_content(
|
2353
|
+
context.set_reg_content(PTMPR, @reciever)
|
2040
2354
|
context.ret_reg = TMPR2
|
2041
2355
|
|
2042
|
-
elsif knode and
|
2356
|
+
elsif knode and
|
2357
|
+
mtop = knode.search_method_with_super(@name)[0] then
|
2043
2358
|
asm = context.assembler
|
2044
2359
|
if !rtype.boxed and rtype.ruby_type == Float then
|
2045
2360
|
if recval != XMM0 then
|
@@ -2050,9 +2365,9 @@ LocalVarNode
|
|
2050
2365
|
context.ret_reg2 = XMM0
|
2051
2366
|
else
|
2052
2367
|
asm.with_retry do
|
2053
|
-
asm.mov(
|
2368
|
+
asm.mov(PTMPR, recval)
|
2054
2369
|
end
|
2055
|
-
context.ret_reg2 =
|
2370
|
+
context.ret_reg2 = PTMPR
|
2056
2371
|
end
|
2057
2372
|
|
2058
2373
|
sig = @parent.signature(context)
|
@@ -2072,9 +2387,9 @@ LocalVarNode
|
|
2072
2387
|
context.ret_reg2 = XMM0
|
2073
2388
|
else
|
2074
2389
|
asm.with_retry do
|
2075
|
-
asm.mov(
|
2390
|
+
asm.mov(PTMPR, recval)
|
2076
2391
|
end
|
2077
|
-
context.ret_reg2 =
|
2392
|
+
context.ret_reg2 = PTMPR
|
2078
2393
|
end
|
2079
2394
|
|
2080
2395
|
addr = lambda {
|
@@ -2197,6 +2512,7 @@ LocalVarNode
|
|
2197
2512
|
def initialize(parent)
|
2198
2513
|
super(parent, 2, 0)
|
2199
2514
|
@classtop = search_class_top
|
2515
|
+
@topnode = search_top
|
2200
2516
|
end
|
2201
2517
|
|
2202
2518
|
def compile_main(context)
|
@@ -2206,11 +2522,17 @@ LocalVarNode
|
|
2206
2522
|
context
|
2207
2523
|
end
|
2208
2524
|
|
2525
|
+
#=begin
|
2209
2526
|
def collect_candidate_type(context)
|
2210
|
-
@
|
2211
|
-
|
2212
|
-
|
2527
|
+
if @topnode.is_a?(ClassTopNode) then
|
2528
|
+
@type = RubyType::BaseType.from_ruby_class(@classtop.klass_object)
|
2529
|
+
add_type(context.to_signature, @type)
|
2530
|
+
context
|
2531
|
+
else
|
2532
|
+
super(context)
|
2533
|
+
end
|
2213
2534
|
end
|
2535
|
+
#=end
|
2214
2536
|
|
2215
2537
|
def compile(context)
|
2216
2538
|
# context = super(context)
|
@@ -2273,6 +2595,7 @@ LocalVarNode
|
|
2273
2595
|
end
|
2274
2596
|
|
2275
2597
|
valr = context.ret_reg
|
2598
|
+
valn = context.ret_node
|
2276
2599
|
context = gen_pursue_parent_function(context, @depth)
|
2277
2600
|
base = context.ret_reg
|
2278
2601
|
offarg = @current_frame_info.offset_arg(@offset, base)
|
@@ -2290,7 +2613,11 @@ LocalVarNode
|
|
2290
2613
|
asm.mov(offarg, TMPR)
|
2291
2614
|
end
|
2292
2615
|
end
|
2293
|
-
|
2616
|
+
|
2617
|
+
tmpctx = context
|
2618
|
+
@depth.times { tmpctx = tmpctx.prev_context}
|
2619
|
+
tmpctx.set_reg_content(offarg, valn)
|
2620
|
+
|
2294
2621
|
context.ret_reg = nil
|
2295
2622
|
if base == TMPR2 then
|
2296
2623
|
context.end_using_reg(base)
|
@@ -2321,6 +2648,7 @@ LocalVarNode
|
|
2321
2648
|
vti = context.modified_instance_var[@name]
|
2322
2649
|
if vti == nil then
|
2323
2650
|
vti = []
|
2651
|
+
context.modified_instance_var[@name] = vti
|
2324
2652
|
end
|
2325
2653
|
# Not dup so vti may update after.
|
2326
2654
|
@var_type_info = vti
|
@@ -2362,11 +2690,16 @@ LocalVarNode
|
|
2362
2690
|
|
2363
2691
|
def collect_info(context)
|
2364
2692
|
context = @val.collect_info(context)
|
2365
|
-
context.modified_instance_var[@name]
|
2693
|
+
if context.modified_instance_var[@name] == nil then
|
2694
|
+
context.modified_instance_var[@name] = []
|
2695
|
+
end
|
2696
|
+
context.modified_instance_var[@name].push self
|
2366
2697
|
@body.collect_info(context)
|
2367
2698
|
end
|
2368
2699
|
|
2369
2700
|
def collect_candidate_type(context)
|
2701
|
+
@is_escape = true
|
2702
|
+
@val.is_escape = true
|
2370
2703
|
context = @val.collect_candidate_type(context)
|
2371
2704
|
cursig = context.to_signature
|
2372
2705
|
same_type(self, @val, cursig, cursig, context)
|
@@ -2427,10 +2760,6 @@ LocalVarNode
|
|
2427
2760
|
end
|
2428
2761
|
context
|
2429
2762
|
end
|
2430
|
-
|
2431
|
-
def type
|
2432
|
-
@value_node.type
|
2433
|
-
end
|
2434
2763
|
|
2435
2764
|
def compile(context)
|
2436
2765
|
case @value_node
|