X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fnative%2Fvm%2FVMSystem.c;h=3808f3aa7d0408560d879401b61c80812c8b9a05;hb=ad92477479aeed17382996ab43a7ca0dfab2ba93;hp=85b4014d21064aaccf2080d5d5cc3d3ef8d2455e;hpb=9a71368bcb9f5e882127a6a542db1ca69d95821f;p=cacao.git diff --git a/src/native/vm/VMSystem.c b/src/native/vm/VMSystem.c index 85b4014d2..3808f3aa7 100644 --- a/src/native/vm/VMSystem.c +++ b/src/native/vm/VMSystem.c @@ -1,124 +1,147 @@ -/* class: java/lang/System */ +/* src/native/vm/VMSystem.c - java/lang/VMSystem + + Copyright (C) 1996-2005, 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + + Contact: cacao@cacaojvm.org + + Authors: Roman Obermaiser + + Changes: Joseph Wenninger + Christian Thalinger + + $Id: VMSystem.c 4357 2006-01-22 23:33:38Z twisti $ + +*/ #include -#include -#include "jni.h" -#include "builtin.h" -#include "native.h" -#include "toolbox/loging.h" -#include "java_lang_Object.h" +#include "config.h" +#include "vm/types.h" -#if 0 -/* - * Class: java/lang/System - * Method: currentTimeMillis - * Signature: ()J - */ -JNIEXPORT s8 JNICALL Java_java_lang_VMSystem_currentTimeMillis ( JNIEnv *env ) -{ - struct timeval tv; +#include "native/jni.h" +#include "native/native.h" +#include "native/include/java_lang_Object.h" +#include "toolbox/logging.h" +#include "vm/builtin.h" +#include "vm/exceptions.h" +#include "vm/stringlocal.h" - (void) gettimeofday(&tv, NULL); - return ((s8) tv.tv_sec) * 1000 + tv.tv_usec / 1000; -} -#endif /* - * Class: java/lang/System + * Class: java/lang/VMSystem * Method: arraycopy * Signature: (Ljava/lang/Object;ILjava/lang/Object;II)V */ -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; - arraydescriptor *sdesc; - arraydescriptor *ddesc; + java_arrayheader *s; + java_arrayheader *d; + arraydescriptor *sdesc; + arraydescriptor *ddesc; + s4 i; -/* printf("arraycopy: %p:%x->%p:%x\n",source,sp,dest,dp); - fflush(stdout);*/ + s = (java_arrayheader *) source; + d = (java_arrayheader *) dest; 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; + exceptions_throw_nullpointerexception(); + return; + } + + sdesc = s->objheader.vftbl->arraydesc; + ddesc = d->objheader.vftbl->arraydesc; + + if (!sdesc || !ddesc || (sdesc->arraytype != ddesc->arraytype)) { + *exceptionptr = new_arraystoreexception(); + return; + } + + /* we try to throw exception with the same message as SUN does */ + + if ((len < 0) || (sp < 0) || (dp < 0) || + (sp + len < 0) || (sp + len > s->size) || + (dp + len < 0) || (dp + len > d->size)) { + exceptions_throw_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; idata[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; - } - } + if (dp <= sp) { + for (i = 0; i < len; i++) { + java_objectheader *o = oas->data[sp + i]; + if (!builtin_canstore(oad, o)) { + *exceptionptr = new_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 = new_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 + * Class: java/lang/VMSystem * 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); }