import auto_super_init
import frontend
import common_ffi
+import platform
# Add compiling options
redef class ToolContext
# Simple indirection to `Toolchain::write_and_make`
protected fun write_and_make(compiler: AbstractCompiler)
do
- var toolchain = new MakefileToolchain(toolcontext)
+ var platform = compiler.mainmodule.target_platform
+ var toolchain
+ if platform == null then
+ toolchain = new MakefileToolchain(toolcontext)
+ else
+ toolchain = platform.toolchain(toolcontext)
+ end
compile_dir = toolchain.compile_dir
toolchain.write_and_make compiler
end
end
-class MakefileToolchain
- # The list of directories to search for included C headers (-I for C compilers)
- # The list is initially set with :
- # * the toolcontext --cc-path option
- # * the NIT_CC_PATH environment variable
- # * some heuristics including the NIT_DIR environment variable and the progname of the process
- # Path can be added (or removed) by the client
- var cc_paths = new Array[String]
+redef class Platform
+ fun toolchain(toolcontext: ToolContext): Toolchain is abstract
+end
+
+class Toolchain
var toolcontext: ToolContext
fun compile_dir: String
return compile_dir
end
+ fun write_and_make(compiler: AbstractCompiler) is abstract
+end
+
+class MakefileToolchain
+ super Toolchain
+ # The list of directories to search for included C headers (-I for C compilers)
+ # The list is initially set with :
+ # * the toolcontext --cc-path option
+ # * the NIT_CC_PATH environment variable
+ # * some heuristics including the NIT_DIR environment variable and the progname of the process
+ # Path can be added (or removed) by the client
+ var cc_paths = new Array[String]
+
protected fun gather_cc_paths
do
# Look for the the Nit clib path
end
end
- fun write_and_make(compiler: AbstractCompiler)
+ redef fun write_and_make(compiler)
do
gather_cc_paths
nmodule.finalize_ffi(visitor, modelbuilder)
nmodule.finalize_nitni(visitor)
end
-
- # Does this compiler support the FFI?
- fun supports_ffi: Bool do return false
end
# A file unit (may be more than one file if
var args = [arguments.first]
for auto_super_init in auto_super_inits do
args.clear
- for i in [0..auto_super_init.intro.msignature.arity+1[ do
+ for i in [0..auto_super_init.msignature.arity+1[ do
args.add(arguments[i])
end
- v.send(auto_super_init, args)
+ v.compile_callsite(auto_super_init, args)
end
end
v.stmt(self.n_block)
end
# stantard call-next-method
- return v.supercall(v.frame.mpropdef.as(MMethodDef), recv.mtype.as(MClassType), args)
+ return v.supercall(mpropdef.as(not null), recv.mtype.as(MClassType), args)
end
end