protected fun compile_class_vft(ccinfo: ClassCompilationInfo, v: SeparateCompilerVisitor)
do
var mclass = ccinfo.mclass
var mtype = ccinfo.mtype
var rta = runtime_type_analysis
var c_name = ccinfo.mclass.c_name
var is_dead = ccinfo.is_dead
var need_corpse = ccinfo.need_corpse
v.add_decl("/* runtime class {c_name}: {mclass.full_name} (dead={is_dead}; need_corpse={need_corpse})*/")
# Build class vft
if not is_dead or need_corpse then
self.provide_declaration("class_{c_name}", "extern const struct class class_{c_name};")
v.add_decl("const struct class class_{c_name} = \{")
v.add_decl("{self.box_kind_of(mclass)}, /* box_kind */")
v.add_decl("\{")
var vft = self.method_tables.get_or_null(mclass)
if vft != null then for i in [0 .. vft.length[ do
var mpropdef = vft[i]
if mpropdef == null then
v.add_decl("NULL, /* empty */")
else
assert mpropdef isa MMethodDef
if rta != null and not rta.live_methoddefs.has(mpropdef) then
v.add_decl("NULL, /* DEAD {mclass.intro_mmodule}:{mclass}:{mpropdef} */")
continue
else if mpropdef.is_broken or mpropdef.msignature == null or mpropdef.mproperty.is_broken then
v.add_decl("NULL, /* DEAD (BROKEN) {mclass.intro_mmodule}:{mclass}:{mpropdef} */")
continue
end
var rf = mpropdef.virtual_runtime_function
v.require_declaration(rf.c_name)
v.add_decl("(nitmethod_t){rf.c_name}, /* pointer to {mclass.intro_mmodule}:{mclass}:{mpropdef} */")
end
end
v.add_decl("\}")
v.add_decl("\};")
end
end
src/compiler/separate_compiler.nit:828,2--867,4
redef fun compile_class_vft(ccinfo, v)
do
var mclass = ccinfo.mclass
var mtype = ccinfo.mtype
var c_name = mclass.c_name
var is_dead = ccinfo.is_dead
var rta = runtime_type_analysis
# Build class vft
self.provide_declaration("class_{c_name}", "extern const struct class class_{c_name};")
v.add_decl("const struct class class_{c_name} = \{")
v.add_decl("{class_ids[mclass]},")
v.add_decl("\"{mclass.name}\", /* class_name_string */")
v.add_decl("{self.box_kind_of(mclass)}, /* box_kind */")
v.add_decl("{class_colors[mclass]},")
if not is_dead then
if build_class_vts_table(mclass) then
v.require_declaration("vts_table_{c_name}")
v.add_decl("&vts_table_{c_name},")
else
v.add_decl("NULL,")
end
v.add_decl("&type_table_{c_name},")
v.add_decl("\{")
var vft = self.method_tables.get_or_null(mclass)
if vft != null then for i in [0 .. vft.length[ do
var mpropdef = vft[i]
if mpropdef == null then
v.add_decl("NULL, /* empty */")
else
assert mpropdef isa MMethodDef
if rta != null and not rta.live_methoddefs.has(mpropdef) then
v.add_decl("NULL, /* DEAD {mclass.intro_mmodule}:{mclass}:{mpropdef} */")
continue
end
var rf = mpropdef.virtual_runtime_function
v.require_declaration(rf.c_name)
v.add_decl("(nitmethod_t){rf.c_name}, /* pointer to {mpropdef.full_name} */")
end
end
v.add_decl("\}")
end
v.add_decl("\};")
end
src/compiler/separate_erasure_compiler.nit:307,2--351,4