model: make autoinit the main construction mechanism
[nit.git] / src / vm / vm_optimizations.nit
index 8c024f8..3fe9672 100644 (file)
@@ -24,28 +24,7 @@ redef class VirtualMachine
        # Add optimization of the method dispatch
        redef fun callsite(callsite: nullable CallSite, arguments: Array[Instance]): nullable Instance
        do
-               var initializers = callsite.mpropdef.initializers
-               if initializers.is_empty then return send_optimize(callsite.as(not null), arguments)
-
-               var recv = arguments.first
-               var i = 1
-               for p in initializers do
-                       if p isa MMethod then
-                               var args = [recv]
-                               for x in p.intro.msignature.mparameters do
-                                       args.add arguments[i]
-                                       i += 1
-                               end
-                               self.send(p, args)
-                       else if p isa MAttribute then
-                               assert recv isa MutableInstance
-                               write_attribute(p, recv, arguments[i])
-                               i += 1
-                       else abort
-               end
-               assert i == arguments.length
-
-               return send_optimize(callsite.as(not null), [recv])
+               return send_optimize(callsite.as(not null), arguments)
        end
 
        # Try to have the most efficient implementation of the method dispatch
@@ -232,7 +211,7 @@ redef class AIsaExpr
                var recv = v.expr(self.n_expr)
                if recv == null then return null
 
-               if status == 0 then optimize(v, recv.mtype, self.cast_type.as(not null))
+               optimize(v, recv.mtype, self.cast_type.as(not null))
                var mtype = v.unanchor_type(self.cast_type.as(not null))
 
                # If this test can be optimized, directly call appropriate subtyping methods
@@ -258,10 +237,19 @@ redef class AIsaExpr
                        return
                end
 
-               if not target.mclass.loaded then return
+               if not target.mclass.abstract_loaded then return
 
-               # We use perfect hashing
-               status = 2
+               # If the value is positive, the target class has an invariant position in source's structures
+               var value = source.mclass.get_position_methods(target.mclass)
+
+               if value > 0 then
+                       # `value - 2` is the position of the target identifier in source vtable
+                       position = value - 2
+                       status = 1
+               else
+                       # We use perfect hashing
+                       status = 2
+               end
                id = target.mclass.vtable.id
        end
 end
@@ -288,7 +276,7 @@ redef class AAsCastExpr
                var recv = v.expr(self.n_expr)
                if recv == null then return null
 
-               if status == 0 then optimize(v, recv.mtype, self.mtype.as(not null))
+               optimize(v, recv.mtype, self.mtype.as(not null))
 
                var mtype = self.mtype.as(not null)
                var amtype = v.unanchor_type(mtype)
@@ -323,11 +311,17 @@ redef class AAsCastExpr
 
                if not target.mclass.loaded then return
 
-               # Try to get the position of the target type in source's structures
-               var value = source.mclass.positions_methods.get_or_null(target.mclass)
+               # If the value is positive, the target class has an invariant position in source's structures
+               var value = source.mclass.get_position_methods(target.mclass)
 
-               # We use perfect hashing
-               status = 2
+               if value > 0 then
+                       # `value - 2` is the position of the target identifier in source vtable
+                       position = value - 2
+                       status = 1
+               else
+                       # We use perfect hashing
+                       status = 2
+               end
                id = target.mclass.vtable.id
        end
 end