# File metasm/parse_c.rb, line 835 def initialize(test, body) @test = test @body = body end
# File metasm/parse_c.rb, line 840 def self.parse(parser, scope, nest) tok = nil raise tok || parser, '"(" expected' if not tok = parser.skipspaces or tok.type != :punct or tok.raw != '(' raise tok, 'expr expected' if not expr = CExpression.parse(parser, scope) or not expr.type.arithmetic? raise tok || parser, '")" expected' if not tok = parser.skipspaces or tok.type != :punct or tok.raw != ')' new expr, parser.parse_statement(scope, nest + [:loop]) end
# File metasm/parse_c.rb, line 3787 def dump(scope, r=[''], dep=[]) r.last << 'while (' r, dep = CExpression.dump(@test, scope, r, dep) r.last << ')' Statement.dump(@body, scope, r, dep) end
# File metasm/compile_c.rb, line 812 def precompile(compiler, scope) @body = @body.precompile_make_block scope @body.continue_label = compiler.new_label('while_continue') @body.break_label = compiler.new_label('while_break') Label.new(@body.continue_label).precompile(compiler, scope) If.new(CExpression.negate(@test), Goto.new(@body.break_label)).precompile(compiler, scope) @body.precompile(compiler, scope) Goto.new(@body.continue_label).precompile(compiler, scope) Label.new(@body.break_label).precompile(compiler, scope) end