Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- include/vm/class.h | 20 ++++++++++++++++++++ include/vm/preload.h | 8 ++++++++ vm/jato.c | 28 +++++++++++++++++++++++++--- vm/preload.c | 15 +++++++++++++++ 4 files changed, 68 insertions(+), 3 deletions(-)
diff --git a/include/vm/class.h b/include/vm/class.h index 722d3db..bf18b5e 100644 --- a/include/vm/class.h +++ b/include/vm/class.h @@ -97,6 +97,26 @@ static inline int vm_class_ensure_init(struct vm_class *vmc) return vm_class_init(vmc); } +static inline bool vm_class_is_public(const struct vm_class *vmc) +{ + return vmc->class->access_flags & CAFEBABE_CLASS_ACC_PUBLIC; +} + +static inline bool vm_class_is_private(const struct vm_class *vmc) +{ + return vmc->class->access_flags & CAFEBABE_CLASS_ACC_PRIVATE; +} + +static inline bool vm_class_is_protected(const struct vm_class *vmc) +{ + return vmc->class->access_flags & CAFEBABE_CLASS_ACC_PROTECTED; +} + +static inline bool vm_class_is_static(const struct vm_class *vmc) +{ + return vmc->class->access_flags & CAFEBABE_CLASS_ACC_STATIC; +} + static inline bool vm_class_is_abstract(const struct vm_class *vmc) { return vmc->class->access_flags & CAFEBABE_CLASS_ACC_ABSTRACT; diff --git a/include/vm/preload.h b/include/vm/preload.h index 0617ba6..2ed913f 100644 --- a/include/vm/preload.h +++ b/include/vm/preload.h @@ -48,6 +48,7 @@ extern struct vm_class *vm_java_lang_Long; extern struct vm_class *vm_java_lang_Short; extern struct vm_class *vm_java_lang_IllegalArgumentException; extern struct vm_class *vm_java_lang_ClassLoader; +extern struct vm_class *vm_java_lang_reflect_Modifier; extern struct vm_class *vm_boolean_class; extern struct vm_class *vm_char_class; extern struct vm_class *vm_float_class; @@ -80,6 +81,13 @@ extern struct vm_field *vm_java_lang_reflect_Field_slot; extern struct vm_field *vm_java_lang_reflect_Method_declaringClass; extern struct vm_field *vm_java_lang_reflect_Method_name; extern struct vm_field *vm_java_lang_reflect_Method_slot; +extern struct vm_field *vm_java_lang_reflect_Modifier_PUBLIC; +extern struct vm_field *vm_java_lang_reflect_Modifier_PRIVATE; +extern struct vm_field *vm_java_lang_reflect_Modifier_PROTECTED; +extern struct vm_field *vm_java_lang_reflect_Modifier_STATIC; +extern struct vm_field *vm_java_lang_reflect_Modifier_FINAL; +extern struct vm_field *vm_java_lang_reflect_Modifier_ABSTRACT; +extern struct vm_field *vm_java_lang_reflect_Modifier_INTERFACE; extern struct vm_method *vm_java_util_Properties_setProperty; extern struct vm_method *vm_java_lang_Throwable_initCause; diff --git a/vm/jato.c b/vm/jato.c index 6d1ac6b..0d32645 100644 --- a/vm/jato.c +++ b/vm/jato.c @@ -607,10 +607,32 @@ native_vmclass_isprimitive(struct vm_object *object) static jint native_vmclass_getmodifiers(struct vm_object *clazz) { - struct vm_class *class = vm_class_get_class_from_class_object(clazz); + struct vm_class *vmc = to_vmclass(clazz); + if (!vmc) + return 0; + + jint flags = 0; + + if (vm_class_ensure_init(vm_java_lang_reflect_Modifier)) + return 0; + + if (vm_class_is_public(vmc)) + flags |= static_field_get_int(vm_java_lang_reflect_Modifier_PUBLIC); + else if (vm_class_is_private(vmc)) + flags |= static_field_get_int(vm_java_lang_reflect_Modifier_PRIVATE); + else if (vm_class_is_protected(vmc)) + flags |= static_field_get_int(vm_java_lang_reflect_Modifier_PROTECTED); + + if (vm_class_is_interface(vmc)) + flags |= static_field_get_int(vm_java_lang_reflect_Modifier_INTERFACE); + + if (vm_class_is_abstract(vmc)) + flags |= static_field_get_int(vm_java_lang_reflect_Modifier_ABSTRACT); + + if (vm_class_is_static(vmc)) + flags |= static_field_get_int(vm_java_lang_reflect_Modifier_STATIC); - NOT_IMPLEMENTED; - return class->class->access_flags; + return flags; } static struct vm_object * diff --git a/vm/preload.c b/vm/preload.c index 4d477db..eb69b0d 100644 --- a/vm/preload.c +++ b/vm/preload.c @@ -89,6 +89,7 @@ struct vm_class *vm_java_lang_Integer; struct vm_class *vm_java_lang_Long; struct vm_class *vm_java_lang_Short; struct vm_class *vm_java_lang_VMString; +struct vm_class *vm_java_lang_reflect_Modifier; struct vm_class *vm_boolean_class; struct vm_class *vm_char_class; struct vm_class *vm_float_class; @@ -148,6 +149,7 @@ static const struct preload_entry preload_entries[] = { { "java/lang/Long", &vm_java_lang_Long }, { "java/lang/ClassLoader", &vm_java_lang_ClassLoader}, { "java/lang/VMString", &vm_java_lang_VMString}, + { "java/lang/reflect/Modifier", &vm_java_lang_reflect_Modifier}, }; static const struct preload_entry primitive_preload_entries[] = { @@ -191,6 +193,13 @@ struct vm_field *vm_java_lang_reflect_Field_slot; struct vm_field *vm_java_lang_reflect_Method_declaringClass; struct vm_field *vm_java_lang_reflect_Method_name; struct vm_field *vm_java_lang_reflect_Method_slot; +struct vm_field *vm_java_lang_reflect_Modifier_PUBLIC; +struct vm_field *vm_java_lang_reflect_Modifier_PRIVATE; +struct vm_field *vm_java_lang_reflect_Modifier_PROTECTED; +struct vm_field *vm_java_lang_reflect_Modifier_STATIC; +struct vm_field *vm_java_lang_reflect_Modifier_FINAL; +struct vm_field *vm_java_lang_reflect_Modifier_ABSTRACT; +struct vm_field *vm_java_lang_reflect_Modifier_INTERFACE; static const struct field_preload_entry field_preload_entries[] = { { &vm_java_lang_Class, "vmdata", "Ljava/lang/Object;", &vm_java_lang_Class_vmdata }, @@ -216,6 +225,12 @@ static const struct field_preload_entry field_preload_entries[] = { { &vm_java_lang_reflect_Method, "declaringClass", "Ljava/lang/Class;", &vm_java_lang_reflect_Method_declaringClass }, { &vm_java_lang_reflect_Method, "slot", "I", &vm_java_lang_reflect_Method_slot }, { &vm_java_lang_reflect_Method, "name", "Ljava/lang/String;", &vm_java_lang_reflect_Method_name }, + { &vm_java_lang_reflect_Modifier, "PUBLIC", "I", &vm_java_lang_reflect_Modifier_PUBLIC }, + { &vm_java_lang_reflect_Modifier, "PROTECTED", "I", &vm_java_lang_reflect_Modifier_PROTECTED }, + { &vm_java_lang_reflect_Modifier, "PRIVATE", "I", &vm_java_lang_reflect_Modifier_PRIVATE }, + { &vm_java_lang_reflect_Modifier, "ABSTRACT", "I", &vm_java_lang_reflect_Modifier_ABSTRACT }, + { &vm_java_lang_reflect_Modifier, "INTERFACE", "I", &vm_java_lang_reflect_Modifier_INTERFACE }, + { &vm_java_lang_reflect_Modifier, "STATIC", "I", &vm_java_lang_reflect_Modifier_STATIC }, }; struct method_preload_entry { -- 1.6.0.6 ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel