Commit 278abd28 by Tom Tromey Committed by Tom Tromey

jni.cc (ThrowableClass): New define.

	* jni.cc (ThrowableClass): New define.
	(_Jv_JNI_Throw): Check argument.
	(_Jv_JNI_ThrowNew): Likewise.
	(wrap_value): Don't wrap object if it is NULL.
	(_Jv_JNI_DefineClass): Use wrap_value.
	(_Jv_JNI_FindClass): Likewise.
	(_Jv_JNI_GetSuperclass): Likewise.
	(_Jv_JNI_ExceptionOccurred): Likewise.
	(_Jv_JNI_AllocObject): Likewise.
	(_Jv_JNI_GetObjectClass): Likewise.
	(_Jv_JNI_NewString): Likewise.
	(_Jv_JNI_NewStringUTF): Likewise.
	(_Jv_JNI_NewObjectArray): Likewise.
	(_Jv_JNI_GetObjectArrayElement): Likewise.
	(_Jv_JNI_NewPrimitiveArray): Likewise.
	(_Jv_JNI_ToReflectedField): Likewise.
	(_Jv_JNI_ToReflectedMethod): Likewise.
	(_Jv_JNI_AllocObject): Check argument.
	(_Jv_JNI_NewObjectV): Likewise.
	(_Jv_JNI_NewObject): Likewise.
	(_Jv_JNI_NewObjectA): Likewise.
	(_Jv_JNI_GetObjectClass): Likewise.
	(_Jv_JNI_GetField): Likewise.
	(_Jv_JNI_SetField): Likewise.

