Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- vm/jato.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 57 insertions(+), 3 deletions(-)
diff --git a/vm/jato.c b/vm/jato.c index c7c6e17..12badf2 100644 --- a/vm/jato.c +++ b/vm/jato.c @@ -86,10 +86,64 @@ static void __vm_native native_vmruntime_println(struct vm_object *message) free(cstr); } -static void __vm_native native_vmsystem_arraycopy(struct vm_object *src, int src_start, - struct vm_object *dest, int dest_start, int len) +static void __vm_native +native_vmsystem_arraycopy(struct vm_object *src, int src_start, + struct vm_object *dest, int dest_start, int len) { - NOT_IMPLEMENTED; + const struct vm_class *src_elem_class; + const struct vm_class *dest_elem_class; + enum vm_type elem_type; + int elem_size; + char *tmp; + int size; + + if (!src || !dest || !src->class || !dest->class) { + signal_new_exception("java.lang.NullPointerException", NULL); + goto throw; + } + + if (!vm_class_is_array_class(src->class) || + !vm_class_is_array_class(dest->class)) { + signal_new_exception("java.lang.ArrayStoreException", NULL); + goto throw; + } + + src_elem_class = vm_class_get_array_element_class(src->class); + dest_elem_class = vm_class_get_array_element_class(dest->class); + if (!src_elem_class || !dest_elem_class) { + signal_new_exception("java.lang.NullPointerException", NULL); + goto throw; + } + + elem_type = vm_class_get_storage_vmtype(src_elem_class); + if (elem_type != vm_class_get_storage_vmtype(dest_elem_class)) { + NOT_IMPLEMENTED; + return; + } + + if (len < 0 || + src_start < 0 || src_start + len > src->array_length || + dest_start < 0 || dest_start + len > dest->array_length) { + signal_new_exception("java.lang.ArrayIndexOutOfBoundsException", + NULL); + goto throw; + } + + elem_size = get_vmtype_size(elem_type); + size = len * elem_size; + tmp = malloc(size); + if (!tmp) { + NOT_IMPLEMENTED; + return; + } + + memcpy(tmp, src->fields + src_start * elem_size, size); + memcpy(dest->fields + dest_start * elem_size, tmp, size); + free(tmp); + + return; + throw: + throw_from_native(sizeof(int) * 3 + sizeof(struct vm_object*) * 2); } static int32_t __vm_native native_vmsystem_identityhashcode(struct vm_object *obj) -- 1.6.0.6 ------------------------------------------------------------------------------ _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel