From 2877bde8a3d9af5f9d8da442d8da2769d50bf36c Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 3 Feb 2016 20:52:25 -0500 Subject: [PATCH] compiler: add a native implementation of NativeArray::memmove Signed-off-by: Jean Privat --- lib/core/collection/array.nit | 3 +-- src/compiler/global_compiler.nit | 5 +++++ src/compiler/separate_compiler.nit | 5 +++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/core/collection/array.nit b/lib/core/collection/array.nit index df7f5e7..8747c8b 100644 --- a/lib/core/collection/array.nit +++ b/lib/core/collection/array.nit @@ -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 diff --git a/src/compiler/global_compiler.nit b/src/compiler/global_compiler.nit index d2a8a0c..b0d5c27 100644 --- a/src/compiler/global_compiler.nit +++ b/src/compiler/global_compiler.nit @@ -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 diff --git a/src/compiler/separate_compiler.nit b/src/compiler/separate_compiler.nit index e67c199..267eae0 100644 --- a/src/compiler/separate_compiler.nit +++ b/src/compiler/separate_compiler.nit @@ -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 -- 1.7.9.5