Added setup files.
[nit.git] / src / compiler_ffi.nit
index adc3075..2ebf76d 100644 (file)
@@ -21,30 +21,30 @@ intrude import abstract_compiler
 intrude import common_ffi
 import nitni
 
-redef class AModule
+redef class MModule
        private var foreign_callbacks = new ForeignCallbackSet
        var nitni_ccu: nullable CCompilationUnit = null
 
-       redef var uses_legacy_ni: Bool = false
-
-       redef fun finalize_ffi(v: AbstractCompilerVisitor, modelbuilder: ModelBuilder)
+       private fun nmodule(v: AbstractCompilerVisitor): nullable AModule
        do
-               finalize_ffi_wrapper(v.compiler.modelbuilder.compile_dir, v.compiler.mainmodule)
-               for file in ffi_files do v.compiler.extern_bodies.add(file)
+               var m2n = v.compiler.modelbuilder.mmodule2nmodule
+               return m2n.get_or_null(self)
        end
 
-       fun ensure_compile_nitni_base(v: AbstractCompilerVisitor)
+       redef fun finalize_ffi(compiler: AbstractCompiler)
        do
-               if nitni_ccu != null then return
+               if not uses_ffi then return
 
-               nitni_ccu = new CCompilationUnit
-       end
+               var v = compiler.new_visitor
+               var n = nmodule(v)
+               if n == null then return
+               n.ensure_compile_ffi_wrapper
+               finalize_ffi_wrapper(v.compiler.modelbuilder.compile_dir, v.compiler.mainmodule)
+               for file in ffi_files do v.compiler.extern_bodies.add(file)
 
-       redef fun finalize_nitni(v: AbstractCompilerVisitor)
-       do
                ensure_compile_nitni_base(v)
 
-               nitni_ccu.header_c_types.add("#include \"{mmodule.name}._ffi.h\"\n")
+               nitni_ccu.header_c_types.add("#include \"{name}._ffi.h\"\n")
 
                nitni_ccu.write_as_nitni(self, v.compiler.modelbuilder.compile_dir)
 
@@ -53,6 +53,13 @@ redef class AModule
                end
        end
 
+       private fun ensure_compile_nitni_base(v: AbstractCompilerVisitor)
+       do
+               if nitni_ccu != null then return
+
+               nitni_ccu = new CCompilationUnit
+       end
+
        redef fun collect_linker_libs
        do
                var s = c_linker_options
@@ -62,10 +69,10 @@ redef class AModule
                return res
        end
 
-       var compiled_callbacks: Array[NitniCallback] = new Array[NitniCallback]
+       private var compiled_callbacks: Array[NitniCallback] = new Array[NitniCallback]
 
        # Returns true if callbacks has yet to be generated and register it as being generated
-       fun check_callback_compilation(cb: NitniCallback): Bool
+       private fun check_callback_compilation(cb: NitniCallback): Bool
        do
                var compiled = compiled_callbacks.has(cb)
                if not compiled then compiled_callbacks.add(cb)
@@ -73,11 +80,12 @@ redef class AModule
        end
 end
 
-redef class AExternPropdef
-       fun compile_ffi_support_to_c(v: AbstractCompilerVisitor)
+redef class AMethPropdef
+       private fun compile_ffi_support_to_c(v: AbstractCompilerVisitor)
        do
                var mmodule = mpropdef.mclassdef.mmodule
-               var amainmodule = v.compiler.modelbuilder.mmodule2nmodule[v.compiler.mainmodule]
+               var mainmodule = v.compiler.mainmodule
+               var amainmodule = v.compiler.modelbuilder.mmodule2nmodule[mainmodule]
                var amodule = v.compiler.modelbuilder.mmodule2nmodule[mmodule]
                var mclass_type = mpropdef.mclassdef.bound_mtype
 
@@ -86,54 +94,53 @@ redef class AExternPropdef
                v.declare_once("{csignature};")
 
                # FFI part
-               compile_ffi_method(amodule)
+               amodule.ensure_compile_ffi_wrapper
+               compile_ffi_method(mmodule)
+
+               assert self isa AExternPropdef
 
                # nitni - Compile missing callbacks
-               amodule.ensure_compile_nitni_base(v)
-               var ccu = amodule.nitni_ccu.as(not null)
+               mmodule.ensure_compile_nitni_base(v)
+               var ccu = mmodule.nitni_ccu.as(not null)
 
                for mtype in foreign_callbacks.types do
                        if not mtype.is_cprimitive then
                                mtype.compile_extern_type(v, ccu)
 
                                # has callbacks already been compiled? (this may very well happen with global compilation)
-                               if amodule.check_callback_compilation(mtype) then mtype.compile_extern_helper_functions(v, ccu)
+                               if mmodule.check_callback_compilation(mtype) then mtype.compile_extern_helper_functions(v, ccu)
                        end
                end
 
                # compile callbacks
-               for cb in foreign_callbacks.callbacks do if amainmodule.check_callback_compilation(cb) then
+               for cb in foreign_callbacks.callbacks do if mainmodule.check_callback_compilation(cb) then
                        cb.compile_extern_callback(v, ccu)
                end
 
