ytljit 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/ytljit.h +2 -2
- data/lib/ytljit/asmext.rb +20 -0
- data/lib/ytljit/asmext_x64.rb +10 -2
- data/lib/ytljit/asmext_x86.rb +1 -1
- data/lib/ytljit/asmutil.rb +7 -1
- data/lib/ytljit/instruction_ia.rb +47 -5
- data/lib/ytljit/util.rb +1 -0
- data/lib/ytljit/vm.rb +405 -82
- data/lib/ytljit/vm_codegen.rb +12 -13
- data/lib/ytljit/vm_inline_method.rb +24 -21
- data/lib/ytljit/vm_sendnode.rb +361 -187
- data/lib/ytljit/vm_trans.rb +57 -10
- data/lib/ytljit/vm_type.rb +27 -18
- data/lib/ytljit/vm_type_gen.rb +0 -2
- data/test/vmtest.rb +5 -1
- metadata +3 -3
data/lib/ytljit/vm.rb
CHANGED
@@ -131,16 +131,16 @@ LocalVarNode
|
|
131
131
|
attr_accessor :type
|
132
132
|
attr_accessor :element_node_list
|
133
133
|
|
134
|
-
def add_type(
|
135
|
-
@type_list.add_type(
|
134
|
+
def add_type(sig, type)
|
135
|
+
@type_list.add_type(sig, type)
|
136
136
|
end
|
137
137
|
|
138
|
-
def type_list(
|
139
|
-
@type_list.type_list(
|
138
|
+
def type_list(sig)
|
139
|
+
@type_list.type_list(sig).value
|
140
140
|
end
|
141
141
|
|
142
|
-
def set_type_list(
|
143
|
-
@type_list.type_list(
|
142
|
+
def set_type_list(sig, val)
|
143
|
+
@type_list.type_list(sig).value = val
|
144
144
|
end
|
145
145
|
|
146
146
|
def collect_info(context)
|
@@ -153,22 +153,22 @@ LocalVarNode
|
|
153
153
|
context
|
154
154
|
end
|
155
155
|
|
156
|
-
def ti_add_observer(dst,
|
156
|
+
def ti_add_observer(dst, dsig, ssig, context)
|
157
157
|
if @ti_observer[dst] == nil then
|
158
158
|
@ti_observer[dst] = []
|
159
159
|
end
|
160
160
|
|
161
|
-
if @ti_observer[dst].all? {|
|
162
|
-
(
|
161
|
+
if @ti_observer[dst].all? {|edsig, essig, eprc|
|
162
|
+
(edsig != dsig) or (essig != ssig)
|
163
163
|
} then
|
164
|
-
prc = lambda { send(:ti_update, dst, self,
|
165
|
-
@ti_observer[dst].push [
|
164
|
+
prc = lambda { send(:ti_update, dst, self, dsig, ssig, context) }
|
165
|
+
@ti_observer[dst].push [dsig, ssig, prc]
|
166
166
|
end
|
167
167
|
end
|
168
168
|
|
169
169
|
def ti_changed
|
170
170
|
@ti_observer.each do |rec, lst|
|
171
|
-
lst.each do |
|
171
|
+
lst.each do |dsig, ssig, prc|
|
172
172
|
prc.call
|
173
173
|
end
|
174
174
|
end
|
@@ -185,17 +185,17 @@ LocalVarNode
|
|
185
185
|
res
|
186
186
|
end
|
187
187
|
|
188
|
-
def ti_update(dst, src,
|
189
|
-
dtlist = dst.type_list(
|
190
|
-
stlist = src.type_list(
|
188
|
+
def ti_update(dst, src, dsig, ssig, context)
|
189
|
+
dtlist = dst.type_list(dsig)
|
190
|
+
stlist = src.type_list(ssig)
|
191
191
|
=begin
|
192
|
-
print
|
192
|
+
print dsig.map(&:ruby_type), "\n"
|
193
193
|
print dtlist.map(&:ruby_type), "\n"
|
194
194
|
print stlist.map(&:ruby_type), "\n"
|
195
195
|
=end
|
196
196
|
orgsize = dtlist.size
|
197
197
|
# p "#{dst.class} #{src.class} #{dtlist} #{stlist}"
|
198
|
-
dst.set_type_list(
|
198
|
+
dst.set_type_list(dsig, merge_type(dtlist, stlist))
|
199
199
|
|
200
200
|
if orgsize != dtlist.size then
|
201
201
|
dst.type = nil
|
@@ -213,7 +213,7 @@ LocalVarNode
|
|
213
213
|
end
|
214
214
|
end
|
215
215
|
|
216
|
-
def same_type(dst, src,
|
216
|
+
def same_type(dst, src, dsig, ssig, context)
|
217
217
|
=begin
|
218
218
|
print "#{src.class} -> #{dst.class} \n"
|
219
219
|
if dst.is_a?(LocalVarNode) then
|
@@ -225,20 +225,20 @@ LocalVarNode
|
|
225
225
|
=end
|
226
226
|
|
227
227
|
if dst.is_a?(BaseNode) then
|
228
|
-
src.ti_add_observer(dst,
|
228
|
+
src.ti_add_observer(dst, dsig, ssig, context)
|
229
229
|
end
|
230
230
|
|
231
|
-
ti_update(dst, src,
|
231
|
+
ti_update(dst, src, dsig, ssig, context)
|
232
232
|
end
|
233
233
|
|
234
|
-
def add_element_node(
|
234
|
+
def add_element_node(sig, enode, context)
|
235
235
|
slfetnode = @element_node_list
|
236
|
-
unless slfetnode.include?(
|
237
|
-
@element_node_list.push [
|
238
|
-
|
239
|
-
|
240
|
-
if
|
241
|
-
same_type(
|
236
|
+
unless slfetnode.include?(enode)
|
237
|
+
@element_node_list.push [sig, enode]
|
238
|
+
orgsig = @element_node_list[0][0]
|
239
|
+
orgnode = @element_node_list[0][1]
|
240
|
+
if orgnode != enode then
|
241
|
+
same_type(orgnode, enode, orgsig, sig, context)
|
242
242
|
end
|
243
243
|
ti_changed
|
244
244
|
# context.convergent = false
|
@@ -258,9 +258,9 @@ LocalVarNode
|
|
258
258
|
|
259
259
|
when 1
|
260
260
|
if tlist[0].have_element? then
|
261
|
-
|
261
|
+
sig = @element_node_list[0][0]
|
262
262
|
node = @element_node_list[0][1]
|
263
|
-
node.decide_type_once(
|
263
|
+
node.decide_type_once(sig)
|
264
264
|
tlist[0].element_type = node.type
|
265
265
|
end
|
266
266
|
tlist[0]
|
@@ -271,19 +271,19 @@ LocalVarNode
|
|
271
271
|
end
|
272
272
|
end
|
273
273
|
|
274
|
-
def decide_type_once(
|
274
|
+
def decide_type_once(sig)
|
275
275
|
if @type.equal?(nil) # or @type.is_a?(RubyType::DefaultType0) then
|
276
|
-
tlist = @type_list.type_list(
|
276
|
+
tlist = @type_list.type_list(sig).value
|
277
277
|
@type = decide_type_core(tlist)
|
278
278
|
end
|
279
279
|
end
|
280
280
|
|
281
|
-
def decide_type(
|
282
|
-
decide_type_once(
|
281
|
+
def decide_type(sig)
|
282
|
+
decide_type_once(sig)
|
283
283
|
|
284
284
|
if is_a?(HaveChildlenMixin) then
|
285
285
|
traverse_childlen {|rec|
|
286
|
-
rec.decide_type(
|
286
|
+
rec.decide_type(sig)
|
287
287
|
}
|
288
288
|
end
|
289
289
|
end
|
@@ -362,11 +362,14 @@ LocalVarNode
|
|
362
362
|
end
|
363
363
|
|
364
364
|
module SendUtil
|
365
|
+
include AbsArch
|
366
|
+
|
365
367
|
def gen_eval_self(context)
|
366
368
|
# eval 1st arg(self)
|
367
369
|
slfnode = @arguments[2]
|
368
370
|
context = slfnode.compile(context)
|
369
371
|
|
372
|
+
context.ret_node.decide_type_once(context.to_signature)
|
370
373
|
rtype = context.ret_node.type
|
371
374
|
rtype.gen_unboxing(context)
|
372
375
|
end
|
@@ -374,12 +377,175 @@ LocalVarNode
|
|
374
377
|
def signature(context)
|
375
378
|
res = []
|
376
379
|
@arguments.each do |ele|
|
377
|
-
ele.decide_type_once(context.
|
380
|
+
ele.decide_type_once(context.to_signature)
|
378
381
|
res.push ele.type
|
379
382
|
end
|
380
383
|
|
381
384
|
res
|
382
385
|
end
|
386
|
+
|
387
|
+
def compile_c_vararg(context)
|
388
|
+
fnc = nil
|
389
|
+
context.start_using_reg(TMPR2)
|
390
|
+
|
391
|
+
context = gen_make_argv(context) do |context, rarg|
|
392
|
+
context.start_using_reg(FUNC_ARG[0])
|
393
|
+
context.start_using_reg(FUNC_ARG[1])
|
394
|
+
context.start_using_reg(FUNC_ARG[2])
|
395
|
+
|
396
|
+
context.cpustack_pushn(3 * AsmType::MACHINE_WORD.size)
|
397
|
+
casm = context.assembler
|
398
|
+
# Method Select
|
399
|
+
# it is legal. use TMPR2 for method select
|
400
|
+
# use TMPR3 for store self
|
401
|
+
context = @func.compile(context)
|
402
|
+
fnc = context.ret_reg
|
403
|
+
casm.with_retry do
|
404
|
+
casm.mov(FUNC_ARG[0], rarg.size) # argc
|
405
|
+
casm.mov(FUNC_ARG[1], TMPR2) # argv
|
406
|
+
casm.mov(FUNC_ARG[2], TMPR3) # self
|
407
|
+
end
|
408
|
+
context.set_reg_content(FUNC_ARG[0], nil)
|
409
|
+
context.set_reg_content(FUNC_ARG[1], TMPR2)
|
410
|
+
context.set_reg_content(FUNC_ARG[2], context.ret_node)
|
411
|
+
|
412
|
+
context = gen_call(context, fnc, 3)
|
413
|
+
context.cpustack_popn(3 * AsmType::MACHINE_WORD.size)
|
414
|
+
|
415
|
+
context.end_using_reg(FUNC_ARG[2])
|
416
|
+
context.end_using_reg(FUNC_ARG[1])
|
417
|
+
context.end_using_reg(FUNC_ARG[0])
|
418
|
+
context.end_using_reg(TMPR2)
|
419
|
+
context.ret_reg = RETR
|
420
|
+
context.ret_node = self
|
421
|
+
|
422
|
+
decide_type_once(context.to_signature)
|
423
|
+
context = @type.to_box.gen_unboxing(context)
|
424
|
+
|
425
|
+
context
|
426
|
+
end
|
427
|
+
end
|
428
|
+
|
429
|
+
def compile_c_fixarg(context)
|
430
|
+
fnc = nil
|
431
|
+
numarg = @arguments.size - 2
|
432
|
+
|
433
|
+
numarg.times do |i|
|
434
|
+
context.start_using_reg(FUNC_ARG[i])
|
435
|
+
end
|
436
|
+
context.cpustack_pushn(numarg * AsmType::MACHINE_WORD.size)
|
437
|
+
|
438
|
+
argpos = 0
|
439
|
+
cursrc = 0
|
440
|
+
@arguments.each do |arg|
|
441
|
+
# skip prevenv and block_argument
|
442
|
+
if cursrc < 2 then
|
443
|
+
cursrc = cursrc + 1
|
444
|
+
next
|
445
|
+
end
|
446
|
+
|
447
|
+
if cursrc == 2 then
|
448
|
+
# Self
|
449
|
+
# Method Select
|
450
|
+
# it is legal. use TMPR2 for method select
|
451
|
+
# use TMPR3 for store self
|
452
|
+
context = @func.compile(context)
|
453
|
+
fnc = context.ret_reg
|
454
|
+
casm = context.assembler
|
455
|
+
casm.with_retry do
|
456
|
+
casm.mov(FUNC_ARG[0], TMPR3)
|
457
|
+
end
|
458
|
+
context.set_reg_content(FUNC_ARG[0], context.ret_node)
|
459
|
+
else
|
460
|
+
# other arg.
|
461
|
+
context = arg.compile(context)
|
462
|
+
context.ret_node.decide_type_once(context.to_signature)
|
463
|
+
rtype = context.ret_node.type
|
464
|
+
context = rtype.gen_boxing(context)
|
465
|
+
casm = context.assembler
|
466
|
+
casm.with_retry do
|
467
|
+
casm.mov(FUNC_ARG[argpos], context.ret_reg)
|
468
|
+
end
|
469
|
+
context.set_reg_content(FUNC_ARG[argpos], context.ret_node)
|
470
|
+
end
|
471
|
+
argpos = argpos + 1
|
472
|
+
cursrc = cursrc + 1
|
473
|
+
end
|
474
|
+
|
475
|
+
context = gen_call(context, fnc, numarg)
|
476
|
+
|
477
|
+
context.cpustack_popn(numarg * AsmType::MACHINE_WORD.size)
|
478
|
+
numarg.times do |i|
|
479
|
+
context.end_using_reg(FUNC_ARG[numarg - i - 1])
|
480
|
+
end
|
481
|
+
context.end_using_reg(fnc)
|
482
|
+
|
483
|
+
decide_type_once(context.to_signature)
|
484
|
+
@type.to_box.gen_unboxing(context)
|
485
|
+
end
|
486
|
+
|
487
|
+
def compile_ytl(context)
|
488
|
+
fnc = nil
|
489
|
+
numarg = @arguments.size
|
490
|
+
|
491
|
+
numarg.times do |i|
|
492
|
+
context.start_using_reg(FUNC_ARG_YTL[i])
|
493
|
+
end
|
494
|
+
context.cpustack_pushn(numarg * 8)
|
495
|
+
|
496
|
+
# push prev env
|
497
|
+
casm = context.assembler
|
498
|
+
casm.with_retry do
|
499
|
+
casm.mov(FUNC_ARG_YTL[0], BPR)
|
500
|
+
end
|
501
|
+
context.set_reg_content(FUNC_ARG_YTL[0], BPR)
|
502
|
+
|
503
|
+
# block
|
504
|
+
# eval block
|
505
|
+
# local block
|
506
|
+
|
507
|
+
# compile block with other code space and context
|
508
|
+
tcontext = context.dup
|
509
|
+
@arguments[1].compile(tcontext)
|
510
|
+
|
511
|
+
casm = context.assembler
|
512
|
+
casm.with_retry do
|
513
|
+
entry = @arguments[1].code_space.var_base_immidiate_address
|
514
|
+
casm.mov(FUNC_ARG_YTL[1], entry)
|
515
|
+
end
|
516
|
+
context.set_reg_content(FUNC_ARG_YTL[1], nil)
|
517
|
+
|
518
|
+
# other arguments
|
519
|
+
@arguments[3..-1].each_with_index do |arg, i|
|
520
|
+
context = arg.compile(context)
|
521
|
+
casm = context.assembler
|
522
|
+
casm.with_retry do
|
523
|
+
casm.mov(FUNC_ARG_YTL[i + 3], context.ret_reg)
|
524
|
+
end
|
525
|
+
context.set_reg_content(FUNC_ARG_YTL[i + 3], context.ret_node)
|
526
|
+
end
|
527
|
+
|
528
|
+
# self
|
529
|
+
# Method Select
|
530
|
+
# it is legal. use TMPR2 for method select
|
531
|
+
# use TMPR3 for store self
|
532
|
+
context = @func.compile(context)
|
533
|
+
fnc = context.ret_reg
|
534
|
+
casm = context.assembler
|
535
|
+
casm.with_retry do
|
536
|
+
casm.mov(FUNC_ARG_YTL[2], TMPR3)
|
537
|
+
end
|
538
|
+
context.set_reg_content(FUNC_ARG_YTL[2], @arguments[2])
|
539
|
+
|
540
|
+
context = gen_call(context, fnc, numarg)
|
541
|
+
|
542
|
+
context.cpustack_popn(numarg * 8)
|
543
|
+
numarg.size.times do |i|
|
544
|
+
context.end_using_reg(FUNC_ARG_YTL[numarg - i])
|
545
|
+
end
|
546
|
+
context.end_using_reg(fnc)
|
547
|
+
context
|
548
|
+
end
|
383
549
|
end
|
384
550
|
|
385
551
|
class DummyNode
|
@@ -427,8 +593,8 @@ LocalVarNode
|
|
427
593
|
end
|
428
594
|
|
429
595
|
def find_cs_by_signature(sig)
|
430
|
-
@code_spaces.each do |
|
431
|
-
if
|
596
|
+
@code_spaces.each do |csig, val|
|
597
|
+
if csig == sig then
|
432
598
|
return val
|
433
599
|
end
|
434
600
|
end
|
@@ -490,8 +656,6 @@ LocalVarNode
|
|
490
656
|
end
|
491
657
|
|
492
658
|
def collect_info(context)
|
493
|
-
context.modified_local_var.push Hash.new
|
494
|
-
context.modified_instance_var = {}
|
495
659
|
context.yield_node.push []
|
496
660
|
@body.collect_info(context)
|
497
661
|
@yield_node = context.yield_node.pop
|
@@ -509,8 +673,10 @@ LocalVarNode
|
|
509
673
|
context.current_method_signature_node.push signode
|
510
674
|
context = @body.collect_candidate_type(context)
|
511
675
|
@end_nodes.each do |enode|
|
512
|
-
same_type(self, enode,
|
513
|
-
|
676
|
+
same_type(self, enode,
|
677
|
+
context.to_signature, context.to_signature, context)
|
678
|
+
same_type(enode, self,
|
679
|
+
context.to_signature, context.to_signature, context)
|
514
680
|
end
|
515
681
|
context.current_method_signature_node.pop
|
516
682
|
context
|
@@ -545,6 +711,8 @@ LocalVarNode
|
|
545
711
|
if context.options[:disp_signature] then
|
546
712
|
disp_signature
|
547
713
|
end
|
714
|
+
|
715
|
+
context.ret_node = self
|
548
716
|
context
|
549
717
|
end
|
550
718
|
end
|
@@ -553,6 +721,13 @@ LocalVarNode
|
|
553
721
|
class MethodTopNode<TopNode
|
554
722
|
include MethodTopCodeGen
|
555
723
|
|
724
|
+
def collect_info(context)
|
725
|
+
context.modified_local_var.push [{}]
|
726
|
+
context = super
|
727
|
+
context.modified_local_var.pop
|
728
|
+
context
|
729
|
+
end
|
730
|
+
|
556
731
|
def construct_frame_info(locals, argnum)
|
557
732
|
locals.unshift :_self
|
558
733
|
locals.unshift :_block
|
@@ -563,6 +738,13 @@ LocalVarNode
|
|
563
738
|
end
|
564
739
|
|
565
740
|
class BlockTopNode<MethodTopNode
|
741
|
+
def collect_info(context)
|
742
|
+
context.modified_local_var.last.push Hash.new
|
743
|
+
context = super
|
744
|
+
context.modified_local_var.last.pop
|
745
|
+
context
|
746
|
+
end
|
747
|
+
|
566
748
|
include MethodTopCodeGen
|
567
749
|
end
|
568
750
|
|
@@ -570,11 +752,25 @@ LocalVarNode
|
|
570
752
|
include MethodTopCodeGen
|
571
753
|
@@class_top_tab = {}
|
572
754
|
|
755
|
+
def self.get_class_top_node(klass)
|
756
|
+
@@class_top_tab[klass]
|
757
|
+
end
|
758
|
+
|
759
|
+
def collect_info(context)
|
760
|
+
context.modified_local_var.push [{}]
|
761
|
+
context.modified_instance_var = {}
|
762
|
+
context = super
|
763
|
+
context.modified_local_var.pop
|
764
|
+
context
|
765
|
+
end
|
766
|
+
|
573
767
|
def initialize(parent, klassobj, name = nil)
|
574
768
|
super(parent, name)
|
575
|
-
@
|
769
|
+
@constant_tab = {}
|
576
770
|
@method_tab = {}
|
577
771
|
@klass_object = klassobj
|
772
|
+
@klassclass = class << @klass_object; self; end
|
773
|
+
RubyType::define_wraped_class(@klassclass, RubyType::RubyTypeBoxed)
|
578
774
|
unless @@class_top_tab[klassobj]
|
579
775
|
@@class_top_tab[klassobj] = self
|
580
776
|
end
|
@@ -593,7 +789,21 @@ LocalVarNode
|
|
593
789
|
end
|
594
790
|
end
|
595
791
|
|
596
|
-
|
792
|
+
def search_method_with_super(name, klassobj = @klass_object)
|
793
|
+
clsnode = @@class_top_tab[klassobj]
|
794
|
+
if clsnode then
|
795
|
+
mtab = clsnode.method_tab
|
796
|
+
if val = mtab[name] then
|
797
|
+
return [val, clsnode]
|
798
|
+
end
|
799
|
+
|
800
|
+
return search_method_with_super(name, klassobj.superclass)
|
801
|
+
end
|
802
|
+
|
803
|
+
[nil, nil]
|
804
|
+
end
|
805
|
+
|
806
|
+
attr :constant_tab
|
597
807
|
attr :klass_object
|
598
808
|
|
599
809
|
def construct_frame_info(locals, argnum)
|
@@ -603,6 +813,23 @@ LocalVarNode
|
|
603
813
|
argnum += 3
|
604
814
|
super(locals, argnum)
|
605
815
|
end
|
816
|
+
|
817
|
+
def collect_candidate_type(context, signode, sig)
|
818
|
+
@type = RubyType::BaseType.from_ruby_class(@klassclass)
|
819
|
+
@type_list.add_type(sig, @type)
|
820
|
+
|
821
|
+
if add_cs_for_signature(sig) == nil and
|
822
|
+
context.visited_top_node[self] then
|
823
|
+
return context
|
824
|
+
end
|
825
|
+
|
826
|
+
context.visited_top_node[self] = true
|
827
|
+
|
828
|
+
context.current_method_signature_node.push signode
|
829
|
+
context = @body.collect_candidate_type(context)
|
830
|
+
context.current_method_signature_node.pop
|
831
|
+
context
|
832
|
+
end
|
606
833
|
end
|
607
834
|
|
608
835
|
class TopTopNode<ClassTopNode
|
@@ -762,9 +989,11 @@ LocalVarNode
|
|
762
989
|
tobj = context.current_method_signature_node.last[argoff]
|
763
990
|
if tobj then
|
764
991
|
same_type(self, tobj,
|
765
|
-
context.
|
992
|
+
context.to_signature, context.to_signature(-2),
|
993
|
+
context)
|
766
994
|
same_type(tobj, self,
|
767
|
-
context.
|
995
|
+
context.to_signature(-2), context.to_signature,
|
996
|
+
context)
|
768
997
|
end
|
769
998
|
end
|
770
999
|
context
|
@@ -816,14 +1045,15 @@ LocalVarNode
|
|
816
1045
|
attr :modified_instance_var
|
817
1046
|
|
818
1047
|
def collect_info(context)
|
819
|
-
context.modified_local_var.pop
|
820
1048
|
@modified_instance_var = context.modified_instance_var
|
821
1049
|
context
|
822
1050
|
end
|
823
1051
|
|
824
1052
|
def collect_candidate_type(context)
|
825
|
-
same_type(self, @parent,
|
826
|
-
|
1053
|
+
same_type(self, @parent,
|
1054
|
+
context.to_signature, context.to_signature, context)
|
1055
|
+
same_type(@parent, self,
|
1056
|
+
context.to_signature, context.to_signature, context)
|
827
1057
|
context
|
828
1058
|
end
|
829
1059
|
|
@@ -863,9 +1093,9 @@ LocalVarNode
|
|
863
1093
|
def collect_candidate_type(context)
|
864
1094
|
context = @value_node.collect_candidate_type(context)
|
865
1095
|
same_type(self, @value_node,
|
866
|
-
context.
|
1096
|
+
context.to_signature, context.to_signature, context)
|
867
1097
|
same_type(@value_node, self,
|
868
|
-
context.
|
1098
|
+
context.to_signature, context.to_signature, context)
|
869
1099
|
context = @body.collect_candidate_type(context)
|
870
1100
|
context
|
871
1101
|
end
|
@@ -875,6 +1105,7 @@ LocalVarNode
|
|
875
1105
|
context = @value_node.compile(context)
|
876
1106
|
if context.ret_reg != RETR then
|
877
1107
|
if context.ret_reg.is_a?(OpRegXMM) then
|
1108
|
+
decide_type_once(context.to_signature)
|
878
1109
|
context = @type.gen_boxing(context)
|
879
1110
|
if context.ret_reg != RETR then
|
880
1111
|
curas = context.assembler
|
@@ -910,9 +1141,9 @@ LocalVarNode
|
|
910
1141
|
@local_label.come_from.values.each do |vnode|
|
911
1142
|
if vnode then
|
912
1143
|
same_type(self, vnode,
|
913
|
-
context.
|
1144
|
+
context.to_signature, context.to_signature, context)
|
914
1145
|
same_type(vnode, self,
|
915
|
-
context.
|
1146
|
+
context.to_signature, context.to_signature, context)
|
916
1147
|
end
|
917
1148
|
end
|
918
1149
|
context
|
@@ -950,7 +1181,7 @@ LocalVarNode
|
|
950
1181
|
end
|
951
1182
|
|
952
1183
|
def collect_info(context)
|
953
|
-
modlocvar = context.modified_local_var.map {|ele| ele.dup}
|
1184
|
+
modlocvar = context.modified_local_var.last.map {|ele| ele.dup}
|
954
1185
|
@modified_local_var_list.push modlocvar
|
955
1186
|
modinsvar = context.modified_instance_var.dup
|
956
1187
|
@modified_instance_var_list.push modinsvar
|
@@ -1136,19 +1367,20 @@ LocalVarNode
|
|
1136
1367
|
super(parent)
|
1137
1368
|
@value = val
|
1138
1369
|
@type = RubyType::BaseType.from_object(val)
|
1370
|
+
@my_element_node = BaseNode.new(self)
|
1139
1371
|
end
|
1140
1372
|
|
1141
1373
|
attr :value
|
1142
1374
|
|
1143
1375
|
def collect_candidate_type(context)
|
1144
|
-
@type_list.add_type(context.
|
1376
|
+
@type_list.add_type(context.to_signature, @type)
|
1145
1377
|
case @value
|
1146
1378
|
when Array
|
1147
|
-
|
1148
|
-
@element_node_list = [[
|
1379
|
+
sig = context.to_signature
|
1380
|
+
@element_node_list = [[sig, @my_element_node]]
|
1149
1381
|
@value.each do |ele|
|
1150
1382
|
etype = RubyType::BaseType.from_object(ele)
|
1151
|
-
@element_node_list[0][1].add_type(
|
1383
|
+
@element_node_list[0][1].add_type(sig, etype)
|
1152
1384
|
end
|
1153
1385
|
end
|
1154
1386
|
context
|
@@ -1157,7 +1389,7 @@ LocalVarNode
|
|
1157
1389
|
def compile(context)
|
1158
1390
|
context = super(context)
|
1159
1391
|
|
1160
|
-
decide_type_once(context.
|
1392
|
+
decide_type_once(context.to_signature)
|
1161
1393
|
case @value
|
1162
1394
|
when Fixnum
|
1163
1395
|
val = @value
|
@@ -1198,11 +1430,42 @@ LocalVarNode
|
|
1198
1430
|
end
|
1199
1431
|
end
|
1200
1432
|
|
1433
|
+
class ClassValueNode<BaseNode
|
1434
|
+
include HaveChildlenMixin
|
1435
|
+
|
1436
|
+
def initialize(parent, define)
|
1437
|
+
super(parent)
|
1438
|
+
@define = define
|
1439
|
+
end
|
1440
|
+
|
1441
|
+
def traverse_childlen
|
1442
|
+
yield @define
|
1443
|
+
yield @body
|
1444
|
+
end
|
1445
|
+
|
1446
|
+
attr_accessor :define
|
1447
|
+
|
1448
|
+
def collect_candidate_type(context)
|
1449
|
+
context = @define.collect_candidate_type(context,[], [])
|
1450
|
+
context = @body.collect_candidate_type(context)
|
1451
|
+
context
|
1452
|
+
end
|
1453
|
+
|
1454
|
+
def compile(context)
|
1455
|
+
# raise "Can't compile"
|
1456
|
+
context = super(context)
|
1457
|
+
context = @define.compile(context)
|
1458
|
+
context = @body.compile(context)
|
1459
|
+
context
|
1460
|
+
end
|
1461
|
+
end
|
1462
|
+
|
1201
1463
|
class SpecialObjectNode<BaseNode
|
1202
1464
|
def initialize(parent, kind)
|
1203
1465
|
super(parent)
|
1204
1466
|
@kind = kind
|
1205
1467
|
end
|
1468
|
+
|
1206
1469
|
|
1207
1470
|
attr :kind
|
1208
1471
|
|
@@ -1291,15 +1554,15 @@ LocalVarNode
|
|
1291
1554
|
|
1292
1555
|
def method_top_node(ctop, slf)
|
1293
1556
|
if slf then
|
1294
|
-
ctop.
|
1557
|
+
ctop.search_method_with_super(@name, slf.ruby_type)[0]
|
1295
1558
|
else
|
1296
|
-
ctop.
|
1559
|
+
ctop.search_method_with_super(@name)[0]
|
1297
1560
|
end
|
1298
1561
|
end
|
1299
1562
|
|
1300
1563
|
def calling_convention(context)
|
1301
1564
|
if @send_node.is_fcall or @send_node.is_vcall then
|
1302
|
-
mtop = @reciever.
|
1565
|
+
mtop = @reciever.search_method_with_super(@name)[0]
|
1303
1566
|
if mtop then
|
1304
1567
|
@calling_convention = :ytl
|
1305
1568
|
else
|
@@ -1307,7 +1570,8 @@ LocalVarNode
|
|
1307
1570
|
if @reciever.klass_object then
|
1308
1571
|
addr = @reciever.klass_object.method_address_of(@name)
|
1309
1572
|
if addr then
|
1310
|
-
|
1573
|
+
recobj = @reciever.klass_object
|
1574
|
+
if variable_argument?(recobj.method(@name).parameters) then
|
1311
1575
|
@calling_convention = :c_vararg
|
1312
1576
|
else
|
1313
1577
|
@calling_convention = :c_fixarg
|
@@ -1321,15 +1585,19 @@ LocalVarNode
|
|
1321
1585
|
end
|
1322
1586
|
end
|
1323
1587
|
else
|
1324
|
-
|
1325
|
-
|
1326
|
-
rtype = context.ret_node.type
|
1588
|
+
@reciever.decide_type_once(context.to_signature)
|
1589
|
+
rtype = @reciever.type
|
1327
1590
|
rklass = rtype.ruby_type
|
1328
|
-
|
1329
|
-
if
|
1330
|
-
@calling_convention = :
|
1591
|
+
knode = ClassTopNode.get_class_top_node(rklass)
|
1592
|
+
if knode and knode.search_method_with_super(@name)[0] then
|
1593
|
+
@calling_convention = :ytl
|
1331
1594
|
else
|
1332
|
-
|
1595
|
+
mth = rklass.instance_method(@name)
|
1596
|
+
if variable_argument?(mth.parameters) then
|
1597
|
+
@calling_convention = :c_vararg
|
1598
|
+
else
|
1599
|
+
@calling_convention = :c_fixarg
|
1600
|
+
end
|
1333
1601
|
end
|
1334
1602
|
end
|
1335
1603
|
|
@@ -1343,7 +1611,7 @@ LocalVarNode
|
|
1343
1611
|
asm.with_retry do
|
1344
1612
|
asm.mov(TMPR3, 4)
|
1345
1613
|
end
|
1346
|
-
mtop = @reciever.
|
1614
|
+
mtop = @reciever.search_method_with_super(@name)[0]
|
1347
1615
|
if mtop then
|
1348
1616
|
sig = @parent.signature(context)
|
1349
1617
|
cs = mtop.find_cs_by_signature(sig)
|
@@ -1368,10 +1636,12 @@ LocalVarNode
|
|
1368
1636
|
end
|
1369
1637
|
else
|
1370
1638
|
context = @reciever.compile(context)
|
1371
|
-
context.ret_node.decide_type_once(context.
|
1639
|
+
context.ret_node.decide_type_once(context.to_signature)
|
1372
1640
|
rtype = context.ret_node.type
|
1373
1641
|
context = rtype.gen_boxing(context)
|
1374
1642
|
recval = context.ret_reg
|
1643
|
+
knode = ClassTopNode.get_class_top_node(rtype.ruby_type)
|
1644
|
+
mtop = nil
|
1375
1645
|
|
1376
1646
|
if rtype.is_a?(RubyType::DefaultType0) then
|
1377
1647
|
# Can't type inference. Dynamic method search
|
@@ -1404,7 +1674,20 @@ LocalVarNode
|
|
1404
1674
|
context.set_reg_content(TMPR2, self)
|
1405
1675
|
context.set_reg_content(TMPR3, @reciever)
|
1406
1676
|
context.ret_reg = TMPR2
|
1677
|
+
|
1678
|
+
elsif knode and mtop = knode.search_method_with_super(@name)[0] then
|
1679
|
+
asm = context.assembler
|
1680
|
+
asm.with_retry do
|
1681
|
+
asm.mov(TMPR3, recval)
|
1682
|
+
end
|
1683
|
+
|
1684
|
+
sig = @parent.signature(context)
|
1685
|
+
cs = mtop.find_cs_by_signature(sig)
|
1686
|
+
context.ret_reg = cs.var_base_address
|
1687
|
+
|
1407
1688
|
else
|
1689
|
+
# regident type
|
1690
|
+
|
1408
1691
|
asm = context.assembler
|
1409
1692
|
asm.with_retry do
|
1410
1693
|
asm.mov(TMPR3, recval)
|
@@ -1461,7 +1744,11 @@ LocalVarNode
|
|
1461
1744
|
end
|
1462
1745
|
|
1463
1746
|
def collect_info(context)
|
1464
|
-
vti =
|
1747
|
+
vti = nil
|
1748
|
+
if context.modified_local_var.last[@depth] then
|
1749
|
+
vti = context.modified_local_var.last[@depth][@offset]
|
1750
|
+
end
|
1751
|
+
|
1465
1752
|
if vti then
|
1466
1753
|
@var_type_info = vti.dup
|
1467
1754
|
else
|
@@ -1475,7 +1762,7 @@ LocalVarNode
|
|
1475
1762
|
def collect_candidate_type(context)
|
1476
1763
|
@var_type_info.each do |src|
|
1477
1764
|
same_type(self, src,
|
1478
|
-
context.
|
1765
|
+
context.to_signature, context.to_signature, context)
|
1479
1766
|
end
|
1480
1767
|
context
|
1481
1768
|
end
|
@@ -1501,17 +1788,18 @@ LocalVarNode
|
|
1501
1788
|
offarg = @current_frame_info.offset_arg(@offset, BPR)
|
1502
1789
|
context.ret_node = self
|
1503
1790
|
context.ret_reg = offarg
|
1791
|
+
context
|
1504
1792
|
end
|
1505
1793
|
|
1506
1794
|
def collect_candidate_type(context)
|
1507
1795
|
@type = RubyType::BaseType.from_ruby_class(@classtop.klass_object)
|
1508
|
-
@type_list.add_type(context.
|
1796
|
+
@type_list.add_type(context.to_signature, @type)
|
1509
1797
|
context
|
1510
1798
|
end
|
1511
1799
|
|
1512
1800
|
def compile(context)
|
1513
1801
|
context = super(context)
|
1514
|
-
|
1802
|
+
compile_main(context)
|
1515
1803
|
end
|
1516
1804
|
end
|
1517
1805
|
|
@@ -1530,14 +1818,14 @@ LocalVarNode
|
|
1530
1818
|
|
1531
1819
|
def collect_info(context)
|
1532
1820
|
context = @val.collect_info(context)
|
1533
|
-
context.modified_local_var[@depth][@offset] = [self]
|
1821
|
+
context.modified_local_var.last[@depth][@offset] = [self]
|
1534
1822
|
@body.collect_info(context)
|
1535
1823
|
end
|
1536
1824
|
|
1537
1825
|
def collect_candidate_type(context)
|
1538
1826
|
context = @val.collect_candidate_type(context)
|
1539
1827
|
same_type(self, @val,
|
1540
|
-
context.
|
1828
|
+
context.to_signature, context.to_signature, context)
|
1541
1829
|
@body.collect_candidate_type(context)
|
1542
1830
|
end
|
1543
1831
|
|
@@ -1545,9 +1833,9 @@ LocalVarNode
|
|
1545
1833
|
context = super(context)
|
1546
1834
|
context = @val.compile(context)
|
1547
1835
|
|
1548
|
-
decide_type_once(context.
|
1836
|
+
decide_type_once(context.to_signature)
|
1549
1837
|
if @type.boxed then
|
1550
|
-
@val.decide_type_once(context.
|
1838
|
+
@val.decide_type_once(context.to_signature)
|
1551
1839
|
rtype = @val.type
|
1552
1840
|
context = rtype.gen_boxing(context)
|
1553
1841
|
end
|
@@ -1558,7 +1846,8 @@ LocalVarNode
|
|
1558
1846
|
offarg = @current_frame_info.offset_arg(@offset, base)
|
1559
1847
|
|
1560
1848
|
asm = context.assembler
|
1561
|
-
if valr.is_a?(OpRegistor) or
|
1849
|
+
if valr.is_a?(OpRegistor) or
|
1850
|
+
(valr.is_a?(OpImmidiate) and !valr.is_a?(OpImmidiate64)) then
|
1562
1851
|
asm.with_retry do
|
1563
1852
|
asm.mov(offarg, valr)
|
1564
1853
|
end
|
@@ -1610,7 +1899,7 @@ LocalVarNode
|
|
1610
1899
|
def collect_candidate_type(context)
|
1611
1900
|
@var_type_info.each do |src|
|
1612
1901
|
same_type(self, src,
|
1613
|
-
context.
|
1902
|
+
context.to_signature, context.to_signature, context)
|
1614
1903
|
end
|
1615
1904
|
context
|
1616
1905
|
end
|
@@ -1647,7 +1936,7 @@ LocalVarNode
|
|
1647
1936
|
def collect_candidate_type(context)
|
1648
1937
|
context = @val.collect_candidate_type(context)
|
1649
1938
|
same_type(self, @val,
|
1650
|
-
context.
|
1939
|
+
context.to_signature, context.to_signature, context)
|
1651
1940
|
@body.collect_candidate_type(context)
|
1652
1941
|
end
|
1653
1942
|
|
@@ -1661,6 +1950,40 @@ LocalVarNode
|
|
1661
1950
|
end
|
1662
1951
|
end
|
1663
1952
|
|
1953
|
+
class ConstantRefNode<VariableRefCommonNode
|
1954
|
+
include NodeUtil
|
1955
|
+
|
1956
|
+
def initialize(parent, klass, name)
|
1957
|
+
super(parent)
|
1958
|
+
@name = name
|
1959
|
+
@class_top = klass # .search_class_top
|
1960
|
+
@value_node = klass.constant_tab[@name]
|
1961
|
+
end
|
1962
|
+
|
1963
|
+
attr :value_node
|
1964
|
+
|
1965
|
+
def collect_candidate_type(context)
|
1966
|
+
same_type(self, @value_node,
|
1967
|
+
context.to_signature, context.to_signature, context)
|
1968
|
+
context
|
1969
|
+
end
|
1970
|
+
|
1971
|
+
def compile(context)
|
1972
|
+
case @value_node
|
1973
|
+
when ClassTopNode
|
1974
|
+
obj = @value_node.klass_object
|
1975
|
+
objadd = lambda { obj.address }
|
1976
|
+
context.ret_reg = OpVarImmidiateAddress.new(objadd)
|
1977
|
+
|
1978
|
+
else
|
1979
|
+
context = @value_node.compile(context)
|
1980
|
+
end
|
1981
|
+
|
1982
|
+
context.ret_node = self
|
1983
|
+
context
|
1984
|
+
end
|
1985
|
+
end
|
1986
|
+
|
1664
1987
|
# Reference Register
|
1665
1988
|
class RefRegister
|
1666
1989
|
end
|