Module: YTLJit::VM::YARVTranslatorSimpleMixin

Includes:
Node
Included in:
YARVTranslatorCRubyObject, YARVTranslatorSimple
Defined in:
lib/ytljit/vm_trans.rb

Instance Method Summary collapse

Instance Method Details

#depth_of_block(code) ⇒ Object



208
209
210
211
212
213
214
215
216
217
# File 'lib/ytljit/vm_trans.rb', line 208

def depth_of_block(code)
  dep = 0
  ccode = code
  while ccode.header['type'] == :block
    ccode = ccode.parent
    dep += 1
  end
  
  dep
end

#gen_arg_node(context, sendnode, func, args) ⇒ Object



141
142
143
144
145
146
147
# File 'lib/ytljit/vm_trans.rb', line 141

def gen_arg_node(context, sendnode, func, args)
  curnode = context.current_node
  nnode = sendnode.new(curnode, func, args, 0, 0)
  nnode.debug_info = context.debug_info
  func.parent = nnode
  nnode
end

#get_self_object(context) ⇒ Object

getclassvariable setclassvariable



276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
# File 'lib/ytljit/vm_trans.rb', line 276

def get_self_object(context)
  klass = context.expstack.pop
  case klass
  when ConstantRefNode
    klass = klass.value_node

  when LiteralNode
    klass = klass.value
    if klass == nil then
      klass = context.current_class_node
    end

  when SpecialObjectNode
    if klass.kind == 3 then
      klass = context.current_class_node
    else
      raise "Unkown special object kind = #{klass.kind}"
    end

  else
    raise "Umkonwn node #{klass.class}"
  end

  klass
end

#get_vmnode_from_label(context, label) ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
# File 'lib/ytljit/vm_trans.rb', line 129

def get_vmnode_from_label(context, label)
  curnode = context.current_node
  nllab = context.local_label_tab[label]
  if nllab == nil then
    nllab = LocalLabel.new(curnode, label)
    nllab.debug_info = context.debug_info
    context.local_label_tab[label] = nllab
  end
  
  nllab
end

#newinst_to_sendnode(argnum, klass, code, ins, context) ⇒ Object

toregexp



412
413
414
415
416
417
418
419
420
421
422
423
424
425
# File 'lib/ytljit/vm_trans.rb', line 412

def newinst_to_sendnode(argnum, klass, code, ins, context)
  arg = []
  argnum.times {
    arg.push context.expstack.pop
  }
  curnode = context.current_node
  arg.push ConstantRefNode.new(curnode, nil, klass.name.to_sym)

  arg.reverse.each do |c|
    context.expstack.push c
  end

  visit_send(code, [:send, :new, argnum, nil, 0, nil], context)
end

#visit_block_end(code, ins, context) ⇒ Object



195
196
197
198
199
200
201
202
203
204
205
206
# File 'lib/ytljit/vm_trans.rb', line 195

def visit_block_end(code, ins, context)
  curnode = context.current_node
  top = context.top_nodes.last
  if top.class == MethodTopNode then
    if context.macro_method then
      code = top.to_ruby(ToRubyContext.new).ret_code.last
#            print code
      proc = eval("lambda" + code)
      SendNode.get_macro_tab[top.name] = proc
    end
  end
end

#visit_block_start(code, ins, context) ⇒ Object



171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/ytljit/vm_trans.rb', line 171

def visit_block_start(code, ins, context)
  mtopnode = context.current_node
  if !mtopnode.is_a?(TopNode) then
    oldtop = context.the_top
    mtopnode = TopTopNode.new(nil, Object)
    mtopnode.debug_info = context.debug_info
    context.the_top = mtopnode
    oldtop.parent = mtopnode
    mtopnode.init_node = oldtop
  end

  context.macro_method = nil

  locals = code.header['locals']
  arg_size   = code.header['misc'][:arg_size]
  args   = code.header['args']
  (arg_size - locals.size).times do 
    locals.push nil
  end
  
  cnode = mtopnode.construct_frame_info(locals, arg_size, args)
  context.current_node = cnode
