class Metasm::C::DoWhile

Public Class Methods

parse(parser, scope, nest) click to toggle source
# File metasm/parse_c.rb, line 864
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

Public Instance Methods

dump(scope, r=[CRenderString.new], dep=[]) click to toggle source
# File metasm/parse_c.rb, line 3844
def dump(scope, r=[CRenderString.new], dep=[])
        r.last << CRenderString.new(self, 'do')
        r, dep = Statement.dump(@body, scope, r, dep)
        r << CRenderString.new if not @body.kind_of?(Block)
        r.last << CRenderString.new(self, ' while (')
        r, dep = CExpression.dump(@test, scope, r, dep)
        r.last << ');'
        [r, dep]
end
precompile(compiler, scope) click to toggle source
# 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