1 /* src/native/vm/VMSystem.c - java/lang/VMSystem
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Roman Obermaiser
29 Changes: Joseph Wenninger
32 $Id: VMSystem.c 4125 2006-01-10 20:50:53Z twisti $
42 #include "native/jni.h"
43 #include "native/native.h"
44 #include "native/include/java_lang_Object.h"
45 #include "toolbox/logging.h"
46 #include "vm/builtin.h"
47 #include "vm/exceptions.h"
48 #include "vm/stringlocal.h"
52 * Class: java/lang/VMSystem
54 * Signature: (Ljava/lang/Object;ILjava/lang/Object;II)V
56 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)
60 arraydescriptor *sdesc;
61 arraydescriptor *ddesc;
64 s = (java_arrayheader *) source;
65 d = (java_arrayheader *) dest;
68 exceptions_throw_nullpointerexception();
72 sdesc = s->objheader.vftbl->arraydesc;
73 ddesc = d->objheader.vftbl->arraydesc;
75 if (!sdesc || !ddesc || (sdesc->arraytype != ddesc->arraytype)) {
76 *exceptionptr = new_arraystoreexception();
80 /* we try to throw exception with the same message as SUN does */
82 if ((len < 0) || (sp < 0) || (dp < 0) ||
83 (sp + len < 0) || (sp + len > s->size) ||
84 (dp + len < 0) || (dp + len > d->size)) {
85 exceptions_throw_arrayindexoutofboundsexception();
89 if (sdesc->componentvftbl == ddesc->componentvftbl) {
90 /* We copy primitive values or references of exactly the same type */
92 s4 dataoffset = sdesc->dataoffset;
93 s4 componentsize = sdesc->componentsize;
95 memmove(((u1 *) d) + dataoffset + componentsize * dp,
96 ((u1 *) s) + dataoffset + componentsize * sp,
97 (size_t) len * componentsize);
100 /* We copy references of different type */
102 java_objectarray *oas = (java_objectarray *) s;
103 java_objectarray *oad = (java_objectarray *) d;
106 for (i = 0; i < len; i++) {
107 java_objectheader *o = oas->data[sp + i];
108 if (!builtin_canstore(oad, o)) {
109 *exceptionptr = new_arraystoreexception();
112 oad->data[dp + i] = o;
116 /* XXX this does not completely obey the specification!
117 If an exception is thrown only the elements above the
118 current index have been copied. The specification
119 requires that only the elements *below* the current
120 index have been copied before the throw. */
122 for (i = len - 1; i >= 0; i--) {
123 java_objectheader *o = oas->data[sp + i];
125 if (!builtin_canstore(oad, o)) {
126 *exceptionptr = new_arraystoreexception();
130 oad->data[dp + i] = o;
138 * Class: java/lang/VMSystem
139 * Method: identityHashCode
140 * Signature: (Ljava/lang/Object;)I
142 JNIEXPORT s4 JNICALL Java_java_lang_VMSystem_identityHashCode(JNIEnv *env, jclass clazz, java_lang_Object *par1)
144 return ((char *) par1) - ((char *) 0);
149 * These are local overrides for various environment variables in Emacs.
150 * Please do not remove this and leave it at the end of the file, where
151 * Emacs will automagically detect them.
152 * ---------------------------------------------------------------------
155 * indent-tabs-mode: t