class Metasm::C::For

Attributes

body[RW]
init[RW]
iter[RW]
test[RW]

Public Class Methods

new(init, test, iter, body) click to toggle source
# File metasm/parse_c.rb, line 809
def initialize(init, test, iter, body)
        @init, @test, @iter, @body = init, test, iter, body
end
parse(parser, scope, nest) click to toggle source
# File metasm/parse_c.rb, line 813
def self.parse(parser, scope, nest)
        tok = nil
        raise tok || parser, '"(" expected' if not tok = parser.skipspaces or tok.type != :punct or tok.raw != '('
        init = forscope = Block.new(scope)
        if not parser.parse_definition(forscope)
                forscope = scope
                init = CExpression.parse(parser, forscope)
                raise tok || parser, '";" expected' if not tok = parser.skipspaces or tok.type != :punct or tok.raw != ';'
        end
        test = CExpression.parse(parser, forscope)
        raise tok || parser, '";" expected' if not tok = parser.skipspaces or tok.type != :punct or tok.raw != ';'
        raise tok, 'bad test expression in for loop' if test and not test.type.arithmetic?
        iter = CExpression.parse(parser, forscope)
        raise tok || parser, '")" expected' if not tok = parser.skipspaces or tok.type != :punct or tok.raw != ')'

        new init, test, iter, parser.parse_statement(forscope, nest + [:loop])
end

Public Instance Methods

dump(scope, r=[''], dep=[]) click to toggle source
# File metasm/parse_c.rb, line 3761
def dump(scope, r=[''], dep=[])
        r.last << 'for ('
        if @init.kind_of? Block
                scope = @init
                skiptype = false
                @init.symbol.each_value { |s|
                        r.last << ', ' if skiptype
                        r, dep = s.dump_def(scope, r, dep, skiptype)
                        skiptype = true
                }
        else
                r, dep = CExpression.dump(@init, scope, r, dep)
        end
        r.last << ' ' if @init
        r.last << ';'
        r.last << ' ' if @test
        r, dep = CExpression.dump(@test, scope, r, dep)
        r.last << ' ' if @test
        r.last << ';'
        r.last << ' ' if @iter
        r, dep = CExpression.dump(@iter, 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 783
def precompile(compiler, scope)
        if init
                @init.precompile(compiler, scope)
                scope = @init if @init.kind_of? Block
        end

        @body = @body.precompile_make_block scope
        @body.continue_label = compiler.new_label 'for_continue'
        @body.break_label = compiler.new_label 'for_break'
        label_test = compiler.new_label 'for_test'

        Label.new(label_test).precompile(compiler, scope)
        if test
                If.new(CExpression.negate(@test), Goto.new(@body.break_label)).precompile(compiler, scope)
        end

        @body.precompile(compiler, scope)

        Label.new(@body.continue_label).precompile(compiler, scope)
        if iter
                @iter.precompile(compiler, scope)
        end

        Goto.new(label_test).precompile(compiler, scope)
        Label.new(@body.break_label).precompile(compiler, scope)
end