# File metasm/parse_c.rb, line 809 def initialize(init, test, iter, body) @init, @test, @iter, @body = init, test, iter, body end
# 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
# 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
# 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