end
module Codegen
+ @@label_count = 0
+
+ def self.genlabel()
+ label = @@label_count
+ @@label_count = @@label_count + 1
+ end
+
def self.emit(syms, v)
if v.is_a? IR::Return then
emit_return(syms, v)
end
def self.emit_def(syms, v)
- puts "# def #{v.name} = #{v}"
syms.add_sym(
v.name.name, v.loc, :local, v.type, v.value)
emit(syms, v.value)
end
def self.emit_if(syms, v)
- puts "# if "
+ lbl1 = genlabel()
+ lbl2 = genlabel()
+ emit(syms, v.cond)
+ puts " jmp_if0 :L#{lbl1}"
+ emit_block(syms, v.then)
+ puts " jmp :L#{lbl2}"
+ puts "label :L#{lbl1}"
+ emit_block(syms, v.else)
+ puts "label :L#{lbl2}"
+ end
+
+ def self.emit_block(syms, v)
+ return if v.nil?
+ v.each do |v|
+ emit(syms, v);
+ end
end
end