nitlanguage
/
nit.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
nitg & lib: intro `Finalizable` to be called when an object is freed
[nit.git]
/
src
/
separate_compiler.nit
diff --git
a/src/separate_compiler.nit
b/src/separate_compiler.nit
index
bf3cb12
..
aab5468
100644
(file)
--- a/
src/separate_compiler.nit
+++ b/
src/separate_compiler.nit
@@
-107,6
+107,7
@@
redef class ModelBuilder
compiler.new_file("{mainmodule.name}.main")
compiler.compile_nitni_global_ref_functions
compiler.compile_main_function
compiler.new_file("{mainmodule.name}.main")
compiler.compile_nitni_global_ref_functions
compiler.compile_main_function
+ compiler.compile_finalizer_function
# compile methods
for m in mainmodule.in_importation.greaters do
# compile methods
for m in mainmodule.in_importation.greaters do
@@
-590,8
+591,7
@@
class SeparateCompiler
# resolution table (for receiver)
if is_live then
# resolution table (for receiver)
if is_live then
- var mclass_type = mtype
- if mclass_type isa MNullableType then mclass_type = mclass_type.mtype
+ var mclass_type = mtype.as_notnullable
assert mclass_type isa MClassType
if resolution_tables[mclass_type].is_empty then
v.add_decl("NULL, /*NO RESOLUTIONS*/")
assert mclass_type isa MClassType
if resolution_tables[mclass_type].is_empty then
v.add_decl("NULL, /*NO RESOLUTIONS*/")
@@
-624,12
+624,7
@@
class SeparateCompiler
fun compile_type_resolution_table(mtype: MType) do
fun compile_type_resolution_table(mtype: MType) do
- var mclass_type: MClassType
- if mtype isa MNullableType then
- mclass_type = mtype.mtype.as(MClassType)
- else
- mclass_type = mtype.as(MClassType)
- end
+ var mclass_type = mtype.as_notnullable.as(MClassType)
# extern const struct resolution_table_X resolution_table_X
self.provide_declaration("resolution_table_{mtype.c_name}", "extern const struct types resolution_table_{mtype.c_name};")
# extern const struct resolution_table_X resolution_table_X
self.provide_declaration("resolution_table_{mtype.c_name}", "extern const struct types resolution_table_{mtype.c_name};")
@@
-771,6
+766,7
@@
class SeparateCompiler
v.require_declaration("class_{c_name}")
v.add("{res}->class = &class_{c_name};")
self.generate_init_attr(v, res, mtype)
v.require_declaration("class_{c_name}")
v.add("{res}->class = &class_{c_name};")
self.generate_init_attr(v, res, mtype)
+ v.set_finalizer res
v.add("return {res};")
end
v.add("\}")
v.add("return {res};")
end
v.add("\}")
@@
-1585,8
+1581,7
@@
class SeparateCompilerVisitor
fun can_be_primitive(value: RuntimeVariable): Bool
do
fun can_be_primitive(value: RuntimeVariable): Bool
do
- var t = value.mcasttype
- if t isa MNullableType then t = t.mtype
+ var t = value.mcasttype.as_notnullable
if not t isa MClassType then return false
var k = t.mclass.kind
return k == interface_kind or t.ctype != "val*"
if not t isa MClassType then return false
var k = t.mclass.kind
return k == interface_kind or t.ctype != "val*"