nitmetrics: add inheritance metrics computation
[nit.git] / src / global_compiler.nit
index 9b5e3d6..df8be17 100644 (file)
@@ -133,9 +133,19 @@ redef class ModelBuilder
                end
                self.toolcontext.info("Total methods to compile to C: {compiler.visitors.length}", 2)
 
+               var time1 = get_time
+               self.toolcontext.info("*** END VISITING: {time1-time0} ***", 2)
+               write_and_make(compiler)
+       end
+
+       private fun write_and_make(compiler: GlobalCompiler)
+       do
+               var mainmodule = compiler.mainmodule
+
                # Generate the .h and .c files
                # A single C file regroups many compiled rumtime functions
                # Note that we do not try to be clever an a small change in a Nit source file may change the content of all the generated .c files
+               var time0 = get_time
 
                var outname = self.toolcontext.opt_output.value
                if outname == null then
@@ -206,7 +216,7 @@ redef class ModelBuilder
                        ofiles.add(o)
                end
                # Link edition
-               makefile.write("{outname}: {ofiles.join(" ")}\n\t$(CC) $(LDFLAGS) $(LDLIBS) -o {outname} {ofiles.join(" ")}\n\n")
+               makefile.write("{outname}: {ofiles.join(" ")}\n\t$(CC) $(LDFLAGS) -o {outname} {ofiles.join(" ")} $(LDLIBS)\n\n")
                # Clean
                makefile.write("clean:\n\trm {ofiles.join(" ")} 2>/dev/null\n\n")
                makefile.close
@@ -795,7 +805,7 @@ private class GlobalCompilerVisitor
        # Force to get the primitive property named `name' in the instance `recv' or abort
        fun get_property(name: String, recv: MType): MMethod
        do
-               return self.compiler.mainmodule.force_get_primitive_method(name, recv)
+               return self.compiler.modelbuilder.force_get_primitive_method(self.current_node.as(not null), name, recv, self.compiler.mainmodule)
        end
 
        # The current Frame
@@ -1138,6 +1148,21 @@ private class GlobalCompilerVisitor
                return res
        end
 
+       # Generate a monomorphic send for the method `m', the type `t' and the arguments `args'
+       fun monomorphic_send(m: MMethod, t: MType, args: Array[RuntimeVariable]): nullable RuntimeVariable
+       do
+               assert t isa MClassType
+               var propdefs = m.lookup_definitions(self.compiler.mainmodule, t)
+               if propdefs.length == 0 then
+                       abort
+               end
+               if propdefs.length > 1 then
+                       self.debug("NOT YET IMPLEMENTED conflict for {t}.{m}: {propdefs.join(" ")}. choose the first")
+               end
+               var propdef = propdefs.first
+               return self.call(propdef, t, args)
+       end
+
        fun check_valid_reciever(recvtype: MClassType)
        do
                if self.compiler.runtime_type_analysis.live_types.has(recvtype) or recvtype.mclass.name == "Object" then return
@@ -1184,7 +1209,11 @@ private class GlobalCompilerVisitor
                else
                        args = args.to_a
                end
-               assert args.length == m.msignature.arity + 1 # because of self
+               if args.length != m.msignature.arity + 1 then # because of self
+                       add("printf(\"NOT YET IMPLEMENTED: Invalid arity for {m}. {args.length} arguments given.\\n\"); exit(1);")
+                       debug("NOT YET IMPLEMENTED: Invalid arity for {m}. {args.length} arguments given.")
+                       return null
+               end
 
                args.first = recv
                var rm = new CustomizedRuntimeFunction(m, recvtype)
@@ -1817,7 +1846,7 @@ redef class AInternMethPropdef
                        end
                        return
                end
-               v.add("printf(\"NOT IMPLEMENTED {class_name}:{mpropdef} at {location.to_s}\\n\");")
+               v.add("printf(\"NOT YET IMPLEMENTED {class_name}:{mpropdef} at {location.to_s}\\n\");")
                debug("Not implemented {mpropdef}")
        end
 end
@@ -2451,6 +2480,7 @@ redef class ASuperExpr
                # FIXME: we do not want an ugly static call!
                var mpropdefs = mpropdef.mproperty.lookup_super_definitions(mpropdef.mclassdef.mmodule, mpropdef.mclassdef.bound_mtype)
                if mpropdefs.length != 1 then
+                       v.add("printf(\"NOT YET IMPLEMENTED {class_name} {mpropdef} at {location.to_s}\\n\");")
                        debug("MPRODFEFS for super {mpropdef} for {recv}: {mpropdefs.join(", ")}")
                end
                mpropdef = mpropdefs.first