emit_assert(v)
elsif v.is_a? IR::If then
emit_if(v)
+ elsif v.is_a? Hash then
+# emit_if(v)
else
raise "code emitting of #{v.class} not implemented"
end
def emit_binop(v)
type = type_to_s(v.type)
+# if reference_type?(type)
+# type = "#{type}
+# end
if v.op == "&&"
lvar = emit(v.left)
result = mktemp();
else
putln "#{type} #{result} = (#{lvar} != #{rvar});"
end
+ when :new
+ putln "#{type} #{result} = 0;"
else
raise "not implemented"
end
end
def emit_var(v)
- var = @syms[v.name]
- if var.nil?
- error v, "no such variable: #{v.name}"
+ if v.module
+ mod = @syms[v.module]
+ if mod.nil?
+ error v, "no such module: #{v.module}"
+ end
+ var = mod.type.exports[v.name]
+ if var.nil?
+ error v, "no such variable: #{v.name}"
+ end
+ "#{v.module}_#{v.name}"
+ else
+ var = @syms[v.name]
+ if var.nil?
+ error v, "no such variable: #{v.name}"
+ end
+ var.name
end
- var.name
end
def emit_if(v)