end

#visit_branchif(code, ins, context) ⇒ Object



777
778
779
780
781
782
783
784
785
786
787
788
789
# File 'lib/ytljit/vm_trans.rb', line 777

def visit_branchif(code, ins, context)
  curnode = context.current_node
  nllab = get_vmnode_from_label(context, ins[1])
 
  cond = context.expstack.pop
 
  node = BranchIfNode.new(curnode, cond, nllab)
  node.debug_info = context.debug_info
  nllab.come_from[node] = nil

  curnode.body = node
  context.current_node = node
end

#visit_branchunless(code, ins, context) ⇒ Object



791
792
793
794
795
796
797
798
799
800
801
802
803
# File 'lib/ytljit/vm_trans.rb', line 791

def visit_branchunless(code, ins, context)
  curnode = context.current_node
  nllab = get_vmnode_from_label(context, ins[1])

  cond = context.expstack.pop
  
  node = BranchUnlessNode.new(curnode, cond, nllab)
  node.debug_info = context.debug_info
  nllab.come_from[node] = nil

  curnode.body = node
  context.current_node = node
end

#visit_concatstrings(code, ins, context) ⇒ Object



384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
# File 'lib/ytljit/vm_trans.rb', line 384

def visit_concatstrings(code, ins, context)
  curnode = context.current_node
  numarg = ins[1]
  nnode = context.expstack[-numarg]
  (numarg - 1).times do |i|
    func = FixArgCApiNode.new(curnode, "rb_str_append", [:VALUE, :VALUE])
    args = [nnode, context.expstack[i - numarg + 1]]
    nnode = gen_arg_node(context, RetStringSendNode, func, args)
  end

  numarg.times do
    context.expstack.pop
  end
  context.expstack.push nnode
end

#visit_defineclass(code, ins, context) ⇒ Object



518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
# File 'lib/ytljit/vm_trans.rb', line 518

def visit_defineclass(code, ins, context)
  name = ins[1]
  supklsnode = context.expstack.pop
  defat = context.expstack.pop
  clsobj = context.current_class_node.klass_object
  klassobj = nil
  begin
    klassobj = clsobj.const_get(name, true)
  rescue NameError
  end

  if klassobj == nil then
    klassnode = context.current_class_node.constant_tab[name]
    if klassnode then
      klassobj = klassnodne.klass_object
      
    else
      supklass = nil
      case supklsnode
      when LiteralNode
        supklass = supklsnode.value
        if supklass == nil then
          supklass = Object
        end

      when ConstantRefNode
        supnode = supklsnode.value_node
        if supnode.is_a?(ClassTopNode) then
          supklass = supnode.klass_object
        else
          raise "Not class #{supnode.class}"
        end

      else
        raise "Not support #{supklsnode.class}"
      end

      case ins[3]
      when 0
        klassobj = Class.new(supklass)
        
      when 2
        klassobj = Module.new
      end
    end
    clsobj.const_set(name, klassobj)
  end
  RubyType::define_wraped_class(klassobj, RubyType::RubyTypeBoxed)
  cnode = ClassTopNode.new(context.current_class_node, klassobj, name)
  cnode.debug_info = context.debug_info
  context.current_class_node.constant_tab[name] = cnode
  
  body = VMLib::InstSeqTree.new(code, ins[2])
  ncontext = YARVContext.new
  ncontext.current_file_name = context.current_file_name
  ncontext.current_node = cnode
  ncontext.current_class_node = cnode
  ncontext.top_nodes.push cnode

  tr = self.class.new([body])
  tr.translate(ncontext)

  curnode = context.current_node
  cvnode = ClassValueNode.new(curnode, cnode)
  cvnode.debug_info = context.debug_info
  context.expstack.push cvnode

  context
end

#visit_dup(code, ins, context) ⇒ Object



478
479
480
481
482
483
# File 'lib/ytljit/vm_trans.rb', line 478

def visit_dup(code, ins, context)
  orgnode = context.expstack.pop
  nnode = MultiplexNode.new(orgnode)
  context.expstack.push nnode
  context.expstack.push nnode
