Class: Mirah::JVM::Compiler::JavaSource::SimpleWhileLoop

Inherits:
Object
  • Object
show all
Defined in:
lib/mirah/jvm/source_generator/loops.rb

Direct Known Subclasses

ComplexWhileLoop

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(loop, compiler) ⇒ SimpleWhileLoop

Returns a new instance of SimpleWhileLoop.



22
23
24
25
# File 'lib/mirah/jvm/source_generator/loops.rb', line 22

def initialize(loop, compiler)
  @loop = loop
  @compiler = compiler
end

Instance Attribute Details

#compilerObject (readonly)

Returns the value of attribute compiler.



21
22
23
# File 'lib/mirah/jvm/source_generator/loops.rb', line 21

def compiler
  @compiler
end

#loopObject (readonly)

Returns the value of attribute loop.



21
22
23
# File 'lib/mirah/jvm/source_generator/loops.rb', line 21

def loop
  @loop
end

Instance Method Details

#breakObject



27
28
29
# File 'lib/mirah/jvm/source_generator/loops.rb', line 27

def break
  compiler.method.puts "break;"
end

#compile(expression) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/mirah/jvm/source_generator/loops.rb', line 39

def compile(expression)
  prepare
  @loop.init.compile(compiler, false) if @loop.init?
  @start.call
  compiler.method.block do
    @loop.pre.compile(compiler, false) if @loop.pre?
    compile_body
    @loop.post.compile(compiler, false) if @loop.post?
  end
  if @end_check
    @end_check.call
    compiler.method.puts ';'
  end
  if expression
    compiler.method.puts "#{compiler.lvalue}null;"
  end
end

#compile_bodyObject



57
58
59
# File 'lib/mirah/jvm/source_generator/loops.rb', line 57

def compile_body
  loop.body.compile(compiler, false) if loop.body
end

#nextObject



31
32
33
# File 'lib/mirah/jvm/source_generator/loops.rb', line 31

def next
  compiler.method.puts "continue;"
end

#prepareObject



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/mirah/jvm/source_generator/loops.rb', line 61

def prepare
  predicate = loop.condition.predicate.precompile(compiler)
  negative = loop.negative ? '!' : ''
  check = lambda do
    compiler.method.print "while (#{negative}"
    predicate.compile(compiler, true)
    compiler.method.print ')'
  end
  if loop.check_first
    @start = check
  else
    @start = lambda {compiler.method.print 'do'}
    @end_check = check
  end
end

#redoObject



35
36
37
# File 'lib/mirah/jvm/source_generator/loops.rb', line 35

def redo
  raise "#{self.class.name} doesn't support redo"
end