From: Alexis Laferrière Date: Wed, 10 Sep 2014 18:54:40 +0000 (-0400) Subject: Merge branch 'master' into polymorphic_extern_classes X-Git-Tag: v0.6.9~38^2~1 X-Git-Url: http://nitlanguage.org Merge branch 'master' into polymorphic_extern_classes --- d4deccd097182290483cc0c7bc69f3ff32cfb6b0 diff --cc lib/pnacl.nit index b997c3f,a76784e..bc876c0 --- a/lib/pnacl.nit +++ b/lib/pnacl.nit @@@ -24,7 -24,16 +24,10 @@@ # Provides PNaCl support for Nit. module pnacl is platform + import standard + intrude import standard::stream + -`{ - #include - #include - #include - #include - #include - #include +in "C Header" `{ #include "ppapi/c/pp_errors.h" #include "ppapi/c/ppp.h" #include "ppapi/c/ppp_instance.h" diff --cc src/compiler/abstract_compiler.nit index 9e67eae,a4c55f8..ef02aec --- a/src/compiler/abstract_compiler.nit +++ b/src/compiler/abstract_compiler.nit @@@ -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) @@@ -2213,8 -2199,8 +2232,9 @@@ arguments.shift v.add("{res} = {externname}({arguments.join(", ")});") + res = v.box_extern(res, ret) v.ret(res) + return true end end