* src/vm/utf8.c (utf_java_lang_AbstractMethodError): Added.
authortwisti <none@none>
Wed, 28 Jun 2006 19:11:20 +0000 (19:11 +0000)
committertwisti <none@none>
Wed, 28 Jun 2006 19:11:20 +0000 (19:11 +0000)
(utf8_init): Initialize utf_java_lang_AbstractMethodError.
* src/vm/utf8.h (utf_java_lang_AbstractMethodError): Added.

* src/vm/class.c (class_java_lang_AbstractMethodError): Added.
(class_resolveclassmethod): Use exceptions_throw_abstractmethoderror.
* src/vm/class.h (class_java_lang_AbstractMethodError): Added.

* src/vm/exceptions.c (exceptions_init): Initialize
class_java_lang_AbstractMethodError.
(exceptions_new_abstractmethoderror): New function.
(exceptions_throw_abstractmethoderror): Likewise.
* src/vm/exceptions.h (exceptions_new_abstractmethoderror)
(exceptions_throw_abstractmethoderror): Added.

* src/vm/resolve.c (resolve_method_invokespecial_lookup): Use
exceptions_throw_abstractmethoderror.

* src/vm/jit/asmpart.h (asm_abstractmethoderror): Added.

* src/vm/jit/i386/asmpart.S (asm_abstractmethoderror): New function.
* src/vm/jit/x86_64/asmpart.S (asm_abstractmethoderror): Likewise.

* src/vm/linker.c (link_class_intern): Fill empty slots in vftbl with
the AbstractMethodError stub.
(linker_addinterface): Insert the AbstractMethodError stub if no
suitable method was found.

* src/cacaoh/headers.c (asm_abstractmethoderror): Added.
(exceptions_throw_abstractmethoderror): Likewise.

12 files changed:
src/cacaoh/headers.c
src/vm/class.c
src/vm/class.h
src/vm/exceptions.c
src/vm/exceptions.h
src/vm/jit/asmpart.h
src/vm/jit/i386/asmpart.S
src/vm/jit/x86_64/asmpart.S
src/vm/linker.c
src/vm/resolve.c
src/vm/utf8.c
src/vm/utf8.h

index 51cd013fb0081356097f88eefa7ff3d5b45ab4c0..fdf29a4ff3b328833e62eba093262f8880db0dc6 100644 (file)
@@ -31,7 +31,7 @@
             Christian Thalinger
                        Edwin Steiner
 
-   $Id: headers.c 5038 2006-06-19 22:22:34Z twisti $
+   $Id: headers.c 5053 2006-06-28 19:11:20Z twisti $
 
 */
 
@@ -138,7 +138,7 @@ u1* asm_initialize_thread_stack(void *func, u1 *stack) { return NULL; }
 void *asm_switchstackandcall(void *stack, void *func, void **stacktopsave, void * p) { return NULL; }
 
 void asm_handle_builtin_exception(classinfo *c) {}
-
+void asm_abstractmethoderror(void) {}
 
 #if defined(ENABLE_JIT)
 void asm_getclassvalues_atomic(vftbl_t *super, vftbl_t *sub, castinfo *out) {}
@@ -282,6 +282,14 @@ java_objectheader *new_exception_javastring(const char *classname,
 }
 
 
