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 835
def initialize(test, body)
        @test = test
        @body = body
end
parse(parser, scope, nest) click to toggle source
# 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

Public Instance Methods

dump(scope, r=[''], dep=[]) click to toggle source
# 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
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