src/interpreter: Clean uses of recvval in interpreter
[nit.git] / src / interpreter / naive_interpreter.nit
index 0326544..c8fc863 100644 (file)
@@ -275,10 +275,21 @@ class NaiveInterpreter
        # Return a new native string initialized with `txt`
        fun native_string_instance(txt: String): Instance
        do
-               var val = new FlatBuffer.from(txt)
-               val.add('\0')
+               var instance = native_string_instance_len(txt.bytelen+1)
+               var val = instance.val
+               val[txt.bytelen] = 0u8
+               txt.to_cstring.copy_to(val, txt.bytelen, 0, 0)
+
+               return instance
+       end
+
+       # Return a new native string initialized of `length`
+       fun native_string_instance_len(length: Int): PrimitiveInstance[NativeString]
+       do
+               var val = new NativeString(length)
+
                var t = mainmodule.native_string_type
-               var instance = new PrimitiveInstance[Buffer](t, val)
+               var instance = new PrimitiveInstance[NativeString](t, val)
                init_instance_primitive(instance)
                return instance
        end
@@ -287,7 +298,7 @@ class NaiveInterpreter
        fun string_instance(txt: String): Instance
        do
                var nat = native_string_instance(txt)
-               var res = self.send(self.force_get_primitive_method("to_s_with_length", nat.mtype), [nat, self.int_instance(txt.length)])
+               var res = self.send(self.force_get_primitive_method("to_s_with_length", nat.mtype), [nat, self.int_instance(txt.bytelen)])
                assert res != null
                return res
        end
@@ -863,85 +874,85 @@ redef class AMethPropdef
                else if cname == "Int" then
                        var recvval = args[0].to_i
                        if pname == "unary -" then
-                               return v.int_instance(-args[0].to_i)
+                               return v.int_instance(-recvval)
                        else if pname == "unary +" then
                                return args[0]
                        else if pname == "+" then
-                               return v.int_instance(args[0].to_i + args[1].to_i)
+                               return v.int_instance(recvval + args[1].to_i)
                        else if pname == "-" then
-                               return v.int_instance(args[0].to_i - args[1].to_i)
+                               return v.int_instance(recvval - args[1].to_i)
                        else if pname == "*" then
-                               return v.int_instance(args[0].to_i * args[1].to_i)
+                               return v.int_instance(recvval * args[1].to_i)
                        else if pname == "%" then
-                               return v.int_instance(args[0].to_i % args[1].to_i)
+                               return v.int_instance(recvval % args[1].to_i)
                        else if pname == "/" then
-                               return v.int_instance(args[0].to_i / args[1].to_i)
+                               return v.int_instance(recvval / args[1].to_i)
                        else if pname == "<" then
-                               return v.bool_instance(args[0].to_i < args[1].to_i)
+                               return v.bool_instance(recvval < args[1].to_i)
                        else if pname == ">" then
-                               return v.bool_instance(args[0].to_i > args[1].to_i)
+                               return v.bool_instance(recvval > args[1].to_i)
                        else if pname == "<=" then
-                               return v.bool_instance(args[0].to_i <= args[1].to_i)
+                               return v.bool_instance(recvval <= args[1].to_i)
                        else if pname == ">=" then
-                               return v.bool_instance(args[0].to_i >= args[1].to_i)
+                               return v.bool_instance(recvval >= args[1].to_i)
                        else if pname == "<=>" then
-                               return v.int_instance(args[0].to_i <=> args[1].to_i)
+                               return v.int_instance(recvval <=> args[1].to_i)
                        else if pname == "ascii" then
-                               return v.char_instance(args[0].to_i.ascii)
+                               return v.char_instance(recvval.ascii)
                        else if pname == "to_f" then
-                               return v.float_instance(args[0].to_i.to_f)
+                               return v.float_instance(recvval.to_f)
                        else if pname == "to_b" then
-                               return v.byte_instance(args[0].to_i.to_b)
+                               return v.byte_instance(recvval.to_b)
                        else if pname == "lshift" then
-                               return v.int_instance(args[0].to_i.lshift(args[1].to_i))
+                               return v.int_instance(recvval.lshift(args[1].to_i))
                        else if pname == "rshift" then
-                               return v.int_instance(args[0].to_i.rshift(args[1].to_i))
+                               return v.int_instance(recvval.rshift(args[1].to_i))
                        else if pname == "rand" then
                                var res = recvval.rand
                                return v.int_instance(res)
                        else if pname == "bin_and" then
-                               return v.int_instance(args[0].to_i.bin_and(args[1].to_i))
+                               return v.int_instance(recvval.bin_and(args[1].to_i))
                        else if pname == "bin_or" then
-                               return v.int_instance(args[0].to_i.bin_or(args[1].to_i))
+                               return v.int_instance(recvval.bin_or(args[1].to_i))
                        else if pname == "bin_xor" then
