* src/vm/method.h (methodinfo): Added signature.
authortwisti <none@none>
Wed, 8 Nov 2006 22:00:57 +0000 (22:00 +0000)
committertwisti <none@none>
Wed, 8 Nov 2006 22:00:57 +0000 (22:00 +0000)
* src/vm/field.h (fieldinfo): Added signature.
* src/vm/loader.c (load_method): Load signature attribute.
(load_field): Likewise.
* src/native/vm/java_lang_reflect_Method.c (getSignature):
Implemented.
* src/native/vm/java_lang_reflect_Field.c (getSignature): Likewise.

src/native/vm/java_lang_reflect_Field.c
src/native/vm/java_lang_reflect_Method.c
src/vm/field.h
src/vm/loader.c
src/vm/method.h

index 6153218596e44efb556a16c8d680d202233ab814..7a6ebe0f7725ae1a0379f6a3fbdb81254a7d916b 100644 (file)
@@ -1,4 +1,4 @@
-/* src/native/vm/Field.c - java/lang/reflect/Field
+/* src/native/vm/java_lang_reflect_Field.c - java/lang/reflect/Field
 
    Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    Contact: cacao@cacaojvm.org
 
    Authors: Roman Obermaiser
-
-   Changes: Joseph Wenninger
+            Joseph Wenninger
             Christian Thalinger
 
-   $Id: java_lang_reflect_Field.c 5224 2006-08-08 19:18:49Z edwin $
+   $Id: java_lang_reflect_Field.c 5937 2006-11-08 22:00:57Z twisti $
 
 */
 
@@ -137,6 +136,47 @@ static void *cacao_get_field_address(java_lang_reflect_Field *this,
 }
 
 
+/*
+ * Class:     java/lang/reflect/Field
+ * Method:    getModifiersInternal
+ * Signature: ()I
+ */
+JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getModifiersInternal(JNIEnv *env, java_lang_reflect_Field *this)
+{
+       classinfo *c;
+       fieldinfo *f;
+
+       c = (classinfo *) this->declaringClass;
+       f = &(c->fields[this->slot]);
+
+       return f->flags;
+}
+
+
+/*
+ * Class:     java/lang/reflect/Field
+ * Method:    getType
+ * Signature: ()Ljava/lang/Class;
+ */
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_reflect_Field_getType(JNIEnv *env, java_lang_reflect_Field *this)
+{
+       classinfo *c;
+       typedesc  *desc;
+       classinfo *ret;
+
+       c    = (classinfo *) this->declaringClass;
+       desc = c->fields[this->slot].parseddesc;
+
+       if (desc == NULL)
+               return NULL;
+
+       if (!resolve_class_from_typedesc(desc, true, false, &ret))
+               return NULL;
+       
+       return (java_lang_Class *) ret;
+}
+
+
 /*
  * Class:     java/lang/reflect/Field
  * Method:    get
@@ -1158,42 +1198,28 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setDouble(JNIEnv *env, java_
 
 /*
  * Class:     java/lang/reflect/Field
- * Method:    getType
- * Signature: ()Ljava/lang/Class;
+ * Method:    getSignature
+ * Signature: ()Ljava/lang/String;
  */
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_reflect_Field_getType(JNIEnv *env, java_lang_reflect_Field *this)
+JNIEXPORT java_lang_String* JNICALL Java_java_lang_reflect_Field_getSignature(JNIEnv *env, java_lang_reflect_Field* this)
 {
-       classinfo *c;
-       typedesc  *desc;
-       classinfo *ret;
+       classinfo        *c;
+       fieldinfo        *f;
+       java_lang_String *s;
+
+       /* get the class and the field */
 
        c = (classinfo *) this->declaringClass;
-       desc = c->fields[this->slot].parseddesc;
+       f = &c->fields[this->slot];
 
-       if (!desc)
+       if (f->signature == NULL)
                return NULL;
 
-       if (!resolve_class_from_typedesc(desc, true, false, &ret))
-               return NULL;
-       
-       return (java_lang_Class *) ret;
-}
+       s = javastring_new(f->signature);
 
+       /* in error case, s == NULL */
 
-/*
- * Class:     java/lang/reflect/Field
- * Method:    getModifiersInternal
- * Signature: ()I
- */
-JNIEXPORT s4 JNICALL Java_java_lang_reflect_Field_getModifiersInternal(JNIEnv *env, java_lang_reflect_Field *this)
-{
-       classinfo *c;
-       fieldinfo *f;
-
-       c = (classinfo *) this->declaringClass;
-       f = &(c->fields[this->slot]);
-
-       return f->flags;
+       return s;
 }
 
 
index 7e639af751cc7477fc9bc4d9ac6409b7ab985e21..919754ed9a9aab117c3220305c02b461dfd9e17f 100644 (file)
    Contact: cacao@cacaojvm.org
 
    Authors: Roman Obermaiser
-
-   Changes: Joseph Wenninger
+            Joseph Wenninger
             Christian Thalinger
 
-   $Id: java_lang_reflect_Method.c 5225 2006-08-08 19:23:44Z edwin $
+   $Id: java_lang_reflect_Method.c 5937 2006-11-08 22:00:57Z twisti $
 
 */
 
@@ -154,6 +153,31 @@ JNIEXPORT java_lang_Object* JNICALL Java_java_lang_reflect_Method_invokeNative(J
 }
 
 
