class Metasm::C::While
Attributes
body[RW]
test[RW]
Public Class Methods
new(test, body)
click to toggle source
# File metasm/parse_c.rb, line 849 def initialize(test, body) @test = test @body = body end
parse(parser, scope, nest)
click to toggle source
# File metasm/parse_c.rb, line 854 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
Public Instance Methods
dump(scope, r=[CRenderString.new], dep=[])
click to toggle source
# File metasm/parse_c.rb, line 3836 def dump(scope, r=[CRenderString.new], dep=[]) r.last << CRenderString.new(self, 'while (') r, dep = CExpression.dump(@test, scope, r, dep) r.last << ')' Statement.dump(@body, scope, r, dep) end
precompile(compiler, scope)
click to toggle source
# 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