GNU header update.
[cacao.git] / src / native / vm / VMSystem.c
index e4f34cf4bb9e04483c07496310d7ec3765ad492d..aead797c191892bd173479430b4627a163d38ecf 100644 (file)
-/* class: java/lang/System */
+/* native/vm/VMSystem.c - java/lang/VMSystem
 
-#if 0
-/*
- * Class:     java/lang/System
- * Method:    currentTimeMillis
- * Signature: ()J
- */
-JNIEXPORT s8 JNICALL Java_java_lang_VMSystem_currentTimeMillis ( JNIEnv *env )
-{
-       struct timeval tv;
+   Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
+   R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
+   C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
+   Institut f. Computersprachen - TU Wien
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA.
+
+   Contact: cacao@complang.tuwien.ac.at
+
+   Authors: Roman Obermaiser
+
+   Changes: Joseph Wenninger
+
+   $Id: VMSystem.c 1735 2004-12-07 14:33:27Z twisti $
+
+*/
+
+
+#include <string.h>
+#include <time.h>
+
+#include "native/jni.h"
+#include "native/native.h"
+#include "native/include/java_lang_Object.h"
+#include "toolbox/logging.h"
+#include "vm/exceptions.h"
+#include "vm/builtin.h"
 
-       (void) gettimeofday(&tv, NULL);
-       return ((s8) tv.tv_sec) * 1000 + tv.tv_usec / 1000;
-}
-#endif
 
 /*
  * Class:     java/lang/System
  * Method:    arraycopy
  * Signature: (Ljava/lang/Object;ILjava/lang/Object;II)V
  */