+void exceptions_throw_abstractmethoderror(void)
+{
+       fprintf(stderr, "java.lang.AbstractMethodError\n");
+
+       exit(1);
+}
+
+
 java_objectheader *new_classformaterror(classinfo *c, const char *message, ...)
 {
        va_list ap;
index 166db0c343d75a95bcc6e25e67e1c9c388dfdf77..81b5453479b8f1e961de3dd6e1e81c1ac6c35a4d 100644 (file)
@@ -31,7 +31,7 @@
             Christian Thalinger
                        Edwin Steiner
 
-   $Id: class.c 5037 2006-06-19 21:39:46Z twisti $
+   $Id: class.c 5053 2006-06-28 19:11:20Z twisti $
 
 */
 
@@ -106,8 +106,9 @@ classinfo *class_java_io_Serializable;
 classinfo *class_java_lang_Throwable;
 classinfo *class_java_lang_VMThrowable;
 classinfo *class_java_lang_Error;
-classinfo *class_java_lang_NoClassDefFoundError;
+classinfo *class_java_lang_AbstractMethodError;
 classinfo *class_java_lang_LinkageError;
+classinfo *class_java_lang_NoClassDefFoundError;
 classinfo *class_java_lang_NoSuchMethodError;
 classinfo *class_java_lang_OutOfMemoryError;
 
@@ -888,7 +889,7 @@ methodinfo *class_resolveclassmethod(classinfo *c, utf *name, utf *desc,
  found:
        if ((m->flags & ACC_ABSTRACT) && !(c->flags & ACC_ABSTRACT)) {
                if (throwexception)
-                       *exceptionptr = new_exception(string_java_lang_AbstractMethodError);
+                       exceptions_throw_abstractmethoderror();
 
                return NULL;
        }
index 98f3bbbed88758c5f80ecd6756579692874adaff..bcf21d05cb9afd014d45e2c44a0fe3730b0795b2 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: class.h 4582 2006-03-11 20:30:48Z edwin $
+   $Id: class.h 5053 2006-06-28 19:11:20Z twisti $
 
 */
 
@@ -173,8 +173,9 @@ extern classinfo *class_java_io_Serializable;
 extern classinfo *class_java_lang_Throwable;
 extern classinfo *class_java_lang_VMThrowable;
 extern classinfo *class_java_lang_Error;
-extern classinfo *class_java_lang_NoClassDefFoundError;
+extern classinfo *class_java_lang_AbstractMethodError;
 extern classinfo *class_java_lang_LinkageError;
+extern classinfo *class_java_lang_NoClassDefFoundError;
 extern classinfo *class_java_lang_NoSuchMethodError;
 extern classinfo *class_java_lang_OutOfMemoryError;
 
index a16935b6bdf70aef5ab6bd21f301a9deceefb83f..ef026cc7f5b60b3bbc02c29302772bcff5f318ee 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Edwin Steiner
 
-   $Id: exceptions.c 5038 2006-06-19 22:22:34Z twisti $
+   $Id: exceptions.c 5053 2006-06-28 19:11:20Z twisti $
 
 */
 
@@ -97,11 +97,11 @@ bool exceptions_init(void)
                !link_class(class_java_lang_Error))
                return false;
 
-       /* java/lang/NoClassDefFoundError */
+       /* java/lang/AbstractMethodError */
 
-       if (!(class_java_lang_NoClassDefFoundError =
-                 load_class_bootstrap(utf_java_lang_NoClassDefFoundError)) ||
-               !link_class(class_java_lang_NoClassDefFoundError))
+       if (!(class_java_lang_AbstractMethodError =
+                 load_class_bootstrap(utf_java_lang_AbstractMethodError)) ||
+               !link_class(class_java_lang_AbstractMethodError))
                return false;
 
        /* java/lang/LinkageError */
@@ -111,6 +111,13 @@ bool exceptions_init(void)
                !link_class(class_java_lang_LinkageError))
                return false;
 
+       /* java/lang/NoClassDefFoundError */
+
+       if (!(class_java_lang_NoClassDefFoundError =
+                 load_class_bootstrap(utf_java_lang_NoClassDefFoundError)) ||
+               !link_class(class_java_lang_NoClassDefFoundError))
+               return false;
+
        /* java/lang/NoSuchMethodError */
 
        if (!(class_java_lang_NoSuchMethodError =
@@ -493,6 +500,37 @@ java_objectheader *new_exception_int(const char *classname, s4 i)
 }
 
 
+/* exceptions_new_abstractmethoderror ******************************************
+
+   Generates a java.lang.AbstractMethodError for the VM.
+
+*******************************************************************************/
+
+java_objectheader *exceptions_new_abstractmethoderror(void)
+{
+       java_objectheader *e;
+
+       e = native_new_and_init(class_java_lang_AbstractMethodError);
+
+       if (e == NULL)
+               return *exceptionptr;
+
+       return e;
+}
+
+
+/* exceptions_throw_abstractmethoderror ****************************************
+
+   Generates a java.lang.AbstractMethodError for the VM and throws it.
+
+*******************************************************************************/
+
+void exceptions_throw_abstractmethoderror(void)
+{
+       *exceptionptr = exceptions_new_abstractmethoderror();
+}
+
+
 /* new_classformaterror ********************************************************
 
    generates a java.lang.ClassFormatError for the classloader
@@ -1054,6 +1092,7 @@ void exceptions_throw_verifyerror_for_stack(methodinfo *m,int type)
        *exceptionptr = o;
 }
 
+
 /* new_arithmeticexception *****************************************************
 
    Generates a java.lang.ArithmeticException for the jit compiler.
index 297408c190a2e702cdbc8811503e7d1777d8b061..dc585cd5bcbe56e5a000bb8b8f307efb6e900a47 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Edwin Steiner
 
-   $Id: exceptions.h 4921 2006-05-15 14:24:36Z twisti $
+   $Id: exceptions.h 5053 2006-06-28 19:11:20Z twisti $
 
 */
 
@@ -118,6 +118,9 @@ java_objectheader *new_exception_int(const char *classname, s4 i);
 
 /* functions to generate compiler exceptions */
 
+java_objectheader *exceptions_new_abstractmethoderror(void);
+void exceptions_throw_abstractmethoderror(void);
+
 java_objectheader *new_classformaterror(classinfo *c, const char *message, ...);
 void exceptions_throw_classformaterror(classinfo *c, const char *message, ...);
 
index d23da4b69f1ddbd14b0bfa1a5b7c61836725f933..b96010eca0613c75eff6c09f66c5541418617fd3 100644 (file)
@@ -30,7 +30,7 @@
    Changes: Christian Thalinger
             Edwin Steiner
 
-   $Id: asmpart.h 4921 2006-05-15 14:24:36Z twisti $
+   $Id: asmpart.h 5053 2006-06-28 19:11:20Z twisti $
 
 */
 
@@ -137,6 +137,9 @@ void asm_handle_exception(void);
 void asm_handle_nat_exception(void);
 #endif
 
+/* stub for throwing AbstractMethodError's */
+void asm_abstractmethoderror(void);
+
 /* wrapper for code patching functions */
 void asm_wrapper_patcher(void);
 
index 08ec9c2ed2773021d4c7e1bd518906c4a436872e..1e580e97b0beec169bf7450d8707d95425e9ae70 100644 (file)
@@ -31,7 +31,7 @@
    Changes: Joseph Wenninger
             Edwin Steiner
 
-   $Id: asmpart.S 5040 2006-06-19 22:53:53Z twisti $
+   $Id: asmpart.S 5053 2006-06-28 19:11:20Z twisti $
 
 */
 
@@ -65,6 +65,8 @@
        .globl asm_handle_nat_exception
        .globl asm_handle_exception
 
+       .globl asm_abstractmethoderror
+
        .globl asm_wrapper_patcher
 
        .globl asm_replacement_out
@@ -473,6 +475,20 @@ noflt:
        jmp     L_asm_handle_exception_stack_loop
                
 
+/* asm_abstractmethoderror *****************************************************
+
+   Creates and throws an AbstractMethodError.
+
+*******************************************************************************/
+
+asm_abstractmethoderror:
+       call    exceptions_new_abstractmethoderror
+                                           /* exception pointer is return value  */
+       pop     xpc                         /* get exception address              */
+       sub     $2,xpc                      /* exception address is ra - 2        */
+       jmp     L_asm_handle_exception
+
+
 /* asm_wrapper_patcher *********************************************************
 
    XXX
index 64625ddfea8910628f7ab9c71cf0cd261fbeb22c..d3ad6a18a56dd0839cbf02a0cdb2e351fe412edd 100644 (file)
@@ -30,7 +30,7 @@
 
    Changes: Edwin Steiner
 
-   $Id: asmpart.S 5041 2006-06-20 09:10:05Z twisti $
+   $Id: asmpart.S 5053 2006-06-28 19:11:20Z twisti $
 
 */
 
@@ -62,6 +62,8 @@
        .globl asm_handle_exception
        .globl asm_handle_nat_exception
 
+       .globl asm_abstractmethoderror
+
        .globl asm_wrapper_patcher
 
        .globl asm_replacement_out
@@ -498,6 +500,20 @@ noflt:
        jmp             L_asm_handle_exception_stack_loop
 
 
+/* asm_abstractmethoderror *****************************************************
+
+   Creates and throws an AbstractMethodError.
+
+*******************************************************************************/
+
+asm_abstractmethoderror:
+       call    exceptions_new_abstractmethoderror@PLT
+                                           /* exception pointer is return value  */
+       pop     xpc                         /* get exception address              */
+       sub     $5,xpc                      /* exception address is ra - 5        */
+       jmp     L_asm_handle_exception
+
+
 /* asm_wrapper_patcher *********************************************************
 
    XXX
index 4dd858e3a939c7e50c7292c2b90264e12ca47deb..006dc17762c5e1a031987fb9e9c0185997c94191 100644 (file)
@@ -32,7 +32,7 @@
             Edwin Steiner
             Christian Thalinger
 
-   $Id: linker.c 5048 2006-06-23 09:23:02Z twisti $
+   $Id: linker.c 5053 2006-06-28 19:11:20Z twisti $
 
 */
 
@@ -57,6 +57,7 @@
 #include "vm/access.h"
 #include "vm/rt-timing.h"
 #include "vm/vm.h"
+#include "vm/jit/asmpart.h"
 
 
 /* global variables ***********************************************************/
@@ -793,7 +794,14 @@ static classinfo *link_class_intern(classinfo *c)
 
        for (i = 0; i < supervftbllength; i++) 
                v->table[i] = super->vftbl->table[i];
-       
+
+       /* Fill the remaining vftbl slots with the AbstractMethodError
+          stub (all after the super class slots, because they are already
+          initialized). */
+
+       for (; i < vftbllength; i++)
+               v->table[i] = &asm_abstractmethoderror;
+
        /* add method stubs into virtual function table */
 
        for (i = 0; i < c->methodscount; i++) {
@@ -1172,7 +1180,6 @@ static bool linker_addinterface(classinfo *c, classinfo *ic)
                v->interfacevftbllength[i] = 1;
                v->interfacetable[-i]      = MNEW(methodptr, 1);
                v->interfacetable[-i][0]   = NULL;
-
        }
        else {
                v->interfacevftbllength[i] = ic->methodscount;
@@ -1216,6 +1223,12 @@ static bool linker_addinterface(classinfo *c, classinfo *ic)
                                        }
                                }
                        }
+
+                       /* If no method was found, insert the AbstractMethodError
+                          stub. */
+
+                       v->interfacetable[-i][j] = &asm_abstractmethoderror;
+
                foundmethod:
                        ;
                }
index af1b6d698333889afa1406e80b0de42c0845416f..f76d7c07b82eef56a46bcf47f5089b9064142942 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Christan Thalinger
 
-   $Id: resolve.c 5008 2006-06-01 16:00:18Z edwin $
+   $Id: resolve.c 5053 2006-06-28 19:11:20Z twisti $
 
 */
 
@@ -1560,9 +1560,10 @@ methodinfo * resolve_method_invokespecial_lookup(methodinfo *refmethod,
                        mi = class_resolvemethod(referer->super.cls,
                                                                         mi->name,
                                                                         mi->descriptor);
-                       if (!mi) {
+
+                       if (mi == NULL) {
                                /* the spec calls for an AbstractMethodError in this case */
-                               *exceptionptr = new_exception(string_java_lang_AbstractMethodError);
+                               exceptions_throw_abstractmethoderror();
                                return NULL;
                        }
                }
index 5695c4abb2d8862dd4031f6030dfe57bb46b1a79..dd9726a041c1cc039b1e2dc3b477e3f9b9ca094e 100644 (file)
@@ -31,7 +31,7 @@
             Christian Thalinger
                        Edwin Steiner
 
-   $Id: utf8.c 5047 2006-06-22 18:48:45Z twisti $
+   $Id: utf8.c 5053 2006-06-28 19:11:20Z twisti $
 
 */
 
@@ -83,8 +83,9 @@ utf *utf_java_io_Serializable;
 utf *utf_java_lang_Throwable;
 utf *utf_java_lang_VMThrowable;
 utf *utf_java_lang_Error;
-utf *utf_java_lang_NoClassDefFoundError;
+utf *utf_java_lang_AbstractMethodError;
 utf *utf_java_lang_LinkageError;
+utf *utf_java_lang_NoClassDefFoundError;
 utf *utf_java_lang_NoSuchMethodError;
 utf *utf_java_lang_OutOfMemoryError;
 
@@ -203,12 +204,15 @@ bool utf8_init(void)
        utf_java_lang_VMThrowable      = utf_new_char(string_java_lang_VMThrowable);
        utf_java_lang_Error            = utf_new_char(string_java_lang_Error);
 
-       utf_java_lang_NoClassDefFoundError =
-               utf_new_char(string_java_lang_NoClassDefFoundError);
+       utf_java_lang_AbstractMethodError =
+               utf_new_char(string_java_lang_AbstractMethodError);
 
        utf_java_lang_LinkageError =
                utf_new_char(string_java_lang_LinkageError);
 
+       utf_java_lang_NoClassDefFoundError =
+               utf_new_char(string_java_lang_NoClassDefFoundError);
+
        utf_java_lang_NoSuchMethodError =
                utf_new_char(string_java_lang_NoSuchMethodError);
 
index a5b9322b48965c74f72d2b821bff05848fd7b68c..e42fd527b3ad9cede93922ea70300b6c9ed3bddd 100644 (file)
@@ -28,7 +28,7 @@
 
    Changes: Edwin Steiner
 
-   $Id: utf8.h 5047 2006-06-22 18:48:45Z twisti $
+   $Id: utf8.h 5053 2006-06-28 19:11:20Z twisti $
 
 */
 
@@ -77,8 +77,9 @@ extern utf *utf_java_io_Serializable;
 extern utf *utf_java_lang_Throwable;
 extern utf *utf_java_lang_VMThrowable;
 extern utf *utf_java_lang_Error;
-extern utf *utf_java_lang_NoClassDefFoundError;
+extern utf *utf_java_lang_AbstractMethodError;
 extern utf *utf_java_lang_LinkageError;
+extern utf *utf_java_lang_NoClassDefFoundError;
 extern utf *utf_java_lang_NoSuchMethodError;
 extern utf *utf_java_lang_OutOfMemoryError;