From-SVN: r31845
parent 7c51d9fb
2000-02-07 Tom Tromey <tromey@cygnus.com> 2000-02-07 Tom Tromey <tromey@cygnus.com>
* jni.cc (ThrowableClass): New define.
(_Jv_JNI_Throw): Check argument.
(_Jv_JNI_ThrowNew): Likewise.
(wrap_value): Don't wrap object if it is NULL.
(_Jv_JNI_DefineClass): Use wrap_value.
(_Jv_JNI_FindClass): Likewise.
(_Jv_JNI_GetSuperclass): Likewise.
(_Jv_JNI_ExceptionOccurred): Likewise.
(_Jv_JNI_AllocObject): Likewise.
(_Jv_JNI_GetObjectClass): Likewise.
(_Jv_JNI_NewString): Likewise.
(_Jv_JNI_NewStringUTF): Likewise.
(_Jv_JNI_NewObjectArray): Likewise.
(_Jv_JNI_GetObjectArrayElement): Likewise.
(_Jv_JNI_NewPrimitiveArray): Likewise.
(_Jv_JNI_ToReflectedField): Likewise.
(_Jv_JNI_ToReflectedMethod): Likewise.
(_Jv_JNI_AllocObject): Check argument.
(_Jv_JNI_NewObjectV): Likewise.
(_Jv_JNI_NewObject): Likewise.
(_Jv_JNI_NewObjectA): Likewise.
(_Jv_JNI_GetObjectClass): Likewise.
(_Jv_JNI_GetField): Likewise.
(_Jv_JNI_SetField): Likewise.
* interpret.cc (PUSHL): Don't use expression statement. * interpret.cc (PUSHL): Don't use expression statement.
(PUSHD): Likewise. (PUSHD): Likewise.
(LOADL): Likewise. (LOADL): Likewise.
......
...@@ -47,6 +47,8 @@ extern java::lang::Class ClassClass; ...@@ -47,6 +47,8 @@ extern java::lang::Class ClassClass;
#define ObjectClass _CL_Q34java4lang6Object #define ObjectClass _CL_Q34java4lang6Object
extern java::lang::Class ObjectClass; extern java::lang::Class ObjectClass;
#define ThrowableClass _CL_Q34java4lang9Throwable
extern java::lang::Class ThrowableClass;
#define MethodClass _CL_Q44java4lang7reflect6Method #define MethodClass _CL_Q44java4lang7reflect6Method
extern java::lang::Class MethodClass; extern java::lang::Class MethodClass;
...@@ -278,7 +280,7 @@ template<> ...@@ -278,7 +280,7 @@ template<>
static jobject static jobject
wrap_value (JNIEnv *env, jobject value) wrap_value (JNIEnv *env, jobject value)
{ {
return _Jv_JNI_NewLocalRef (env, value); return value == NULL ? value : _Jv_JNI_NewLocalRef (env, value);
} }
...@@ -302,7 +304,7 @@ _Jv_JNI_DefineClass (JNIEnv *env, jobject loader, ...@@ -302,7 +304,7 @@ _Jv_JNI_DefineClass (JNIEnv *env, jobject loader,
// FIXME: exception processing. // FIXME: exception processing.
jclass result = l->defineClass (bytes, 0, bufLen); jclass result = l->defineClass (bytes, 0, bufLen);
return (jclass) _Jv_JNI_NewLocalRef (env, result); return (jclass) wrap_value (env, result);
} }
static jclass static jclass
...@@ -328,13 +330,13 @@ _Jv_JNI_FindClass (JNIEnv *env, const char *name) ...@@ -328,13 +330,13 @@ _Jv_JNI_FindClass (JNIEnv *env, const char *name)
// FIXME: exception processing. // FIXME: exception processing.
jclass r = loader->findClass (n); jclass r = loader->findClass (n);
return (jclass) _Jv_JNI_NewLocalRef (env, r); return (jclass) wrap_value (env, r);
} }
static jclass static jclass
_Jv_JNI_GetSuperclass (JNIEnv *env, jclass clazz) _Jv_JNI_GetSuperclass (JNIEnv *env, jclass clazz)
{ {
return (jclass) _Jv_JNI_NewLocalRef (env, clazz->getSuperclass ()); return (jclass) wrap_value (env, clazz->getSuperclass ());
} }
static jboolean static jboolean
...@@ -346,6 +348,8 @@ _Jv_JNI_IsAssignableFrom(JNIEnv *, jclass clazz1, jclass clazz2) ...@@ -346,6 +348,8 @@ _Jv_JNI_IsAssignableFrom(JNIEnv *, jclass clazz1, jclass clazz2)
static jint static jint
_Jv_JNI_Throw (JNIEnv *env, jthrowable obj) _Jv_JNI_Throw (JNIEnv *env, jthrowable obj)
{ {
// We check in case the user did some funky cast.
JvAssert (obj != NULL && (&ThrowableClass)->isInstance (obj));
env->ex = obj; env->ex = obj;
return 0; return 0;
} }
...@@ -355,6 +359,8 @@ _Jv_JNI_ThrowNew (JNIEnv *env, jclass clazz, const char *message) ...@@ -355,6 +359,8 @@ _Jv_JNI_ThrowNew (JNIEnv *env, jclass clazz, const char *message)
{ {
using namespace java::lang::reflect; using namespace java::lang::reflect;
JvAssert ((&ThrowableClass)->isAssignableFrom (clazz));
JArray<jclass> *argtypes JArray<jclass> *argtypes
= (JArray<jclass> *) JvNewObjectArray (1, &ClassClass, NULL); = (JArray<jclass> *) JvNewObjectArray (1, &ClassClass, NULL);
...@@ -378,7 +384,7 @@ _Jv_JNI_ThrowNew (JNIEnv *env, jclass clazz, const char *message) ...@@ -378,7 +384,7 @@ _Jv_JNI_ThrowNew (JNIEnv *env, jclass clazz, const char *message)
static jthrowable static jthrowable
_Jv_JNI_ExceptionOccurred (JNIEnv *env) _Jv_JNI_ExceptionOccurred (JNIEnv *env)
{ {
return (jthrowable) _Jv_JNI_NewLocalRef (env, env->ex); return (jthrowable) wrap_value (env, env->ex);
} }
static void static void
...@@ -419,6 +425,8 @@ _Jv_JNI_AllocObject (JNIEnv *env, jclass clazz) ...@@ -419,6 +425,8 @@ _Jv_JNI_AllocObject (JNIEnv *env, jclass clazz)
{ {
jobject obj = NULL; jobject obj = NULL;
using namespace java::lang::reflect; using namespace java::lang::reflect;
JvAssert (clazz && ! clazz->isArray ());
if (clazz->isInterface() || Modifier::isAbstract(clazz->getModifiers())) if (clazz->isInterface() || Modifier::isAbstract(clazz->getModifiers()))
env->ex = new java::lang::InstantiationException (); env->ex = new java::lang::InstantiationException ();
else else
...@@ -428,13 +436,14 @@ _Jv_JNI_AllocObject (JNIEnv *env, jclass clazz) ...@@ -428,13 +436,14 @@ _Jv_JNI_AllocObject (JNIEnv *env, jclass clazz)
obj = JvAllocObject (clazz); obj = JvAllocObject (clazz);
} }
return _Jv_JNI_NewLocalRef (env, obj); return wrap_value (env, obj);
} }
static jclass static jclass
_Jv_JNI_GetObjectClass (JNIEnv *env, jobject obj) _Jv_JNI_GetObjectClass (JNIEnv *env, jobject obj)
{ {
return (jclass) _Jv_JNI_NewLocalRef (env, obj->getClass()); JvAssert (obj);
return (jclass) wrap_value (env, obj->getClass());
} }
static jboolean static jboolean
...@@ -784,6 +793,9 @@ static jobject ...@@ -784,6 +793,9 @@ static jobject
_Jv_JNI_NewObjectV (JNIEnv *env, jclass klass, _Jv_JNI_NewObjectV (JNIEnv *env, jclass klass,
jmethodID id, va_list args) jmethodID id, va_list args)
{ {
JvAssert (klass && ! klass->isArray ());
JvAssert (! strcmp (id->name->data, "<init>")
&& ! strcmp (id->signature->data, "()V"));
return _Jv_JNI_CallAnyMethodV<jobject, constructor> (env, NULL, klass, return _Jv_JNI_CallAnyMethodV<jobject, constructor> (env, NULL, klass,
id, args); id, args);
} }
...@@ -791,6 +803,10 @@ _Jv_JNI_NewObjectV (JNIEnv *env, jclass klass, ...@@ -791,6 +803,10 @@ _Jv_JNI_NewObjectV (JNIEnv *env, jclass klass,
static jobject static jobject
_Jv_JNI_NewObject (JNIEnv *env, jclass klass, jmethodID id, ...) _Jv_JNI_NewObject (JNIEnv *env, jclass klass, jmethodID id, ...)
{ {
JvAssert (klass && ! klass->isArray ());
JvAssert (! strcmp (id->name->data, "<init>")
&& ! strcmp (id->signature->data, "()V"));
va_list args; va_list args;
jobject result; jobject result;
...@@ -806,6 +822,9 @@ static jobject ...@@ -806,6 +822,9 @@ static jobject
_Jv_JNI_NewObjectA (JNIEnv *env, jclass klass, jmethodID id, _Jv_JNI_NewObjectA (JNIEnv *env, jclass klass, jmethodID id,
jvalue *args) jvalue *args)
{ {
JvAssert (klass && ! klass->isArray ());
JvAssert (! strcmp (id->name->data, "<init>")
&& ! strcmp (id->signature->data, "()V"));
return _Jv_JNI_CallAnyMethodA<jobject, constructor> (env, NULL, klass, return _Jv_JNI_CallAnyMethodA<jobject, constructor> (env, NULL, klass,
id, args); id, args);
} }
...@@ -816,6 +835,7 @@ template<typename T> ...@@ -816,6 +835,7 @@ template<typename T>
static T static T
_Jv_JNI_GetField (JNIEnv *env, jobject obj, jfieldID field) _Jv_JNI_GetField (JNIEnv *env, jobject obj, jfieldID field)
{ {
JvAssert (obj);
T *ptr = (T *) ((char *) obj + field->getOffset ()); T *ptr = (T *) ((char *) obj + field->getOffset ());
return wrap_value (env, *ptr); return wrap_value (env, *ptr);
} }
...@@ -824,6 +844,7 @@ template<typename T> ...@@ -824,6 +844,7 @@ template<typename T>
static void static void
_Jv_JNI_SetField (JNIEnv *, jobject obj, jfieldID field, T value) _Jv_JNI_SetField (JNIEnv *, jobject obj, jfieldID field, T value)
{ {
JvAssert (obj);
T *ptr = (T *) ((char *) obj + field->getOffset ()); T *ptr = (T *) ((char *) obj + field->getOffset ());
*ptr = value; *ptr = value;
} }
...@@ -900,7 +921,7 @@ _Jv_JNI_NewString (JNIEnv *env, const jchar *unichars, jsize len) ...@@ -900,7 +921,7 @@ _Jv_JNI_NewString (JNIEnv *env, const jchar *unichars, jsize len)
{ {
// FIXME: exception processing. // FIXME: exception processing.
jstring r = _Jv_NewString (unichars, len); jstring r = _Jv_NewString (unichars, len);
return (jstring) _Jv_JNI_NewLocalRef (env, r); return (jstring) wrap_value (env, r);
} }
static jsize static jsize
...@@ -930,7 +951,7 @@ _Jv_JNI_NewStringUTF (JNIEnv *env, const char *bytes) ...@@ -930,7 +951,7 @@ _Jv_JNI_NewStringUTF (JNIEnv *env, const char *bytes)
{ {
// FIXME: exception processing. // FIXME: exception processing.
jstring result = JvNewStringUTF (bytes); jstring result = JvNewStringUTF (bytes);
return (jstring) _Jv_JNI_NewLocalRef (env, result); return (jstring) wrap_value (env, result);
} }
static jsize static jsize
...@@ -1010,14 +1031,14 @@ _Jv_JNI_NewObjectArray (JNIEnv *env, jsize length, jclass elementClass, ...@@ -1010,14 +1031,14 @@ _Jv_JNI_NewObjectArray (JNIEnv *env, jsize length, jclass elementClass,
{ {
// FIXME: exception processing. // FIXME: exception processing.
jarray result = JvNewObjectArray (length, elementClass, init); jarray result = JvNewObjectArray (length, elementClass, init);
return (jarray) _Jv_JNI_NewLocalRef (env, result); return (jarray) wrap_value (env, result);
} }
static jobject static jobject
_Jv_JNI_GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index) _Jv_JNI_GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index)
{ {
jobject *elts = elements (array); jobject *elts = elements (array);
return _Jv_JNI_NewLocalRef (env, elts[index]); return wrap_value (env, elts[index]);
} }
static void static void
...@@ -1035,8 +1056,7 @@ static JArray<T> * ...@@ -1035,8 +1056,7 @@ static JArray<T> *
_Jv_JNI_NewPrimitiveArray (JNIEnv *env, jsize length) _Jv_JNI_NewPrimitiveArray (JNIEnv *env, jsize length)
{ {
// FIXME: exception processing. // FIXME: exception processing.
return (JArray<T> *) _Jv_JNI_NewLocalRef (env, return (JArray<T> *) wrap_value (env, _Jv_NewPrimArray (K, length));
_Jv_NewPrimArray (K, length));
} }
template<typename T> template<typename T>
...@@ -1145,7 +1165,7 @@ _Jv_JNI_ToReflectedField (JNIEnv *env, jclass cls, jfieldID fieldID, ...@@ -1145,7 +1165,7 @@ _Jv_JNI_ToReflectedField (JNIEnv *env, jclass cls, jfieldID fieldID,
field->declaringClass = cls; field->declaringClass = cls;
field->offset = (char*) fieldID - (char *) cls->fields; field->offset = (char*) fieldID - (char *) cls->fields;
field->name = _Jv_NewStringUtf8Const (fieldID->getNameUtf8Const (cls)); field->name = _Jv_NewStringUtf8Const (fieldID->getNameUtf8Const (cls));
return _Jv_JNI_NewLocalRef (env, field); return wrap_value (env, field);
} }
// JDK 1.2 // JDK 1.2
...@@ -1184,7 +1204,7 @@ _Jv_JNI_ToReflectedMethod (JNIEnv *env, jclass klass, jmethodID id, ...@@ -1184,7 +1204,7 @@ _Jv_JNI_ToReflectedMethod (JNIEnv *env, jclass klass, jmethodID id,
result = meth; result = meth;
} }
return _Jv_JNI_NewLocalRef (env, result); return wrap_value (env, result);
} }
static jmethodID static jmethodID
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment