Module: BiteScript::Bytecode

Includes:
ASM, Signature
Included in:
MethodBuilder
Defined in:
lib/bitescript/bytecode.rb,
lib/bitescript/asm3/bytecode.rb

Overview

Bytecode is a simple adapter around an ASM MethodVisitor that makes it look like JVM assembly code. Included classes must just provide a method_visitor accessor

Defined Under Namespace

Classes: SmartLabel

Constant Summary collapse

JObject =
java.lang.Object
JSystem =
java.lang.System
JPrintStream =
java.io.PrintStream
JVoid =
java.lang.Void
JInteger =
java.lang.Integer
JFloat =
java.lang.Float
JLong =
java.lang.Long
JDobule =
java.lang.Double
OpcodeStackDeltas =
{}
OpcodeInstructions =
{}

Instance Method Summary collapse

Methods included from Signature

ci, class_id, classname, path, sig, signature, tipath, type_insn_path

Instance Method Details

#aprintlnObject



377
378
379
# File 'lib/bitescript/bytecode.rb', line 377

def aprintln
  println
end

#label(id = nil) ⇒ Object



367
368
369
370
371
372
373
374
375
# File 'lib/bitescript/bytecode.rb', line 367

def label(id = nil)
  if id
    lbl = sym_to_label(id)
    lbl.set!
    lbl
  else
    return SmartLabel.new(method_visitor)
  end
end

#labelsObject



355
356
357
# File 'lib/bitescript/bytecode.rb', line 355

def labels
  @labels ||= {}
end

#line(num) ⇒ Object



392
393
394
395
396
397
# File 'lib/bitescript/bytecode.rb', line 392

def line(num)
  if num && num != @line_num
    method_visitor.visit_line_number(num, label.set!.label)
  end
  @line_num = num
end

#println(type = JObject) ⇒ Object



381
382
383
384
385
# File 'lib/bitescript/bytecode.rb', line 381

def println(type = JObject)
  getstatic JSystem, "out", JPrintStream
  swap
  invokevirtual JPrintStream, "println", [JVoid::TYPE, type]
end

#push_int(num) ⇒ Object



399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
# File 'lib/bitescript/bytecode.rb', line 399

def push_int(num)
  if (num <= Java::java.lang.Byte::MAX_VALUE && num >= Java::java.lang.Byte::MIN_VALUE)
    case num
    when -1
      iconst_m1
    when 0
      iconst_0
    when 1
      iconst_1
    when 2
      iconst_2
    when 3
      iconst_3
    when 4
      iconst_4
    when 5
      iconst_5
    else
      bipush(num)
    end
  elsif (num <= Java::java.lang.Short::MAX_VALUE && num >= Java::java.lang.Short::MIN_VALUE)
    sipush(num)
  elsif (num <= Java::java.lang.Integer::MAX_VALUE && num >= Java::java.lang.Integer::MIN_VALUE)
    ldc_int(num)
  else
    ldc_long(num)
  end
end

#startObject



312
313
314
315
# File 'lib/bitescript/bytecode.rb', line 312

def start
  method_visitor.visit_code
  @start_label.set!
end

#stopObject



317
318
319
320
321
322
323
324
# File 'lib/bitescript/bytecode.rb', line 317

def stop
  @end_label.set!
  @locals.each do |name, locals|
    local_debug_info(name, locals[-1], @end_label)
  end
  method_visitor.visit_maxs(1,1)
  method_visitor.visit_end
end

#swap2Object



387
388
389
390
# File 'lib/bitescript/bytecode.rb', line 387

def swap2
  dup2_x2
  pop2
end

#sym_to_label(id) ⇒ Object



359
360
361
362
363
364
365
# File 'lib/bitescript/bytecode.rb', line 359

def sym_to_label(id)
  lbl = labels[id]
  unless lbl
    lbl = labels[id] = label
  end
  lbl
end

#trycatch(from, to, target, type) ⇒ Object



326
327
328
329
330
331
332
# File 'lib/bitescript/bytecode.rb', line 326

def trycatch(from, to, target, type)
  from = sym_to_label(from) if Symbol === from
  to = sym_to_label(to) if Symbol === to
  target = sym_to_label(target) if Symbol === target
  
  method_visitor.visit_try_catch_block(from.label, to.label, target.label, type ? path(type) : nil)
end