puts ""
end
-# # output imported record declarations
-# imported_mods.each do |mod|
-# @syms[mod[:name]].type.exports.each do |name, val|
-# define_sym(val) if val.kind == :type
-# end
-# puts ""
-# end
+ # output imported record declarations
+ imported_mods.each do |mod|
+ @syms[mod[:name]].type.exports.each do |name, val|
+ define_sym(val) if val.kind == :type
+ end
+ puts ""
+ end
# output this modules symbol declarations
@syms.each { |name, val| declare_sym(val) }
else
putln "#{type} #{result} = Array_Get(#{lvar}, #{rvar});"
end
+ elsif v.op == "."
+
+ lvar = emit(v.left)
+ result = mktemp();
+ putln "#{type} #{result} = (#{lvar}->#{v.right.name});"
+
+
else
lvar = emit(v.left)
rvar = emit(v.right)
putln "#{type} #{result} = (#{lvar} != #{rvar});"
end
when :new
- putln "#{type} #{result} = 0;"
+ putln "#{type} #{result} = Record_Create(sizeof(#{type[0..-2]}));"
+ v.right.each do |field, value|
+ putln "#{result}->#{field} = #{emit(value)};"
+ end
else
raise "not implemented"
end
@syms.add_sym(v.name.name, v.loc, :local, v.type, v.value)
temp = emit(v.value)
error v, "invalid local definition: #{v.name.name}" if not @locals.index(v.name.name)
-
-# if v.type.module.nil?
-# sym = @syms[v.type.name].value || @syms[v.type.name].type
-# else
-# if type.module == @parser.module
-# sym = @syms[v.type.name].type || @syms[v.type.name].value
-# else
-# sym = @syms[v.type.module].type.exports[v.type.name]
-# sym = sym.type || sym.value
-# end
-# end
-# is_record = sym.is_a?(Value::Type) and sym.form == :record
-
putln "#{type_to_s(v.value.type)} #{v.name.name} = #{temp};"
end
def emit_set(v)
if v.name.is_a? IR::Op
- error v, "not a valid array or hash access expression" if v.name.op != "["
+ error v, "not a valid array or hash access expression" if (v.name.op != "[") && (v.name.op != ".")
object = emit(v.name.left)
key = emit(v.name.right)
value = emit(v.value)
- putln "Array_Set(#{object}, #{key}, #{value});"
+ if (v.name.op == ".")
+ putln "#{object}->#{v.name.right.name} = #{value};"
+ else
+ putln "Array_Set(#{object}, #{key}, #{value});"
+ end
else
temp = emit(v.value)
error v, "invalid local definition: #{v.name.name}" if not @locals.index(v.name.name)