end

#visit_duparray(code, ins, context) ⇒ Object



443
444
445
446
447
# File 'lib/ytljit/vm_trans.rb', line 443

def visit_duparray(code, ins, context)
  nnode = LiteralNode.new(nil, ins[1])
  nnode.debug_info = context.debug_info
  context.expstack.push nnode
end

#visit_dupn(code, ins, context) ⇒ Object



485
486
487
# File 'lib/ytljit/vm_trans.rb', line 485

def visit_dupn(code, ins, context)
  raise "foo"
end

#visit_getconstant(code, ins, context) ⇒ Object



302
303
304
305
306
307
308
309
# File 'lib/ytljit/vm_trans.rb', line 302

def visit_getconstant(code, ins, context)
  klass = get_self_object(context)
  name = ins[1]
  curnode = context.current_node
  node = ConstantRefNode.new(curnode, klass, name)
  node.debug_info = context.debug_info
  context.expstack.push node
end

#visit_getdynamic(code, ins, context) ⇒ Object

getspecial setspecial



232
233
234
235
236
237
238
239
240
241
242
243
# File 'lib/ytljit/vm_trans.rb', line 232

def visit_getdynamic(code, ins, context)
  # + 3 mean prtv_env/pointer to block function/self
  dep = ins[2]
  curcode = code
  dep.times do
    curcode = curcode.parent
  end
  offset = curcode.header['misc'][:local_size] + 3 - ins[1]
  node = LocalVarRefNode.new(context.current_node, offset, dep)
  node.debug_info = context.debug_info
  context.expstack.push node
end

#visit_getlocal(code, ins, context) ⇒ Object



219
220
221
222
# File 'lib/ytljit/vm_trans.rb', line 219

def visit_getlocal(code, ins, context)
  dep = depth_of_block(code)
  visit_getdynamic(code, [:getlocal, ins[1], dep], context)
end

#visit_invokeblock(code, ins, context) ⇒ Object



676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
# File 'lib/ytljit/vm_trans.rb', line 676

def visit_invokeblock(code, ins, context)
  curnode = context.current_node
  func = YieldNode.new(curnode)
  func.debug_info = context.debug_info
  numarg = ins[1]
  op_flag = ins[2]
  seqno = ins[3]

  # regular arguments
  args = []
  numarg.times do |i|
    argele = context.expstack.pop
    args.push argele
  end

  frameinfo = func.frame_info
  roff = frameinfo.real_offset(0)  # offset of prevenv
  framelayout = frameinfo.frame_layout

  # self
  argnode = LiteralNode.new(curnode, nil)
  argnode.debug_info = context.debug_info
  args.push argnode

  # block
  argnode = LiteralNode.new(curnode, nil)
  argnode.debug_info = context.debug_info
  args.push argnode
  
  # perv env
  argnode = LiteralNode.new(curnode, nil)
  argnode.debug_info = context.debug_info
  args.push argnode

  args = args.reverse

  nnode = SendNode.new(curnode, func, args, op_flag, seqno)
  nnode.debug_info = context.debug_info
  func.parent = nnode
  context.expstack.push nnode

  context
end

#visit_invokesuper(code, ins, context) ⇒ Object



673
674
# File 'lib/ytljit/vm_trans.rb', line 673

def visit_invokesuper(code, ins, context)
end

#visit_jump(code, ins, context) ⇒ Object



761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
# File 'lib/ytljit/vm_trans.rb', line 761

def visit_jump(code, ins, context)
  curnode = context.current_node
  nllab = get_vmnode_from_label(context, ins[1])

  jpnode = JumpNode.new(curnode, nllab) 
  jpnode.debug_info = context.debug_info
  jpnode.body = nllab

  val = context.expstack.pop
  nllab.come_from[jpnode] = val

  curnode.body = jpnode
  context.current_node = jpnode
  context.not_reached_pos = true
end

#visit_leave(code, ins, context) ⇒ Object



720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
# File 'lib/ytljit/vm_trans.rb', line 720

def visit_leave(code, ins, context)
  curnode = nil
  vnode = nil

  if context.top_nodes.last.name == :initialize then
    # This is necessary. So it decides type of new method
    visit_pop(code, ins, context)
    curnode = context.current_node 
    vnode = SelfRefNode.new(curnode)
    vnode.debug_info = context.debug_info
  else
    curnode = context.current_node 
    vnode = context.expstack.pop
    vnode.debug_info = context.debug_info
  end

  srnode = SetResultNode.new(curnode, vnode)
  srnode.debug_info = context.debug_info
  curnode.body = srnode

  context.current_node = srnode

  case code.header['type']
  when :method
    nnode = MethodEndNode.new(srnode)
  when :block
    nnode = BlockEndNode.new(srnode)
  when :class
    nnode = ClassEndNode.new(srnode)
  when :top
    nnode = ClassEndNode.new(srnode)
  end
  nnode.debug_info = context.debug_info

  context.top_nodes.last.end_nodes.push nnode
  srnode.body = nnode
end

#visit_newarray(code, ins, context) ⇒ Object



427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
# File 'lib/ytljit/vm_trans.rb', line 427

def visit_newarray(code, ins, context)
  curnode = context.current_node
  func = FixArgCApiNode.new(curnode, "rb_ary_new3", [:int, :VALUE, :"..."])
  argnum = ins[1]
  argnumnode = LiteralNode.new(nil, argnum)
  args = []
  argnum.times do
    argele = context.expstack.pop
    args.push argele
  end
  args.push argnumnode
  args = args.reverse
  nnode = gen_arg_node(context, RetArraySendNode, func, args)
  context.expstack.push nnode
end

#visit_newrange(code, ins, context) ⇒ Object

expandarray concatarray splatarray checkincludearray newhash



455
456
457
458
459
# File 'lib/ytljit/vm_trans.rb', line 455

def visit_newrange(code, ins, context)
  exclflag = LiteralNode.new(nil, ins[1] == 1)
  context.expstack.push exclflag
  newinst_to_sendnode(3, Range, code, ins, context)
end

#visit_pop(code, ins, context) ⇒ Object



461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
# File 'lib/ytljit/vm_trans.rb', line 461

def visit_pop(code, ins, context)
  node = context.expstack.pop
  if node == nil then
    # Maybe push instruction deleted by optimize
    node = LiteralNode.new(nil, nil)
  end

  curnode = context.current_node
  node.parent = curnode
  curnode.body = node
  if node.is_a?(HaveChildlenMixin) then
    context.current_node = node
  end

  context
end

#visit_putiseq(code, ins, context) ⇒ Object



348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
# File 'lib/ytljit/vm_trans.rb', line 348

def visit_putiseq(code, ins, context)
  body = VMLib::InstSeqTree.new(code, ins[1])
  curnode = context.current_node
  ncontext = YARVContext.new

  case body.header['type']
  when :block
    mtopnode = BlockTopNode.new(curnode)
  when :method
    mtopnode = MethodTopNode.new(curnode, body.header['name'].to_sym)
  when :class
    mtopnode = ClassTopNode.new(curnode, body.header['name'].to_sym)
  when :top
    raise "Maybe bug not appear top block."
  end
  mtopnode.debug_info = context.debug_info
  ncontext.current_node = mtopnode
  ncontext.top_nodes.push mtopnode

  ncontext.current_file_name = context.current_file_name
  ncontext.current_class_node = context.current_class_node
  mname = context.expstack.last
  ncontext.current_method_node = mname

  tr = self.class.new([body])
  tr.translate(ncontext)
  context.macro_method = ncontext.macro_method
  context.expstack.push mtopnode
end

#visit_putnil(code, ins, context) ⇒ Object

getglobal setglobal



325
326
327
328
329
# File 'lib/ytljit/vm_trans.rb', line 325

def visit_putnil(code, ins, context)
  nnode = LiteralNode.new(nil, nil)
  nnode.debug_info = context.debug_info
  context.expstack.push nnode
end

#visit_putobject(code, ins, context) ⇒ Object



338
339
340
341
342
# File 'lib/ytljit/vm_trans.rb', line 338

def visit_putobject(code, ins, context)
  nnode = LiteralNode.new(nil, ins[1])
  nnode.debug_info = context.debug_info
  context.expstack.push nnode
end

#visit_putself(code, ins, context) ⇒ Object



331
332
333
334
335
336
# File 'lib/ytljit/vm_trans.rb', line 331

def visit_putself(code, ins, context)
  curnode = context.current_node
  nnode = SelfRefNode.new(curnode)
  nnode.debug_info = context.debug_info
  context.expstack.push nnode
end

#visit_putspecialobject(code, ins, context) ⇒ Object



344
345
346
# File 'lib/ytljit/vm_trans.rb', line 344

def visit_putspecialobject(code, ins, context)
  context.expstack.push SpecialObjectNode.new(nil, ins[1])
end

#visit_putstring(code, ins, context) ⇒ Object



378
379
380
381
382
# File 'lib/ytljit/vm_trans.rb', line 378

def visit_putstring(code, ins, context)
  nnode = LiteralNode.new(nil, ins[1])
  nnode.debug_info = context.debug_info
  context.expstack.push nnode
end

#visit_send(code, ins, context) ⇒ Object



588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
# File 'lib/ytljit/vm_trans.rb', line 588

def visit_send(code, ins, context)
  curnode = context.current_node
  numarg = ins[2]
  blk_iseq = ins[3]
  op_flag = ins[4]
  seqno = ins[5]

  # regular arguments
  arg = []
  numarg.times do |i|
    argele = context.expstack.pop
    arg.push argele
  end
  
  # self
  slf = context.expstack.pop
  if (op_flag & (0b11 << 3)) != 0 and # fcall, vcall
      slf.is_a?(LiteralNode) and 
      slf.value == nil and 
      context.current_class_node.name != :top then
    slf = SelfRefNode.new(curnode)
  end
  arg.push slf

  # block
  if blk_iseq then
    body = VMLib::InstSeqTree.new(code, blk_iseq)
    ncontext = YARVContext.new
    ncontext.current_file_name = context.current_file_name
    ncontext.current_class_node = context.current_class_node
    ncontext.current_method_node = context.current_method_node
    btn = ncontext.current_node = BlockTopNode.new(curnode)
    ncontext.top_nodes.push btn

    tr = self.class.new([body])
    tr.translate(ncontext)
    btn.debug_info = context.debug_info
    context.macro_method = ncontext.macro_method

    arg.push btn # block
  else
    argnode = LiteralNode.new(curnode, nil)
    argnode.debug_info = context.debug_info
    arg.push argnode      # block(dymmy)
  end

  # perv env
  argnode = LiteralNode.new(curnode, nil)
  argnode.debug_info = context.debug_info
  arg.push argnode

  arg = arg.reverse

  func = MethodSelectNode.new(curnode, ins[1])
  sn = SendNode.make_send_node(curnode, func, arg, op_flag, seqno)
  if sn.is_a?(SendEvalNode) then
    if context.macro_method == nil then
      context.macro_method = true
    end
  end

  if sn.is_a?(SendNode) then
    sn.debug_info = context.debug_info
    func.set_reciever(sn)
    context.expstack.push sn

  elsif sn.is_a?(Array)
    # macro(including eval method). execute in compile time and
    # compile eval strings.
    val, evalstr = sn
    evalstr = evalstr.join("\n")
    is = RubyVM::InstructionSequence.compile(
             evalstr, "macro #{ins[1]}", "", 0, YTL::ISEQ_OPTS
         ).to_a
    ncode = VMLib::InstSeqTree.new(code, is)
    ncode.body.pop        # Chop leave instruction
    translate_main(ncode, context)
#          context.expstack.push val
  else
    raise "Unexcepted data type #{sn.class}"
  end

  context
end

#visit_setconstant(code, ins, context) ⇒ Object