-                               return v.int_instance(args[0].to_i.bin_xor(args[1].to_i))
+                               return v.int_instance(recvval.bin_xor(args[1].to_i))
                        else if pname == "bin_not" then
-                               return v.int_instance(args[0].to_i.bin_not)
+                               return v.int_instance(recvval.bin_not)
                        end
                else if cname == "Byte" then
                        var recvval = args[0].to_b
                        if pname == "unary -" then
-                               return v.byte_instance(-args[0].to_b)
+                               return v.byte_instance(-recvval)
                        else if pname == "unary +" then
                                return args[0]
                        else if pname == "+" then
-                               return v.byte_instance(args[0].to_b + args[1].to_b)
+                               return v.byte_instance(recvval + args[1].to_b)
                        else if pname == "-" then
-                               return v.byte_instance(args[0].to_b - args[1].to_b)
+                               return v.byte_instance(recvval - args[1].to_b)
                        else if pname == "*" then
-                               return v.byte_instance(args[0].to_b * args[1].to_b)
+                               return v.byte_instance(recvval * args[1].to_b)
                        else if pname == "%" then
-                               return v.byte_instance(args[0].to_b % args[1].to_b)
+                               return v.byte_instance(recvval % args[1].to_b)
                        else if pname == "/" then
-                               return v.byte_instance(args[0].to_b / args[1].to_b)
+                               return v.byte_instance(recvval / args[1].to_b)
                        else if pname == "<" then
-                               return v.bool_instance(args[0].to_b < args[1].to_b)
+                               return v.bool_instance(recvval < args[1].to_b)
                        else if pname == ">" then
-                               return v.bool_instance(args[0].to_b > args[1].to_b)
+                               return v.bool_instance(recvval > args[1].to_b)
                        else if pname == "<=" then
-                               return v.bool_instance(args[0].to_b <= args[1].to_b)
+                               return v.bool_instance(recvval <= args[1].to_b)
                        else if pname == ">=" then
-                               return v.bool_instance(args[0].to_b >= args[1].to_b)
+                               return v.bool_instance(recvval >= args[1].to_b)
                        else if pname == "<=>" then
-                               return v.int_instance(args[0].to_b <=> args[1].to_b)
+                               return v.int_instance(recvval <=> args[1].to_b)
                        else if pname == "to_f" then
-                               return v.float_instance(args[0].to_b.to_f)
+                               return v.float_instance(recvval.to_f)
                        else if pname == "to_i" then
-                               return v.int_instance(args[0].to_b.to_i)
+                               return v.int_instance(recvval.to_i)
                        else if pname == "lshift" then
-                               return v.byte_instance(args[0].to_b.lshift(args[1].to_i))
+                               return v.byte_instance(recvval.lshift(args[1].to_i))
                        else if pname == "rshift" then
-                               return v.byte_instance(args[0].to_b.rshift(args[1].to_i))
+                               return v.byte_instance(recvval.rshift(args[1].to_i))
                        else if pname == "byte_to_s_len" then
                                return v.int_instance(recvval.to_s.length)
                        end
@@ -1025,50 +1036,32 @@ redef class AMethPropdef
                        end
                else if cname == "NativeString" then
                        if pname == "new" then
-                               return v.native_string_instance("!" * args[1].to_i)
+                               return v.native_string_instance_len(args[1].to_i)
                        end
-                       var recvval = args.first.val.as(Buffer)
+                       var recvval = args.first.val.as(NativeString)
                        if pname == "[]" then
                                var arg1 = args[1].to_i
-                               if arg1 >= recvval.length or arg1 < 0 then
-                                       debug("Illegal access on {recvval} for element {arg1}/{recvval.length}")
-                               end
-                               return v.char_instance(recvval.chars[arg1])
+                               return v.byte_instance(recvval[arg1])
                        else if pname == "[]=" then
                                var arg1 = args[1].to_i
-                               if arg1 >= recvval.length or arg1 < 0 then
-                                       debug("Illegal access on {recvval} for element {arg1}/{recvval.length}")
-                               end
-                               recvval.chars[arg1] = args[2].val.as(Char)
+                               recvval[arg1] = args[2].val.as(Byte)
                                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(FlatBuffer)
+                               var destval = args[1].val.as(NativeString)
                                var lenval = args[2].to_i
                                var fromval = args[3].to_i
                                var toval = args[4].to_i