-               for cb in foreign_callbacks.supers do if amainmodule.check_callback_compilation(cb) then
+               for cb in foreign_callbacks.supers do if mainmodule.check_callback_compilation(cb) then
                        cb.compile_extern_callback(v, ccu)
                end
 
-               for cb in foreign_callbacks.casts do if amainmodule.check_callback_compilation(cb) then
+               for cb in foreign_callbacks.casts do if mainmodule.check_callback_compilation(cb) then
                        cb.compile_extern_callbacks(v, ccu)
                end
 
                # manage nitni callback set
-               amodule.foreign_callbacks.join(foreign_callbacks)
+               mmodule.foreign_callbacks.join(foreign_callbacks)
        end
-end
 
-redef class AExternMethPropdef
-       redef fun compile_to_c(v, mpropdef, arguments)
+       redef fun compile_externmeth_to_c(v, mpropdef, arguments)
        do
                var mmodule = mpropdef.mclassdef.mmodule
-               var amodule = v.compiler.modelbuilder.mmodule2nmodule[mmodule]
 
                # if using the old native interface fallback on previous implementation
                var nextern = self.n_extern
                if nextern != null then
-                       amodule.uses_legacy_ni = true
                        super
                        return
                end
 
-               amodule.mmodule.uses_ffi = true
+               mmodule.uses_ffi = true
 
                var mclass_type = mpropdef.mclassdef.bound_mtype
 
@@ -184,23 +191,19 @@ redef class AExternMethPropdef
 
                compile_ffi_support_to_c(v)
        end
-end
 
-redef class AExternInitPropdef
-       redef fun compile_to_c(v, mpropdef, arguments)
+       redef fun compile_externinit_to_c(v, mpropdef, arguments)
        do
                var mmodule = mpropdef.mclassdef.mmodule
-               var amodule = v.compiler.modelbuilder.mmodule2nmodule[mmodule]
 
                # if using the old native interface fallback on previous implementation
                var nextern = self.n_extern
                if nextern != null then
-                       amodule.uses_legacy_ni = true
                        super
                        return
                end
 
-               amodule.mmodule.uses_ffi = true
+               mmodule.uses_ffi = true
 
                var mclass_type = mpropdef.mclassdef.bound_mtype
 
@@ -243,16 +246,16 @@ redef class AExternInitPropdef
 end
 
 redef class CCompilationUnit
-       fun write_as_nitni(amodule: AModule, compdir: String)
+       fun write_as_nitni(mmodule: MModule, compdir: String)
        do
-               var base_name = "{amodule.mmodule.name}._nitni"
+               var base_name = "{mmodule.name}._nitni"
 
                var h_file = "{base_name}.h"
-               write_header_to_file( amodule, "{compdir}/{h_file}", new Array[String],
-                       "{amodule.cname.to_s.to_upper}_NITG_NITNI_H")
+               write_header_to_file( mmodule, "{compdir}/{h_file}", new Array[String],
+                       "{mmodule.cname.to_s.to_upper}_NITG_NITNI_H")
 
                var c_file = "{base_name}.c"
-               write_body_to_file( amodule, "{compdir}/{c_file}", ["\"{h_file}\""] )
+               write_body_to_file( mmodule, "{compdir}/{c_file}", ["\"{h_file}\""] )
 
                files.add( "{compdir}/{c_file}" )
        end
@@ -284,7 +287,7 @@ redef class AbstractCompilerVisitor
 end
 
 redef class MType
-       fun compile_extern_type(v: AbstractCompilerVisitor, ccu: CCompilationUnit)
+       private fun compile_extern_type(v: AbstractCompilerVisitor, ccu: CCompilationUnit)
        do
                assert not is_cprimitive
 
@@ -295,7 +298,7 @@ redef class MType
                ccu.header_c_types.add("#endif\n")
        end
 
-       fun compile_extern_helper_functions(v: AbstractCompilerVisitor, ccu: CCompilationUnit)
+       private fun compile_extern_helper_functions(v: AbstractCompilerVisitor, ccu: CCompilationUnit)
        do
                # actually, we do not need to do anything when using the bohem garbage collector
 
@@ -346,7 +349,7 @@ redef class MNullableType
 end
 
 redef class MExplicitCall
-       fun compile_extern_callback(v: AbstractCompilerVisitor, ccu: CCompilationUnit)
+       private fun compile_extern_callback(v: AbstractCompilerVisitor, ccu: CCompilationUnit)
        do
                var mproperty = mproperty
                assert mproperty isa MMethod
@@ -407,7 +410,7 @@ redef class MExplicitCall
 end
 
 redef class MExplicitSuper
-       fun compile_extern_callback(v: AbstractCompilerVisitor, ccu: CCompilationUnit)
+       private fun compile_extern_callback(v: AbstractCompilerVisitor, ccu: CCompilationUnit)
        do
                var mproperty = from.mproperty
                assert mproperty isa MMethod
@@ -457,7 +460,7 @@ redef class MExplicitSuper
 end
 
 redef class MExplicitCast
-       fun compile_extern_callbacks(v: AbstractCompilerVisitor, ccu: CCompilationUnit)
+       private fun compile_extern_callbacks(v: AbstractCompilerVisitor, ccu: CCompilationUnit)
        do
                var from = from
                var to = to