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 823 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 827 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=[CRenderString.new], dep=[])
click to toggle source
# File metasm/parse_c.rb, line 3810 def dump(scope, r=[CRenderString.new], dep=[]) r.last << CRenderString.new(self, '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