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

Reply via email to