Class: Mirah::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.



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

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

Instance Attribute Details

#compilerObject (readonly)

Returns the value of attribute compiler.



18
19
20
# File 'lib/mirah/jvm/source_generator/loops.rb', line 18

def compiler
  @compiler
end

#loopObject (readonly)

Returns the value of attribute loop.



18
19
20
# File 'lib/mirah/jvm/source_generator/loops.rb', line 18

def loop
  @loop
end

Instance Method Details

#breakObject



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

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

#compile(expression) ⇒ Object



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

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



54
55
56
# File 'lib/mirah/jvm/source_generator/loops.rb', line 54

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

#nextObject



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

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

#prepareObject



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

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



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

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