+/*
+ * Class:     java/lang/reflect/Method
+ * Method:    getSignature
+ * Signature: ()Ljava/lang/String;
+ */
+JNIEXPORT java_lang_String* JNICALL Java_java_lang_reflect_Method_getSignature(JNIEnv *env, java_lang_reflect_Method* this)
+{
+       classinfo        *c;
+       methodinfo       *m;
+       java_lang_String *s;
+
+       c = (classinfo *) this->declaringClass;
+       m = &(c->methods[this->slot]);
+
+       if (m->signature == NULL)
+               return NULL;
+
+       s = javastring_new(m->signature);
+
+       /* in error case, s == NULL */
+
+       return s;
+}
+
+
 /*
  * 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
index 000b5ae2a4dbe813986998814a9235acb058b069..37df985a133c27c0504a6b97e06f7bdd22dd1efc 100644 (file)
    Contact: cacao@cacaojvm.org
 
    Authors: Reinhard Grafl
+            Christian Thalinger
 
-   Changes: Christian Thalinger
-
-   $Id: field.h 4758 2006-04-12 17:51:10Z edwin $
+   $Id: field.h 5937 2006-11-08 22:00:57Z twisti $
 */
 
 
@@ -60,6 +59,7 @@ struct fieldinfo {          /* field of a class                                 */
        s4         type;      /* basic data type                                  */
        utf       *name;      /* name of field                                    */
        utf       *descriptor;/* JavaVM descriptor string of field                */
+       utf       *signature; /* Signature attribute string                       */
        typedesc  *parseddesc;/* parsed descriptor                                */
 
        s4         offset;    /* offset from start of object (instance variables) */
index c992a7ea9ddaec3e9deff89dc786ef1b00c9a41c..60c75e76ce4cc02692daf00216fd9ec5f5790138 100644 (file)
@@ -31,7 +31,7 @@
             Edwin Steiner
             Christian Thalinger
 
-   $Id: loader.c 5919 2006-11-05 21:18:05Z twisti $
+   $Id: loader.c 5937 2006-11-08 22:00:57Z twisti $
 
 */
 
@@ -909,18 +909,21 @@ static bool load_field(classbuffer *cb, fieldinfo *f, descriptor_pool *descpool)
                                return false;
 
                        /* check attribute length */
+
                        if (suck_u4(cb) != 2) {
                                exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
                                return false;
                        }
                        
                        /* constant value attribute */
+
                        if (pindex != field_load_NOVALUE) {
                                exceptions_throw_classformaterror(c, "Multiple ConstantValue attributes");
                                return false;
                        }
                        
-                       /* index of value in constantpool */            
+                       /* index of value in constantpool */
+
                        pindex = suck_u2(cb);
                
                        /* initialize field with value from constantpool */             
@@ -976,8 +979,27 @@ static bool load_field(classbuffer *cb, fieldinfo *f, descriptor_pool *descpool)
                        default: 
                                log_text("Invalid Constant - Type");
                        }
+               }
+               else if (u == utf_Signature) {
+                       if (!suck_check_classbuffer_size(cb, 4 + 2))
+                               return false;
 
-               } else {
+                       /* check attribute length */
+
+                       if (suck_u4(cb) != 2) {
+                               exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
+                               return false;
+                       }
+
+                       if (f->signature != NULL) {
+                               exceptions_throw_classformaterror(c, "Multiple Signature attributes");
+                               return false;
+                       }
+
+                       if (!(f->signature = class_getconstant(c, suck_u2(cb), CONSTANT_Utf8)))
+                               return false;
+               }
+               else {
                        /* unknown attribute */
                        if (!skipattributebody(cb))
                                return false;
@@ -1244,8 +1266,8 @@ static bool load_method(classbuffer *cb, methodinfo *m, descriptor_pool *descpoo
                                                return false;
                                }
                        }
-
-               else if (aname == utf_Exceptions) {
+               }
+               else if (aname == utf_Exceptions) {
                        s4 j;
 
                        if (m->thrownexceptions) {
@@ -1270,8 +1292,27 @@ static bool load_method(classbuffer *cb, methodinfo *m, descriptor_pool *descpoo
                                          (utf*) class_getconstant(c, suck_u2(cb), CONSTANT_Class)))
                                        return false;
                        }
-                               
-               } else {
+               }
+               else if (aname == utf_Signature) {
+                       if (!suck_check_classbuffer_size(cb, 4 + 2))
+                               return false;
+
+                       /* check attribute length */
+
+                       if (suck_u4(cb) != 2) {
+                               exceptions_throw_classformaterror(c, "Wrong size for VALUE attribute");
+                               return false;
+                       }
+
+                       if (m->signature != NULL) {
+                               exceptions_throw_classformaterror(c, "Multiple Signature attributes");
+                               return false;
+                       }
+
+                       if (!(m->signature = class_getconstant(c, suck_u2(cb), CONSTANT_Utf8)))
+                               return false;
+               }
+               else {
                        if (!skipattributebody(cb))
                                return false;
                }
index a3efcc7aa395a6a2c787f14290d1c4616c5a6b10..d1f428413458e15cdeaf1511318c9f821aaf690f 100644 (file)
    Contact: cacao@cacaojvm.org
 
    Authors: Reinhard Grafl
-
-   Changes: Christian Thalinger
+            Christian Thalinger
             Edwin Steiner
 
-   $Id: method.h 5785 2006-10-15 22:25:54Z edwin $
+   $Id: method.h 5937 2006-11-08 22:00:57Z twisti $
 */
 
 
@@ -60,6 +59,7 @@ struct methodinfo {                 /* method structure                       */
        s4            flags;            /* ACC flags                              */
        utf          *name;             /* name of method                         */
        utf          *descriptor;       /* JavaVM descriptor string of method     */
+       utf          *signature;        /* Signature attribute string             */
        methoddesc   *parseddesc;       /* parsed descriptor                      */
                             
        classinfo    *class;            /* class, the method belongs to           */