311
312
313
314
315
316
317
318
319
320
# File 'lib/ytljit/vm_trans.rb', line 311

def visit_setconstant(code, ins, context)
  klass = get_self_object(context)
  value = context.expstack.pop
  name = ins[1]
  curnode = context.current_node
  node = ConstantAssignNode.new(curnode, klass, name, value)
  node.debug_info = context.debug_info
  curnode.body = node
  context.current_node = node
end

#visit_setdynamic(code, ins, context) ⇒ Object



245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
# File 'lib/ytljit/vm_trans.rb', line 245

def visit_setdynamic(code, ins, context)
  dep = ins[2]
  curcode = code
  dep.times do
    curcode = curcode.parent
  end
  val = context.expstack.pop
  curnode = context.current_node
  offset = curcode.header['misc'][:local_size] + 3 - ins[1]
  node = LocalAssignNode.new(curnode, offset, dep, val)
  node.debug_info = context.debug_info
  if context.expstack[-1] == val then
    varref = LocalVarRefNode.new(context.current_node, offset, dep)
    varref.debug_info = context.debug_info
    context.expstack[-1] = varref
  end
  curnode.body = node
  context.current_node = node
end

#visit_setlocal(code, ins, context) ⇒ Object



224
225
226
227
# File 'lib/ytljit/vm_trans.rb', line 224

def visit_setlocal(code, ins, context)
  dep = depth_of_block(code)
  visit_setdynamic(code, [:setlocal, ins[1], dep], context)
end

#visit_setn(code, ins, context) ⇒ Object



504
505
506
507
508
509
510
# File 'lib/ytljit/vm_trans.rb', line 504

def visit_setn(code, ins, context)
  n = ins[1] + 1
  orgnode = context.expstack.last
  nnode = MultiplexNode.new(orgnode)
  context.expstack[-n] = nnode
  context.expstack[-1] = nnode
end

#visit_swap(code, ins, context) ⇒ Object



489
490
491
492
493
494
# File 'lib/ytljit/vm_trans.rb', line 489

def visit_swap(code, ins, context)
  val0 = context.expstack.pop
  val1 = context.expstack.pop
  context.expstack.push val0
  context.expstack.push val1
end

#visit_symbol(code, ins, context) ⇒ Object



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# File 'lib/ytljit/vm_trans.rb', line 149

def visit_symbol(code, ins, context)
  context.current_local_label = ins

  curnode = context.current_node
  nllab = get_vmnode_from_label(context, ins)
  
  unless curnode.is_a?(JumpNode)
    jmpnode = JumpNode.new(curnode, nllab)
    jmpnode.debug_info = context.debug_info
    nllab.parent = jmpnode

    val = context.expstack.pop
    nllab.come_from[jmpnode] = val
  
    curnode.body = jmpnode
    jmpnode.body = nllab
    context.expstack.push nllab.value_node
  end
  
  context.current_node = nllab
end

#visit_throw(code, ins, context) ⇒ Object



758
759
# File 'lib/ytljit/vm_trans.rb', line 758

def visit_throw(code, ins, context)
end

#visit_topn(code, ins, context) ⇒ Object

reput



498
499
500
501
502
# File 'lib/ytljit/vm_trans.rb', line 498

def visit_topn(code, ins, context)
  raise
  n = ins[1] + 1
  context.expstack.push context.expstack[-n]
end

#visit_tostring(code, ins, context) ⇒ Object



400
401
402
403
404
405
406
407
408
# File 'lib/ytljit/vm_trans.rb', line 400

def visit_tostring(code, ins, context)
  curnode = context.current_node
  func = FixArgCApiNode.new(curnode, "rb_obj_as_string", [:VALUE])
  args = []
  argele = context.expstack.pop
  args.push argele
  nnode = gen_arg_node(context, RetStringSendNode, func, args)
  context.expstack.push nnode
end

#visit_trace(code, ins, context) ⇒ Object

adjuststack defined



515
516
# File 'lib/ytljit/vm_trans.rb', line 515

def visit_trace(code, ins, context)
end