From 997404079cb32c296d47017a50b4b5276c571fee Mon Sep 17 00:00:00 2001 From: bdemsky Date: Fri, 30 Jul 2010 00:23:48 +0000 Subject: [PATCH] arraycopy method --- Robust/src/ClassLibrary/System.java | 2 ++ Robust/src/Runtime/runtime.c | 44 +++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/Robust/src/ClassLibrary/System.java b/Robust/src/ClassLibrary/System.java index a0b847a8..249a09e4 100644 --- a/Robust/src/ClassLibrary/System.java +++ b/Robust/src/ClassLibrary/System.java @@ -77,4 +77,6 @@ public class System { public static native void flushToFile(int threadid); /* Only used for microbenchmark testing of SingleTM version */ + + public static native void arraycopy(Object src, int srcPos, Object dst, int destPos, int length); } diff --git a/Robust/src/Runtime/runtime.c b/Robust/src/Runtime/runtime.c index 3c6b3911..b6b4c88b 100644 --- a/Robust/src/Runtime/runtime.c +++ b/Robust/src/Runtime/runtime.c @@ -230,6 +230,50 @@ void CALL02(___System______deepArrayCopy____L___Object____L___Object___, struct } #endif +#ifdef D___System______arraycopy____L___Object____I_L___Object____I_I +void arraycopy(struct ___Object___ *src, int srcPos, struct ___Object___ *dst, int destPos, int length) { + int dsttype=((int *)dst)[0]; + int srctype=((int *)src)[0]; + + //not an array or type mismatch + if (dsttype___length___; + int srclength=aosrc->___length___; + + if (length<=0) + return; + if (srcPos+length>=srclength) + return; + if (dstPos+length>=dstlength) + return; + + unsigned INTPTR *pointer=pointerarray[srctype]; + if (pointer==0) { + int elementsize=classsize[srctype]; + int size=length*elementsize; + //primitives + memcpy(((char *)&aodst->___length___)+sizeof(int)+dstPos*elementsize, ((char *)&aosrc->___length___)+sizeof(int)+srcPos*elementsize, size); + } else { + //objects + int i; + for(i=0;i___length___)+sizeof(int)))[i+srcPos]; + int ptrtype=((int *)ptr)[0]; + //hit an object + ((struct ___Object___ **)(((char*) &aodst->___length___)+sizeof(int)))[i+dstPos]=ptr; + } + } +} + +void CALL35(___System______arraycopy____L___Object____I_L___Object____I_I, int ___srcPos___, int ___destPos___, int ___length___, struct ___Object___ * ___src___, int ___srcPos___, struct ___Object___ * ___dst___, int ___destPos___, int ___length___) { + arraycopy(VAR(___src___), int ___srcPos___, VAR(___dst___), int ___destPos___, int ___length___); +} +#endif + void CALL11(___System______exit____I,int ___status___, int ___status___) { #ifdef TRANSSTATS #ifndef RECOVERY -- 2.34.1