add native copy method
authorbdemsky <bdemsky>
Thu, 2 Jul 2009 04:07:34 +0000 (04:07 +0000)
committerbdemsky <bdemsky>
Thu, 2 Jul 2009 04:07:34 +0000 (04:07 +0000)
Robust/src/ClassLibrary/System.java
Robust/src/Runtime/runtime.c

index ef6caa03f8f05bfb2cd86f79280c6513c75b0c10..1aa3d0898cd5dd1f0930b0796b7f579cc4650177 100644 (file)
@@ -52,4 +52,6 @@ public class System {
 
   public static native void rangePrefetch(Object o, short[] offsets);
 
+  public static native void deepArrayCopy(Object dst, Object src);
+
 }
index c175242faf4de4d6beb6b940a4b3cfcf725f36b2..e7de7f78e512104dd0c2885204db17a6e5d1f445 100644 (file)
@@ -140,6 +140,45 @@ int CALL12(___String______convertdoubletochar____D__AR_C, double ___val___, doub
   return num;
 }
 #endif
+#ifdef D___System______deepArrayCopy____L___Object____L___Object___
+void deepArrayCopy(struct ___Object___ * dst, struct ___Object___ * src) {
+  int dsttype=((int *)dst)[0];
+  int srctype=((int *)src)[0];
+  if (dsttype<NUMCLASSES||srctype<NUMCLASSES||srctype!=dsttype)
+    return;
+  struct ArrayObject *aodst=(struct ArrayObject *)dst;
+  struct ArrayObject *aosrc=(struct ArrayObject *)src;
+  int dstlength=aodst->___length___;
+  int srclength=aosrc->___length___;
+  if (dstlength!=srclength)
+    return;
+  unsigned INTPTR *pointer=pointerarray[srctype];
+  if (pointer==0) {
+    int elementsize=classsize[srctype];
+    int size=srclength*elementsize;
+    //primitives
+    memcpy(((char *)&aodst->___length___)+sizeof(int) , ((char *)&aosrc->___length___)+sizeof(int), size);
+  } else {
+    //objects
+    int i;
+    for(i=0;i<srclength;i++) {
+      struct ___Object___ * ptr=((struct ___Object___**)(((char*) &aosrc->___length___)+sizeof(int)))[i];
+      int ptrtype=((int *)ptr)[0];
+      if (ptrtype>=NUMCLASSES) {
+       struct ___Object___ * dstptr=((struct ___Object___**)(((char*) &aodst->___length___)+sizeof(int)))[i];
+       deepArrayCopy(dstptr,ptr);
+      } else {
+       //hit an object
+       ((struct ___Object___ **)(((char*) &aodst->___length___)+sizeof(int)))[i]=ptr;
+      }
+    }
+  }
+}
+
+void CALL02(___System______deepArrayCopy____L___Object____L___Object___, struct ___Object___ * ___dst___, struct ___Object___ * ___src___) {
+  deepArrayCopy(VAR(___dst___), VAR(___src___));
+}
+#endif
 
 void CALL11(___System______exit____I,int ___status___, int ___status___) {
 #ifdef TRANSSTATS