* Use 8-byte stack-slots on all architectures.
* Faster C-to-Java calls.
* Removed genoffsets, cross-compilation is now much easier.
+ * Implemented Class.isAnonymousClass(), isLocalClass() and
+ isMemberClass() for GNU Classpath.
New in release 0.98 (June 6, 2007)
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: jni.c 8335 2007-08-17 11:04:35Z michi $
+ $Id: jni.c 8343 2007-08-17 21:39:32Z michi $
*/
TRACEJNICALLS("_Jv_JNI_GetSuperclass(env=%p, sub=%p)", env, sub);
- c = (classinfo *) sub;
+ c = LLNI_classinfo_unwrap(sub);
if (c == NULL)
return NULL;
STATISTICS(jniinvokation());
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
if (msg == NULL)
msg = "";
s = javastring_new_from_utf_string(msg);
STATISTICS(jniinvokation());
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
if ((c->flags & ACC_INTERFACE) || (c->flags & ACC_ABSTRACT)) {
exceptions_throw_instantiationexception(c);
STATISTICS(jniinvokation());
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
m = (methodinfo *) methodID;
/* create object */
STATISTICS(jniinvokation());
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
m = (methodinfo *) methodID;
/* create object */
STATISTICS(jniinvokation());
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
m = (methodinfo *) methodID;
/* create object */
STATISTICS(jniinvokation());
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
if (c == NULL)
return NULL;
type ret; \
\
o = (java_handle_t *) obj; \
- c = (classinfo *) clazz; \
+ c = LLNI_classinfo_unwrap(clazz); \
m = (methodinfo *) methodID; \
\
va_start(ap, methodID); \
type ret; \
\
o = (java_handle_t *) obj; \
- c = (classinfo *) clazz; \
+ c = LLNI_classinfo_unwrap(clazz); \
m = (methodinfo *) methodID; \
\
ret = _Jv_jni_CallIntMethod(o, c->vftbl, m, args); \
va_list ap;
o = (java_handle_t *) obj;
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
m = (methodinfo *) methodID;
va_start(ap, methodID);
java_handle_t *r;
o = (java_handle_t *) obj;
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
m = (methodinfo *) methodID;
r = _Jv_jni_CallObjectMethod(o, c->vftbl, m, args);
va_list ap;
o = (java_handle_t *) obj;
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
m = (methodinfo *) methodID;
va_start(ap, methodID);
methodinfo *m;
o = (java_handle_t *) obj;
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
m = (methodinfo *) methodID;
_Jv_jni_CallVoidMethod(o, c->vftbl, m, args);
methodinfo *m;
o = (java_handle_t *) obj;
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
m = (methodinfo *) methodID;
_Jv_jni_CallVoidMethodA(o, c->vftbl, m, args);
STATISTICS(jniinvokation());
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
/* XXX NPE check? */
STATISTICS(jniinvokation());
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
if (!c)
return NULL;
STATISTICS(jniinvokation());
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
uname = utf_new_char((char *) name);
usig = utf_new_char((char *) sig);
\
STATISTICS(jniinvokation()); \
\
- c = (classinfo *) clazz; \
+ c = LLNI_classinfo_unwrap(clazz); \
f = (fieldinfo *) fieldID; \
\
if (!(c->state & CLASS_INITIALIZED)) \
STATISTICS(jniinvokation());
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
f = (fieldinfo *) fieldID;
if (!(c->state & CLASS_INITIALIZED))
\
STATISTICS(jniinvokation()); \
\
- c = (classinfo *) clazz; \
+ c = LLNI_classinfo_unwrap(clazz); \
f = (fieldinfo *) fieldID; \
\
if (!(c->state & CLASS_INITIALIZED)) \
STATISTICS(jniinvokation());
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
f = (fieldinfo *) fieldID;
if (!(c->state & CLASS_INITIALIZED))
STATISTICS(jniinvokation());
- c = (classinfo *) elementClass;
+ c = LLNI_classinfo_unwrap(elementClass);
o = (java_handle_t *) initialElement;
if (length < 0) {
STATISTICS(jniinvokation());
- c = (classinfo *) clazz;
+ c = LLNI_classinfo_unwrap(clazz);
/* XXX: if implemented this needs a call to jvmti_NativeMethodBind
if (jvmti) jvmti_NativeMethodBind(method, address, new_address_ptr);
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: llni.h 8321 2007-08-16 11:37:25Z michi $
+ $Id: llni.h 8343 2007-08-17 21:39:32Z michi $
*/
#define LLNI_class_get(obj, variable) \
(variable) = LLNI_field_direct(obj, header.vftbl->class)
+
+/* LLNI classinfo wrapping / unwrapping macros *********************************
+
+ The following macros are used to wrap or unwrap a classinfo from
+ or into a handle (typically java_lang_Class).
+
+*******************************************************************************/
+
+#define LLNI_classinfo_wrap(classinfo) \
+ ((java_lang_Class *) (classinfo))
+
+#define LLNI_classinfo_unwrap(clazz) \
+ ((classinfo *) (clazz))
+
+
/* XXX the direct macros have to be used inside a critical section!!! */
#define LLNI_field_direct(obj, field) ((obj)->field)
classinfo *c;
java_handle_t *o;
- c = (classinfo *) this;
+ c = LLNI_classinfo_unwrap(this);
o = native_new_and_init(c);
c = o->vftbl->class;
- return (java_lang_Class *) c;
+ return LLNI_classinfo_wrap(c);
}
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: java_lang_VMClass.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: java_lang_VMClass.c 8343 2007-08-17 21:39:32Z michi $
*/
#include "config.h"
+
+#include <stdint.h>
+
#include "vm/types.h"
#include "native/jni.h"
+#include "native/llni.h"
#include "native/native.h"
#include "native/include/java_lang_Class.h"
#include "native/vm/java_lang_Class.h"
+#include "vmcore/class.h"
+
/* native methods implemented by this file ************************************/
{ "getEnclosingConstructor", "(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;", (void *) (ptrint) &Java_java_lang_VMClass_getEnclosingConstructor },
{ "getEnclosingMethod", "(Ljava/lang/Class;)Ljava/lang/reflect/Method;", (void *) (ptrint) &Java_java_lang_VMClass_getEnclosingMethod },
{ "getClassSignature", "(Ljava/lang/Class;)Ljava/lang/String;", (void *) (ptrint) &Java_java_lang_VMClass_getClassSignature },
-#if 0
{ "isAnonymousClass", "(Ljava/lang/Class;)Z", (void *) (ptrint) &Java_java_lang_VMClass_isAnonymousClass },
{ "isLocalClass", "(Ljava/lang/Class;)Z", (void *) (ptrint) &Java_java_lang_VMClass_isLocalClass },
{ "isMemberClass", "(Ljava/lang/Class;)Z", (void *) (ptrint) &Java_java_lang_VMClass_isMemberClass },
-#endif
};
*/
JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getComponentType(JNIEnv *env, jclass clazz, java_lang_Class *klass)
{
- return _Jv_java_lang_Class_getComponentType(klass);
+ classinfo *c;
+ classinfo *component;
+
+ c = LLNI_classinfo_unwrap(klass);
+
+ component = class_get_componenttype(c);
+
+ return LLNI_classinfo_wrap(component);
}
*/
JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
{
- return _Jv_java_lang_Class_getEnclosingClass(klass);
+ classinfo *c;
+ classinfo *result;
+
+ c = LLNI_classinfo_unwrap(klass);
+
+ result = class_get_enclosingclass(c);
+
+ return LLNI_classinfo_wrap(result);
}
}
-#if 0
/*
* Class: java/lang/VMClass
* Method: isAnonymousClass
* Signature: (Ljava/lang/Class;)Z
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
+JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+{
+ return class_is_anonymousclass(LLNI_classinfo_unwrap(klass));
+}
/*
* Method: isLocalClass
* Signature: (Ljava/lang/Class;)Z
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
+JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+{
+ return class_is_localclass(LLNI_classinfo_unwrap(klass));
+}
/*
* Method: isMemberClass
* Signature: (Ljava/lang/Class;)Z
*/
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-#endif
+JNIEXPORT int32_t JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, java_lang_Class *klass)
+{
+ return class_is_memberclass(LLNI_classinfo_unwrap(klass));
+}
/*
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: java_lang_VMClassLoader.c 8335 2007-08-17 11:04:35Z michi $
+ $Id: java_lang_VMClassLoader.c 8343 2007-08-17 21:39:32Z michi $
*/
#include "mm/memory.h"
#include "native/jni.h"
+#include "native/llni.h"
#include "native/native.h"
#include "native/include/java_lang_Class.h"
#include "native/include/java_lang_String.h"
return NULL;
}
- return (java_lang_Class *) c;
+ return LLNI_classinfo_wrap(c);
}
{
classinfo *ci;
- ci = (classinfo *) c;
+ ci = LLNI_classinfo_unwrap(c);
if (!ci) {
exceptions_throw_nullpointerexception();
if (!link_class(c))
return NULL;
- return (java_lang_Class *) c;
+ return LLNI_classinfo_wrap(c);
}
if (c == NULL)
c = classcache_lookup(cl, u);
- return (java_lang_Class *) c;
+ return LLNI_classinfo_wrap(c);
}
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: java_lang_VMThrowable.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: java_lang_VMThrowable.c 8343 2007-08-17 21:39:32Z michi $
*/
/* get declaring class name */
declaringclass =
- _Jv_java_lang_Class_getName((java_lang_Class *) ste->method->class);
+ _Jv_java_lang_Class_getName(LLNI_classinfo_wrap(ste->method->class));
/* fill the java.lang.StackTraceElement element */
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: java_lang_reflect_Constructor.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: java_lang_reflect_Constructor.c 8343 2007-08-17 21:39:32Z michi $
*/
#include "native/include/java_lang_reflect_Constructor.h"
#if defined(ENABLE_ANNOTATIONS)
-#include "native/include/sun_reflect_ConstantPool.h"
-#include "native/vm/reflect.h"
+# include "native/include/sun_reflect_ConstantPool.h"
+
+# include "native/vm/reflect.h"
#endif
#include "native/vm/java_lang_reflect_Constructor.h"
* Method: declaredAnnotations
* Signature: ()Ljava/util/Map;
*/
-JNIEXPORT struct java_util_Map* JNICALL Java_java_lang_reflect_Constructor_declaredAnnotations(JNIEnv *env, struct java_lang_reflect_Constructor* this)
+JNIEXPORT struct java_util_Map* JNICALL Java_java_lang_reflect_Constructor_declaredAnnotations(JNIEnv *env, java_lang_reflect_Constructor *this)
{
- java_handle_t *o = (java_handle_t*)this;
- struct java_util_Map *declaredAnnotations = NULL;
- java_bytearray *annotations = NULL;
- java_lang_Class *declaringClass = NULL;
-
- if (this == NULL) {
- exceptions_throw_nullpointerexception();
- return NULL;
- }
-
+ java_handle_t *o = (java_handle_t*)this;
+ struct java_util_Map *declaredAnnotations = NULL;
+ java_handle_bytearray_t *annotations = NULL;
+ java_lang_Class *declaringClass = NULL;
+
LLNI_field_get_ref(this, declaredAnnotations, declaredAnnotations);
if (declaredAnnotations == NULL) {
* Method: getParameterAnnotations
* Signature: ()[[Ljava/lang/annotation/Annotation;
*/
-JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_reflect_Constructor_getParameterAnnotations(JNIEnv *env, struct java_lang_reflect_Constructor* this)
+JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_reflect_Constructor_getParameterAnnotations(JNIEnv *env, java_lang_reflect_Constructor *this)
{
- java_handle_t *o = (java_handle_t*)this;
- java_bytearray *parameterAnnotations = NULL;
- int32_t slot = -1;
- java_lang_Class *declaringClass = NULL;
-
- if (this == NULL) {
- exceptions_throw_nullpointerexception();
- return NULL;
- }
+ java_handle_t *o = (java_handle_t*)this;
+ java_handle_bytearray_t *parameterAnnotations = NULL;
+ int32_t slot = -1;
+ java_lang_Class *declaringClass = NULL;
LLNI_field_get_ref(this, parameterAnnotations, parameterAnnotations);
LLNI_field_get_val(this, slot, slot);
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: java_lang_reflect_Field.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: java_lang_reflect_Field.c 8343 2007-08-17 21:39:32Z michi $
*/
if (!resolve_class_from_typedesc(desc, true, false, &ret))
return NULL;
- return (java_lang_Class *) ret;
+ return LLNI_classinfo_wrap(ret);
}
* Method: declaredAnnotations
* Signature: ()Ljava/util/Map;
*/
-JNIEXPORT struct java_util_Map* JNICALL Java_java_lang_reflect_Field_declaredAnnotations(JNIEnv *env, struct java_lang_reflect_Field* this)
+JNIEXPORT struct java_util_Map* JNICALL Java_java_lang_reflect_Field_declaredAnnotations(JNIEnv *env, java_lang_reflect_Field *this)
{
- java_handle_t *o = (java_handle_t*)this;
- struct java_util_Map *declaredAnnotations = NULL;
- java_bytearray *annotations = NULL;
- java_lang_Class *declaringClass = NULL;
-
- if (this == NULL) {
- exceptions_throw_nullpointerexception();
- return NULL;
- }
+ java_handle_t *o = (java_handle_t*)this;
+ struct java_util_Map *declaredAnnotations = NULL;
+ java_handle_bytearray_t *annotations = NULL;
+ java_lang_Class *declaringClass = NULL;
LLNI_field_get_ref(this, declaredAnnotations, declaredAnnotations);
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: java_lang_reflect_Method.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: java_lang_reflect_Method.c 8343 2007-08-17 21:39:32Z michi $
*/
result = method_returntype_get(m);
- return (java_lang_Class *) result;
+ return LLNI_classinfo_wrap(result);
}
* Method: declaredAnnotations
* Signature: ()Ljava/util/Map;
*/
-JNIEXPORT struct java_util_Map* JNICALL Java_java_lang_reflect_Method_declaredAnnotations(JNIEnv *env, struct java_lang_reflect_Method* this)
+JNIEXPORT struct java_util_Map* JNICALL Java_java_lang_reflect_Method_declaredAnnotations(JNIEnv *env, java_lang_reflect_Method *this)
{
- java_handle_t *o = (java_handle_t*)this;
- struct java_util_Map *declaredAnnotations = NULL;
- java_bytearray *annotations = NULL;
- java_lang_Class *declaringClass = NULL;
-
- if (this == NULL) {
- exceptions_throw_nullpointerexception();
- return NULL;
- }
+ java_handle_t *o = (java_handle_t*)this;
+ struct java_util_Map *declaredAnnotations = NULL;
+ java_handle_bytearray_t *annotations = NULL;
+ java_lang_Class *declaringClass = NULL;
LLNI_field_get_ref(this, declaredAnnotations, declaredAnnotations);
* Method: getParameterAnnotations
* Signature: ()[[Ljava/lang/annotation/Annotation;
*/
-JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_reflect_Method_getParameterAnnotations(JNIEnv *env, struct java_lang_reflect_Method* this)
+JNIEXPORT java_handle_objectarray_t* JNICALL Java_java_lang_reflect_Method_getParameterAnnotations(JNIEnv *env, java_lang_reflect_Method *this)
{
- java_handle_t *o = (java_handle_t*)this;
- java_bytearray *parameterAnnotations = NULL;
- int32_t slot = -1;
- java_lang_Class *declaringClass = NULL;
-
- if (this == NULL) {
- exceptions_throw_nullpointerexception();
- return NULL;
- }
+ java_handle_t *o = (java_handle_t*)this;
+ java_handle_bytearray_t *parameterAnnotations = NULL;
+ int32_t slot = -1;
+ java_lang_Class *declaringClass = NULL;
LLNI_field_get_ref(this, parameterAnnotations, parameterAnnotations);
LLNI_field_get_val(this, slot, slot);
*/
JNIEXPORT int32_t JNICALL Java_sun_reflect_ConstantPool_getSize0(JNIEnv *env, struct sun_reflect_ConstantPool* this, struct java_lang_Object* jcpool)
{
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
return cls->cpcount;
}
JNIEXPORT struct java_lang_Class* JNICALL Java_sun_reflect_ConstantPool_getClassAt0(JNIEnv *env, struct sun_reflect_ConstantPool* this, struct java_lang_Object* jcpool, int32_t index)
{
constant_classref *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
ref = (constant_classref*)class_getconstant(
cls, index, CONSTANT_Class);
return NULL;
}
- return (jclass)resolve_classref_eager(ref);
+ return LLNI_classinfo_wrap(resolve_classref_eager(ref));
}
{
constant_classref *ref;
classinfo *c = NULL;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
ref = (constant_classref*)class_getconstant(
cls, index, CONSTANT_Class);
return NULL;
}
- return (jclass)c;
+ return LLNI_classinfo_wrap(c);
}
JNIEXPORT struct java_lang_reflect_Member* JNICALL Java_sun_reflect_ConstantPool_getMethodAt0(JNIEnv *env, struct sun_reflect_ConstantPool* this, struct java_lang_Object* jcpool, int32_t index)
{
constant_FMIref *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
ref = (constant_FMIref*)class_getconstant(
cls, index, CONSTANT_Methodref);
{
constant_FMIref *ref;
classinfo *c = NULL;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
ref = (constant_FMIref*)class_getconstant(
cls, index, CONSTANT_Methodref);
JNIEXPORT struct java_lang_reflect_Field* JNICALL Java_sun_reflect_ConstantPool_getFieldAt0(JNIEnv *env, struct sun_reflect_ConstantPool* this, struct java_lang_Object* jcpool, int32_t index)
{
constant_FMIref *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
ref = (constant_FMIref*)class_getconstant(
cls, index, CONSTANT_Fieldref);
{
constant_FMIref *ref;
classinfo *c;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
ref = (constant_FMIref*)class_getconstant(
cls, index, CONSTANT_Fieldref);
JNIEXPORT int32_t JNICALL Java_sun_reflect_ConstantPool_getIntAt0(JNIEnv *env, struct sun_reflect_ConstantPool* this, struct java_lang_Object* jcpool, int32_t index)
{
constant_integer *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
ref = (constant_integer*)class_getconstant(
cls, index, CONSTANT_Integer);
JNIEXPORT int64_t JNICALL Java_sun_reflect_ConstantPool_getLongAt0(JNIEnv *env, struct sun_reflect_ConstantPool* this, struct java_lang_Object* jcpool, int32_t index)
{
constant_long *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
ref = (constant_long*)class_getconstant(
cls, index, CONSTANT_Long);
JNIEXPORT float JNICALL Java_sun_reflect_ConstantPool_getFloatAt0(JNIEnv *env, struct sun_reflect_ConstantPool* this, struct java_lang_Object* jcpool, int32_t index)
{
constant_float *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
ref = (constant_float*)class_getconstant(
cls, index, CONSTANT_Float);
JNIEXPORT double JNICALL Java_sun_reflect_ConstantPool_getDoubleAt0(JNIEnv *env, struct sun_reflect_ConstantPool* this, struct java_lang_Object* jcpool, int32_t index)
{
constant_double *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
ref = (constant_double*)class_getconstant(
cls, index, CONSTANT_Double);
JNIEXPORT struct java_lang_String* JNICALL Java_sun_reflect_ConstantPool_getStringAt0(JNIEnv *env, struct sun_reflect_ConstantPool* this, struct java_lang_Object* jcpool, int32_t index)
{
utf *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
ref = (utf*)class_getconstant(cls, index, CONSTANT_String);
JNIEXPORT struct java_lang_String* JNICALL Java_sun_reflect_ConstantPool_getUTF8At0(JNIEnv *env, struct sun_reflect_ConstantPool* this, struct java_lang_Object* jcpool, int32_t index)
{
utf *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
ref = (utf*)class_getconstant(cls, index, CONSTANT_Utf8);
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: java_lang_Class.c 8335 2007-08-17 11:04:35Z michi $
+ $Id: java_lang_Class.c 8343 2007-08-17 21:39:32Z michi $
*/
java_handle_chararray_t *ca;
u4 i;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
/* create a java string */
if (!initialize_class(c))
return NULL;
- return (java_lang_Class *) c;
+ return LLNI_classinfo_wrap(c);
}
classinfo *c;
java_handle_t *ob;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
ob = (java_handle_t *) o;
if (!(c->state & CLASS_LINKED))
classinfo *kc;
classinfo *cc;
- kc = (classinfo *) klass;
- cc = (classinfo *) c;
+ kc = LLNI_classinfo_unwrap(klass);
+ cc = LLNI_classinfo_unwrap(c);
if (cc == NULL) {
exceptions_throw_nullpointerexception();
{
classinfo *c;
- c = (classinfo *) this;
+ c = LLNI_classinfo_unwrap(this);
return class_is_interface(c);
}
{
classinfo *c;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
return class_is_primitive(c);
}
classinfo *c;
classinfo *super;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
super = class_get_superclass(c);
- return (java_lang_Class *) super;
+ return LLNI_classinfo_wrap(super);
}
classinfo *c;
java_handle_objectarray_t *oa;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
oa = class_get_interfaces(c);
}
-/*
- * Class: java/lang/Class
- * Method: getComponentType
- * Signature: ()Ljava/lang/Class;
- */
-java_lang_Class *_Jv_java_lang_Class_getComponentType(java_lang_Class *klass)
-{
- classinfo *c;
- classinfo *comp;
- arraydescriptor *desc;
-
- c = (classinfo *) klass;
-
- /* XXX maybe we could find a way to do this without linking. */
- /* This way should be safe and easy, however. */
-
- if (!(c->state & CLASS_LINKED))
- if (!link_class(c))
- return NULL;
-
- desc = c->vftbl->arraydesc;
-
- if (desc == NULL)
- return NULL;
-
- if (desc->arraytype == ARRAYTYPE_OBJECT)
- comp = desc->componentvftbl->class;
- else
- comp = primitive_class_get_by_type(desc->arraytype);
-
- return (java_lang_Class *) comp;
-}
-
-
/*
* Class: java/lang/Class
* Method: getModifiers
utf *innername;
s4 i;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
if (!ignoreInnerClassesAttrib && (c->innerclasscount != 0)) {
/* search for passed class as inner class */
java_lang_Class *_Jv_java_lang_Class_getDeclaringClass(java_lang_Class *klass)
{
classinfo *c;
+ classinfo *dc;
+
+ c = LLNI_classinfo_unwrap(klass);
- c = (classinfo *) klass;
+ dc = class_get_declaringclass(c);
- return (java_lang_Class *) class_get_declaringclass(c);
+ return LLNI_classinfo_wrap(dc);
}
classinfo *c;
java_handle_objectarray_t *oa;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
oa = class_get_declaredclasses(c, publicOnly);
s4 pos;
s4 i;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
/* determine number of fields */
s4 pos;
s4 i;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
public_methods = 0;
s4 pos;
s4 i;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
/* determine number of constructors */
{
classinfo *c;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
if (c->classloader == NULL)
return NULL;
{
classinfo *c;
- c = (classinfo *) this;
+ c = LLNI_classinfo_unwrap(this);
return class_is_array(c);
}
*/
java_handle_objectarray_t *_Jv_java_lang_Class_getDeclaredAnnotations(java_lang_Class* klass)
{
- classinfo *c = (classinfo*)klass;
+ classinfo *c = LLNI_classinfo_unwrap(klass);
static methodinfo *m_parseAnnotationsIntoArray = NULL;
utf *utf_parseAnnotationsIntoArray = NULL;
utf *utf_desc = NULL;
#endif
-/*
- * Class: java/lang/Class
- * Method: getEnclosingClass
- * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
- */
-java_lang_Class *_Jv_java_lang_Class_getEnclosingClass(java_lang_Class *klass)
-{
- classinfo *c;
- classref_or_classinfo cr;
- classinfo *ec;
-
- c = (classinfo *) klass;
-
- /* get enclosing class */
-
- cr = c->enclosingclass;
-
- if (cr.any == NULL)
- return NULL;
-
- /* resolve the class if necessary */
-
- if (IS_CLASSREF(cr)) {
- ec = resolve_classref_eager(cr.ref);
-
- if (ec == NULL)
- return NULL;
- }
- else
- ec = cr.cls;
-
- return (java_lang_Class *) ec;
-}
-
-
/* _Jv_java_lang_Class_getEnclosingMethod_intern *******************************
Helper function for _Jv_java_lang_Class_getEnclosingConstructor and
static methodinfo *_Jv_java_lang_Class_getEnclosingMethod_intern(classinfo *c)
{
- classref_or_classinfo cr;
- constant_nameandtype *cn;
- classinfo *ec;
- methodinfo *m;
+ constant_nameandtype *cn;
+ classinfo *ec;
+ methodinfo *m;
/* get enclosing class and method */
- cr = c->enclosingclass;
+ ec = class_get_enclosingclass(c);
cn = c->enclosingmethod;
/* check for enclosing class and method */
- if (cr.any == NULL)
+ if (ec == NULL)
return NULL;
if (cn == NULL)
return NULL;
- /* resolve the class if necessary */
-
- if (IS_CLASSREF(cr)) {
- ec = resolve_classref_eager(cr.ref);
-
- if (ec == NULL)
- return NULL;
- }
- else
- ec = cr.cls;
-
/* find method in enclosing class */
m = class_findmethod(ec, cn->name, cn->descriptor);
methodinfo *m;
java_lang_reflect_Constructor *rc;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
/* get enclosing method */
methodinfo *m;
java_lang_reflect_Method *rm;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
/* get enclosing method */
classinfo *c;
java_handle_t *o;
- c = (classinfo *) klass;
+ c = LLNI_classinfo_unwrap(klass);
if (c->signature == NULL)
return NULL;
return (java_lang_String *) o;
}
-
-#if 0
-/*
- * Class: java/lang/Class
- * Method: isAnonymousClass
- * Signature: (Ljava/lang/Class;)Z
- */
-s4 _Jv_java_lang_Class_isAnonymousClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-
-
-/*
- * Class: java/lang/VMClass
- * Method: isLocalClass
- * Signature: (Ljava/lang/Class;)Z
- */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-
-
-/*
- * Class: java/lang/VMClass
- * Method: isMemberClass
- * Signature: (Ljava/lang/Class;)Z
- */
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-#endif
-
#endif /* ENABLE_JAVASE */
s4 _Jv_java_lang_Class_isPrimitive(java_lang_Class *klass);
java_lang_Class *_Jv_java_lang_Class_getSuperclass(java_lang_Class *klass);
java_handle_objectarray_t *_Jv_java_lang_Class_getInterfaces(java_lang_Class *klass);
-java_lang_Class *_Jv_java_lang_Class_getComponentType(java_lang_Class *klass);
s4 _Jv_java_lang_Class_getModifiers(java_lang_Class *klass, s4 ignoreInnerClassesAttrib);
java_lang_Class *_Jv_java_lang_Class_getDeclaringClass(java_lang_Class *klass);
java_handle_objectarray_t *_Jv_java_lang_Class_getDeclaredClasses(java_lang_Class *klass, s4 publicOnly);
java_handle_objectarray_t *_Jv_java_lang_Class_getDeclaredAnnotations(java_lang_Class* klass);
#endif
-java_lang_Class *_Jv_java_lang_Class_getEnclosingClass(java_lang_Class *klass);
java_lang_reflect_Constructor *_Jv_java_lang_Class_getEnclosingConstructor(java_lang_Class *klass);
java_lang_reflect_Method *_Jv_java_lang_Class_getEnclosingMethod(java_lang_Class *klass);
java_lang_String *_Jv_java_lang_Class_getClassSignature(java_lang_Class* klass);
#endif
-#if 0
-s4 _Jv_java_lang_Class_isAnonymousClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-JNIEXPORT s4 JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, struct java_lang_Class* par1);
-#endif
-
#endif /* _JV_JAVA_LANG_CLASS_H */
/* for convenience */
- o = (java_lang_Class *) c;
+ o = LLNI_classinfo_wrap(c);
#if defined(WITH_CLASSPATH_GNU)
/* set ProtectionDomain */
LLNI_class_get(obj, c);
- return (java_lang_Class *) c;
+ return LLNI_classinfo_wrap(c);
}
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: reflect.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: reflect.c 8343 2007-08-17 21:39:32Z michi $
*/
java_handle_t *o;
java_lang_reflect_Constructor *rc;
int32_t slot;
- java_handle_bytearray_t *annotations = NULL;
- java_handle_bytearray_t *parameterAnnotations = NULL;
/* get declaring class */
- c = (classinfo *) m->class;
+ c = m->class;
/* allocate a new object */
slot = m - c->methods;
-#if defined(ENABLE_ANNOTATIONS)
- /* get annotations */
-
- annotations = method_get_annotations(m);
-
- /* get parameter annotations */
-
- parameterAnnotations = method_get_parameterannotations(m);
-#endif
-
#if defined(WITH_CLASSPATH_GNU)
LLNI_field_set_cls(rc, clazz , c);
LLNI_field_set_val(rc, slot , slot);
- LLNI_field_set_ref(rc, annotations , annotations);
- LLNI_field_set_ref(rc, parameterAnnotations, parameterAnnotations);
+ LLNI_field_set_ref(rc, annotations , method_get_annotations(m));
+ LLNI_field_set_ref(rc, parameterAnnotations, method_get_parameterannotations(m));
#elif defined(WITH_CLASSPATH_SUN)
LLNI_field_set_val(rc, modifiers , m->flags & ACC_CLASS_REFLECT_MASK);
LLNI_field_set_val(rc, slot , slot);
LLNI_field_set_ref(rc, signature , m->signature ? (java_lang_String *) javastring_new(m->signature) : NULL);
- LLNI_field_set_ref(rc, annotations , annotations);
- LLNI_field_set_ref(rc, parameterAnnotations, parameterAnnotations);
+ LLNI_field_set_ref(rc, annotations , method_get_annotations(m));
+ LLNI_field_set_ref(rc, parameterAnnotations, method_get_parameterannotations(m));
#else
# error unknown classpath configuration
java_handle_t *o;
java_lang_reflect_Field *rf;
int32_t slot;
- java_handle_bytearray_t *annotations = NULL;
/* get declaring class */
- c = (classinfo *) f->class;
+ c = f->class;
/* allocate a new object */
slot = f - c->fields;
-#if defined(ENABLE_ANNOTATIONS)
- /* get annotations */
-
- annotations = field_get_annotations(f);
-#endif
-
#if defined(WITH_CLASSPATH_GNU)
LLNI_field_set_cls(rf, clazz , c);
LLNI_field_set_ref(rf, name , _Jv_java_lang_String_intern((java_lang_String *) javastring_new(f->name)));
LLNI_field_set_val(rf, slot , slot);
- LLNI_field_set_ref(rf, annotations , annotations);
+ LLNI_field_set_ref(rf, annotations , field_get_annotations(f));
#elif defined(WITH_CLASSPATH_SUN)
LLNI_field_set_val(rf, modifiers , f->flags);
LLNI_field_set_val(rf, slot , slot);
LLNI_field_set_ref(rf, signature , f->signature ? (java_lang_String *) javastring_new(f->signature) : NULL);
- LLNI_field_set_ref(rf, annotations , annotations);
+ LLNI_field_set_ref(rf, annotations , field_get_annotations(f));
#else
# error unknown classpath configuration
java_handle_t *o;
java_lang_reflect_Method *rm;
int32_t slot;
- java_handle_bytearray_t *annotations = NULL;
- java_handle_bytearray_t *parameterAnnotations = NULL;
- java_handle_bytearray_t *annotationDefault = NULL;
/* get declaring class */
- c = (classinfo *) m->class;
+ c = m->class;
/* allocate a new object */
slot = m - c->methods;
-#if defined(ENABLE_ANNOTATIONS)
- /* get annotations */
-
- annotations = method_get_annotations(m);
-
- /* get parameter annotations */
-
- parameterAnnotations = method_get_parameterannotations(m);
-
- /* get annotation default value */
-
- annotationDefault = method_get_annotationdefault(m);
-#endif
-
#if defined(WITH_CLASSPATH_GNU)
LLNI_field_set_cls(rm, clazz , m->class);
LLNI_field_set_ref(rm, name , _Jv_java_lang_String_intern((java_lang_String *) javastring_new(m->name)));
LLNI_field_set_val(rm, slot , slot);
- LLNI_field_set_ref(rm, annotations , annotations);
- LLNI_field_set_ref(rm, parameterAnnotations, parameterAnnotations);
- LLNI_field_set_ref(rm, annotationDefault , annotationDefault);
+ LLNI_field_set_ref(rm, annotations , method_get_annotations(m));
+ LLNI_field_set_ref(rm, parameterAnnotations, method_get_parameterannotations(m));
+ LLNI_field_set_ref(rm, annotationDefault , method_get_annotationdefault(m));
#elif defined(WITH_CLASSPATH_SUN)
LLNI_field_set_val(rm, modifiers , m->flags & ACC_CLASS_REFLECT_MASK);
LLNI_field_set_val(rm, slot , slot);
LLNI_field_set_ref(rm, signature , m->signature ? (java_lang_String *) javastring_new(m->signature) : NULL);
- LLNI_field_set_ref(rm, annotations , annotations);
- LLNI_field_set_ref(rm, parameterAnnotations, parameterAnnotations);
- LLNI_field_set_ref(rm, annotationDefault , annotationDefault);
+ LLNI_field_set_ref(rm, annotations , method_get_annotations(m));
+ LLNI_field_set_ref(rm, parameterAnnotations, method_get_parameterannotations(m));
+ LLNI_field_set_ref(rm, annotationDefault , method_get_annotationdefault(m));
#else
# error unknown classpath configuration
/* get parameter count */
- c = (classinfo *)declaringClass;
+ c = LLNI_classinfo_unwrap(declaringClass);
m = &(c->methods[slot]);
numParameters = method_get_parametercount(m);
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: jvm.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: jvm.c 8343 2007-08-17 21:39:32Z michi $
*/
#include "toolbox/logging.h"
+#include "vm/array.h"
#include "vm/builtin.h"
#include "vm/exceptions.h"
+#include "vm/global.h"
#include "vm/initialize.h"
#include "vm/primitive.h"
#include "vm/properties.h"
/* get declaring class name */
declaringclass =
- _Jv_java_lang_Class_getName((java_lang_Class *) ste->method->class);
+ _Jv_java_lang_Class_getName(LLNI_classinfo_wrap(ste->method->class));
/* fill the java.lang.StackTraceElement element */
/* JVM_FindPrimitiveClass */
-jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* utf)
+jclass JVM_FindPrimitiveClass(JNIEnv* env, const char* s)
{
-#if PRINTVM
- log_println("JVM_FindPrimitiveClass: utf=%s", utf);
-#endif
- return (jclass) primitive_class_get_by_name(utf_new_char(utf));
+ classinfo *c;
+ utf *u;
+
+ TRACEJVMCALLS("JVM_FindPrimitiveClass(env=%p, s=%s)", env, s);
+
+ u = utf_new_char(s);
+ c = primitive_class_get_by_name(u);
+
+ return LLNI_classinfo_wrap(c);
}
if (!initialize_class(c))
return NULL;
- return (jclass) c;
+ return LLNI_classinfo_wrap(c);
}
#endif
/* XXX do something with pd and source */
- return (jclass) class_define(utf_new_char(name), (classloader *) loader, len, (u1 *) buf);
+ return LLNI_classinfo_wrap( class_define(utf_new_char(name), (classloader *) loader, len, (u1 *) buf) );
}
u = javastring_toutf((java_handle_t *) name, true);
c = classcache_lookup(cl, u);
- return (jclass) c;
+ return LLNI_classinfo_wrap(c);
}
TRACEJVMCALLS("JVM_GetClassInterfaces(env=%p, cls=%p)", env, cls);
- c = (classinfo *) cls;
+ c = LLNI_classinfo_unwrap(cls);
oa = class_get_interfaces(c);
log_println("JVM_IsInterface: cls=%p", cls);
#endif
- c = (classinfo *) cls;
+ c = LLNI_classinfo_unwrap(cls);
return class_is_interface(c);
}
log_println("JVM_GetProtectionDomain: cls=%p");
#endif
- c = (classinfo *) cls;
+ c = LLNI_classinfo_unwrap(cls);
if (c == NULL) {
exceptions_throw_nullpointerexception();
if (class_is_primitive(c))
return NULL;
+
+ return NULL;
}
#if PRINTJVM
log_println("JVM_IsArrayClass: cls=%p", cls);
#endif
- return class_is_array((classinfo *) cls);
+ return class_is_array(LLNI_classinfo_unwrap(cls));
}
{
classinfo *c;
- c = (classinfo *) cls;
+ c = LLNI_classinfo_unwrap(cls);
#if PRINTJVM
log_println("JVM_IsPrimitiveClass(cls=%p)", cls);
jclass JVM_GetComponentType(JNIEnv *env, jclass cls)
{
-#if PRINTJVM
- log_println("JVM_GetComponentType: cls=%p", cls);
-#endif
- return (jclass) _Jv_java_lang_Class_getComponentType((java_lang_Class *) cls);
+ classinfo *component;
+ classinfo *c;
+
+ TRACEJVMCALLS("JVM_GetComponentType(env=%p, cls=%p)", env, cls);
+
+ c = LLNI_classinfo_unwrap(cls);
+
+ component = class_get_componenttype(c);
+
+ return LLNI_classinfo_wrap(component);
}
log_println("JVM_GetClassModifiers: cls=%p", cls);
#endif
- c = (classinfo *) cls;
+ c = LLNI_classinfo_unwrap(cls);
/* XXX is this correct? */
TRACEJVMCALLS("JVM_GetDeclaredClasses(env=%p, ofClass=%p)", env, ofClass);
- c = (classinfo *) ofClass;
+ c = LLNI_classinfo_unwrap(ofClass);
oa = class_get_declaredclasses(c, false);
jclass JVM_GetDeclaringClass(JNIEnv *env, jclass ofClass)
{
- classinfo *c = (classinfo*)ofClass;
+ classinfo *c = LLNI_classinfo_unwrap(ofClass);
TRACEJVMCALLS("JVM_GetDeclaringClass: ofClass=%p", ofClass);
return NULL;
}
- return (jclass)class_get_declaringclass(c);
+ return LLNI_classinfo_wrap(class_get_declaringclass(c));
}
jbyteArray JVM_GetClassAnnotations(JNIEnv *env, jclass cls)
{
#if defined(ENABLE_ANNOTATIONS)
- classinfo *c = (classinfo*)cls;
- java_bytearray *annotations = NULL;
+ classinfo *c = LLNI_classinfo_unwrap(cls);
+ java_handle_bytearray_t *annotations = NULL;
TRACEJVMCALLS("JVM_GetClassAnnotations: cls=%p", cls);
jbyteArray JVM_GetFieldAnnotations(JNIEnv *env, jobject field)
{
java_lang_reflect_Field *rf = (java_lang_reflect_Field*)field;
- java_bytearray *ba = NULL;
+ java_handle_bytearray_t *ba = NULL;
TRACEJVMCALLS("JVM_GetFieldAnnotations: field=%p", field);
jbyteArray JVM_GetMethodAnnotations(JNIEnv *env, jobject method)
{
java_lang_reflect_Method *rm = (java_lang_reflect_Method*)method;
- java_bytearray *ba = NULL;
+ java_handle_bytearray_t *ba = NULL;
TRACEJVMCALLS("JVM_GetMethodAnnotations: method=%p", method);
jbyteArray JVM_GetMethodDefaultAnnotationValue(JNIEnv *env, jobject method)
{
java_lang_reflect_Method *rm = (java_lang_reflect_Method*)method;
- java_bytearray *ba = NULL;
+ java_handle_bytearray_t *ba = NULL;
TRACEJVMCALLS("JVM_GetMethodDefaultAnnotationValue: method=%p", method);
jbyteArray JVM_GetMethodParameterAnnotations(JNIEnv *env, jobject method)
{
java_lang_reflect_Method *rm = (java_lang_reflect_Method*)method;
- java_bytearray *ba = NULL;
+ java_handle_bytearray_t *ba = NULL;
TRACEJVMCALLS("JVM_GetMethodParameterAnnotations: method=%p", method);
log_println("JVM_GetClassAccessFlags: cls=%p", cls);
#endif
- c = (classinfo *) cls;
+ c = LLNI_classinfo_unwrap(cls);
return c->flags & ACC_CLASS_REFLECT_MASK;
}
jint JVM_ConstantPoolGetSize(JNIEnv *env, jobject unused, jobject jcpool)
{
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
TRACEJVMCALLS("JVM_ConstantPoolGetSize: jcpool=%p", jcpool);
return cls->cpcount;
}
jclass JVM_ConstantPoolGetClassAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
{
constant_classref *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
TRACEJVMCALLS("JVM_ConstantPoolGetClassAt: jcpool=%p, index=%d", jcpool, index);
return NULL;
}
- return (jclass)resolve_classref_eager(ref);
+ return LLNI_classinfo_wrap(resolve_classref_eager(ref));
}
{
constant_classref *ref;
classinfo *c = NULL;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
TRACEJVMCALLS("JVM_ConstantPoolGetClassAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
return NULL;
}
- return (jclass)c;
+ return LLNI_classinfo_wrap(c);
}
jobject JVM_ConstantPoolGetMethodAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
{
constant_FMIref *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
TRACEJVMCALLS("JVM_ConstantPoolGetMethodAt: jcpool=%p, index=%d", jcpool, index);
{
constant_FMIref *ref;
classinfo *c = NULL;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
TRACEJVMCALLS("JVM_ConstantPoolGetMethodAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
jobject JVM_ConstantPoolGetFieldAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
{
constant_FMIref *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
TRACEJVMCALLS("JVM_ConstantPoolGetFieldAt: jcpool=%p, index=%d", jcpool, index);
{
constant_FMIref *ref;
classinfo *c;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
TRACEJVMCALLS("JVM_ConstantPoolGetFieldAtIfLoaded: jcpool=%p, index=%d", jcpool, index);
- ref = (constant_FMIref*)class_getconstant(
- (classinfo*)cls, index, CONSTANT_Fieldref);
+ ref = (constant_FMIref*)class_getconstant(cls, index, CONSTANT_Fieldref);
if (ref == NULL) {
return NULL;
jint JVM_ConstantPoolGetIntAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
{
constant_integer *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
TRACEJVMCALLS("JVM_ConstantPoolGetIntAt: jcpool=%p, index=%d", jcpool, index);
jlong JVM_ConstantPoolGetLongAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
{
constant_long *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
TRACEJVMCALLS("JVM_ConstantPoolGetLongAt: jcpool=%p, index=%d", jcpool, index);
jfloat JVM_ConstantPoolGetFloatAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
{
constant_float *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
TRACEJVMCALLS("JVM_ConstantPoolGetFloatAt: jcpool=%p, index=%d", jcpool, index);
jdouble JVM_ConstantPoolGetDoubleAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
{
constant_double *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
TRACEJVMCALLS("JVM_ConstantPoolGetDoubleAt: jcpool=%p, index=%d", jcpool, index);
jstring JVM_ConstantPoolGetStringAt(JNIEnv *env, jobject unused, jobject jcpool, jint index)
{
utf *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
TRACEJVMCALLS("JVM_ConstantPoolGetStringAt: jcpool=%p, index=%d", jcpool, index);
jstring JVM_ConstantPoolGetUTF8At(JNIEnv *env, jobject unused, jobject jcpool, jint index)
{
utf *ref;
- classinfo *cls = (classinfo*)jcpool;
+ classinfo *cls = LLNI_classinfo_unwrap(jcpool);
TRACEJVMCALLS("JVM_ConstantPoolGetUTF8At: jcpool=%p, index=%d", jcpool, index);
jint JVM_GetArrayLength(JNIEnv *env, jobject arr)
{
- java_arrayheader *a;
+ java_array_t *a;
TRACEJVMCALLS("JVM_GetArrayLength(arr=%p)", arr);
- a = (java_arrayheader *) arr;
+ a = (java_array_t *) arr;
if (a == NULL) {
exceptions_throw_nullpointerexception();
jobject JVM_GetArrayElement(JNIEnv *env, jobject arr, jint index)
{
-/* log_println("JVM_GetArrayElement: IMPLEMENT ME!"); */
+ java_array_t *a;
+ int elementtype;
- java_arrayheader *a = NULL;
- int32_t elementtype = 0;
+ TRACEJVMCALLS("JVM_GetArrayElement(env=%p, arr=%p, index=%d)", env, arr, index);
- TRACEJVMCALLS("JVM_GetArrayElement: arr=%p, index=%d", arr, index);
-
- a = (java_arrayheader *) arr;
+ a = (java_array_t *) arr;
if (a == NULL) {
exceptions_throw_nullpointerexception();
}
if (index < 0 || index > a->size) {
- exceptions_new_arrayindexoutofboundsexception(index);
+ exceptions_throw_arrayindexoutofboundsexception();
return NULL;
}
switch (elementtype) {
case ARRAYTYPE_INT:
- return (jobject)primitive_box_int(((java_intarray*)a)->data[index]);
+ return (jobject)primitive_box_int(((java_handle_intarray_t*)a)->data[index]);
case ARRAYTYPE_LONG:
- return (jobject)primitive_box_long(((java_longarray*)a)->data[index]);
+ return (jobject)primitive_box_long(((java_handle_longarray_t*)a)->data[index]);
case ARRAYTYPE_FLOAT:
- return (jobject)primitive_box_float(((java_floatarray*)a)->data[index]);
+ return (jobject)primitive_box_float(((java_handle_floatarray_t*)a)->data[index]);
case ARRAYTYPE_DOUBLE:
- return (jobject)primitive_box_double(((java_doublearray*)a)->data[index]);
+ return (jobject)primitive_box_double(((java_handle_doublearray_t*)a)->data[index]);
case ARRAYTYPE_BYTE:
- return (jobject)primitive_box_byte(((java_bytearray*)a)->data[index]);
+ return (jobject)primitive_box_byte(((java_handle_bytearray_t*)a)->data[index]);
case ARRAYTYPE_CHAR:
- return (jobject)primitive_box_char(((java_chararray*)a)->data[index]);
+ return (jobject)primitive_box_char(((java_handle_chararray_t*)a)->data[index]);
case ARRAYTYPE_SHORT:
- return (jobject)primitive_box_short(((java_shortarray*)a)->data[index]);
+ return (jobject)primitive_box_short(((java_handle_shortarray_t*)a)->data[index]);
case ARRAYTYPE_BOOLEAN:
- return (jobject)primitive_box_boolean(((java_booleanarray*)a)->data[index]);
+ return (jobject)primitive_box_boolean(((java_handle_booleanarray_t*)a)->data[index]);
case ARRAYTYPE_OBJECT:
- return (jobject)((java_objectarray*)a)->data[index];
+ return (jobject)((java_handle_objectarray_t*)a)->data[index];
default:
/* invalid element type */
exceptions_throw_internalerror("invalid element type code in array descriptor: %d", elementtype);
TRACEJVMCALLS("JVM_NewArray(env=%p, eltClass=%p, length=%d)", env, eltClass, length);
- c = (classinfo *) eltClass;
+ c = LLNI_classinfo_unwrap(eltClass);
/* create primitive or object array */
{
classinfo *c;
- c = (classinfo *) class;
+ c = LLNI_classinfo_unwrap(class);
if (!(c->state & CLASS_INITIALIZED))
initialize_class(c);
classinfo *c;
arraydescriptor *ad;
- c = (classinfo *) arrayClass;
+ c = LLNI_classinfo_unwrap(arrayClass);
ad = c->vftbl->arraydesc;
if (ad == NULL) {
classinfo *c;
arraydescriptor *ad;
- c = (classinfo *) arrayClass;
+ c = LLNI_classinfo_unwrap(arrayClass);
ad = c->vftbl->arraydesc;
if (ad == NULL) {
/* for convenience */
- o = (java_lang_Class *) c;
+ o = LLNI_classinfo_wrap(c);
#if defined(WITH_CLASSPATH_GNU)
/* set ProtectionDomain */
## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
## 02110-1301, USA.
##
-## $Id: Makefile.am 8299 2007-08-13 08:41:18Z michi $
+## $Id: Makefile.am 8343 2007-08-17 21:39:32Z michi $
## Process this file with automake to produce Makefile.in
libvm_la_SOURCES = \
access.c \
access.h \
+ array.c \
+ array.h \
builtin.c \
builtin.h \
builtintable.inc \
--- /dev/null
+/* src/vm/array.c - array functions
+
+ Copyright (C) 2007 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.
+
+ $Id: access.c 8318 2007-08-16 10:05:34Z michi $
+
+*/
+
+
+#include "config.h"
+
+#include <stdint.h>
+
+#include "native/llni.h"
+
+#include "vm/array.h"
+#include "vm/global.h"
+#include "vm/vm.h"
+
+
+/* array_element_primitive_get *************************************************
+
+ Returns a primitive element of the given Java array.
+
+*******************************************************************************/
+
+imm_union array_element_primitive_get(java_handle_t *a, int32_t index)
+{
+ vftbl_t *v;
+ int elementtype;
+ imm_union value;
+
+ v = LLNI_vftbl_direct(a);
+
+ elementtype = v->arraydesc->elementtype;
+
+ switch (elementtype) {
+ case ARRAYTYPE_BOOLEAN:
+ value.i = array_booleanarray_element_get(a, index);
+ break;
+ case ARRAYTYPE_BYTE:
+ value.i = array_bytearray_element_get(a, index);
+ break;
+ case ARRAYTYPE_CHAR:
+ value.i = array_chararray_element_get(a, index);
+ break;
+ case ARRAYTYPE_SHORT:
+ value.i = array_shortarray_element_get(a, index);
+ break;
+ case ARRAYTYPE_INT:
+ value.i = array_intarray_element_get(a, index);
+ break;
+ case ARRAYTYPE_LONG:
+ value.l = array_longarray_element_get(a, index);
+ break;
+ case ARRAYTYPE_FLOAT:
+ value.f = array_floatarray_element_get(a, index);
+ break;
+ case ARRAYTYPE_DOUBLE:
+ value.d = array_doublearray_element_get(a, index);
+ break;
+ case ARRAYTYPE_OBJECT:
+ value.a = array_objectarray_element_get(a, index);
+ break;
+
+ default:
+ vm_abort("array_element_primitive_get: invalid array element type %d",
+ elementtype);
+ }
+
+ return value;
+}
+
+
+/* array_xxxarray_element_get **************************************************
+
+ Returns a primitive element of the given Java array.
+
+*******************************************************************************/
+
+#define ARRAY_TYPEARRAY_ELEMENT_GET(name, type) \
+type array_##name##array_element_get(java_handle_t *a, int32_t index) \
+{ \
+ java_handle_##name##array_t *ja; \
+ type value; \
+ \
+ ja = (java_handle_##name##array_t *) a; \
+ \
+ value = LLNI_array_direct(ja, index); \
+ \
+ return value; \
+}
+
+ARRAY_TYPEARRAY_ELEMENT_GET(boolean, uint8_t)
+ARRAY_TYPEARRAY_ELEMENT_GET(byte, int8_t)
+ARRAY_TYPEARRAY_ELEMENT_GET(char, uint16_t)
+ARRAY_TYPEARRAY_ELEMENT_GET(short, int16_t)
+ARRAY_TYPEARRAY_ELEMENT_GET(int, int32_t)
+ARRAY_TYPEARRAY_ELEMENT_GET(long, int64_t)
+ARRAY_TYPEARRAY_ELEMENT_GET(float, float)
+ARRAY_TYPEARRAY_ELEMENT_GET(double, double)
+ARRAY_TYPEARRAY_ELEMENT_GET(object, java_handle_t*)
+
+
+/*
+ * 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:
+ * vim:noexpandtab:sw=4:ts=4:
+ */
--- /dev/null
+/* src/vm/array.h - array functions
+
+ Copyright (C) 2007 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.
+
+ $Id: access.c 8318 2007-08-16 10:05:34Z michi $
+
+*/
+
+
+#ifndef _VM_ARRAY_H
+#define _VM_ARRAY_H
+
+#include "config.h"
+
+#include <stdint.h>
+
+#include "vm/global.h"
+#include "vm/primitive.h"
+
+
+/* array types ****************************************************************/
+
+/* CAUTION: Don't change the numerical values! These constants (with
+ the exception of ARRAYTYPE_OBJECT) are used as indices in the
+ primitive type table. */
+
+#define ARRAYTYPE_INT PRIMITIVETYPE_INT
+#define ARRAYTYPE_LONG PRIMITIVETYPE_LONG
+#define ARRAYTYPE_FLOAT PRIMITIVETYPE_FLOAT
+#define ARRAYTYPE_DOUBLE PRIMITIVETYPE_DOUBLE
+#define ARRAYTYPE_BYTE PRIMITIVETYPE_BYTE
+#define ARRAYTYPE_CHAR PRIMITIVETYPE_CHAR
+#define ARRAYTYPE_SHORT PRIMITIVETYPE_SHORT
+#define ARRAYTYPE_BOOLEAN PRIMITIVETYPE_BOOLEAN
+#define ARRAYTYPE_OBJECT PRIMITIVETYPE_VOID /* don't use as index! */
+
+
+/* function prototypes ********************************************************/
+
+imm_union array_element_primitive_get(java_handle_t *a, int32_t index);
+
+uint8_t array_booleanarray_element_get(java_handle_t *a, int32_t index);
+int8_t array_bytearray_element_get(java_handle_t *a, int32_t index);
+uint16_t array_chararray_element_get(java_handle_t *a, int32_t index);
+int16_t array_shortarray_element_get(java_handle_t *a, int32_t index);
+int32_t array_intarray_element_get(java_handle_t *a, int32_t index);
+int64_t array_longarray_element_get(java_handle_t *a, int32_t index);
+float array_floatarray_element_get(java_handle_t *a, int32_t index);
+double array_doublearray_element_get(java_handle_t *a, int32_t index);
+java_handle_t *array_objectarray_element_get(java_handle_t *a, int32_t index);
+
+#endif /* _VM_ARRAY_H */
+
+
+/*
+ * 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:
+ * vim:noexpandtab:sw=4:ts=4:
+ */
calls instead of machine instructions, using the C calling
convention.
- $Id: builtin.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: builtin.c 8343 2007-08-17 21:39:32Z michi $
*/
#include "toolbox/logging.h"
#include "toolbox/util.h"
+#include "vm/array.h"
#include "vm/builtin.h"
#include "vm/cycles-stats.h"
#include "vm/exceptions.h"
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: global.h 8324 2007-08-16 16:48:12Z michi $
+ $Id: global.h 8343 2007-08-17 21:39:32Z michi $
*/
#define ACC_CLASS_REFLECT_MASK 0x0000ffff/* flags reported by reflection */
-#define ACC_CLASS_PRIMITIVE 0x00010000/* class is a primitive class */
+#define ACC_CLASS_PRIMITIVE 0x00010000
+#define ACC_CLASS_MEMBER 0x00020000
+#define ACC_CLASS_ANONYMOUS 0x00040000
-#define ACC_CLASS_HAS_POINTERS 0x00020000/* instance contains pointers */
+#define ACC_CLASS_HAS_POINTERS 0x00080000/* instance contains pointers */
-#define ACC_CLASS_REFERENCE_MASK 0x001c0000
-#define ACC_CLASS_REFERENCE_SOFT 0x00040000
-#define ACC_CLASS_REFERENCE_WEAK 0x00080000
-#define ACC_CLASS_REFERENCE_PHANTOM 0x00100000
+#define ACC_CLASS_REFERENCE_MASK 0x00700000
+#define ACC_CLASS_REFERENCE_SOFT 0x00100000
+#define ACC_CLASS_REFERENCE_WEAK 0x00200000
+#define ACC_CLASS_REFERENCE_PHANTOM 0x00400000
/* special flags used in methodinfo *******************************************/
#ifndef NDEBUG
bool check_13bit_imm(s8 imm)
{
- s4 check = imm & ~0x1fff;
- if (check == 0) return true; /* pos imm. */
- if (check + 0x1fff == -1) return true; /* neg imm. */
+ s4 sign = (imm >> 12) & 0x1;
+
+ if (sign == 0) {
+ if ((imm & ~0xfff) == 0) return true; /* pos imm. */
+ }
+ else
+ if ((imm & ~0xfff) + 0xfff == -1) return true; /* neg imm. */
- printf("immediate out-of-bounds: %d\n", imm);
+ printf("immediate out-of-bounds: %ld\n", imm);
return false;
}
#endif
if (l == 0) {
M_INTMOVE(s1, REG_ITMP1);
}
- else if (l <= 4095) {
+ else if (-l >= 4096 && -l <= 4095) {
M_ADD_IMM(s1, -l, REG_ITMP1);
}
else {
ICONST(REG_ITMP2, l);
- /* XXX: do I need to truncate s1 to 32-bit ? */
M_SUB(s1, REG_ITMP2, REG_ITMP1);
}
- i = i - l + 1;
+
+ i = i - l + 1; /* number of targets (>0) */
/* range check */
/* debug defines **************************************************************/
#ifndef NDEBUG
-# define PASS13BIT(imm) (imm) & 0x1fff
+# define PASS13BIT(imm) ((((s4)(imm)&0x1fff)<<19)>>19)
#else
-# define PASS13BIT(imm)
+# define PASS13BIT(imm) imm
#endif
} \
else { \
DO_SETHI_PART(disp,rs,rd); \
- M_LDX_INTERN(rd,rd,get_lopart_disp(disp)); \
+ M_LDX_INTERN(rd,rd,PASS13BIT(get_lopart_disp(disp))); \
} \
} while (0)
} \
else { \
DO_SETHI_PART(disp,rs,rd); \
- M_ILD_INTERN(rd,rd,get_lopart_disp(disp)); \
+ M_ILD_INTERN(rd,rd,PASS13BIT(get_lopart_disp(disp))); \
} \
} while (0)
} \
else { \
DO_SETHI_PART(disp,rs,REG_ITMP3); \
- M_STX_INTERN(rd,REG_ITMP3,get_lopart_disp(disp)); \
+ M_STX_INTERN(rd,REG_ITMP3,PASS13BIT(get_lopart_disp(disp))); \
} \
} while (0)
} \
else { \
DO_SETHI_PART(disp,rs,REG_ITMP3); \
- M_IST_INTERN(rd,REG_ITMP3,get_lopart_disp(disp)); \
+ M_IST_INTERN(rd,REG_ITMP3,PASS13BIT(get_lopart_disp(disp))); \
} \
} while (0)
#include "vm/builtin.h"
#include "mm/memory.h"
+#include "vm/array.h"
#include "vm/global.h"
#include "vm/primitive.h"
#include "toolbox/logging.h"
+#include "vm/array.h"
#include "vm/access.h"
#include "vm/builtin.h"
#include "vm/exceptions.h"
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: typecheck.c 8299 2007-08-13 08:41:18Z michi $
+ $Id: typecheck.c 8343 2007-08-17 21:39:32Z michi $
*/
#include "toolbox/logging.h"
#include "vm/access.h"
+#include "vm/array.h"
#include "vm/builtin.h"
#include "vm/exceptions.h"
#include "vm/global.h"
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: typeinfo.c 8299 2007-08-13 08:41:18Z michi $
+ $Id: typeinfo.c 8343 2007-08-17 21:39:32Z michi $
*/
#include <string.h>
#include "mm/memory.h"
+
#include "toolbox/logging.h"
+#include "vm/array.h"
#include "vm/exceptions.h"
#include "vm/primitive.h"
#include "vm/resolve.h"
}
+/* primitive_type_get_by_wrapperclass ******************************************
+
+ Returns the primitive type of the given wrapper-class.
+
+*******************************************************************************/
+
+int primitive_type_get_by_wrapperclass(classinfo *c)
+{
+ int i;
+
+ /* Search primitive table. */
+
+ for (i = 0; i < PRIMITIVETYPE_COUNT; i++)
+ if (primitivetype_table[i].class_wrap == c)
+ return i;
+
+ /* Invalid primitive wrapper-class. */
+
+ return -1;
+}
+
+
/* primitive_box ***************************************************************
Box a primitive of the given type.
*******************************************************************************/
-imm_union primitive_unbox(int type, java_handle_t *o)
+imm_union primitive_unbox(java_handle_t *o)
{
- imm_union value;
+ classinfo *c;
+ int type;
+ imm_union value;
+
+ c = o->vftbl->class;
+
+ type = primitive_type_get_by_wrapperclass(c);
switch (type) {
case PRIMITIVETYPE_BOOLEAN:
#define PRIMITIVETYPE_VOID TYPE_VOID
-/* CAUTION: Don't change the numerical values! These constants (with
- the exception of ARRAYTYPE_OBJECT) are used as indices in the
- primitive type table. */
-
-#define ARRAYTYPE_INT PRIMITIVETYPE_INT
-#define ARRAYTYPE_LONG PRIMITIVETYPE_LONG
-#define ARRAYTYPE_FLOAT PRIMITIVETYPE_FLOAT
-#define ARRAYTYPE_DOUBLE PRIMITIVETYPE_DOUBLE
-#define ARRAYTYPE_BYTE PRIMITIVETYPE_BYTE
-#define ARRAYTYPE_CHAR PRIMITIVETYPE_CHAR
-#define ARRAYTYPE_SHORT PRIMITIVETYPE_SHORT
-#define ARRAYTYPE_BOOLEAN PRIMITIVETYPE_BOOLEAN
-#define ARRAYTYPE_OBJECT PRIMITIVETYPE_VOID /* don't use as index! */
-
-
/* primitivetypeinfo **********************************************************/
struct primitivetypeinfo {
classinfo *primitive_class_get_by_name(utf *name);
classinfo *primitive_class_get_by_type(int type);
classinfo *primitive_class_get_by_char(char ch);
+
classinfo *primitive_arrayclass_get_by_name(utf *name);
classinfo *primitive_arrayclass_get_by_type(int type);
+int primitive_type_get_by_wrapperclass(classinfo *c);
+
java_handle_t *primitive_box(int type, imm_union value);
-imm_union primitive_unbox(int type, java_handle_t *o);
+imm_union primitive_unbox(java_handle_t *o);
java_handle_t *primitive_box_boolean(int32_t value);
java_handle_t *primitive_box_byte(int32_t value);
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: string.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: string.c 8343 2007-08-17 21:39:32Z michi $
*/
#include "threads/lock-common.h"
+#include "vm/array.h"
#include "vm/builtin.h"
#include "vm/exceptions.h"
#include "vm/primitive.h"
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: vm.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: vm.c 8343 2007-08-17 21:39:32Z michi $
*/
}
+#if 0
static void XXusage(void)
{
puts(" -v write state-information");
exit(1);
}
+#endif
/* version *********************************************************************
uint64_t *array;
java_handle_t *param;
classinfo *c;
+ int type;
int32_t i;
int32_t j;
imm_union value;
/* convert the value according to its declared type */
- c = param->vftbl->class;
+ c = param->vftbl->class;
+ type = primitive_type_get_by_wrapperclass(c);
switch (td->decltype) {
case PRIMITIVETYPE_BOOLEAN:
- if (c == class_java_lang_Boolean)
- LLNI_field_get_val((java_lang_Boolean *) param, value, value.i);
- else
+ switch (type) {
+ case PRIMITIVETYPE_BOOLEAN:
+ /* This type is OK. */
+ break;
+ default:
goto illegal_arg;
+ }
break;
case PRIMITIVETYPE_BYTE:
- if (c == class_java_lang_Byte)
- LLNI_field_get_val((java_lang_Byte *) param, value, value.i);
- else
+ switch (type) {
+ case PRIMITIVETYPE_BYTE:
+ /* This type is OK. */
+ break;
+ default:
goto illegal_arg;
+ }
break;
case PRIMITIVETYPE_CHAR:
- if (c == class_java_lang_Character)
- LLNI_field_get_val((java_lang_Character *) param, value, value.i);
- else
+ switch (type) {
+ case PRIMITIVETYPE_CHAR:
+ /* This type is OK. */
+ break;
+ default:
goto illegal_arg;
+ }
break;
case PRIMITIVETYPE_SHORT:
- if (c == class_java_lang_Short)
- LLNI_field_get_val((java_lang_Short *) param, value, value.i);
- else if (c == class_java_lang_Byte)
- LLNI_field_get_val((java_lang_Byte *) param, value, value.i);
- else
+ switch (type) {
+ case PRIMITIVETYPE_BYTE:
+ case PRIMITIVETYPE_SHORT:
+ /* These types are OK. */
+ break;
+ default:
goto illegal_arg;
+ }
break;
case PRIMITIVETYPE_INT:
- if (c == class_java_lang_Integer)
- LLNI_field_get_val((java_lang_Integer *) param, value, value.i);
- else if (c == class_java_lang_Short)
- LLNI_field_get_val((java_lang_Short *) param, value, value.i);
- else if (c == class_java_lang_Byte)
- LLNI_field_get_val((java_lang_Byte *) param, value, value.i);
- else
+ switch (type) {
+ case PRIMITIVETYPE_BYTE:
+ case PRIMITIVETYPE_SHORT:
+ case PRIMITIVETYPE_INT:
+ /* These types are OK. */
+ break;
+ default:
goto illegal_arg;
+ }
break;
default:
- goto illegal_arg;
+ vm_abort("vm_array_from_objectarray: invalid type %d",
+ td->decltype);
}
+ value = primitive_unbox(param);
vm_array_store_int(array, pd, value.i);
break;
if (param == NULL)
goto illegal_arg;
- /* convert the value according to its declared type */
+ c = param->vftbl->class;
+ type = primitive_type_get_by_wrapperclass(c);
- c = param->vftbl->class;
+ assert(td->decltype == PRIMITIVETYPE_LONG);
- switch (td->decltype) {
+ switch (type) {
+ case PRIMITIVETYPE_BYTE:
+ case PRIMITIVETYPE_SHORT:
+ case PRIMITIVETYPE_INT:
case PRIMITIVETYPE_LONG:
- if (c == class_java_lang_Long)
- LLNI_field_get_val((java_lang_Long *) param, value, value.l);
- else if (c == class_java_lang_Integer)
- value.l = (int64_t) LLNI_field_direct(((java_lang_Integer *) param), value);
- else if (c == class_java_lang_Short)
- value.l = (int64_t) LLNI_field_direct(((java_lang_Short *) param), value);
- else if (c == class_java_lang_Byte)
- value.l = (int64_t) LLNI_field_direct(((java_lang_Byte *) param), value);
- else
- goto illegal_arg;
+ /* These types are OK. */
break;
-
default:
goto illegal_arg;
}
+ value = primitive_unbox(param);
vm_array_store_lng(array, pd, value.l);
break;
if (param == NULL)
goto illegal_arg;
- /* convert the value according to its declared type */
+ c = param->vftbl->class;
+ type = primitive_type_get_by_wrapperclass(c);
- c = param->vftbl->class;
+ assert(td->decltype == PRIMITIVETYPE_FLOAT);
- switch (td->decltype) {
+ switch (type) {
case PRIMITIVETYPE_FLOAT:
- if (c == class_java_lang_Float)
- LLNI_field_get_val((java_lang_Float *) param, value, value.f);
- else
- goto illegal_arg;
+ /* This type is OK. */
break;
-
default:
goto illegal_arg;
}
+ value = primitive_unbox(param);
vm_array_store_flt(array, pd, value.l);
break;
if (param == NULL)
goto illegal_arg;
- /* convert the value according to its declared type */
+ c = param->vftbl->class;
+ type = primitive_type_get_by_wrapperclass(c);
- c = param->vftbl->class;
+ assert(td->decltype == PRIMITIVETYPE_DOUBLE);
- switch (td->decltype) {
+ switch (type) {
+ case PRIMITIVETYPE_FLOAT:
case PRIMITIVETYPE_DOUBLE:
- if (c == class_java_lang_Double)
- LLNI_field_get_val((java_lang_Double *) param, value, value.d);
- else if (c == class_java_lang_Float)
- LLNI_field_get_val((java_lang_Float *) param, value, value.f);
- else
- goto illegal_arg;
+ /* These types are OK. */
break;
-
default:
goto illegal_arg;
}
+ value = primitive_unbox(param);
vm_array_store_dbl(array, pd, value.l);
break;
break;
default:
- goto illegal_arg;
+ vm_abort("vm_array_from_objectarray: invalid type %d", td->type);
}
}
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: class.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: class.c 8343 2007-08-17 21:39:32Z michi $
*/
#include "toolbox/logging.h"
+#include "vm/array.h"
#include "vm/builtin.h"
#include "vm/exceptions.h"
#include "vm/global.h"
bool class_load_attributes(classbuffer *cb)
{
- classinfo *c;
- u4 i, j;
- u2 attributes_count;
- u2 attribute_name_index;
- utf *attribute_name;
+ classinfo *c;
+ uint16_t attributes_count;
+ uint16_t attribute_name_index;
+ utf *attribute_name;
+ innerclassinfo *info;
+ classref_or_classinfo inner;
+ classref_or_classinfo outer;
+ utf *name;
+ uint16_t flags;
+ int i, j;
c = cb->class;
for (j = 0; j < c->innerclasscount; j++) {
/* The innerclass structure contains a class with an encoded
name, its defining scope, its simple name and a bitmask of
- the access flags. If an inner class is not a member, its
- outer_class is NULL, if a class is anonymous, its name is
- NULL. */
+ the access flags. */
- innerclassinfo *info = c->innerclass + j;
-
- info->inner_class.ref =
- innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
- info->outer_class.ref =
- innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
- info->name =
- innerclass_getconstant(c, suck_u2(cb), CONSTANT_Utf8);
- info->flags = suck_u2(cb);
+ info = c->innerclass + j;
+
+ inner.ref = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
+ outer.ref = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Class);
+ name = innerclass_getconstant(c, suck_u2(cb), CONSTANT_Utf8);
+ flags = suck_u2(cb);
+
+ /* If the current inner-class is the currently loaded
+ class check for some special flags. */
+
+ if (inner.ref->name == c->name) {
+ /* If an inner-class is not a member, its
+ outer-class is NULL. */
+
+ if (outer.ref != NULL) {
+ c->flags |= ACC_CLASS_MEMBER;
+
+ /* A member class doesn't have an
+ EnclosingMethod attribute, so set the
+ enclosing-class to be the same as the
+ declaring-class. */
+
+ c->declaringclass = outer;
+ c->enclosingclass = outer;
+ }
+
+ /* If an inner-class is anonymous, its name is
+ NULL. */
+
+ if (name == NULL)
+ c->flags |= ACC_CLASS_ANONYMOUS;
+ }
+
+ info->inner_class = inner;
+ info->outer_class = outer;
+ info->name = name;
+ info->flags = flags;
}
}
else if (attribute_name == utf_SourceFile) {
}
+/* class_is_anonymousclass *****************************************************
+
+ Checks if the given class is an anonymous class.
+
+*******************************************************************************/
+
+bool class_is_anonymousclass(classinfo *c)
+{
+ if (c->flags & ACC_CLASS_ANONYMOUS)
+ return true;
+
+ return false;
+}
+
+
/* class_is_array **************************************************************
Checks if the given class is an array class.
}
+/* class_is_localclass *********************************************************
+
+ Checks if the given class is a local class.
+
+*******************************************************************************/
+
+bool class_is_localclass(classinfo *c)
+{
+ if ((c->enclosingmethod != NULL) && !class_is_anonymousclass(c))
+ return true;
+
+ return false;
+}
+
+
+/* class_is_memberclass ********************************************************
+
+ Checks if the given class is a member class.
+
+*******************************************************************************/
+
+bool class_is_memberclass(classinfo *c)
+{
+ if (c->flags & ACC_CLASS_MEMBER)
+ return true;
+
+ return false;
+}
+
+
/* class_get_superclass ********************************************************
Return the super class of the given class. If the super-field is a
}
+/* class_get_componenttype *****************************************************
+
+ Return the component class of the given class. If the given class
+ is not an array, return NULL.
+
+*******************************************************************************/
+
+classinfo *class_get_componenttype(classinfo *c)
+{
+ classinfo *component;
+ arraydescriptor *ad;
+
+ /* XXX maybe we could find a way to do this without linking. */
+ /* This way should be safe and easy, however. */
+
+ if (!(c->state & CLASS_LINKED))
+ if (!link_class(c))
+ return NULL;
+
+ ad = c->vftbl->arraydesc;
+
+ if (ad == NULL)
+ return NULL;
+
+ if (ad->arraytype == ARRAYTYPE_OBJECT)
+ component = ad->componentvftbl->class;
+ else
+ component = primitive_class_get_by_type(ad->arraytype);
+
+ return component;
+}
+
+
/* class_get_declaredclasses ***************************************************
Return an array of declared classes of the given class.
/* Determine number of declared classes. */
for (i = 0; i < c->innerclasscount; i++) {
+ /* Get outer-class. If the inner-class is not a member
+ class, the outer-class is NULL. */
+
outer = c->innerclass[i].outer_class;
- /* Check if outer_class is a classref or a real class and
+ if (outer.any == NULL)
+ continue;
+
+ /* Check if outer-class is a classref or a real class and
get the class name from the structure. */
outername = IS_CLASSREF(outer) ? outer.ref->name : outer.cls->name;
inner = c->innerclass[i].inner_class;
outer = c->innerclass[i].outer_class;
+ /* Get outer-class. If the inner-class is not a member class,
+ the outer-class is NULL. */
+
+ if (outer.any == NULL)
+ continue;
+
/* Check if outer_class is a classref or a real class and get
the class name from the structure. */
classinfo *class_get_declaringclass(classinfo *c)
{
- classref_or_classinfo innercr;
- utf *innername;
- classref_or_classinfo outercr;
- classinfo *outer;
- int16_t i;
+ classref_or_classinfo cr;
+ classinfo *dc;
+
+ /* Get declaring class. */
- /* return NULL for arrayclasses and primitive classes */
+ cr = c->declaringclass;
- if (class_is_primitive(c) || (c->name->text[0] == '['))
+ if (cr.any == NULL)
return NULL;
- /* no innerclasses exist */
+ /* Resolve the class if necessary. */
- if (c->innerclasscount == 0)
- return NULL;
+ if (IS_CLASSREF(cr)) {
+/* dc = resolve_classref_eager(cr.ref); */
+ dc = resolve_classref_or_classinfo_eager(cr, true);
- for (i = 0; i < c->innerclasscount; i++) {
- /* Check if inner_class is a classref or a real class and get
- the class name from the structure. */
+ if (dc == NULL)
+ return NULL;
- innercr = c->innerclass[i].inner_class;
+ /* Store the resolved class in the class structure. */
- innername = IS_CLASSREF(innercr) ?
- innercr.ref->name : innercr.cls->name;
+ cr.cls = dc;
+ }
- /* Is the current innerclass this class? */
+ dc = cr.cls;
- if (innername == c->name) {
- /* Maybe the outer class is not loaded yet. */
+ return dc;
+}
- outercr = c->innerclass[i].outer_class;
- outer = resolve_classref_or_classinfo_eager(outercr, false);
+/* class_get_enclosingclass ****************************************************
- if (outer == NULL)
- return NULL;
+ Return the enclosing class for the given class.
- if (!(outer->state & CLASS_LINKED))
- if (!link_class(outer))
- return NULL;
+*******************************************************************************/
- return outer;
- }
+classinfo *class_get_enclosingclass(classinfo *c)
+{
+ classref_or_classinfo cr;
+ classinfo *ec;
+
+ /* Get enclosing class. */
+
+ cr = c->enclosingclass;
+
+ if (cr.any == NULL)
+ return NULL;
+
+ /* Resolve the class if necessary. */
+
+ if (IS_CLASSREF(cr)) {
+/* ec = resolve_classref_eager(cr.ref); */
+ ec = resolve_classref_or_classinfo_eager(cr, true);
+
+ if (ec == NULL)
+ return NULL;
+
+ /* Store the resolved class in the class structure. */
+
+ cr.cls = ec;
}
- return NULL;
+ ec = cr.cls;
+
+ return ec;
}
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: class.h 8336 2007-08-17 11:09:20Z michi $
+ $Id: class.h 8343 2007-08-17 21:39:32Z michi $
*/
u2 innerclasscount; /* number of inner classes */
innerclassinfo *innerclass;
+ classref_or_classinfo declaringclass;
+
#if defined(ENABLE_JAVASE)
classref_or_classinfo enclosingclass; /* enclosing class */
constant_nameandtype *enclosingmethod; /* enclosing method */
methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *dest, classinfo *referer, bool throwexception);
methodinfo *class_resolveinterfacemethod(classinfo *c, utf *name, utf *dest, classinfo *referer, bool throwexception);
-bool class_issubclass(classinfo *sub, classinfo *super);
-bool class_isanysubclass(classinfo *sub, classinfo *super);
-bool class_is_primitive(classinfo *c);
-bool class_is_array(classinfo *c);
-bool class_is_interface(classinfo *c);
+bool class_issubclass(classinfo *sub, classinfo *super);
+bool class_isanysubclass(classinfo *sub, classinfo *super);
+
+bool class_is_primitive(classinfo *c);
+bool class_is_anonymousclass(classinfo *c);
+bool class_is_array(classinfo *c);
+bool class_is_interface(classinfo *c);
+bool class_is_localclass(classinfo *c);
+bool class_is_memberclass(classinfo *c);
classinfo *class_get_superclass(classinfo *c);
+classinfo *class_get_componenttype(classinfo *c);
java_handle_objectarray_t *class_get_declaredclasses(classinfo *c, bool publicOnly);
classinfo *class_get_declaringclass(classinfo *c);
+classinfo *class_get_enclosingclass(classinfo *c);
java_handle_objectarray_t *class_get_interfaces(classinfo *c);
#if defined(ENABLE_JAVASE)
-utf *class_get_signature(classinfo *c);
+utf *class_get_signature(classinfo *c);
#endif
/* some debugging functions */
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: field.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: field.c 8343 2007-08-17 21:39:32Z michi $
*/
}
-#if defined(ENABLE_ANNOTATIONS)
/* field_get_annotations ******************************************************
Gets a fields' annotations (or NULL if none).
*******************************************************************************/
-java_bytearray *field_get_annotations(fieldinfo *f)
+java_handle_bytearray_t *field_get_annotations(fieldinfo *f)
{
- classinfo *c = f->class;
- int slot = f - c->fields;
- annotation_bytearray_t *ba = NULL;
- java_bytearray *annotations = NULL;
+#if defined(ENABLE_ANNOTATIONS)
+ classinfo *c;
+ int slot;
+ annotation_bytearray_t *ba;
+ java_handle_bytearray_t *annotations;
+
+ c = f->class;
+ slot = f - c->fields;
+ annotations = NULL;
if (c->field_annotations != NULL && c->field_annotations->size > slot) {
ba = c->field_annotations->data[slot];
}
return annotations;
-}
+#else
+ return NULL;
#endif
+}
/* field_printflags ************************************************************
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: field.h 8321 2007-08-16 11:37:25Z michi $
+ $Id: field.h 8343 2007-08-17 21:39:32Z michi $
*/
classinfo *field_get_type(fieldinfo *f);
void field_free(fieldinfo *f);
-#if defined(ENABLE_ANNOTATIONS)
-java_bytearray *field_get_annotations(fieldinfo *f);
-#endif
+java_handle_bytearray_t *field_get_annotations(fieldinfo *f);
#if !defined(NDEBUG)
void field_printflags(fieldinfo *f);
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: linker.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: linker.c 8343 2007-08-17 21:39:32Z michi $
*/
#include "toolbox/logging.h"
#include "vm/access.h"
+#include "vm/array.h"
#include "vm/exceptions.h"
#include "vm/primitive.h"
#include "vm/stringlocal.h"
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: linker.h 8299 2007-08-13 08:41:18Z michi $
+ $Id: linker.h 8343 2007-08-17 21:39:32Z michi $
*/
interfacetablelength = 4
| ... | +----------+
- +-----------+ | method 2 |---> method z
- | class | | method 1 |---> method y
- +-----------+ | method 0 |---> method x
- | ivftbl 0 |----------> +----------+
- vftblptr ---> +-----------+
+ +-----------+ | method 2 |---> method z
+ | class | | method 1 |---> method y
+ +-----------+ | method 0 |---> method x
+ | ivftbl 0 |----------> +----------+
+ vftblptr ---> +-----------+
| ivftbl -1 |--> NULL +----------+
| ivftbl -2 |--> NULL | method 1 |---> method x
| ivftbl -3 |-----+ | method 0 |---> method a
+-----------+ +----> +----------+
+---------------+
- | length 3 = 2 |
- | length 2 = 0 |
- | length 1 = 0 |
- | length 0 = 3 |
- interfacevftbllength ---> +---------------+
+ | length 3 = 2 |
+ | length 2 = 0 |
+ | length 1 = 0 |
+ | length 0 = 3 |
+ interfacevftbllength ---> +---------------+
*******************************************************************************/
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: loader.c 8335 2007-08-17 11:04:35Z michi $
+ $Id: loader.c 8343 2007-08-17 21:39:32Z michi $
*/
RT_TIMING_GET_TIME(time_java);
- c = (classinfo *) o;
+ c = LLNI_classinfo_unwrap(o);
if (c != NULL) {
/* Store this class in the loaded class cache. If another
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: method.c 8321 2007-08-16 11:37:25Z michi $
+ $Id: method.c 8343 2007-08-17 21:39:32Z michi $
*/
}
-#if defined(ENABLE_ANNOTATIONS)
/* method_get_annotations ******************************************************
Gets a methods' annotations (or NULL if none).
*******************************************************************************/
-java_bytearray *method_get_annotations(methodinfo *m)
+java_handle_bytearray_t *method_get_annotations(methodinfo *m)
{
- classinfo *c = m->class;
- int slot = m - c->methods;
- annotation_bytearray_t *ba = NULL;
- java_bytearray *annotations = NULL;
+#if defined(ENABLE_ANNOTATIONS)
+ classinfo *c;
+ int slot;
+ annotation_bytearray_t *ba;
+ java_handle_bytearray_t *annotations;
+
+ c = m->class;
+ slot = m - c->methods;
+ annotations = NULL;
if (c->method_annotations != NULL && c->method_annotations->size > slot) {
ba = c->method_annotations->data[slot];
}
return annotations;
+#else
+ return NULL;
+#endif
}
*******************************************************************************/
-java_bytearray *method_get_parameterannotations(methodinfo *m)
+java_handle_bytearray_t *method_get_parameterannotations(methodinfo *m)
{
- classinfo *c = m->class;
- int slot = m - c->methods;
- annotation_bytearray_t *ba = NULL;
- java_bytearray *parameterAnnotations = NULL;
+#if defined(ENABLE_ANNOTATIONS)
+ classinfo *c;
+ int slot;
+ annotation_bytearray_t *ba;
+ java_handle_bytearray_t *parameterAnnotations;
+
+ c = m->class;
+ slot = m - c->methods;
+ parameterAnnotations = NULL;
if (c->method_parameterannotations != NULL &&
c->method_parameterannotations->size > slot) {
}
return parameterAnnotations;
+#else
+ return NULL;
+#endif
}
*******************************************************************************/
-java_bytearray *method_get_annotationdefault(methodinfo *m)
+java_handle_bytearray_t *method_get_annotationdefault(methodinfo *m)
{
- classinfo *c = m->class;
- int slot = m - c->methods;
- annotation_bytearray_t *ba = NULL;
- java_bytearray *annotationDefault = NULL;
+#if defined(ENABLE_ANNOTATIONS)
+ classinfo *c;
+ int slot;
+ annotation_bytearray_t *ba;
+ java_handle_bytearray_t *annotationDefault;
+
+ c = m->class;
+ slot = m - c->methods;
+ annotationDefault = NULL;
if (c->method_annotationdefaults != NULL &&
c->method_annotationdefaults->size > slot) {
}
return annotationDefault;
-}
+#else
+ return NULL;
#endif
+}
/* method_add_to_worklist ******************************************************
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: method.h 8321 2007-08-16 11:37:25Z michi $
+ $Id: method.h 8343 2007-08-17 21:39:32Z michi $
*/
s4 method_count_implementations(methodinfo *m, classinfo *c, methodinfo **found);
-#if defined(ENABLE_ANNOTATIONS)
-java_bytearray *method_get_annotations(methodinfo *m);
-java_bytearray *method_get_parameterannotations(methodinfo *m);
-java_bytearray *method_get_annotationdefault(methodinfo *m);
-#endif
+java_handle_bytearray_t *method_get_annotations(methodinfo *m);
+java_handle_bytearray_t *method_get_parameterannotations(methodinfo *m);
+java_handle_bytearray_t *method_get_annotationdefault(methodinfo *m);
#if !defined(NDEBUG)
void method_printflags(methodinfo *m);
##
## Authors: Christian Thalinger
##
-## $Id: Makefile.am 7441 2007-03-02 23:13:10Z michi $
+## $Id: Makefile.am 8343 2007-08-17 21:39:32Z michi $
## Process this file with automake to produce Makefile.in
$(srcdir)/clinitexception.java \
$(srcdir)/LoadDisplacementOverflow.java \
$(srcdir)/FieldDisplacementOverflow.java \
- $(srcdir)/StackDisplacementOverflow.java
+ $(srcdir)/StackDisplacementOverflow.java \
+ $(srcdir)/MinimalClassReflection.java
EXTRA_DIST = \
$(SOURCE_FILES) \
clinitexception.2output \
LoadDisplacementOverflow.output \
FieldDisplacementOverflow.output \
- StackDisplacementOverflow.output
+ StackDisplacementOverflow.output \
+ MinimalClassReflection.output
CLEANFILES = \
*.class \
clinitexception \
LoadDisplacementOverflow \
FieldDisplacementOverflow \
- StackDisplacementOverflow
+ StackDisplacementOverflow \
+ MinimalClassReflection
check: build $(SIMPLE_JAVA_TESTS) $(OUTPUT_JAVA_TESTS)
--- /dev/null
+/* tests/regression/MinimalClassReflection.java - checks most some of the
+ reflective methods onto java.lang.Class
+
+ 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,
+ 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: Mathias Panzenböck
+
+ $Id$
+
+*/
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Constructor;
+
+public class MinimalClassReflection {
+ public static void printClassInfo(String header, Class<?> cls) {
+ Class<?> clazz;
+ Constructor<?> constr;
+ Method method;
+
+ p("---------------------- %s ----------------------", header);
+ p("is local: %s", cls.isLocalClass());
+ p("is anonymous: %s", cls.isAnonymousClass());
+ p("is member: %s", cls.isMemberClass());
+ p("name: %s", cls.getName());
+ p("simple name: %s", cls.getSimpleName());
+ p("canonical name: %s", cls.getCanonicalName());
+
+ clazz = cls.getSuperclass();
+ p("super class: %s",
+ (clazz == null ? "null" : clazz.getName()));
+
+ clazz = cls.getDeclaringClass();
+ p("declaring class: %s",
+ (clazz == null ? "null" : clazz.getName()));
+
+ clazz = cls.getEnclosingClass();
+ p("enclosing class: %s",
+ (clazz == null ? "null" : clazz.getName()));
+
+ constr = cls.getEnclosingConstructor();
+ p("enclosing constructor: %s",
+ (constr == null ? "null" :
+ constr.getDeclaringClass().getName() +
+ "." + constr.getName()));
+
+ method = cls.getEnclosingMethod();
+ p("enclosing method: %s",
+ (method == null ? "null" :
+ method.getDeclaringClass().getName() +
+ "." + method.getName()));
+
+ p();
+ }
+
+ public static void main(String[] args) {
+ class ALocalClass {
+ class AMemberClass {
+ }
+
+ public ALocalClass() {
+ class AnotherLocalClass {
+ }
+
+ printClassInfo(
+ "test a member class",
+ AMemberClass.class);
+
+ printClassInfo(
+ "test a anonymous class derived from a member class",
+ new AMemberClass() {}.getClass());
+
+ printClassInfo(
+ "test a local class (local to a constructor)",
+ AnotherLocalClass.class);
+
+ printClassInfo(
+ "test a anonymous class derived from a local " +
+ "class (local to a constructor)",
+ new AnotherLocalClass() {}.getClass());
+ }
+ }
+
+ printClassInfo(
+ "test a normal class",
+ MinimalClassReflection.class);
+
+ printClassInfo(
+ "test a local class (local to a method)",
+ ALocalClass.class);
+
+ printClassInfo(
+ "test a anonymous class",
+ new Object() {}.getClass());
+
+ printClassInfo(
+ "test a anonymous class derived from a local class" +
+ " (local to a method)",
+ new ALocalClass() {}.getClass());
+
+ new ALocalClass();
+ }
+
+ public static void p(String fmt, Object... args) {
+ System.out.printf(fmt + "\n", args);
+ }
+
+ public static <T> void p(T o) {
+ System.out.println(o);
+ }
+
+ public static void p() {
+ System.out.println();
+ }
+}
--- /dev/null
+---------------------- test a normal class ----------------------
+is local: false
+is anonymous: false
+is member: false
+name: MinimalClassReflection
+simple name: MinimalClassReflection
+canonical name: MinimalClassReflection
+super class: java.lang.Object
+declaring class: null
+enclosing class: null
+enclosing constructor: null
+enclosing method: null
+
+---------------------- test a local class (local to a method) ----------------------
+is local: true
+is anonymous: false
+is member: false
+name: MinimalClassReflection$1ALocalClass
+simple name: ALocalClass
+canonical name: null
+super class: java.lang.Object
+declaring class: null
+enclosing class: MinimalClassReflection
+enclosing constructor: null
+enclosing method: MinimalClassReflection.main
+
+---------------------- test a anonymous class ----------------------
+is local: false
+is anonymous: true
+is member: false
+name: MinimalClassReflection$1
+simple name:
+canonical name: null
+super class: java.lang.Object
+declaring class: null
+enclosing class: MinimalClassReflection
+enclosing constructor: null
+enclosing method: MinimalClassReflection.main
+
+---------------------- test a member class ----------------------
+is local: false
+is anonymous: false
+is member: true
+name: MinimalClassReflection$1ALocalClass$AMemberClass
+simple name: AMemberClass
+canonical name: null
+super class: java.lang.Object
+declaring class: MinimalClassReflection$1ALocalClass
+enclosing class: MinimalClassReflection$1ALocalClass
+enclosing constructor: null
+enclosing method: null
+
+---------------------- test a anonymous class derived from a member class ----------------------
+is local: false
+is anonymous: true
+is member: false
+name: MinimalClassReflection$1ALocalClass$1
+simple name:
+canonical name: null
+super class: MinimalClassReflection$1ALocalClass$AMemberClass
+declaring class: null
+enclosing class: MinimalClassReflection$1ALocalClass
+enclosing constructor: MinimalClassReflection$1ALocalClass.MinimalClassReflection$1ALocalClass
+enclosing method: null
+
+---------------------- test a local class (local to a constructor) ----------------------
+is local: true
+is anonymous: false
+is member: false
+name: MinimalClassReflection$1ALocalClass$1AnotherLocalClass
+simple name: AnotherLocalClass
+canonical name: null
+super class: java.lang.Object
+declaring class: null
+enclosing class: MinimalClassReflection$1ALocalClass
+enclosing constructor: MinimalClassReflection$1ALocalClass.MinimalClassReflection$1ALocalClass
+enclosing method: null
+
+---------------------- test a anonymous class derived from a local class (local to a constructor) ----------------------
+is local: false
+is anonymous: true
+is member: false
+name: MinimalClassReflection$1ALocalClass$2
+simple name:
+canonical name: null
+super class: MinimalClassReflection$1ALocalClass$1AnotherLocalClass
+declaring class: null
+enclosing class: MinimalClassReflection$1ALocalClass
+enclosing constructor: MinimalClassReflection$1ALocalClass.MinimalClassReflection$1ALocalClass
+enclosing method: null
+
+---------------------- test a anonymous class derived from a local class (local to a method) ----------------------
+is local: false
+is anonymous: true
+is member: false
+name: MinimalClassReflection$2
+simple name:
+canonical name: null
+super class: MinimalClassReflection$1ALocalClass
+declaring class: null
+enclosing class: MinimalClassReflection
+enclosing constructor: null
+enclosing method: MinimalClassReflection.main
+
+---------------------- test a member class ----------------------
+is local: false
+is anonymous: false
+is member: true
+name: MinimalClassReflection$1ALocalClass$AMemberClass
+simple name: AMemberClass
+canonical name: null
+super class: java.lang.Object
+declaring class: MinimalClassReflection$1ALocalClass
+enclosing class: MinimalClassReflection$1ALocalClass
+enclosing constructor: null
+enclosing method: null
+
+---------------------- test a anonymous class derived from a member class ----------------------
+is local: false
+is anonymous: true
+is member: false
+name: MinimalClassReflection$1ALocalClass$1
+simple name:
+canonical name: null
+super class: MinimalClassReflection$1ALocalClass$AMemberClass
+declaring class: null
+enclosing class: MinimalClassReflection$1ALocalClass
+enclosing constructor: MinimalClassReflection$1ALocalClass.MinimalClassReflection$1ALocalClass
+enclosing method: null
+
+---------------------- test a local class (local to a constructor) ----------------------
+is local: true
+is anonymous: false
+is member: false
+name: MinimalClassReflection$1ALocalClass$1AnotherLocalClass
+simple name: AnotherLocalClass
+canonical name: null
+super class: java.lang.Object
+declaring class: null
+enclosing class: MinimalClassReflection$1ALocalClass
+enclosing constructor: MinimalClassReflection$1ALocalClass.MinimalClassReflection$1ALocalClass
+enclosing method: null
+
+---------------------- test a anonymous class derived from a local class (local to a constructor) ----------------------
+is local: false
+is anonymous: true
+is member: false
+name: MinimalClassReflection$1ALocalClass$2
+simple name:
+canonical name: null
+super class: MinimalClassReflection$1ALocalClass$1AnotherLocalClass
+declaring class: null
+enclosing class: MinimalClassReflection$1ALocalClass
+enclosing constructor: MinimalClassReflection$1ALocalClass.MinimalClassReflection$1ALocalClass
+enclosing method: null
+