(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.
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 $
*/
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) {}
}
+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;
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 $
*/
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;
found:
if ((m->flags & ACC_ABSTRACT) && !(c->flags & ACC_ABSTRACT)) {
if (throwexception)
- *exceptionptr = new_exception(string_java_lang_AbstractMethodError);
+ exceptions_throw_abstractmethoderror();
return NULL;
}
Changes:
- $Id: class.h 4582 2006-03-11 20:30:48Z edwin $
+ $Id: class.h 5053 2006-06-28 19:11:20Z twisti $
*/
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;
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 $
*/
!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 */
!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 =
}
+/* 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
*exceptionptr = o;
}
+
/* new_arithmeticexception *****************************************************
Generates a java.lang.ArithmeticException for the jit compiler.
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 $
*/
/* 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, ...);
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 $
*/
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);
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 $
*/
.globl asm_handle_nat_exception
.globl asm_handle_exception
+ .globl asm_abstractmethoderror
+
.globl asm_wrapper_patcher
.globl asm_replacement_out
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
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 $
*/
.globl asm_handle_exception
.globl asm_handle_nat_exception
+ .globl asm_abstractmethoderror
+
.globl asm_wrapper_patcher
.globl asm_replacement_out
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
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 $
*/
#include "vm/access.h"
#include "vm/rt-timing.h"
#include "vm/vm.h"
+#include "vm/jit/asmpart.h"
/* global variables ***********************************************************/
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++) {
v->interfacevftbllength[i] = 1;
v->interfacetable[-i] = MNEW(methodptr, 1);
v->interfacetable[-i][0] = NULL;
-
}
else {
v->interfacevftbllength[i] = ic->methodscount;
}
}
}
+
+ /* If no method was found, insert the AbstractMethodError
+ stub. */
+
+ v->interfacetable[-i][j] = &asm_abstractmethoderror;
+
foundmethod:
;
}
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 $
*/
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;
}
}
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 $
*/
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;
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);
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 $
*/
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;