rta: add_monomorphic_send mark the mproperty as live
[nit.git] / src / naive_interpreter.nit
index 016cdc8..4bd3267 100644 (file)
@@ -249,7 +249,7 @@ private class NaiveInterpreter
        # Return a new native string initialized with `txt`
        fun native_string_instance(txt: String): Instance
        do
-               var val = new Buffer.from(txt)
+               var val = new FlatBuffer.from(txt)
                val.add('\0')
                var ic = self.mainmodule.get_primitive_class("NativeString")
                return new PrimitiveInstance[Buffer](ic.mclass_type, val)
@@ -264,7 +264,7 @@ private class NaiveInterpreter
        # Return a stack stace. One line per function
        fun stack_trace: String
        do
-               var b = new Buffer
+               var b = new FlatBuffer
                b.append(",---- Stack trace -- - -  -\n")
                for f in frames do
                        b.append("| {f.mpropdef} ({f.current_node.location})\n")
@@ -623,10 +623,10 @@ redef class AConcreteMethPropdef
                        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.callsite(auto_super_init, args)
                        end
                end
 
@@ -716,6 +716,10 @@ redef class AInternMethPropdef
                                return v.char_instance(recv.succ)
                        else if pname == "prec" then
                                return v.char_instance(recv.prec)
+                       else if pname == "+" then
+                               return v.char_instance(recv + args[1].to_i)
+                       else if pname == "-" then
+                               return v.char_instance(recv - args[1].to_i)
                        else if pname == "<" then
                                return v.bool_instance(recv < args[1].val.as(Char))
                        else if pname == ">" then
@@ -767,7 +771,7 @@ redef class AInternMethPropdef
                                return null
                        else if pname == "copy_to" then
                                # sig= copy_to(dest: NativeString, length: Int, from: Int, to: Int)
-                               var destval = args[1].val.as(Buffer)
+                               var destval = args[1].val.as(FlatBuffer)
                                var lenval = args[2].to_i
                                var fromval = args[3].to_i
                                var toval = args[4].to_i
@@ -783,7 +787,7 @@ redef class AInternMethPropdef
                                if toval + lenval >= destval.length then
                                        debug("Illegal access on {destval} for element {toval}+{lenval}/{destval.length}")
                                end
-                               recvval.copy(fromval, lenval, destval, toval)
+                               recvval.as(FlatBuffer).copy(fromval, lenval, destval, toval)
                                return null
                        else if pname == "atoi" then
                                return v.int_instance(recvval.to_i)
@@ -870,12 +874,12 @@ redef class AExternMethPropdef
                        var recvval = args.first.val
                        if pname == "io_write" then
                                var a1 = args[1].val.as(Buffer)
-                               recvval.as(OStream).write(a1.substring(0, args[2].to_i))
+                               recvval.as(OStream).write(a1.substring(0, args[2].to_i).to_s)
                                return args[2]
                        else if pname == "io_read" then
                                var str = recvval.as(IStream).read(args[2].to_i)
                                var a1 = args[1].val.as(Buffer)
-                               new Buffer.from(str).copy(0, str.length, a1, 0)
+                               new FlatBuffer.from(str).copy(0, str.length, a1.as(FlatBuffer), 0)
                                return v.int_instance(str.length)
                        else if pname == "io_close" then
                                recvval.as(IOS).close
@@ -929,6 +933,14 @@ redef class AExternMethPropdef
                                return v.float_instance(args[0].to_f.pow(args[1].to_f))
                        else if pname == "rand" then
                                return v.float_instance(args[0].to_f.rand)
+                       else if pname == "abs" then
+                               return v.float_instance(args[0].to_f.abs)
+                       else if pname == "hypot_with" then
+                               return v.float_instance(args[0].to_f.hypot_with(args[1].to_f))
+                       else if pname == "is_nan" then
+                               return v.bool_instance(args[0].to_f.is_nan)
+                       else if pname == "is_inf_extern" then
+                               return v.bool_instance(args[0].to_f.is_inf != 0)
                        end
                else if pname == "native_argc" then
                        return v.int_instance(v.arguments.length)
@@ -1249,19 +1261,19 @@ redef class AForExpr
                if col.mtype isa MNullType then fatal(v, "Receiver is null")
 
                #self.debug("col {col}")
-               var iter = v.send(v.force_get_primitive_method("iterator", col.mtype), [col]).as(not null)
+               var iter = v.callsite(method_iterator, [col]).as(not null)
                #self.debug("iter {iter}")
                loop
-                       var isok = v.send(v.force_get_primitive_method("is_ok", iter.mtype), [iter]).as(not null)
+                       var isok = v.callsite(method_is_ok, [iter]).as(not null)
                        if not isok.is_true then return
                        if self.variables.length == 1 then
-                               var item = v.send(v.force_get_primitive_method("item", iter.mtype), [iter]).as(not null)
+                               var item = v.callsite(method_item, [iter]).as(not null)
                                #self.debug("item {item}")
                                v.frame.map[self.variables.first] = item
                        else if self.variables.length == 2 then
-                               var key = v.send(v.force_get_primitive_method("key", iter.mtype), [iter]).as(not null)
+                               var key = v.callsite(method_key, [iter]).as(not null)
                                v.frame.map[self.variables[0]] = key
-                               var item = v.send(v.force_get_primitive_method("item", iter.mtype), [iter]).as(not null)
+                               var item = v.callsite(method_item, [iter]).as(not null)
                                v.frame.map[self.variables[1]] = item
                        else
                                abort
@@ -1270,7 +1282,7 @@ redef class AForExpr
                        if v.is_break(self.escapemark) then return
                        v.is_continue(self.escapemark) # Clear the break
                        if v.is_escaping then return
-                       v.send(v.force_get_primitive_method("next", iter.mtype), [iter])
+                       v.callsite(method_next, [iter])
                end
        end
 end
@@ -1415,7 +1427,7 @@ redef class ACrangeExpr
                var mtype = v.unanchor_type(self.mtype.as(not null))
                var res = new MutableInstance(mtype)
                v.init_instance(res)
-               v.send(v.force_get_primitive_method("init", mtype), [res, e1, e2])
+               v.callsite(init_callsite, [res, e1, e2])
                return res
        end
 end
@@ -1430,7 +1442,7 @@ redef class AOrangeExpr
                var mtype = v.unanchor_type(self.mtype.as(not null))
                var res = new MutableInstance(mtype)
                v.init_instance(res)
-               v.send(v.force_get_primitive_method("without_last", mtype), [res, e1, e2])
+               v.callsite(init_callsite, [res, e1, e2])
                return res
        end
 end
@@ -1586,9 +1598,8 @@ redef class ASuperExpr
                end
 
                # stantard call-next-method
-               var mpropdef = v.frame.mpropdef
+               var mpropdef = self.mpropdef
                mpropdef = mpropdef.lookup_next_definition(v.mainmodule, recv.mtype)
-               assert mpropdef isa MMethodDef
                var res = v.call_without_varargs(mpropdef, args)
                return res
        end