compiler: add a native implementation of NativeArray::memmove
authorJean Privat <jean@pryen.org>
Thu, 4 Feb 2016 01:52:25 +0000 (20:52 -0500)
committerJean Privat <jean@pryen.org>
Thu, 4 Feb 2016 01:52:25 +0000 (20:52 -0500)
Signed-off-by: Jean Privat <jean@pryen.org>

lib/core/collection/array.nit
src/compiler/global_compiler.nit
src/compiler/separate_compiler.nit

index df7f5e7..8747c8b 100644 (file)
@@ -992,8 +992,7 @@ universal NativeArray[E]
        fun copy_to(dest: NativeArray[E], length: Int) is intern
 
        # Copy `length` items to `dest` starting from `dest`.
-       fun memmove(start: Int, length: Int, dest: NativeArray[E], dest_start: Int) do
-               # TODO native one
+       fun memmove(start: Int, length: Int, dest: NativeArray[E], dest_start: Int) is intern do
                if start < dest_start then
                        var i = length
                        while i > 0 do
index d2a8a0c..b0d5c27 100644 (file)
@@ -396,6 +396,11 @@ class GlobalCompilerVisitor
                        var recv1 = "((struct {arguments[1].mcasttype.c_name}*){arguments[1]})->values"
                        self.add("memmove({recv1},{recv},{arguments[2]}*sizeof({elttype.ctype}));")
                        return true
+               else if pname == "memmove" then
+                       # fun memmove(start: Int, length: Int, dest: NativeArray[E], dest_start: Int) is intern do
+                       var recv1 = "((struct {arguments[3].mcasttype.c_name}*){arguments[3]})->values"
+                       self.add("memmove({recv1}+{arguments[4]}, {recv}+{arguments[1]}, {arguments[2]}*sizeof({elttype.ctype}));")
+                       return true
                end
                return false
        end
index e67c199..267eae0 100644 (file)
@@ -2121,6 +2121,11 @@ class SeparateCompilerVisitor
                        var recv1 = "((struct instance_{nclass.c_name}*){arguments[1]})->values"
                        self.add("memmove({recv1}, {recv}, {arguments[2]}*sizeof({elttype.ctype}));")
                        return true
+               else if pname == "memmove" then
+                       # fun memmove(start: Int, length: Int, dest: NativeArray[E], dest_start: Int) is intern do
+                       var recv1 = "((struct instance_{nclass.c_name}*){arguments[3]})->values"
+                       self.add("memmove({recv1}+{arguments[4]}, {recv}+{arguments[1]}, {arguments[2]}*sizeof({elttype.ctype}));")
+                       return true
                end
                return false
        end