Merge branch 'master' into polymorphic_extern_classes
authorAlexis Laferrière <alexis.laf@xymus.net>
Wed, 10 Sep 2014 18:54:40 +0000 (14:54 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Wed, 10 Sep 2014 18:54:40 +0000 (14:54 -0400)
1  2 
lib/pnacl.nit
src/compiler/abstract_compiler.nit
src/compiler/compiler_ffi.nit
src/compiler/global_compiler.nit
src/compiler/separate_compiler.nit
src/compiler/separate_erasure_compiler.nit
src/model/model.nit
src/nit.nit
src/rapid_type_analysis.nit

diff --cc lib/pnacl.nit
  # Provides PNaCl support for Nit.
  module pnacl is platform
  
+ import standard
+ intrude import standard::stream
 -`{
 -      #include <unistd.h>
 -      #include <stddef.h>
 -      #include <stdio.h>
 -      #include <string.h>
 -      #include <stdlib.h>
 -      #include <pthread.h>
 +in "C Header" `{
        #include "ppapi/c/pp_errors.h"
        #include "ppapi/c/ppp.h"
        #include "ppapi/c/ppp_instance.h"
@@@ -2186,21 -2169,25 +2200,26 @@@ redef class AMethPropde
                        v.add("{externname}({arguments.join(", ")});")
                else
                        v.add("{res} = {externname}({arguments.join(", ")});")
 +                      res = v.box_extern(res, ret.as(not null))
                        v.ret(res)
                end
+               return true
        end
  
-       fun compile_externinit_to_c(v: AbstractCompilerVisitor, mpropdef: MMethodDef, arguments: Array[RuntimeVariable])
+       # Compile an extern factory
+       # Return `true` if the compilation was successful, `false` if a fall-back is needed
+       fun compile_externinit_to_c(v: AbstractCompilerVisitor, mpropdef: MMethodDef, arguments: Array[RuntimeVariable]): Bool
        do
                var externname
-               var nextern = self.n_extern
-               if nextern == null then
-                       v.add("PRINT_ERROR(\"NOT YET IMPLEMENTED nitni for {mpropdef} at {location.to_s}\\n\");")
-                       v.add("show_backtrace(1);")
-                       return
+               var at = self.get_single_annotation("extern", v.compiler.modelbuilder)
+               if at != null then
+                       externname = at.arg_as_string(v.compiler.modelbuilder)
+                       if externname == null then return false
+               else
+                       var nextern = self.n_extern
+                       if nextern == null then return false
+                       externname = nextern.text.substring(1, nextern.text.length-2)
                end
-               externname = nextern.text.substring(1, nextern.text.length-2)
                if location.file != null then
                        var file = location.file.filename
                        v.add_extern(file)
                arguments.shift
  
                v.add("{res} = {externname}({arguments.join(", ")});")
 +              res = v.box_extern(res, ret)
                v.ret(res)
+               return true
        end
  end
  
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc src/nit.nit
Simple merge
Simple merge