var compiler = new GlobalCompiler(mainmodule, self, runtime_type_analysis)
compiler.compile_header
- var v = compiler.header
for t in runtime_type_analysis.live_types do
- compiler.declare_runtimeclass(v, t)
+ compiler.declare_runtimeclass(t)
end
compiler.compile_class_names
init(mainmodule: MModule, modelbuilder: ModelBuilder, runtime_type_analysis: RapidTypeAnalysis)
do
super(mainmodule, modelbuilder)
+ var file = new_file(mainmodule.name)
+ self.header = new CodeWriter(file)
self.runtime_type_analysis = runtime_type_analysis
self.live_primitive_types = new Array[MClassType]
for t in runtime_type_analysis.live_types do
# Compile class names (for the class_name and output_class_name methods)
protected fun compile_class_names do
+ var v = new_visitor
self.header.add_decl("extern const char const * class_names[];")
- self.header.add("const char const * class_names[] = \{")
+ v.add("const char const * class_names[] = \{")
for t in self.runtime_type_analysis.live_types do
- self.header.add("\"{t}\", /* {self.classid(t)} */")
+ v.add("\"{t}\", /* {self.classid(t)} */")
end
- self.header.add("\};")
+ v.add("\};")
end
# Return the C symbol associated to a live type runtime
private var seen: HashSet[AbstractRuntimeFunction] = new HashSet[AbstractRuntimeFunction]
# Declare C structures and identifiers for a runtime class
- fun declare_runtimeclass(v: CodeWriter, mtype: MClassType)
+ fun declare_runtimeclass(mtype: MClassType)
do
+ var v = self.header
assert self.runtime_type_analysis.live_types.has(mtype)
v.add_decl("/* runtime class {mtype} */")
var idnum = classids.length
res.is_exact = true
if is_native_array then
var mtype_elt = mtype.arguments.first
- v.add("{res} = GC_MALLOC(sizeof(struct {mtype.c_name}) + length*sizeof({mtype_elt.ctype}));")
+ v.add("{res} = nit_alloc(sizeof(struct {mtype.c_name}) + length*sizeof({mtype_elt.ctype}));")
else
- v.add("{res} = GC_MALLOC(sizeof(struct {mtype.c_name}));")
+ v.add("{res} = nit_alloc(sizeof(struct {mtype.c_name}));")
end
v.add("{res}->classid = {self.classid(mtype)};")
self.header.add_decl("val* BOX_{mtype.c_name}({mtype.ctype});")
v.add_decl("/* allocate {mtype} */")
v.add_decl("val* BOX_{mtype.c_name}({mtype.ctype} value) \{")
- v.add("struct {mtype.c_name}*res = GC_MALLOC(sizeof(struct {mtype.c_name}));")
+ v.add("struct {mtype.c_name}*res = nit_alloc(sizeof(struct {mtype.c_name}));")
v.add("res->classid = {self.classid(mtype)};")
v.add("res->value = value;")
v.add("return (val*)res;")