# File metasm/parse_c.rb, line 850 def self.parse(parser, scope, nest) body = parser.parse_statement(scope, nest + [:loop]) tok = nil raise tok || parser, '"while" expected' if not tok = parser.skipspaces or tok.type != :string or tok.raw != 'while' 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 != ')' parser.checkstatementend(tok) new expr, body end
# File metasm/parse_c.rb, line 3795 def dump(scope, r=[''], dep=[]) r.last << 'do' r, dep = Statement.dump(@body, scope, r, dep) @body.kind_of?(Block) ? (r.last << ' while (') : (r << 'while (') r, dep = CExpression.dump(@test, scope, r, dep) r.last << ');' [r, dep] end
# File metasm/compile_c.rb, line 829 def precompile(compiler, scope) @body = @body.precompile_make_block scope @body.continue_label = compiler.new_label('dowhile_continue') @body.break_label = compiler.new_label('dowhile_break') loop_start = compiler.new_label('dowhile_start') Label.new(loop_start).precompile(compiler, scope) @body.precompile(compiler, scope) Label.new(@body.continue_label).precompile(compiler, scope) If.new(@test, Goto.new(loop_start)).precompile(compiler, scope) Label.new(@body.break_label).precompile(compiler, scope) end