Signed-off-by: Tomek Grabiec <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel