PatchSet 5016 Date: 2004/07/25 16:33:47 Author: hkraemer Branch: HEAD Tag: (none) Log: fixed invocations of java.lang.Object methods via INVOKEINTERFACE
Members: ChangeLog:1.2575->1.2576 kaffe/kaffevm/kaffe.def:1.31->1.32 kaffe/kaffevm/lookup.c:1.37->1.38 kaffe/kaffevm/soft.c:1.64->1.65 Index: kaffe/ChangeLog diff -u kaffe/ChangeLog:1.2575 kaffe/ChangeLog:1.2576 --- kaffe/ChangeLog:1.2575 Sun Jul 25 15:36:39 2004 +++ kaffe/ChangeLog Sun Jul 25 16:33:47 2004 @@ -1,3 +1,19 @@ +2004-07-25 Helmer Kraemer <[EMAIL PROTECTED]> + + * kaffe/kaffevm/soft.c (soft_lookupinterfacemethod): + Removed handling of invocations on java.lang.Object methods. + + * kaffe/kaffevm/kaffe.def (INVOKEINTERFACE): + Simplified invocations on java.lang.Object methods by using + the object's dispatch table as in INVOKEVIRTUAL. + + * kaffe/kaffevm/lookup.c (getMethodSignatureClass): + When resolving an interface method, search superinterfaces before + java.lang.Object. That way, we don't find the wrong method when + a superinterface overrides a method from java.lang.Object. + + Reported by: Benja Fallenstein <[EMAIL PROTECTED]> + 2004-07-25 Dalibor Topic <[EMAIL PROTECTED]> * libraries/clib/awt/classpath-gtk/gtk-peer/gnu_java_awt_peer_gtk_GtkFileDialogPeer.c Index: kaffe/kaffe/kaffevm/kaffe.def diff -u kaffe/kaffe/kaffevm/kaffe.def:1.31 kaffe/kaffe/kaffevm/kaffe.def:1.32 --- kaffe/kaffe/kaffevm/kaffe.def:1.31 Sat Mar 27 19:02:19 2004 +++ kaffe/kaffe/kaffevm/kaffe.def Sun Jul 25 16:33:49 2004 @@ -2912,6 +2912,8 @@ define_insn(INVOKEINTERFACE) { + Method *m; + /* * ..., obj, ..args.., -> ... */ @@ -2947,13 +2949,33 @@ else { idx = (uint8)getpc(2) - 1; + + /* + * if we invoke a method from java.lang.Object, we can directly use the + * dispatch table. + */ + m = findMethodLocal(ObjectClass, method_method()->name, method_sig()); + check_null(INVOKEINTERFACE, stack(idx), 34); check_stack_ref(idx); slot_alloctmp(tmp); - softcall_lookupinterfacemethod(tmp, method_method(), stack(idx)); + if (m != NULL) { + /* Find dispatch table in object */ + load_offset_ref(tmp, stack(idx), + method_dtable_offset); + + /* Check method table for cached entry */ + load_offset_ref(tmp, tmp, + DTABLE_METHODOFFSET + + m->idx * + DTABLE_METHODSIZE); + } else { + softcall_lookupinterfacemethod(tmp, method_method(), stack(idx)); + } + /* Push arguments & object */ build_call_frame(method_sig(), stack(idx), idx); idx++; @@ -2969,7 +2991,7 @@ /* Pop args */ popargs(); - + end_func_sync(); METHOD_RETURN_VALUE(); } Index: kaffe/kaffe/kaffevm/lookup.c diff -u kaffe/kaffe/kaffevm/lookup.c:1.37 kaffe/kaffe/kaffevm/lookup.c:1.38 --- kaffe/kaffe/kaffevm/lookup.c:1.37 Sat Jul 17 07:57:14 2004 +++ kaffe/kaffe/kaffevm/lookup.c Sun Jul 25 16:33:49 2004 @@ -99,28 +99,40 @@ /* Find method - we don't use findMethod(...) yet since this * will initialise our class (and we don't want to do that). */ - mptr = 0; - for (; class != 0; class = class->superclass) { + if (isSpecial != 2) { + /* method resolution for INVOKEVIRTUAL or INVOKESPECIAL. + * Since we make sure that the dispatch table of a class + * contains all methods of all implemented interfaces, we + * don't need to search superinterfaces here. + */ + for (; class != 0; class = class->superclass) { + mptr = findMethodLocal(class, name, sig); + if (mptr != NULL) { + call->method = mptr; + break; + } + } + } else { + /* method resolution for INVOKEINTERFACE. First search the + * interface itself, then its superinterfaces and finally + * java.lang.Object. + */ + class = call->class; mptr = findMethodLocal(class, name, sig); - if (mptr != NULL) { - call->method = mptr; - break; + if (mptr == NULL) { + for (i = class->total_interface_len - 1; i >= 0; i--) { + mptr = findMethodLocal(class->interfaces[i], name, sig); + if (mptr != 0) { + break; + } + } + + if (mptr == NULL) { + mptr = findMethodLocal(call->class->superclass, name, sig); + } } + call->method = mptr; } - - /* If we've not found anything and we're searching interfaces, - * search them too. - */ - if (mptr == 0 && isSpecial == 2) { - class = call->class; - for (i = class->total_interface_len - 1; i >= 0; i--) { - mptr = findMethodLocal(class->interfaces[i], name, sig); - if (mptr != 0) { - call->method = mptr; - break; - } - } - } } /* Calculate in's and out's */ Index: kaffe/kaffe/kaffevm/soft.c diff -u kaffe/kaffe/kaffevm/soft.c:1.64 kaffe/kaffe/kaffevm/soft.c:1.65 --- kaffe/kaffe/kaffevm/soft.c:1.64 Tue Jul 6 17:16:13 2004 +++ kaffe/kaffe/kaffevm/soft.c Sun Jul 25 16:33:49 2004 @@ -264,12 +264,6 @@ } } #endif - - /* handle invocations on java.lang.Object methods via INVOKEINTERFACE */ - if (implementors == 0 || i > implementors[0]) { - goto notfound; - } - /* skip word at the beginning of itable2dtable */ ncode = cls->itable2dtable[implementors[i] + idx + 1]; @@ -282,40 +276,10 @@ * given that they should be rare---minus possible DoS.) */ if (ncode == (void *)-1) { - goto notfound; + return NULL; } assert(ncode != NULL); return (ncode); - -notfound: - /* - * Compilers following the latest version of the JLS emit a - * INVOKEINTERFACE instruction for methods that aren't defined in - * an interface, but inherited from Object. - * - * In this case, the JVM must - * a) check that the object really implements the interface given - * b) find and invoke the method on object. - * - * The best way to jit that would be a checkcast <interface_type> - * followed by an INVOKEVIRTUAL. - * - * For now, we simply detect the case where an object method is called - * and find it by hand using its (name, signature). - */ - if (ifclass == ObjectClass) { - Method* objm = CLASS_METHODS(ifclass) + idx; - errorInfo info; - - meth = findMethod(cls, objm->name, METHOD_SIG(objm), &info); - if (meth == 0) { - throwError(&info); - } - return (METHOD_INDIRECTMETHOD(meth)); - } - meth = CLASS_METHODS(ifclass) + idx; - soft_nosuchmethod(cls, meth->name, METHOD_SIG(meth)); - return (0); } inline _______________________________________________ kaffe mailing list [EMAIL PROTECTED] http://kaffe.org/cgi-bin/mailman/listinfo/kaffe