Property definitions

nitc $ SeparateCompiler :: compile_class_vft
	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

nitc $ SeparateErasureCompiler :: compile_class_vft
	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