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_trans.rb
CHANGED
@@ -8,7 +8,7 @@ module YTLJit
|
|
8
8
|
@top_nodes = [@the_top]
|
9
9
|
@current_file_name = nil
|
10
10
|
@current_class_node = the_top
|
11
|
-
@
|
11
|
+
@current_method_node = nil
|
12
12
|
|
13
13
|
@enc_label = ""
|
14
14
|
@enc_pos_in_source = ""
|
@@ -22,6 +22,8 @@ module YTLJit
|
|
22
22
|
@local_label_tab = {}
|
23
23
|
|
24
24
|
@not_reached_pos = false
|
25
|
+
|
26
|
+
@macro_method = nil
|
25
27
|
end
|
26
28
|
|
27
29
|
attr_accessor :the_top
|
@@ -29,7 +31,7 @@ module YTLJit
|
|
29
31
|
|
30
32
|
attr_accessor :current_file_name
|
31
33
|
attr_accessor :current_class_node
|
32
|
-
attr_accessor :
|
34
|
+
attr_accessor :current_method_node
|
33
35
|
|
34
36
|
attr_accessor :enc_label
|
35
37
|
attr_accessor :enc_pos_in_source
|
@@ -44,6 +46,8 @@ module YTLJit
|
|
44
46
|
|
45
47
|
attr_accessor :not_reached_pos
|
46
48
|
|
49
|
+
attr_accessor :macro_method
|
50
|
+
|
47
51
|
def import_object(klass, name, value)
|
48
52
|
ctn = ClassTopNode.get_class_top_node(klass)
|
49
53
|
if ctn == nil then
|
@@ -52,6 +56,21 @@ module YTLJit
|
|
52
56
|
valnode = LiteralNode.new(ctn, value)
|
53
57
|
ctn.get_constant_tab[name] = valnode
|
54
58
|
end
|
59
|
+
|
60
|
+
def debug_info
|
61
|
+
mname = nil
|
62
|
+
if @current_method_node then
|
63
|
+
mname = @current_method_node.get_constant_value
|
64
|
+
end
|
65
|
+
if mname then
|
66
|
+
mname = mname[0]
|
67
|
+
end
|
68
|
+
|
69
|
+
[@current_file_name,
|
70
|
+
@current_class_node.name,
|
71
|
+
mname,
|
72
|
+
@current_line_no]
|
73
|
+
end
|
55
74
|
end
|
56
75
|
|
57
76
|
class YARVTranslatorBase
|
@@ -68,7 +87,7 @@ module YTLJit
|
|
68
87
|
context.enc_pos_in_source = pos
|
69
88
|
if code.header['type'] == :block then
|
70
89
|
lstr = context.enc_label + "+blk+" +
|
71
|
-
context.
|
90
|
+
context.current_method_node.to_s
|
72
91
|
context.enc_label = lstr
|
73
92
|
end
|
74
93
|
translate_block(code, context)
|
@@ -77,8 +96,7 @@ module YTLJit
|
|
77
96
|
context.the_top
|
78
97
|
end
|
79
98
|
|
80
|
-
def
|
81
|
-
visit_block_start(code, nil, context)
|
99
|
+
def translate_main(code, context)
|
82
100
|
code.body.each do |ins|
|
83
101
|
pos = "#{code.header['filename']}:#{context.current_line_no}"
|
84
102
|
context.enc_pos_in_source = pos
|
@@ -96,6 +114,11 @@ module YTLJit
|
|
96
114
|
send(("visit_" + opname).to_sym, code, ins, context)
|
97
115
|
end
|
98
116
|
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def translate_block(code, context)
|
120
|
+
visit_block_start(code, nil, context)
|
121
|
+
translate_main(code, context)
|
99
122
|
visit_block_end(code, nil, context)
|
100
123
|
end
|
101
124
|
end
|
@@ -108,12 +131,21 @@ module YTLJit
|
|
108
131
|
nllab = context.local_label_tab[label]
|
109
132
|
if nllab == nil then
|
110
133
|
nllab = LocalLabel.new(curnode, label)
|
134
|
+
nllab.debug_info = context.debug_info
|
111
135
|
context.local_label_tab[label] = nllab
|
112
136
|
end
|
113
137
|
|
114
138
|
nllab
|
115
139
|
end
|
116
140
|
|
141
|
+
def gen_arg_node(context, sendnode, func, args)
|
142
|
+
curnode = context.current_node
|
143
|
+
nnode = sendnode.new(curnode, func, args, 0, 0)
|
144
|
+
nnode.debug_info = context.debug_info
|
145
|
+
func.parent = nnode
|
146
|
+
nnode
|
147
|
+
end
|
148
|
+
|
117
149
|
def visit_symbol(code, ins, context)
|
118
150
|
context.current_local_label = ins
|
119
151
|
|
@@ -122,6 +154,7 @@ module YTLJit
|
|
122
154
|
|
123
155
|
unless curnode.is_a?(JumpNode)
|
124
156
|
jmpnode = JumpNode.new(curnode, nllab)
|
157
|
+
jmpnode.debug_info = context.debug_info
|
125
158
|
nllab.parent = jmpnode
|
126
159
|
|
127
160
|
val = context.expstack.pop
|
@@ -140,25 +173,43 @@ module YTLJit
|
|
140
173
|
if !mtopnode.is_a?(TopNode) then
|
141
174
|
oldtop = context.the_top
|
142
175
|
mtopnode = TopTopNode.new(nil, Object)
|
176
|
+
mtopnode.debug_info = context.debug_info
|
143
177
|
context.the_top = mtopnode
|
144
178
|
oldtop.parent = mtopnode
|
145
179
|
mtopnode.init_node = oldtop
|
146
180
|
end
|
147
181
|
|
148
|
-
|
149
|
-
args = code.header['misc'][:arg_size]
|
182
|
+
context.macro_method = nil
|
150
183
|
|
151
|
-
|
184
|
+
locals = code.header['locals']
|
185
|
+
arg_size = code.header['misc'][:arg_size]
|
186
|
+
args = code.header['args']
|
187
|
+
(arg_size - locals.size).times do
|
188
|
+
locals.push nil
|
189
|
+
end
|
190
|
+
|
191
|
+
cnode = mtopnode.construct_frame_info(locals, arg_size, args)
|
192
|
+
context.current_node = cnode
|
152
193
|
end
|
153
194
|
|
154
195
|
def visit_block_end(code, ins, context)
|
196
|
+
curnode = context.current_node
|
197
|
+
top = context.top_nodes.last
|
198
|
+
if top.class == MethodTopNode then
|
199
|
+
if context.macro_method then
|
200
|
+
code = top.to_ruby(ToRubyContext.new).ret_code.last
|
201
|
+
# print code
|
202
|
+
proc = eval("lambda" + code)
|
203
|
+
SendNode.get_macro_tab[top.name] = proc
|
204
|
+
end
|
205
|
+
end
|
155
206
|
end
|
156
207
|
|
157
208
|
def depth_of_block(code)
|
158
209
|
dep = 0
|
159
210
|
ccode = code
|
160
211
|
while ccode.header['type'] == :block
|
161
|
-
ccode =
|
212
|
+
ccode = ccode.parent
|
162
213
|
dep += 1
|
163
214
|
end
|
164
215
|
|
@@ -187,6 +238,7 @@ module YTLJit
|
|
187
238
|
end
|
188
239
|
offset = curcode.header['misc'][:local_size] + 3 - ins[1]
|
189
240
|
node = LocalVarRefNode.new(context.current_node, offset, dep)
|
241
|
+
node.debug_info = context.debug_info
|
190
242
|
context.expstack.push node
|
191
243
|
end
|
192
244
|
|
@@ -200,8 +252,10 @@ module YTLJit
|
|
200
252
|
curnode = context.current_node
|
201
253
|
offset = curcode.header['misc'][:local_size] + 3 - ins[1]
|
202
254
|
node = LocalAssignNode.new(curnode, offset, dep, val)
|
255
|
+
node.debug_info = context.debug_info
|
203
256
|
if context.expstack[-1] == val then
|
204
257
|
varref = LocalVarRefNode.new(context.current_node, offset, dep)
|
258
|
+
varref.debug_info = context.debug_info
|
205
259
|
context.expstack[-1] = varref
|
206
260
|
end
|
207
261
|
curnode.body = node
|
@@ -250,6 +304,7 @@ module YTLJit
|
|
250
304
|
name = ins[1]
|
251
305
|
curnode = context.current_node
|
252
306
|
node = ConstantRefNode.new(curnode, klass, name)
|
307
|
+
node.debug_info = context.debug_info
|
253
308
|
context.expstack.push node
|
254
309
|
end
|
255
310
|
|
@@ -259,6 +314,7 @@ module YTLJit
|
|
259
314
|
name = ins[1]
|
260
315
|
curnode = context.current_node
|
261
316
|
node = ConstantAssignNode.new(curnode, klass, name, value)
|
317
|
+
node.debug_info = context.debug_info
|
262
318
|
curnode.body = node
|
263
319
|
context.current_node = node
|
264
320
|
end
|
@@ -268,17 +324,20 @@ module YTLJit
|
|
268
324
|
|
269
325
|
def visit_putnil(code, ins, context)
|
270
326
|
nnode = LiteralNode.new(nil, nil)
|
327
|
+
nnode.debug_info = context.debug_info
|
271
328
|
context.expstack.push nnode
|
272
329
|
end
|
273
330
|
|
274
331
|
def visit_putself(code, ins, context)
|
275
332
|
curnode = context.current_node
|
276
333
|
nnode = SelfRefNode.new(curnode)
|
334
|
+
nnode.debug_info = context.debug_info
|
277
335
|
context.expstack.push nnode
|
278
336
|
end
|
279
337
|
|
280
338
|
def visit_putobject(code, ins, context)
|
281
339
|
nnode = LiteralNode.new(nil, ins[1])
|
340
|
+
nnode.debug_info = context.debug_info
|
282
341
|
context.expstack.push nnode
|
283
342
|
end
|
284
343
|
|
@@ -301,31 +360,89 @@ module YTLJit
|
|
301
360
|
when :top
|
302
361
|
raise "Maybe bug not appear top block."
|
303
362
|
end
|
363
|
+
mtopnode.debug_info = context.debug_info
|
304
364
|
ncontext.current_node = mtopnode
|
305
365
|
ncontext.top_nodes.push mtopnode
|
306
366
|
|
307
367
|
ncontext.current_file_name = context.current_file_name
|
308
368
|
ncontext.current_class_node = context.current_class_node
|
309
369
|
mname = context.expstack.last
|
310
|
-
ncontext.
|
370
|
+
ncontext.current_method_node = mname
|
311
371
|
|
312
372
|
tr = self.class.new([body])
|
313
373
|
tr.translate(ncontext)
|
374
|
+
context.macro_method = ncontext.macro_method
|
314
375
|
context.expstack.push mtopnode
|
315
376
|
end
|
316
377
|
|
317
378
|
def visit_putstring(code, ins, context)
|
318
379
|
nnode = LiteralNode.new(nil, ins[1])
|
380
|
+
nnode.debug_info = context.debug_info
|
381
|
+
context.expstack.push nnode
|
382
|
+
end
|
383
|
+
|
384
|
+
def visit_concatstrings(code, ins, context)
|
385
|
+
curnode = context.current_node
|
386
|
+
numarg = ins[1]
|
387
|
+
nnode = context.expstack[-numarg]
|
388
|
+
(numarg - 1).times do |i|
|
389
|
+
func = FixArgCApiNode.new(curnode, "rb_str_append", [:VALUE, :VALUE])
|
390
|
+
args = [nnode, context.expstack[i - numarg + 1]]
|
391
|
+
nnode = gen_arg_node(context, RetStringSendNode, func, args)
|
392
|
+
end
|
393
|
+
|
394
|
+
numarg.times do
|
395
|
+
context.expstack.pop
|
396
|
+
end
|
397
|
+
context.expstack.push nnode
|
398
|
+
end
|
399
|
+
|
400
|
+
def visit_tostring(code, ins, context)
|
401
|
+
curnode = context.current_node
|
402
|
+
func = FixArgCApiNode.new(curnode, "rb_obj_as_string", [:VALUE])
|
403
|
+
args = []
|
404
|
+
argele = context.expstack.pop
|
405
|
+
args.push argele
|
406
|
+
nnode = gen_arg_node(context, RetStringSendNode, func, args)
|
319
407
|
context.expstack.push nnode
|
320
408
|
end
|
321
409
|
|
322
|
-
# concatstrings
|
323
|
-
# tostring
|
324
410
|
# toregexp
|
325
|
-
|
411
|
+
|
412
|
+
def newinst_to_sendnode(argnum, klass, code, ins, context)
|
413
|
+
arg = []
|
414
|
+
argnum.times {
|
415
|
+
arg.push context.expstack.pop
|
416
|
+
}
|
417
|
+
curnode = context.current_node
|
418
|
+
arg.push ConstantRefNode.new(curnode, nil, klass.name.to_sym)
|
419
|
+
|
420
|
+
arg.reverse.each do |c|
|
421
|
+
context.expstack.push c
|
422
|
+
end
|
423
|
+
|
424
|
+
visit_send(code, [:send, :new, argnum, nil, 0, nil], context)
|
425
|
+
end
|
426
|
+
|
427
|
+
def visit_newarray(code, ins, context)
|
428
|
+
curnode = context.current_node
|
429
|
+
func = FixArgCApiNode.new(curnode, "rb_ary_new3", [:int, :VALUE, :"..."])
|
430
|
+
argnum = ins[1]
|
431
|
+
argnumnode = LiteralNode.new(nil, argnum)
|
432
|
+
args = []
|
433
|
+
argnum.times do
|
434
|
+
argele = context.expstack.pop
|
435
|
+
args.push argele
|
436
|
+
end
|
437
|
+
args.push argnumnode
|
438
|
+
args = args.reverse
|
439
|
+
nnode = gen_arg_node(context, RetArraySendNode, func, args)
|
440
|
+
context.expstack.push nnode
|
441
|
+
end
|
326
442
|
|
327
443
|
def visit_duparray(code, ins, context)
|
328
444
|
nnode = LiteralNode.new(nil, ins[1])
|
445
|
+
nnode.debug_info = context.debug_info
|
329
446
|
context.expstack.push nnode
|
330
447
|
end
|
331
448
|
|
@@ -334,8 +451,13 @@ module YTLJit
|
|
334
451
|
# splatarray
|
335
452
|
# checkincludearray
|
336
453
|
# newhash
|
337
|
-
# newrange
|
338
454
|
|
455
|
+
def visit_newrange(code, ins, context)
|
456
|
+
exclflag = LiteralNode.new(nil, ins[1] == 1)
|
457
|
+
context.expstack.push exclflag
|
458
|
+
newinst_to_sendnode(3, Range, code, ins, context)
|
459
|
+
end
|
460
|
+
|
339
461
|
def visit_pop(code, ins, context)
|
340
462
|
node = context.expstack.pop
|
341
463
|
if node == nil then
|
@@ -354,21 +476,37 @@ module YTLJit
|
|
354
476
|
end
|
355
477
|
|
356
478
|
def visit_dup(code, ins, context)
|
357
|
-
|
479
|
+
orgnode = context.expstack.pop
|
480
|
+
nnode = MultiplexNode.new(orgnode)
|
481
|
+
context.expstack.push nnode
|
482
|
+
context.expstack.push nnode
|
358
483
|
end
|
359
484
|
|
360
485
|
def visit_dupn(code, ins, context)
|
486
|
+
raise "foo"
|
361
487
|
end
|
362
488
|
|
363
489
|
def visit_swap(code, ins, context)
|
490
|
+
val0 = context.expstack.pop
|
491
|
+
val1 = context.expstack.pop
|
492
|
+
context.expstack.push val0
|
493
|
+
context.expstack.push val1
|
364
494
|
end
|
365
495
|
|
366
496
|
# reput
|
367
497
|
|
368
498
|
def visit_topn(code, ins, context)
|
499
|
+
raise
|
500
|
+
n = ins[1] + 1
|
501
|
+
context.expstack.push context.expstack[-n]
|
369
502
|
end
|
370
503
|
|
371
504
|
def visit_setn(code, ins, context)
|
505
|
+
n = ins[1] + 1
|
506
|
+
orgnode = context.expstack.last
|
507
|
+
nnode = MultiplexNode.new(orgnode)
|
508
|
+
context.expstack[-n] = nnode
|
509
|
+
context.expstack[-1] = nnode
|
372
510
|
end
|
373
511
|
|
374
512
|
# adjuststack
|
@@ -426,6 +564,7 @@ module YTLJit
|
|
426
564
|
end
|
427
565
|
RubyType::define_wraped_class(klassobj, RubyType::RubyTypeBoxed)
|
428
566
|
cnode = ClassTopNode.new(context.current_class_node, klassobj, name)
|
567
|
+
cnode.debug_info = context.debug_info
|
429
568
|
context.current_class_node.constant_tab[name] = cnode
|
430
569
|
|
431
570
|
body = VMLib::InstSeqTree.new(code, ins[2])
|
@@ -440,15 +579,17 @@ module YTLJit
|
|
440
579
|
|
441
580
|
curnode = context.current_node
|
442
581
|
cvnode = ClassValueNode.new(curnode, cnode)
|
582
|
+
cvnode.debug_info = context.debug_info
|
443
583
|
context.expstack.push cvnode
|
444
584
|
|
445
585
|
context
|
446
586
|
end
|
447
587
|
|
448
588
|
def visit_send(code, ins, context)
|
449
|
-
blk_iseq = ins[3]
|
450
589
|
curnode = context.current_node
|
451
590
|
numarg = ins[2]
|
591
|
+
blk_iseq = ins[3]
|
592
|
+
op_flag = ins[4]
|
452
593
|
seqno = ins[5]
|
453
594
|
|
454
595
|
# regular arguments
|
@@ -459,7 +600,14 @@ module YTLJit
|
|
459
600
|
end
|
460
601
|
|
461
602
|
# self
|
462
|
-
|
603
|
+
slf = context.expstack.pop
|
604
|
+
if (op_flag & (0b11 << 3)) != 0 and # fcall, vcall
|
605
|
+
slf.is_a?(LiteralNode) and
|
606
|
+
slf.value == nil and
|
607
|
+
context.current_class_node.name != :top then
|
608
|
+
slf = SelfRefNode.new(curnode)
|
609
|
+
end
|
610
|
+
arg.push slf
|
463
611
|
|
464
612
|
# block
|
465
613
|
if blk_iseq then
|
@@ -467,26 +615,57 @@ module YTLJit
|
|
467
615
|
ncontext = YARVContext.new
|
468
616
|
ncontext.current_file_name = context.current_file_name
|
469
617
|
ncontext.current_class_node = context.current_class_node
|
618
|
+
ncontext.current_method_node = context.current_method_node
|
470
619
|
btn = ncontext.current_node = BlockTopNode.new(curnode)
|
471
620
|
ncontext.top_nodes.push btn
|
472
621
|
|
473
622
|
tr = self.class.new([body])
|
474
623
|
tr.translate(ncontext)
|
624
|
+
btn.debug_info = context.debug_info
|
625
|
+
context.macro_method = ncontext.macro_method
|
626
|
+
|
475
627
|
arg.push btn # block
|
476
628
|
else
|
477
|
-
|
629
|
+
argnode = LiteralNode.new(curnode, nil)
|
630
|
+
argnode.debug_info = context.debug_info
|
631
|
+
arg.push argnode # block(dymmy)
|
478
632
|
end
|
479
633
|
|
480
634
|
# perv env
|
481
|
-
|
635
|
+
argnode = LiteralNode.new(curnode, nil)
|
636
|
+
argnode.debug_info = context.debug_info
|
637
|
+
arg.push argnode
|
482
638
|
|
483
639
|
arg = arg.reverse
|
484
640
|
|
485
641
|
func = MethodSelectNode.new(curnode, ins[1])
|
486
|
-
op_flag = ins[4]
|
487
642
|
sn = SendNode.make_send_node(curnode, func, arg, op_flag, seqno)
|
488
|
-
|
489
|
-
|
643
|
+
if sn.is_a?(SendEvalNode) then
|
644
|
+
if context.macro_method == nil then
|
645
|
+
context.macro_method = true
|
646
|
+
end
|
647
|
+
end
|
648
|
+
|
649
|
+
if sn.is_a?(SendNode) then
|
650
|
+
sn.debug_info = context.debug_info
|
651
|
+
func.set_reciever(sn)
|
652
|
+
context.expstack.push sn
|
653
|
+
|
654
|
+
elsif sn.is_a?(Array)
|
655
|
+
# macro(including eval method). execute in compile time and
|
656
|
+
# compile eval strings.
|
657
|
+
val, evalstr = sn
|
658
|
+
evalstr = evalstr.join("\n")
|
659
|
+
is = RubyVM::InstructionSequence.compile(
|
660
|
+
evalstr, "macro #{ins[1]}", "", 0, YTL::ISEQ_OPTS
|
661
|
+
).to_a
|
662
|
+
ncode = VMLib::InstSeqTree.new(code, is)
|
663
|
+
ncode.body.pop # Chop leave instruction
|
664
|
+
translate_main(ncode, context)
|
665
|
+
# context.expstack.push val
|
666
|
+
else
|
667
|
+
raise "Unexcepted data type #{sn.class}"
|
668
|
+
end
|
490
669
|
|
491
670
|
context
|
492
671
|
end
|
@@ -497,6 +676,7 @@ module YTLJit
|
|
497
676
|
def visit_invokeblock(code, ins, context)
|
498
677
|
curnode = context.current_node
|
499
678
|
func = YieldNode.new(curnode)
|
679
|
+
func.debug_info = context.debug_info
|
500
680
|
numarg = ins[1]
|
501
681
|
op_flag = ins[2]
|
502
682
|
seqno = ins[3]
|
@@ -513,17 +693,24 @@ module YTLJit
|
|
513
693
|
framelayout = frameinfo.frame_layout
|
514
694
|
|
515
695
|
# self
|
516
|
-
|
696
|
+
argnode = LiteralNode.new(curnode, nil)
|
697
|
+
argnode.debug_info = context.debug_info
|
698
|
+
args.push argnode
|
517
699
|
|
518
700
|
# block
|
519
|
-
|
701
|
+
argnode = LiteralNode.new(curnode, nil)
|
702
|
+
argnode.debug_info = context.debug_info
|
703
|
+
args.push argnode
|
520
704
|
|
521
705
|
# perv env
|
522
|
-
|
706
|
+
argnode = LiteralNode.new(curnode, nil)
|
707
|
+
argnode.debug_info = context.debug_info
|
708
|
+
args.push argnode
|
523
709
|
|
524
710
|
args = args.reverse
|
525
711
|
|
526
712
|
nnode = SendNode.new(curnode, func, args, op_flag, seqno)
|
713
|
+
nnode.debug_info = context.debug_info
|
527
714
|
func.parent = nnode
|
528
715
|
context.expstack.push nnode
|
529
716
|
|
@@ -533,16 +720,21 @@ module YTLJit
|
|
533
720
|
def visit_leave(code, ins, context)
|
534
721
|
curnode = nil
|
535
722
|
vnode = nil
|
723
|
+
|
536
724
|
if context.top_nodes.last.name == :initialize then
|
725
|
+
# This is necessary. So it decides type of new method
|
537
726
|
visit_pop(code, ins, context)
|
538
727
|
curnode = context.current_node
|
539
728
|
vnode = SelfRefNode.new(curnode)
|
729
|
+
vnode.debug_info = context.debug_info
|
540
730
|
else
|
541
731
|
curnode = context.current_node
|
542
732
|
vnode = context.expstack.pop
|
733
|
+
vnode.debug_info = context.debug_info
|
543
734
|
end
|
544
735
|
|
545
736
|
srnode = SetResultNode.new(curnode, vnode)
|
737
|
+
srnode.debug_info = context.debug_info
|
546
738
|
curnode.body = srnode
|
547
739
|
|
548
740
|
context.current_node = srnode
|
@@ -557,6 +749,7 @@ module YTLJit
|
|
557
749
|
when :top
|
558
750
|
nnode = ClassEndNode.new(srnode)
|
559
751
|
end
|
752
|
+
nnode.debug_info = context.debug_info
|
560
753
|
|
561
754
|
context.top_nodes.last.end_nodes.push nnode
|
562
755
|
srnode.body = nnode
|
@@ -570,6 +763,7 @@ module YTLJit
|
|
570
763
|
nllab = get_vmnode_from_label(context, ins[1])
|
571
764
|
|
572
765
|
jpnode = JumpNode.new(curnode, nllab)
|
766
|
+
jpnode.debug_info = context.debug_info
|
573
767
|
jpnode.body = nllab
|
574
768
|
|
575
769
|
val = context.expstack.pop
|
@@ -587,6 +781,7 @@ module YTLJit
|
|
587
781
|
cond = context.expstack.pop
|
588
782
|
|
589
783
|
node = BranchIfNode.new(curnode, cond, nllab)
|
784
|
+
node.debug_info = context.debug_info
|
590
785
|
nllab.come_from[node] = nil
|
591
786
|
|
592
787
|
curnode.body = node
|
@@ -600,6 +795,7 @@ module YTLJit
|
|
600
795
|
cond = context.expstack.pop
|
601
796
|
|
602
797
|
node = BranchUnlessNode.new(curnode, cond, nllab)
|
798
|
+
node.debug_info = context.debug_info
|
603
799
|
nllab.come_from[node] = nil
|
604
800
|
|
605
801
|
curnode.body = node
|
data/lib/ytljit/vm_type.rb
CHANGED
@@ -52,7 +52,7 @@ module YTLJit
|
|
52
52
|
raise "foo"
|
53
53
|
return !b
|
54
54
|
end
|
55
|
-
}
|
55
|
+
} then
|
56
56
|
cnode = cnode.same_klass
|
57
57
|
else
|
58
58
|
cnode = cnode.next_klass
|
@@ -241,6 +241,10 @@ module YTLJit
|
|
241
241
|
end
|
242
242
|
end
|
243
243
|
|
244
|
+
def ruby_type_raw
|
245
|
+
@ruby_type
|
246
|
+
end
|
247
|
+
|
244
248
|
attr_writer :ruby_type
|
245
249
|
end
|
246
250
|
|
@@ -310,6 +314,7 @@ module YTLJit
|
|
310
314
|
define_wraped_class(NilClass, RubyTypeBoxed)
|
311
315
|
define_wraped_class(Fixnum, RubyTypeUnboxed)
|
312
316
|
define_wraped_class(Float, RubyTypeUnboxed)
|
317
|
+
define_wraped_class(Range, RubyTypeUnboxed)
|
313
318
|
define_wraped_class(TrueClass, RubyTypeBoxed)
|
314
319
|
define_wraped_class(FalseClass, RubyTypeBoxed)
|
315
320
|
define_wraped_class(Symbol, RubyTypeBoxed)
|