nitc/ffi: adds a variable to know if a module uses the native interface
authorAlexis Laferrière <alexis.laf@xymus.net>
Wed, 6 Feb 2013 13:03:05 +0000 (08:03 -0500)
committerAlexis Laferrière <alexis.laf@xymus.net>
Wed, 6 Feb 2013 23:09:29 +0000 (18:09 -0500)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

src/metamodel/abstractmetamodel.nit
src/syntax/extern_inline.nit

index 71e9097..37f9472 100644 (file)
@@ -159,6 +159,9 @@ abstract class MMModule
        # extern class declaration
        var is_extern_hybrid : Bool writable = false
 
+       # Uses foreign function interface
+       fun uses_ffi : Bool is abstract
+
        protected init(name: Symbol, dir: MMDirectory, context: MMContext, loc: Location)
        do
                _name = name
index d2ee779..f0380d2 100644 (file)
@@ -31,6 +31,7 @@ end
 redef class MMModule
        # extern code blocks in module
        var extern_code_blocks : Set[ExternCode] = new HashSet[ExternCode]
+       redef var uses_ffi : Bool = false
 end
 
 redef class MMLocalClass
@@ -77,6 +78,7 @@ redef class AExternPropdef
                                        "Cannot implement the non extern method {method.full_name} with extern code" )
                        else
                                method.extern_implementation = n_extern_code_block.to_extern_code
+                               method.mmmodule.uses_ffi = true
                        end
                end
        end
@@ -95,6 +97,7 @@ redef class AStdClassdef
                                        "Cannot define an extern equivalent in the non extern class {local_class.name}" )
                        else
                                local_class.extern_type = extern_code_block.to_extern_code
+                               local_class.mmmodule.uses_ffi = true
                        end
                end
        end
@@ -108,6 +111,7 @@ redef class MMSrcModule
                super
 
                # extern code blocks
+               if not node.n_extern_code_blocks.is_empty then uses_ffi = true
                for n_extern_code_block in node.n_extern_code_blocks do
                        extern_code_blocks.add( n_extern_code_block.to_extern_code )
                end