50 |
* Signature: (Ljava/lang/Class;)Z |
* Signature: (Ljava/lang/Class;)Z |
51 |
*/ |
*/ |
52 |
JNIEXPORT jboolean JNICALL |
JNIEXPORT jboolean JNICALL |
53 |
Java_java_io_VMObjectStreamClass_hasClassInitializer(JNIEnv * env, |
Java_java_io_VMObjectStreamClass_hasClassInitializer (JNIEnv * env, |
54 |
jclass vmosklass |
jclass vmosklass |
55 |
__attribute__ ((__unused__)), |
__attribute__ ((__unused__)), jclass klass) |
|
jclass klass ) |
|
56 |
{ |
{ |
57 |
jmethodID mid = (*env)->GetStaticMethodID(env, klass, "<clinit>", "()V"); |
jmethodID mid = (*env)->GetStaticMethodID (env, klass, "<clinit>", "()V"); |
58 |
if (mid == NULL) |
if (mid == NULL) |
59 |
{ |
{ |
60 |
(*env)->ExceptionClear(env); |
(*env)->ExceptionClear (env); |
61 |
return JNI_FALSE; |
return JNI_FALSE; |
62 |
} |
} |
63 |
return JNI_TRUE; |
return JNI_TRUE; |
64 |
} |
} |
65 |
|
|
66 |
static void throwInternalError(JNIEnv *env) |
static void |
67 |
|
throwInternalError (JNIEnv * env) |
68 |
{ |
{ |
69 |
jclass internalErrorClass; |
jclass internalErrorClass; |
70 |
jthrowable previousException, newException; |
jthrowable previousException, newException; |
71 |
jmethodID initException, getMessageID, initCauseID; |
jmethodID initException, getMessageID, initCauseID; |
72 |
jstring message; |
jstring message; |
73 |
|
|
74 |
internalErrorClass = (*env)->FindClass(env, "java/lang/InternalError"); |
internalErrorClass = (*env)->FindClass (env, "java/lang/InternalError"); |
75 |
/** Just give up if this also fails. */ |
/** Just give up if this also fails. */ |
76 |
if (internalErrorClass == NULL) |
if (internalErrorClass == NULL) |
77 |
return; |
return; |
78 |
|
|
79 |
previousException = (*env)->ExceptionOccurred(env); |
previousException = (*env)->ExceptionOccurred (env); |
80 |
|
|
81 |
if (previousException == NULL) |
if (previousException == NULL) |
82 |
{ |
{ |
83 |
(*env)->ThrowNew(env, internalErrorClass, "Unknown error raised by the VM"); |
(*env)->ThrowNew (env, internalErrorClass, |
84 |
|
"Unknown error raised by the VM"); |
85 |
return; |
return; |
86 |
} |
} |
87 |
|
|
88 |
initException = (*env)->GetMethodID |
initException = (*env)->GetMethodID |
89 |
(env, internalErrorClass, "<init>", "(Ljava/lang/String;)V"); |
(env, internalErrorClass, "<init>", "(Ljava/lang/String;)V"); |
90 |
getMessageID = (*env)->GetMethodID |
getMessageID = (*env)->GetMethodID |
91 |
(env, (*env)->GetObjectClass(env, previousException), |
(env, (*env)->GetObjectClass (env, previousException), |
92 |
"getMessage", "()Ljava/lang/String;"); |
"getMessage", "()Ljava/lang/String;"); |
93 |
initCauseID = (*env)->GetMethodID |
initCauseID = (*env)->GetMethodID |
94 |
(env, internalErrorClass, "initCause", "(Ljava/lang/Throwable;)V"); |
(env, internalErrorClass, "initCause", "(Ljava/lang/Throwable;)V"); |
95 |
|
|
96 |
message = (*env)->CallObjectMethod(env, previousException, |
message = (*env)->CallObjectMethod (env, previousException, getMessageID); |
|
getMessageID); |
|
97 |
|
|
98 |
newException = (*env)->NewObject(env, internalErrorClass, initException, |
newException = (*env)->NewObject (env, internalErrorClass, initException, |
99 |
message); |
message); |
100 |
(*env)->CallVoidMethod(env, newException, initCauseID, |
(*env)->CallVoidMethod (env, newException, initCauseID, previousException); |
|
previousException); |
|
101 |
|
|
102 |
(*env)->ExceptionClear(env); |
(*env)->ExceptionClear (env); |
103 |
(*env)->Throw(env, newException); |
(*env)->Throw (env, newException); |
104 |
} |
} |
105 |
|
|
106 |
static jfieldID getFieldReference(JNIEnv *env, jobject field, |
static jfieldID |
107 |
const char *type) |
getFieldReference (JNIEnv * env, jobject field, const char *type) |
108 |
{ |
{ |
109 |
jclass classClass; |
jclass classClass; |
110 |
jclass fieldClass; |
jclass fieldClass; |
119 |
jstring tname; |
jstring tname; |
120 |
int i; |
int i; |
121 |
|
|
122 |
fieldClass = (*env)->GetObjectClass(env, field); |
fieldClass = (*env)->GetObjectClass (env, field); |
123 |
|
|
124 |
mid = (*env)->GetMethodID(env, fieldClass, "getName", "()Ljava/lang/String;"); |
mid = |
125 |
if (mid == NULL || (*env)->ExceptionOccurred(env) != NULL) |
(*env)->GetMethodID (env, fieldClass, "getName", "()Ljava/lang/String;"); |
126 |
|
if (mid == NULL || (*env)->ExceptionOccurred (env) != NULL) |
127 |
{ |
{ |
128 |
throwInternalError(env); |
throwInternalError (env); |
129 |
return NULL; |
return NULL; |
130 |
} |
} |
131 |
|
|
132 |
name = (*env)->CallObjectMethod(env, field, mid); |
name = (*env)->CallObjectMethod (env, field, mid); |
133 |
field_name = (*env)->GetStringUTFChars(env, name, NULL); |
field_name = (*env)->GetStringUTFChars (env, name, NULL); |
134 |
|
|
135 |
mid = (*env)->GetMethodID(env, fieldClass, |
mid = (*env)->GetMethodID (env, fieldClass, |
136 |
"getDeclaringClass", |
"getDeclaringClass", "()Ljava/lang/Class;"); |
137 |
"()Ljava/lang/Class;"); |
if (mid == NULL || (*env)->ExceptionOccurred (env) != NULL) |
|
if (mid == NULL || (*env)->ExceptionOccurred(env) != NULL) |
|
138 |
{ |
{ |
139 |
throwInternalError(env); |
throwInternalError (env); |
140 |
return NULL; |
return NULL; |
141 |
} |
} |
142 |
|
|
143 |
declaringClass = (*env)->CallObjectMethod(env, field, mid); |
declaringClass = (*env)->CallObjectMethod (env, field, mid); |
144 |
|
|
145 |
/* Do we need to find out the exact type descriptor of the field? */ |
/* Do we need to find out the exact type descriptor of the field? */ |
146 |
if (type == NULL) |
if (type == NULL) |
147 |
{ |
{ |
148 |
char *the_type; |
char *the_type; |
149 |
|
|
150 |
mid = (*env)->GetMethodID(env, fieldClass, |
mid = (*env)->GetMethodID (env, fieldClass, |
151 |
"getType", |
"getType", "()Ljava/lang/Class;"); |
|
"()Ljava/lang/Class;"); |
|
152 |
|
|
153 |
if (mid == NULL || (*env)->ExceptionOccurred(env) != NULL) |
if (mid == NULL || (*env)->ExceptionOccurred (env) != NULL) |
154 |
{ |
{ |
155 |
throwInternalError(env); |
throwInternalError (env); |
156 |
return NULL; |
return NULL; |
157 |
} |
} |
158 |
|
|
159 |
typeClass = (*env)->CallObjectMethod(env, field, mid); |
typeClass = (*env)->CallObjectMethod (env, field, mid); |
160 |
classClass = (*env)->FindClass(env, "java/lang/Class"); |
classClass = (*env)->FindClass (env, "java/lang/Class"); |
161 |
|
|
162 |
mid = (*env)->GetMethodID(env, classClass, |
mid = (*env)->GetMethodID (env, classClass, |
163 |
"getName", |
"getName", "()Ljava/lang/String;"); |
|
"()Ljava/lang/String;"); |
|
164 |
|
|
165 |
if (mid == NULL || (*env)->ExceptionOccurred(env) != NULL) |
if (mid == NULL || (*env)->ExceptionOccurred (env) != NULL) |
166 |
{ |
{ |
167 |
throwInternalError(env); |
throwInternalError (env); |
168 |
return NULL; |
return NULL; |
169 |
} |
} |
170 |
|
|
171 |
tname = (*env)->CallObjectMethod(env, typeClass, mid); |
tname = (*env)->CallObjectMethod (env, typeClass, mid); |
172 |
type_name = (*env)->GetStringUTFChars(env, tname, NULL); |
type_name = (*env)->GetStringUTFChars (env, tname, NULL); |
173 |
|
|
174 |
/* |
/* |
175 |
* If it isn't an array class then the actual field type descriptor |
* If it isn't an array class then the actual field type descriptor |
176 |
* starts with 'L', ends with ';' and has '/' instead of '.'. |
* starts with 'L', ends with ';' and has '/' instead of '.'. |
177 |
*/ |
*/ |
178 |
type_len = strlen((char *) type_name); |
type_len = strlen ((char *) type_name); |
179 |
if (type_name[0] != '[') |
if (type_name[0] != '[') |
180 |
{ |
{ |
181 |
/* XXX - FIXME - should not use dynamic allocation in core lib. */ |
/* XXX - FIXME - should not use dynamic allocation in core lib. */ |
182 |
the_type = (char *) malloc(type_len + 3); |
the_type = (char *) malloc (type_len + 3); |
183 |
the_type[0] = 'L'; |
the_type[0] = 'L'; |
184 |
the_type[type_len + 1] = ';'; |
the_type[type_len + 1] = ';'; |
185 |
the_type[type_len + 2] = '\0'; |
the_type[type_len + 2] = '\0'; |
188 |
else |
else |
189 |
{ |
{ |
190 |
/* XXX - FIXME - should not use dynamic allocation in core lib. */ |
/* XXX - FIXME - should not use dynamic allocation in core lib. */ |
191 |
the_type = (char *) malloc(type_len + 1); |
the_type = (char *) malloc (type_len + 1); |
192 |
the_type[type_len] = '\0'; |
the_type[type_len] = '\0'; |
193 |
} |
} |
194 |
|
|
195 |
for (i = 0; i < type_len; i++) |
for (i = 0; i < type_len; i++) |
196 |
if (type_name[i] == '.') |
if (type_name[i] == '.') |
197 |
the_type[i] = '/'; |
the_type[i] = '/'; |
198 |
else |
else |
199 |
the_type[i] = type_name[i]; |
the_type[i] = type_name[i]; |
200 |
|
|
201 |
if (type_name[0] != '[') |
if (type_name[0] != '[') |
202 |
the_type--; |
the_type--; |
203 |
|
|
204 |
(*env)->ReleaseStringUTFChars(env, tname, type_name); |
(*env)->ReleaseStringUTFChars (env, tname, type_name); |
205 |
fid = (*env)->GetFieldID(env, declaringClass, field_name, the_type); |
fid = (*env)->GetFieldID (env, declaringClass, field_name, the_type); |
206 |
free(the_type); |
free (the_type); |
207 |
} |
} |
208 |
else |
else |
209 |
{ |
{ |
210 |
type_len = -1; |
type_len = -1; |
211 |
fid = (*env)->GetFieldID(env, declaringClass, field_name, type); |
fid = (*env)->GetFieldID (env, declaringClass, field_name, type); |
212 |
} |
} |
213 |
|
|
214 |
if (fid == NULL) |
if (fid == NULL) |
215 |
{ |
{ |
216 |
throwInternalError(env); |
throwInternalError (env); |
217 |
return NULL; |
return NULL; |
218 |
} |
} |
219 |
(*env)->ReleaseStringUTFChars(env, name, field_name); |
(*env)->ReleaseStringUTFChars (env, name, field_name); |
220 |
|
|
221 |
return fid; |
return fid; |
222 |
} |
} |
227 |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;Z)V |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;Z)V |
228 |
*/ |
*/ |
229 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
230 |
Java_java_io_VMObjectStreamClass_setBooleanNative(JNIEnv * env, |
Java_java_io_VMObjectStreamClass_setBooleanNative (JNIEnv * env, |
231 |
jclass vmosklass |
jclass vmosklass |
232 |
__attribute__ ((__unused__)), |
__attribute__ ((__unused__)), jobject field, jobject object, jboolean value) |
|
jobject field, |
|
|
jobject object, |
|
|
jboolean value ) |
|
233 |
{ |
{ |
234 |
jfieldID fid = getFieldReference (env, field, "Z"); |
jfieldID fid = getFieldReference (env, field, "Z"); |
235 |
|
|
236 |
if (fid != NULL) |
if (fid != NULL) |
237 |
(*env)->SetBooleanField(env, object, fid, value); |
(*env)->SetBooleanField (env, object, fid, value); |
238 |
} |
} |
239 |
|
|
240 |
/* |
/* |
243 |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;C)V |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;C)V |
244 |
*/ |
*/ |
245 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
246 |
Java_java_io_VMObjectStreamClass_setCharNative(JNIEnv * env, |
Java_java_io_VMObjectStreamClass_setCharNative (JNIEnv * env, |
247 |
jclass vmosklass |
jclass vmosklass |
248 |
__attribute__ ((__unused__)), |
__attribute__ ((__unused__)), |
249 |
jobject field, |
jobject field, |
250 |
jobject object, |
jobject object, jchar value) |
|
jchar value ) |
|
251 |
{ |
{ |
252 |
jfieldID fid = getFieldReference (env, field, "C"); |
jfieldID fid = getFieldReference (env, field, "C"); |
253 |
|
|
254 |
if (fid != NULL) |
if (fid != NULL) |
255 |
(*env)->SetCharField(env, object, fid, value); |
(*env)->SetCharField (env, object, fid, value); |
256 |
} |
} |
257 |
|
|
258 |
/* |
/* |
261 |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;B)V |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;B)V |
262 |
*/ |
*/ |
263 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
264 |
Java_java_io_VMObjectStreamClass_setByteNative(JNIEnv * env, |
Java_java_io_VMObjectStreamClass_setByteNative (JNIEnv * env, |
265 |
jclass vmosklass |
jclass vmosklass |
266 |
__attribute__ ((__unused__)), |
__attribute__ ((__unused__)), |
267 |
jobject field, |
jobject field, |
268 |
jobject object, |
jobject object, jbyte value) |
|
jbyte value ) |
|
269 |
{ |
{ |
270 |
jfieldID fid = getFieldReference (env, field, "B"); |
jfieldID fid = getFieldReference (env, field, "B"); |
271 |
|
|
272 |
if (fid != NULL) |
if (fid != NULL) |
273 |
(*env)->SetByteField(env, object, fid, value); |
(*env)->SetByteField (env, object, fid, value); |
274 |
} |
} |
275 |
|
|
276 |
|
|
280 |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;S)V |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;S)V |
281 |
*/ |
*/ |
282 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
283 |
Java_java_io_VMObjectStreamClass_setShortNative(JNIEnv * env, |
Java_java_io_VMObjectStreamClass_setShortNative (JNIEnv * env, |
284 |
jclass vmosklass |
jclass vmosklass |
285 |
__attribute__ ((__unused__)), |
__attribute__ ((__unused__)), |
286 |
jobject field, |
jobject field, |
287 |
jobject object, |
jobject object, jshort value) |
|
jshort value ) |
|
288 |
{ |
{ |
289 |
jfieldID fid = getFieldReference (env, field, "S"); |
jfieldID fid = getFieldReference (env, field, "S"); |
290 |
|
|
291 |
if (fid != NULL) |
if (fid != NULL) |
292 |
(*env)->SetShortField(env, object, fid, value); |
(*env)->SetShortField (env, object, fid, value); |
293 |
} |
} |
294 |
|
|
295 |
/* |
/* |
298 |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;I)V |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;I)V |
299 |
*/ |
*/ |
300 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
301 |
Java_java_io_VMObjectStreamClass_setIntNative(JNIEnv * env, |
Java_java_io_VMObjectStreamClass_setIntNative (JNIEnv * env, |
302 |
jclass vmosklass |
jclass vmosklass |
303 |
__attribute__ ((__unused__)), |
__attribute__ ((__unused__)), |
304 |
jobject field, |
jobject field, |
305 |
jobject object, |
jobject object, jint value) |
|
jint value ) |
|
306 |
{ |
{ |
307 |
jfieldID fid = getFieldReference (env, field, "I"); |
jfieldID fid = getFieldReference (env, field, "I"); |
308 |
|
|
309 |
if (fid != NULL) |
if (fid != NULL) |
310 |
(*env)->SetIntField(env, object, fid, value); |
(*env)->SetIntField (env, object, fid, value); |
311 |
} |
} |
312 |
|
|
313 |
|
|
317 |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;J)V |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;J)V |
318 |
*/ |
*/ |
319 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
320 |
Java_java_io_VMObjectStreamClass_setLongNative(JNIEnv * env, |
Java_java_io_VMObjectStreamClass_setLongNative (JNIEnv * env, |
321 |
jclass vmosklass |
jclass vmosklass |
322 |
__attribute__ ((__unused__)), |
__attribute__ ((__unused__)), |
323 |
jobject field, |
jobject field, |
324 |
jobject object, |
jobject object, jlong value) |
|
jlong value ) |
|
325 |
{ |
{ |
326 |
jfieldID fid = getFieldReference (env, field, "J"); |
jfieldID fid = getFieldReference (env, field, "J"); |
327 |
|
|
328 |
if (fid != NULL) |
if (fid != NULL) |
329 |
(*env)->SetLongField(env, object, fid, value); |
(*env)->SetLongField (env, object, fid, value); |
330 |
} |
} |
331 |
|
|
332 |
|
|
336 |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;F)V |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;F)V |
337 |
*/ |
*/ |
338 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
339 |
Java_java_io_VMObjectStreamClass_setFloatNative(JNIEnv * env, |
Java_java_io_VMObjectStreamClass_setFloatNative (JNIEnv * env, |
340 |
jclass vmosklass |
jclass vmosklass |
341 |
__attribute__ ((__unused__)), |
__attribute__ ((__unused__)), |
342 |
jobject field, |
jobject field, |
343 |
jobject object, |
jobject object, jfloat value) |
|
jfloat value ) |
|
344 |
{ |
{ |
345 |
jfieldID fid = getFieldReference (env, field, "F"); |
jfieldID fid = getFieldReference (env, field, "F"); |
346 |
|
|
347 |
if (fid != NULL) |
if (fid != NULL) |
348 |
(*env)->SetFloatField(env, object, fid, value); |
(*env)->SetFloatField (env, object, fid, value); |
349 |
} |
} |
350 |
|
|
351 |
/* |
/* |
354 |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;D)V |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;D)V |
355 |
*/ |
*/ |
356 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
357 |
Java_java_io_VMObjectStreamClass_setDoubleNative(JNIEnv * env, |
Java_java_io_VMObjectStreamClass_setDoubleNative (JNIEnv * env, |
358 |
jclass vmosklass |
jclass vmosklass |
359 |
__attribute__ ((__unused__)), |
__attribute__ ((__unused__)), jobject field, jobject object, jdouble value) |
|
jobject field, |
|
|
jobject object, |
|
|
jdouble value ) |
|
360 |
{ |
{ |
361 |
jfieldID fid = getFieldReference (env, field, "D"); |
jfieldID fid = getFieldReference (env, field, "D"); |
362 |
|
|
363 |
if (fid != NULL) |
if (fid != NULL) |
364 |
(*env)->SetDoubleField(env, object, fid, value); |
(*env)->SetDoubleField (env, object, fid, value); |
365 |
} |
} |
366 |
|
|
367 |
/* |
/* |
370 |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;Ljava/lang/Object;)V |
* Signature: (Ljava/lang/reflect/Field;Ljava/lang/Object;Ljava/lang/Object;)V |
371 |
*/ |
*/ |
372 |
JNIEXPORT void JNICALL |
JNIEXPORT void JNICALL |
373 |
Java_java_io_VMObjectStreamClass_setObjectNative(JNIEnv * env, |
Java_java_io_VMObjectStreamClass_setObjectNative (JNIEnv * env, |
374 |
jclass vmosklass |
jclass vmosklass |
375 |
__attribute__ ((__unused__)), |
__attribute__ ((__unused__)), jobject field, jobject object, jobject value) |
|
jobject field, |
|
|
jobject object, |
|
|
jobject value ) |
|
376 |
{ |
{ |
377 |
jfieldID fid = getFieldReference (env, field, NULL); |
jfieldID fid = getFieldReference (env, field, NULL); |
378 |
|
|
379 |
if (fid != NULL) |
if (fid != NULL) |
380 |
(*env)->SetObjectField(env, object, fid, value); |
(*env)->SetObjectField (env, object, fid, value); |
381 |
} |
} |