-                               if fromval < 0 then
-                                       debug("Illegal access on {recvval} for element {fromval}/{recvval.length}")
-                               end
-                               if fromval + lenval > recvval.length then
-                                       debug("Illegal access on {recvval} for element {fromval}+{lenval}/{recvval.length}")
-                               end
-                               if toval < 0 then
-                                       debug("Illegal access on {destval} for element {toval}/{destval.length}")
-                               end
-                               if toval + lenval > destval.length then
-                                       debug("Illegal access on {destval} for element {toval}+{lenval}/{destval.length}")
-                               end
-                               recvval.as(FlatBuffer).copy(fromval, lenval, destval, toval)
+                               recvval.copy_to(destval, lenval, fromval, toval)
                                return null
                        else if pname == "atoi" then
-                               return v.int_instance(recvval.to_i)
+                               return v.int_instance(recvval.atoi)
                        else if pname == "fast_cstring" then
-                               var ns = recvval.to_cstring.to_s.substring_from(args[1].to_i)
+                               var ns = recvval.to_s.substring_from(args[1].to_i)
                                return v.native_string_instance(ns)
                        end
                else if pname == "calloc_string" then
-                       return v.native_string_instance("!" * args[1].to_i)
+                       return v.native_string_instance_len(args[1].to_i)
                else if cname == "NativeArray" then
                        if pname == "new" then
                                var val = new Array[Instance].filled_with(v.null_instance, args[1].to_i)
@@ -1078,9 +1071,6 @@ redef class AMethPropdef
                        end
                        var recvval = args.first.val.as(Array[Instance])
                        if pname == "[]" then
-                               if args[1].to_i >= recvval.length or args[1].to_i < 0 then
-                                       debug("Illegal access on {recvval} for element {args[1].to_i}/{recvval.length}")
-                               end
                                return recvval[args[1].to_i]
                        else if pname == "[]=" then
                                recvval[args[1].to_i] = args[2]
@@ -1091,54 +1081,6 @@ redef class AMethPropdef
                                recvval.copy_to(0, args[2].to_i, args[1].val.as(Array[Instance]), 0)
                                return null
                        end
-               else if cname == "NativeFile" then
-                       if pname == "native_stdout" then
-                               var inst = new PrimitiveNativeFile.native_stdout
-                               var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
-                               v.init_instance_primitive(instance)
-                               return instance
-                       else if pname == "native_stdin" then
-                               var inst = new PrimitiveNativeFile.native_stdin
-                               var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
-                               v.init_instance_primitive(instance)
-                               return instance
-                       else if pname == "native_stderr" then
-                               var inst = new PrimitiveNativeFile.native_stderr
-                               var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
-                               v.init_instance_primitive(instance)
-                               return instance
-                       else if pname == "io_open_read" then
-                               var a1 = args[1].val.as(Buffer)
-                               var inst = new PrimitiveNativeFile.io_open_read(a1.to_s)
-                               var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
-                               v.init_instance_primitive(instance)
-                               return instance
-                       else if pname == "io_open_write" then
-                               var a1 = args[1].val.as(Buffer)
-                               var inst = new PrimitiveNativeFile.io_open_write(a1.to_s)
-                               var instance = new PrimitiveInstance[PrimitiveNativeFile](mpropdef.mclassdef.mclass.mclass_type, inst)
-                               v.init_instance_primitive(instance)
-                               return instance
-                       end
-                       var recvval = args.first.val
-                       if pname == "io_write" then
-                               var a1 = args[1].val.as(Buffer)
-                               return v.int_instance(recvval.as(PrimitiveNativeFile).io_write(a1.to_cstring, args[2].to_i))
-                       else if pname == "io_read" then
-                               var a1 = args[1].val.as(Buffer)
-                               var ns = new NativeString(a1.length)
-                               var len = recvval.as(PrimitiveNativeFile).io_read(ns, args[2].to_i)
-                               a1.clear
-                               a1.append(ns.to_s_with_length(len))
-                               return v.int_instance(len)
-                       else if pname == "flush" then
-                               recvval.as(PrimitiveNativeFile).flush
-                               return null
-                       else if pname == "io_close" then
-                               return v.int_instance(recvval.as(PrimitiveNativeFile).io_close)
-                       else if pname == "set_buffering_type" then
-                               return v.int_instance(recvval.as(PrimitiveNativeFile).set_buffering_type(args[1].to_i, args[2].to_i))
-                       end
                else if pname == "native_argc" then
                        return v.int_instance(v.arguments.length)
                else if pname == "native_argv" then
@@ -1573,17 +1515,12 @@ redef class AOrElseExpr
        end
 end
 
-redef class AIntExpr
-       redef fun expr(v)
-       do
-               return v.int_instance(self.value.as(not null))
-       end
-end
-
-redef class AByteExpr
+redef class AIntegerExpr
        redef fun expr(v)
        do
-               return v.byte_instance(self.value.as(not null))
+               if value isa Int then return v.int_instance(value.as(Int))
+               if value isa Byte then return v.byte_instance(value.as(Byte))
+               return null
        end
 end