-/* XXX delete */
-#if 0
-JNIEXPORT void JNICALL Java_java_lang_VMSystem_arraycopy (JNIEnv *env, jclass clazz,struct java_lang_Object* source, s4 sp, struct java_lang_Object* dest, s4 dp, s4 len)
+JNIEXPORT void JNICALL Java_java_lang_VMSystem_arraycopy(JNIEnv *env, jclass clazz, java_lang_Object *source, s4 sp, java_lang_Object *dest, s4 dp, s4 len)
 {
        s4 i;
-       java_arrayheader *s = (java_arrayheader*) source;
-       java_arrayheader *d = (java_arrayheader*) dest;
-
-       printf("arraycopy: %p:%x->%p:%x||len=%d\n",source,sp,dest,dp,len);
-       fflush(stdout);
+       java_arrayheader *s = (java_arrayheader *) source;
+       java_arrayheader *d = (java_arrayheader *) dest;
+       arraydescriptor *sdesc;
+       arraydescriptor *ddesc;
 
+       /*      printf("arraycopy: %p:%x->%p:%x\n",source,sp,dest,dp);
+               fflush(stdout);*/
 
-       if (((s == NULL) || (d == NULL)) != 0) { 
-               exceptionptr = proto_java_lang_NullPointerException; 
-               return; 
-               }
-       log_text("Passed nullpointer check");
-       if (s->objheader.vftbl->class != class_array) {
-               exceptionptr = proto_java_lang_ArrayStoreException; 
-               return; 
-               }
-
-       log_text("Passed array storeexception");
-       if (((sp<0) | (sp+len > s->size) | (dp<0) | (dp+len > d->size)) != 0) {
-               exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException; 
+       if (!s || !d) { 
+               *exceptionptr = new_exception(string_java_lang_NullPointerException);
                return; 
-               }
+       }
 
-       log_text("Passed array out of bounds exception");
-       printf("ARRAY TYPE: %d\n",s->arraytype);
+       sdesc = s->objheader.vftbl->arraydesc;
+       ddesc = d->objheader.vftbl->arraydesc;
 
-       switch (s->arraytype) {
-       case ARRAYTYPE_BYTE:
-               if (s->objheader.vftbl != d->objheader.vftbl) {
-                       exceptionptr = proto_java_lang_ArrayStoreException; 
-                       return; 
-                       }
-               memmove(((java_bytearray*) d)->data + dp,
-                       ((java_bytearray*) s)->data + sp,
-                       (size_t) len);
-               return;
-       case ARRAYTYPE_BOOLEAN:
-               if (s->objheader.vftbl != d->objheader.vftbl) {
-                       exceptionptr = proto_java_lang_ArrayStoreException; 
-                       return; 
-                       }
-               memmove(((java_booleanarray*) d)->data + dp,
-                       ((java_booleanarray*) s)->data + sp,
-                       (size_t) len);
-               return;
-       case ARRAYTYPE_CHAR:
-               if (s->objheader.vftbl != d->objheader.vftbl) {
-                       exceptionptr = proto_java_lang_ArrayStoreException; 
-                       return; 
-                       }
-       printf("CHARARRAY:");
-       if (len>0) {
-               utf_display(utf_new_u2(((java_chararray*)d)->data+sp,len*sizeof(u2), 0));
+       if (!sdesc || !ddesc || (sdesc->arraytype != ddesc->arraytype)) {
+               *exceptionptr = new_exception(string_java_lang_ArrayStoreException);
+               return; 
        }
-       printf("\n");
-
-               memmove(((java_chararray*) d)->data + dp,
-                       ((java_chararray*) s)->data + sp,
-                       (size_t) len * sizeof(u2));
-               return;
-       case ARRAYTYPE_SHORT:
-               if (s->objheader.vftbl != d->objheader.vftbl) {
-                       exceptionptr = proto_java_lang_ArrayStoreException; 
-                       return; 
-                       }
-               memmove(((java_shortarray*) d)->data + dp,
-                       ((java_shortarray*) s)->data + sp,
-                       (size_t) len * sizeof(s2));
-               return;
-       case ARRAYTYPE_INT:
-               if (s->objheader.vftbl != d->objheader.vftbl) {
-                       exceptionptr = proto_java_lang_ArrayStoreException; 
-                       return; 
-                       }
-               memmove(((java_intarray*) d)->data + dp,
-                       ((java_intarray*) s)->data + sp,
-                       (size_t) len * sizeof(s4));
-               return;
-       case ARRAYTYPE_LONG:
-               if (s->objheader.vftbl != d->objheader.vftbl) {
-                       exceptionptr = proto_java_lang_ArrayStoreException; 
-                       return; 
-                       }
-               memmove(((java_longarray*) d)->data + dp,
-                       ((java_longarray*) s)->data + sp,
-                       (size_t) len * sizeof(s8));
-               return;
-       case ARRAYTYPE_FLOAT:
-               if (s->objheader.vftbl != d->objheader.vftbl) {
-                       exceptionptr = proto_java_lang_ArrayStoreException; 
-                       return; 
-                       }
-               memmove(((java_floatarray*) d)->data + dp,
-                       ((java_floatarray*) s)->data + sp,
-                       (size_t) len * sizeof(float));
-               return;
-       case ARRAYTYPE_DOUBLE:
-               if (s->objheader.vftbl != d->objheader.vftbl) {
-                       exceptionptr = proto_java_lang_ArrayStoreException; 
-                       return; 
-                       }
-               memmove(((java_doublearray*) d)->data + dp,
-                       ((java_doublearray*) s)->data + sp,
-                       (size_t) len * sizeof(double));
-               return;
-       case ARRAYTYPE_OBJECT:
-               {
-               java_objectarray *oas = (java_objectarray*) s;
-               java_objectarray *oad = (java_objectarray*) d;
 
-               if (d->objheader.vftbl->class != class_array) {
-                       exceptionptr = proto_java_lang_ArrayStoreException; 
-                       return; 
-                       }
-               if (s->arraytype != d->arraytype) {
-                       exceptionptr = proto_java_lang_ArrayStoreException; 
-                       return; 
-                       }
+       if ((len < 0) || (sp < 0) || (sp + len > s->size) || (dp < 0) || (dp + len > d->size)) {
+               *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+               return; 
+       }
 
-               if (dp<=sp) 
-                       for (i=0; i<len; i++) {
-                               java_objectheader *o = oas->data[sp+i];
-                               if (!builtin_canstore(oad, o)) {
-                                       exceptionptr = proto_java_lang_ArrayStoreException;
-                                       return;
-                                       }
-                               oad->data[dp+i] = o;
-                               }
-               else 
-                       for (i=len-1; i>=0; i--) {
-                               java_objectheader *o = oas->data[sp+i];
+       if (sdesc->componentvftbl == ddesc->componentvftbl) {
+               /* We copy primitive values or references of exactly the same type */
+               s4 dataoffset = sdesc->dataoffset;
+               s4 componentsize = sdesc->componentsize;
+               memmove(((u1 *) d) + dataoffset + componentsize * dp,
+                               ((u1 *) s) + dataoffset + componentsize * sp,
+                               (size_t) len * componentsize);
+
+       } else {
+               /* We copy references of different type */
+               java_objectarray *oas = (java_objectarray *) s;
+               java_objectarray *oad = (java_objectarray *) d;
+                
+               if (dp <= sp) {
+                       for (i = 0; i < len; i++) {
+                               java_objectheader *o = oas->data[sp + i];
                                if (!builtin_canstore(oad, o)) {
-                                       exceptionptr = proto_java_lang_ArrayStoreException;
+                                       *exceptionptr = new_exception(string_java_lang_ArrayStoreException);
                                        return;
-                                       }
-                               oad->data[dp+i] = o;
                                }
-               
-               }
-               break;
-       case ARRAYTYPE_ARRAY:
-               {
-               java_arrayarray *aas = (java_arrayarray*) s;
-               java_arrayarray *aad = (java_arrayarray*) d;
-
-               if (d->objheader.vftbl->class != class_array) {
-                       exceptionptr = proto_java_lang_ArrayStoreException; 
-                       return; 
-                       }
-               if (s->arraytype != d->arraytype) {
-                       exceptionptr = proto_java_lang_ArrayStoreException; 
-                       return; 
+                               oad->data[dp + i] = o;
                        }
 
-               if (dp<=sp) 
-                       for (i=0; i<len; i++) {
-                               java_arrayheader *o = aas->data[sp+i];
-                               if (!builtin_canstore( (java_objectarray*)aad, 
-                                       (java_objectheader*)o )) {
-                                       exceptionptr = proto_java_lang_ArrayStoreException;
-                                       return;
-                                       }
-                               aad->data[dp+i] = o;
-                               }
-               else
-                       for (i=len-1; i>=0; i--) {
-                               java_arrayheader *o = aas->data[sp+i];
-                               if (!builtin_canstore( (java_objectarray*)aad, 
-                                       (java_objectheader*)o )) {
-                                       exceptionptr = proto_java_lang_ArrayStoreException;
+               } else {
+                       /* XXX this does not completely obey the specification!
+                        * If an exception is thrown only the elements above
+                        * the current index have been copied. The
+                        * specification requires that only the elements
+                        * *below* the current index have been copied before
+                        * the throw.
+                        */
+                       for (i = len - 1; i >= 0; i--) {
+                               java_objectheader *o = oas->data[sp + i];
+                               if (!builtin_canstore(oad, o)) {
+                                       *exceptionptr = new_exception(string_java_lang_ArrayStoreException);
                                        return;
-                                       }
-                               aad->data[dp+i] = o;
                                }
-
+                               oad->data[dp + i] = o;
+                       }
                }
-               break;
-
-       default:
-               panic ("Unknown data type for arraycopy");
        }
 }
-#endif
-JNIEXPORT void JNICALL Java_java_lang_VMSystem_arraycopy (JNIEnv *env, jclass clazz,struct java_lang_Object* source, s4 sp, struct java_lang_Object* dest, s4 dp, s4 len)
-{
-       s4 i;
-       java_arrayheader *s = (java_arrayheader*) source;
-       java_arrayheader *d = (java_arrayheader*) dest;
-        arraydescriptor *sdesc;
-        arraydescriptor *ddesc;
-
-/*     printf("arraycopy: %p:%x->%p:%x\n",source,sp,dest,dp);
-       fflush(stdout);*/
-
-       if (!s || !d) { 
-            exceptionptr = proto_java_lang_NullPointerException; 
-            return; 
-        }
 
-        sdesc = s->objheader.vftbl->arraydesc;
-        ddesc = d->objheader.vftbl->arraydesc;
-
-        if (!sdesc || !ddesc || (sdesc->arraytype != ddesc->arraytype)) {
-            exceptionptr = proto_java_lang_ArrayStoreException; 
-            return; 
-        }
-
-       if ((len<0) || (sp<0) || (sp+len > s->size) || (dp<0) || (dp+len > d->size)) {
-            exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException; 
-            return; 
-        }
-
-        if (sdesc->componentvftbl == ddesc->componentvftbl) {
-            /* We copy primitive values or references of exactly the same type */
-            s4 dataoffset = sdesc->dataoffset;
-            s4 componentsize = sdesc->componentsize;
-            memmove(((u1*)d) + dataoffset + componentsize * dp,
-                    ((u1*)s) + dataoffset + componentsize * sp,
-                    (size_t) len * componentsize);
-        }
-        else {
-            /* We copy references of different type */
-            java_objectarray *oas = (java_objectarray*) s;
-            java_objectarray *oad = (java_objectarray*) d;
-                
-            if (dp<=sp) 
-                for (i=0; i<len; i++) {
-                    java_objectheader *o = oas->data[sp+i];
-                    if (!builtin_canstore(oad, o)) {
-                        exceptionptr = proto_java_lang_ArrayStoreException;
-                        return;
-                    }
-                    oad->data[dp+i] = o;
-                }
-            else
-                /* XXX this does not completely obey the specification!
-                 * If an exception is thrown only the elements above
-                 * the current index have been copied. The
-                 * specification requires that only the elements
-                 * *below* the current index have been copied before
-                 * the throw.
-                 */
-                for (i=len-1; i>=0; i--) {
-                    java_objectheader *o = oas->data[sp+i];
-                    if (!builtin_canstore(oad, o)) {
-                        exceptionptr = proto_java_lang_ArrayStoreException;
-                        return;
-                    }
-                    oad->data[dp+i] = o;
-                }
-        }
-}
-
-void attach_property (char *name, char *value)
-{
-       log_text("attach_property not supported");
-#if 0
-       if (activeprops >= MAXPROPS) panic ("Too many properties defined");
-       proplist[activeprops][0] = name;
-       proplist[activeprops][1] = value;
-       activeprops++;
-#endif
-}
 
 /*
  * Class:     java/lang/System
  * Method:    identityHashCode
  * Signature: (Ljava/lang/Object;)I
  */
-JNIEXPORT s4 JNICALL Java_java_lang_VMSystem_identityHashCode (JNIEnv *env , jclass clazz, struct java_lang_Object* par1)
+JNIEXPORT s4 JNICALL Java_java_lang_VMSystem_identityHashCode(JNIEnv *env, jclass clazz, java_lang_Object *par1)
 {
-       return ((char*) par1) - ((char*) 0);    
+       return ((char *) par1) - ((char *) 0);
 }
 
 
-
-
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */