PatchSet 7257 Date: 2006/04/22 01:53:39 Author: robilad Branch: HEAD Tag: (none) Log: added helper function for creation of new utf8 constants from strings
2006-04-22 Dalibor Topic <[EMAIL PROTECTED]> Replaced utf8ConstNew(*,-1) calls with the helper function utf8ConstFromString. * kaffe/kaffevm/utf8const.h, kaffe/kaffevm/utf8const.c (utf8ConstFromString): New function. (utf8ConstNew) Factored out creation of utf8 constants from null-terminated strings into utf8ConstFromString. Changed len parameter type to size_t. * kaffe/kaffeh/main.c, kaffe/kaffevm/baseClasses.c, kaffe/kaffevm/classMethod.c, kaffe/kaffevm/itypes.c, kaffe/kaffevm/reference.c, kaffe/kaffevm/string.c, kaffe/kaffevm/support.c, kaffe/kaffevm/gcj/gcj-glue.c, kaffe/kaffevm/jni/jni-string.c, kaffe/kaffevm/jni/jni.c, libraries/clib/management/JIT.c, libraries/clib/native/ClassLoader.c, libraries/clib/net/InetAddressImpl.c, libraries/extensions/microsoft/clib/Delegate.c, test/internal/jitBasic.c, test/internal/jit_stub.c: Replaced use of utf8ConstNew with utf8ConstFromString where a utf8 constant was created from a null-terminated string. Members: ChangeLog:1.4762->1.4763 kaffe/kaffeh/main.c:1.23->1.24 kaffe/kaffevm/baseClasses.c:1.74->1.75 kaffe/kaffevm/classMethod.c:1.154->1.155 kaffe/kaffevm/itypes.c:1.39->1.40 kaffe/kaffevm/reference.c:1.8->1.9 kaffe/kaffevm/string.c:1.48->1.49 kaffe/kaffevm/support.c:1.92->1.93 kaffe/kaffevm/utf8const.c:1.51->1.52 kaffe/kaffevm/utf8const.h:1.5->1.6 kaffe/kaffevm/gcj/gcj-glue.c:1.10->1.11 kaffe/kaffevm/jni/jni-string.c:1.15->1.16 kaffe/kaffevm/jni/jni.c:1.43->1.44 libraries/clib/management/JIT.c:1.10->1.11 libraries/clib/native/ClassLoader.c:1.52->1.53 libraries/clib/net/InetAddressImpl.c:1.33->1.34 libraries/extensions/microsoft/clib/Delegate.c:INITIAL->1.7 test/internal/jitBasic.c:INITIAL->1.10 test/internal/jit_stub.c:1.13->1.14 Index: kaffe/ChangeLog diff -u kaffe/ChangeLog:1.4762 kaffe/ChangeLog:1.4763 --- kaffe/ChangeLog:1.4762 Sat Apr 22 00:32:11 2006 +++ kaffe/ChangeLog Sat Apr 22 01:53:39 2006 @@ -1,5 +1,35 @@ 2006-04-22 Dalibor Topic <[EMAIL PROTECTED]> + Replaced utf8ConstNew(*,-1) calls with the helper function + utf8ConstFromString. + + * kaffe/kaffevm/utf8const.h, + kaffe/kaffevm/utf8const.c (utf8ConstFromString): New function. + (utf8ConstNew) Factored out creation of utf8 constants from + null-terminated strings into utf8ConstFromString. Changed len + parameter type to size_t. + + * kaffe/kaffeh/main.c, + kaffe/kaffevm/baseClasses.c, + kaffe/kaffevm/classMethod.c, + kaffe/kaffevm/itypes.c, + kaffe/kaffevm/reference.c, + kaffe/kaffevm/string.c, + kaffe/kaffevm/support.c, + kaffe/kaffevm/gcj/gcj-glue.c, + kaffe/kaffevm/jni/jni-string.c, + kaffe/kaffevm/jni/jni.c, + libraries/clib/management/JIT.c, + libraries/clib/native/ClassLoader.c, + libraries/clib/net/InetAddressImpl.c, + libraries/extensions/microsoft/clib/Delegate.c, + test/internal/jitBasic.c, + test/internal/jit_stub.c: Replaced use of utf8ConstNew with + utf8ConstFromString where a utf8 constant was created from a + null-terminated string. + +2006-04-22 Dalibor Topic <[EMAIL PROTECTED]> + * kaffe/kaffevm/jit/native-wrapper.c (Kaffe_wrapper): Call the right initInsnSequence depending on the jit engine. Call INIT_JIT_MD if necessary. Index: kaffe/kaffe/kaffeh/main.c diff -u kaffe/kaffe/kaffeh/main.c:1.23 kaffe/kaffe/kaffeh/main.c:1.24 --- kaffe/kaffe/kaffeh/main.c:1.23 Thu Mar 30 17:39:15 2006 +++ kaffe/kaffe/kaffeh/main.c Sat Apr 22 01:53:40 2006 @@ -101,19 +101,19 @@ } utf8ConstInit(); - init_name = utf8ConstNew("<clinit>", -1); - final_name = utf8ConstNew("finalize", -1); - void_signature = utf8ConstNew("()V", -1); - constructor_name = utf8ConstNew("<init>", -1); - Code_name = utf8ConstNew("Code", -1); - LineNumberTable_name = utf8ConstNew("LineNumberTable", -1); - LocalVariableTable_name = utf8ConstNew("LocalVariableTable", -1); - ConstantValue_name = utf8ConstNew("ConstantValue", -1); - Exceptions_name = utf8ConstNew("Exceptions", -1); - SourceFile_name = utf8ConstNew("SourceFile", -1); - InnerClasses_name = utf8ConstNew("InnerClasses", -1); - Synthetic_name = utf8ConstNew("Synthetic", -1); - Signature_name = utf8ConstNew("Signature", -1); + init_name = utf8ConstFromString("<clinit>"); + final_name = utf8ConstFromString("finalize"); + void_signature = utf8ConstFromString("()V"); + constructor_name = utf8ConstFromString("<init>"); + Code_name = utf8ConstFromString("Code"); + LineNumberTable_name = utf8ConstFromString("LineNumberTable"); + LocalVariableTable_name = utf8ConstFromString("LocalVariableTable"); + ConstantValue_name = utf8ConstFromString("ConstantValue"); + Exceptions_name = utf8ConstFromString("Exceptions"); + SourceFile_name = utf8ConstFromString("SourceFile"); + InnerClasses_name = utf8ConstFromString("InnerClasses"); + Synthetic_name = utf8ConstFromString("Synthetic"); + Signature_name = utf8ConstFromString("Signature"); /* Process each class */ for (nm = argv[farg]; nm != 0; nm = argv[++farg]) { Index: kaffe/kaffe/kaffevm/baseClasses.c diff -u kaffe/kaffe/kaffevm/baseClasses.c:1.74 kaffe/kaffe/kaffevm/baseClasses.c:1.75 --- kaffe/kaffe/kaffevm/baseClasses.c:1.74 Mon Apr 17 17:57:05 2006 +++ kaffe/kaffe/kaffevm/baseClasses.c Sat Apr 22 01:53:40 2006 @@ -247,20 +247,20 @@ /* Create the initialise and finalize names and signatures. */ DBG(INIT, dprintf("create names and signatures\n"); ); - init_name = utf8ConstNew("<clinit>", -1); - final_name = utf8ConstNew("finalize", -1); - void_signature = utf8ConstNew("()V", -1); - constructor_name = utf8ConstNew("<init>", -1); - Code_name = utf8ConstNew("Code", -1); - LineNumberTable_name = utf8ConstNew("LineNumberTable", -1); - LocalVariableTable_name = utf8ConstNew("LocalVariableTable", -1); - ConstantValue_name = utf8ConstNew("ConstantValue", -1); - Exceptions_name = utf8ConstNew("Exceptions", -1); - SourceFile_name = utf8ConstNew("SourceFile", -1); - InnerClasses_name = utf8ConstNew("InnerClasses", -1); - Signature_name = utf8ConstNew("Signature", -1); - Synthetic_name = utf8ConstNew("Synthetic", -1); - EnclosingMethod_name = utf8ConstNew("EnclosingMethod", -1); + init_name = utf8ConstFromString("<clinit>"); + final_name = utf8ConstFromString("finalize"); + void_signature = utf8ConstFromString("()V"); + constructor_name = utf8ConstFromString("<init>"); + Code_name = utf8ConstFromString("Code"); + LineNumberTable_name = utf8ConstFromString("LineNumberTable"); + LocalVariableTable_name = utf8ConstFromString("LocalVariableTable"); + ConstantValue_name = utf8ConstFromString("ConstantValue"); + Exceptions_name = utf8ConstFromString("Exceptions"); + SourceFile_name = utf8ConstFromString("SourceFile"); + InnerClasses_name = utf8ConstFromString("InnerClasses"); + Signature_name = utf8ConstFromString("Signature"); + Synthetic_name = utf8ConstFromString("Synthetic"); + EnclosingMethod_name = utf8ConstFromString("EnclosingMethod"); if (!(init_name && final_name && void_signature && constructor_name && Code_name && LineNumberTable_name && Index: kaffe/kaffe/kaffevm/classMethod.c diff -u kaffe/kaffe/kaffevm/classMethod.c:1.154 kaffe/kaffe/kaffevm/classMethod.c:1.155 --- kaffe/kaffe/kaffevm/classMethod.c:1.154 Mon Apr 17 17:57:05 2006 +++ kaffe/kaffe/kaffevm/classMethod.c Sat Apr 22 01:53:40 2006 @@ -1613,7 +1613,7 @@ classEntry* centry; bool refAdded; - utf8 = utf8ConstNew(name, -1); + utf8 = utf8ConstFromString(name); if (!utf8) goto bad; centry = lookupClassEntry(utf8, NULL, &info); if (!centry) goto bad; @@ -1665,7 +1665,7 @@ Hjava_lang_Class* class; Utf8Const *utf8; - utf8 = utf8ConstNew(name, -1); + utf8 = utf8ConstFromString(name); if (!utf8) { postOutOfMemory(einfo); return NULL; @@ -2911,7 +2911,7 @@ sprintf (sig, "[L%s;", cname); } } - arr_name = utf8ConstNew(sig, -1); /* release before returning */ + arr_name = utf8ConstFromString(sig); /* release before returning */ KFREE(sig); if (!arr_name) { Index: kaffe/kaffe/kaffevm/itypes.c diff -u kaffe/kaffe/kaffevm/itypes.c:1.39 kaffe/kaffe/kaffevm/itypes.c:1.40 --- kaffe/kaffe/kaffevm/itypes.c:1.39 Mon May 30 21:16:03 2005 +++ kaffe/kaffe/kaffevm/itypes.c Sat Apr 22 01:53:41 2006 @@ -55,7 +55,7 @@ } clazz->vtable = _PRIMITIVE_DTABLE; - clazz->name = utf8ConstNew(name, -1); + clazz->name = utf8ConstFromString(name); clazz->accflags = ACC_PUBLIC | ACC_FINAL; CLASS_PRIM_SIG(clazz) = sig; CLASS_PRIM_NAME(clazz) = utf8ConstNew(&sig, 1); @@ -75,7 +75,7 @@ */ assert(strlen(name) <= 8); sprintf(entryName, ";%s", name); - uname = utf8ConstNew(entryName, -1); + uname = utf8ConstFromString(entryName); centry = lookupClassEntry(uname, NULL, &info); utf8ConstRelease(uname); Index: kaffe/kaffe/kaffevm/reference.c diff -u kaffe/kaffe/kaffevm/reference.c:1.8 kaffe/kaffe/kaffevm/reference.c:1.9 --- kaffe/kaffe/kaffevm/reference.c:1.8 Sun Mar 19 16:16:21 2006 +++ kaffe/kaffe/kaffevm/reference.c Sat Apr 22 01:53:41 2006 @@ -97,7 +97,7 @@ if (referentOffset == ~((uint32)0)) { - Utf8Const *referent_name = utf8ConstNew("referent", -1); + Utf8Const *referent_name = utf8ConstFromString("referent"); Field *referent_field; errorInfo einfo; Index: kaffe/kaffe/kaffevm/string.c diff -u kaffe/kaffe/kaffevm/string.c:1.48 kaffe/kaffe/kaffevm/string.c:1.49 --- kaffe/kaffe/kaffevm/string.c:1.48 Mon Mar 20 21:46:21 2006 +++ kaffe/kaffe/kaffevm/string.c Sat Apr 22 01:53:41 2006 @@ -245,7 +245,7 @@ throwError(&info); } - utf8 = utf8ConstNew(utf8buf, -1); + utf8 = utf8ConstFromString(utf8buf); KFREE(utf8buf); return (utf8); } Index: kaffe/kaffe/kaffevm/support.c diff -u kaffe/kaffe/kaffevm/support.c:1.92 kaffe/kaffe/kaffevm/support.c:1.93 --- kaffe/kaffe/kaffevm/support.c:1.92 Sun Mar 19 16:16:21 2006 +++ kaffe/kaffe/kaffevm/support.c Sat Apr 22 01:53:41 2006 @@ -67,7 +67,7 @@ Utf8Const *fieldUTF; Field *field; - checkPtr(fieldUTF = utf8ConstNew(fieldName, -1)); + checkPtr(fieldUTF = utf8ConstFromString(fieldName)); field = lookupClassField(clazz, fieldUTF, isStatic, einfo); utf8ConstRelease(fieldUTF); @@ -264,7 +264,7 @@ } } - sig = checkPtr(utf8ConstNew(signature, -1)); + sig = checkPtr(utf8ConstFromString(signature)); mb = findMethodLocal(cc, constructor_name, sig); utf8ConstRelease(sig); if (mb == 0) { @@ -376,12 +376,12 @@ assert(name != NULL); assert(sig != NULL); - name_utf8 = utf8ConstNew(name, -1); + name_utf8 = utf8ConstFromString(name); if (!name_utf8) { postOutOfMemory(einfo); return NULL; } - sig_utf8 = utf8ConstNew(sig, -1); + sig_utf8 = utf8ConstFromString(sig); if (!sig_utf8) { utf8ConstRelease(name_utf8); postOutOfMemory(einfo); Index: kaffe/kaffe/kaffevm/utf8const.c diff -u kaffe/kaffe/kaffevm/utf8const.c:1.51 kaffe/kaffe/kaffevm/utf8const.c:1.52 --- kaffe/kaffe/kaffevm/utf8const.c:1.51 Sat May 14 21:46:31 2005 +++ kaffe/kaffe/kaffevm/utf8const.c Sat Apr 22 01:53:41 2006 @@ -87,25 +87,24 @@ static int utf8ConstHashValueInternal(const void *v); static int utf8ConstCompare(const void *v1, const void *v2); +Utf8Const * +utf8ConstFromString(const char *s) +{ + size_t len = strlen(s); + return utf8ConstNew(s, len); +} + /* * Convert a non-terminated UTF-8 string into an interned Utf8Const. * Returns 0 if an malloc failed occurred. */ Utf8Const * -utf8ConstNew(const char *s, int slen) +utf8ConstNew(const char *s, size_t len) { - size_t len; Utf8Const *utf8, *temp; int32 hash; Utf8Const *fake; char buf[200]; - - /* Automatic length finder */ - if (slen < 0) { - len = strlen(s); - }else{ - len = (unsigned int) slen; - } #ifdef KAFFE_VMDEBUG assert(utf8ConstIsValidUtf8(s, len)); Index: kaffe/kaffe/kaffevm/utf8const.h diff -u kaffe/kaffe/kaffevm/utf8const.h:1.5 kaffe/kaffe/kaffevm/utf8const.h:1.6 --- kaffe/kaffe/kaffevm/utf8const.h:1.5 Thu Apr 22 09:22:38 2004 +++ kaffe/kaffe/kaffevm/utf8const.h Sat Apr 22 01:53:41 2006 @@ -16,9 +16,19 @@ /* Initialize utf8const support system */ extern void utf8ConstInit(void); +/** + * Create a Utf8Const from a string. + * + * The returned pointer remains valid until + * Utf8ConstRelease() is called. + * + * @str UTF-8 encoded, '\0'-terminated string. + */ +extern Utf8Const* utf8ConstFromString(const char* str); + /* Create a Utf8Const from a UTF-8 encoded array. The returned pointer remains valid until Utf8ConstRelease() is called. */ -extern Utf8Const* utf8ConstNew(const char*, int); +extern Utf8Const* utf8ConstNew(const char* str, size_t len); /* Add a reference to a Utf8Const */ extern void utf8ConstAddRef(Utf8Const*); Index: kaffe/kaffe/kaffevm/gcj/gcj-glue.c diff -u kaffe/kaffe/kaffevm/gcj/gcj-glue.c:1.10 kaffe/kaffe/kaffevm/gcj/gcj-glue.c:1.11 --- kaffe/kaffe/kaffevm/gcj/gcj-glue.c:1.10 Thu Mar 30 17:39:16 2006 +++ kaffe/kaffe/kaffevm/gcj/gcj-glue.c Sat Apr 22 01:53:41 2006 @@ -233,10 +233,10 @@ static char buf[1024]; Method *mt = &CLASS_METHODS(c)[CLASS_NMETHODS(c)]; - mt->name = utf8ConstNew(info->name, -1); + mt->name = utf8ConstFromString(info->name); classname2pathname(info->signature, buf); - signature = utf8ConstNew(buf, -1); + signature = utf8ConstFromString(buf); METHOD_PSIG(mt) = parseSignature(signature, einfo); utf8ConstRelease(signature); @@ -334,7 +334,7 @@ fld = &CLASS_FIELDS(c)[info->idx + CLASS_NSFIELDS(c)]; } fld->accflags = info->flags; - fld->name = utf8ConstNew(info->name, -1); + fld->name = utf8ConstFromString(info->name); /* For now, that's true. However, see * http://sourceware.cygnus.com/ml/java-discuss/1999-q4/msg00379.html Index: kaffe/kaffe/kaffevm/jni/jni-string.c diff -u kaffe/kaffe/kaffevm/jni/jni-string.c:1.15 kaffe/kaffe/kaffevm/jni/jni-string.c:1.16 --- kaffe/kaffe/kaffevm/jni/jni-string.c:1.15 Fri Aug 19 01:47:01 2005 +++ kaffe/kaffe/kaffevm/jni/jni-string.c Sat Apr 22 01:53:41 2006 @@ -101,7 +101,7 @@ if (!utf8ConstIsValidUtf8(data, len)) { str = NULL; } else { - utf8 = checkPtr(utf8ConstNew(data, (int)len)); + utf8 = checkPtr(utf8ConstNew(data, len)); str = utf8Const2Java(utf8); utf8ConstRelease(utf8); if (!str) { Index: kaffe/kaffe/kaffevm/jni/jni.c diff -u kaffe/kaffe/kaffevm/jni/jni.c:1.43 kaffe/kaffe/kaffevm/jni/jni.c:1.44 --- kaffe/kaffe/kaffevm/jni/jni.c:1.43 Sun Apr 16 07:20:15 2006 +++ kaffe/kaffe/kaffevm/jni/jni.c Sat Apr 22 01:53:41 2006 @@ -180,7 +180,7 @@ classname2pathname (name, pathname); /* create a new utf8 constant */ - utf8 = utf8ConstNew(pathname, -1); + utf8 = utf8ConstFromString(pathname); /* free the internal form of name */ KFREE(pathname); @@ -607,7 +607,7 @@ BEGIN_EXCEPTION_HANDLING(NULL); cls_local = unveil(cls); - utf8 = checkPtr(utf8ConstNew(name, -1)); + utf8 = checkPtr(utf8ConstFromString(name)); fld = lookupClassField((Hjava_lang_Class*)cls_local, utf8, false, &info); utf8ConstRelease(utf8); @@ -653,7 +653,7 @@ BEGIN_EXCEPTION_HANDLING(NULL); cls_local = unveil(cls); - utf8 = checkPtr(utf8ConstNew(name, -1)); + utf8 = checkPtr(utf8ConstFromString(name)); fld = lookupClassField((Hjava_lang_Class*)cls_local, utf8, true, &info); utf8ConstRelease(utf8); if (fld == NULL) { Index: kaffe/libraries/clib/management/JIT.c diff -u kaffe/libraries/clib/management/JIT.c:1.10 kaffe/libraries/clib/management/JIT.c:1.11 --- kaffe/libraries/clib/management/JIT.c:1.10 Mon Dec 26 20:06:36 2005 +++ kaffe/libraries/clib/management/JIT.c Sat Apr 22 01:53:42 2006 @@ -49,9 +49,9 @@ char* cname = stringJava2C(_cname); char* mname = stringJava2C(_mname); char* signature = stringJava2C(_signature); - Utf8Const* u8cname = utf8ConstNew(cname, -1); - Utf8Const* u8mname = utf8ConstNew(mname, -1); - Utf8Const* u8sig = utf8ConstNew(signature, -1); + Utf8Const* u8cname = utf8ConstFromString(cname); + Utf8Const* u8mname = utf8ConstFromString(mname); + Utf8Const* u8sig = utf8ConstFromString(signature); /* dprintf("translating %s.%s%s\n", cname, mname, signature); Index: kaffe/libraries/clib/native/ClassLoader.c diff -u kaffe/libraries/clib/native/ClassLoader.c:1.52 kaffe/libraries/clib/native/ClassLoader.c:1.53 --- kaffe/libraries/clib/native/ClassLoader.c:1.52 Tue Mar 21 00:24:10 2006 +++ kaffe/libraries/clib/native/ClassLoader.c Sat Apr 22 01:53:42 2006 @@ -225,7 +225,7 @@ throwException (throwable); } - if( (c = utf8ConstNew(name, -1)) ) + if( (c = utf8ConstFromString(name)) ) { clazz = loadClass(c, NULL, &info); if( clazz ) Index: kaffe/libraries/clib/net/InetAddressImpl.c diff -u kaffe/libraries/clib/net/InetAddressImpl.c:1.33 kaffe/libraries/clib/net/InetAddressImpl.c:1.34 --- kaffe/libraries/clib/net/InetAddressImpl.c:1.33 Tue May 31 17:55:52 2005 +++ kaffe/libraries/clib/net/InetAddressImpl.c Sat Apr 22 01:53:42 2006 @@ -77,7 +77,7 @@ if (inetClass == NULL) { - Utf8Const *name = utf8ConstNew("java/net/InetAddress", -1); + Utf8Const *name = utf8ConstFromString("java/net/InetAddress"); inetClass = loadClass(name, NULL, &einfo); utf8ConstRelease(name); assert(inetClass != NULL); @@ -123,7 +123,7 @@ if (SysInetClass == NULL) { - Utf8Const *name = utf8ConstNew("gnu/java/net/SysInetAddressImpl", -1); + Utf8Const *name = utf8ConstFromString("gnu/java/net/SysInetAddressImpl"); SysInetClass = loadClass(name, NULL, &einfo); utf8ConstRelease(name); assert(SysInetClass != NULL); =================================================================== Checking out kaffe/libraries/extensions/microsoft/clib/Delegate.c RCS: /home/cvs/kaffe/kaffe/libraries/extensions/microsoft/clib/Delegate.c,v VERS: 1.7 *************** --- /dev/null Sun Aug 4 19:57:58 2002 +++ kaffe/libraries/extensions/microsoft/clib/Delegate.c Sat Apr 22 02:01:09 2006 @@ -0,0 +1,134 @@ +/* + * com.ms.lang.Delegate.c + * + * Copyright (c) 1999 + * Transvirtual Technologies, Inc. All rights reserved. + * + * See the file "license.terms" for information on usage and redistribution + * of this file. + */ +#include "config.h" +#include "config-std.h" +#include "config-mem.h" +#include "gtypes.h" +#include "classMethod.h" +#include "lookup.h" +#include "stringSupport.h" +#include <jni.h> +#include <native.h> +#include "java_lang_reflect_Method.h" + +/* Copied from Class.c */ +static +Hjava_lang_Class* +makeReturn(Method* meth) +{ + errorInfo info; + Hjava_lang_Class* clazz; + + clazz = getClassFromSignaturePart(METHOD_RET_TYPE(meth), meth->class->loader, &info); + if (clazz == 0) { + throwError(&info); + } + + return (clazz); +} + +/* Copied from Class.c */ +static +HArrayOfObject* +makeParameters(Method* meth) +{ + int i; + HArrayOfObject* array; + errorInfo info; + Hjava_lang_Class* clazz; + + array = (HArrayOfObject*)AllocObjectArray(METHOD_NARGS(meth), + "Ljava/lang/Class;", 0); + for (i = 0; i < METHOD_NARGS(meth); ++i) { + clazz = getClassFromSignaturePart(METHOD_ARG_TYPE(meth, i), + meth->class->loader, &info); + if (clazz == 0) { + throwError(&info); + } + unhand_array(array)->body[i] = &clazz->head; + } + + return (array); +} + +/* Copied from Class.c */ +static +HArrayOfObject* +makeExceptions(Method* meth) +{ + int nr; + int i; + HArrayOfObject* array; + Hjava_lang_Class** ptr; + + if( meth->ndeclared_exceptions == -1 ) + { + meth = meth->declared_exceptions_u.remote_exceptions; + } + nr = meth->ndeclared_exceptions; + array = (HArrayOfObject*)AllocObjectArray(nr, "Ljava/lang/Class;", 0); + ptr = (Hjava_lang_Class**)&unhand_array(array)->body[0]; + for (i = 0; i < nr; i++) { + errorInfo info; + Hjava_lang_Class* clazz; + clazz = getClass(meth->declared_exceptions[i], meth->class, + &info); + if (clazz == 0) { + throwError(&info); + } + *ptr++ = clazz; + } + return (array); +} + + +/* We need to find the method corresponding to the name and signature + * given. + */ +jobject +Java_com_ms_lang_Delegate_getMethod0(JNIEnv* env, jclass delegate, jobject o, jstring name, jstring sig) +{ + jboolean ncopy; + jboolean scopy; + jbyte* bname; + jbyte* bsig; + Method* m; + Hjava_lang_reflect_Method* meth; + Hjava_lang_Class* clazz; + Utf8Const* fname; + Utf8Const* fsig; + + bname = (jbyte*)(*env)->GetStringUTFChars(env, name, &ncopy); + bsig = (jbyte*)(*env)->GetStringUTFChars(env, sig, &scopy); + clazz = (Hjava_lang_Class*)(*env)->GetObjectClass(env, o); + + fname = utf8ConstFromString(bname); + fsig = utf8ConstFromString(bsig); + + m = findMethodLocal(clazz, fname, fsig); + + utf8ConstRelease(fname); + utf8ConstRelease(fsig); + + meth = (Hjava_lang_reflect_Method*) + AllocObject("java/lang/reflect/Method", 0); + unhand(meth)->clazz = clazz; + unhand(meth)->slot = m - CLASS_METHODS(clazz); + unhand(meth)->name = name; + unhand(meth)->parameterTypes = makeParameters(m); + unhand(meth)->exceptionTypes = makeExceptions(m); + unhand(meth)->returnType = makeReturn(m); + + (*env)->ReleaseStringUTFChars(env, name, bname); + (*env)->ReleaseStringUTFChars(env, sig, bsig); + + return (meth); +} + =================================================================== Checking out kaffe/test/internal/jitBasic.c RCS: /home/cvs/kaffe/kaffe/test/internal/jitBasic.c,v VERS: 1.10 *************** --- /dev/null Sun Aug 4 19:57:58 2002 +++ kaffe/test/internal/jitBasic.c Sat Apr 22 02:01:09 2006 @@ -0,0 +1,288 @@ +/* + * jitBasic.c + * + * Copyright (c) 2003, 2004 University of Utah and the Flux Group. + * All rights reserved. + * + * This file is licensed under the terms of the GNU Public License. + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * + * Contributed by the Flux Research Group, Department of Computer Science, + * University of Utah, http://www.cs.utah.edu/flux/ + */ + +#include "config.h" +#include "object.h" +#include "support.h" +#include "utf8const.h" +#include "classMethod.h" +#include "stringParsing.h" + +#if !defined(TRANSLATOR) + +int internal_test(char *class_name) +{ + return( 0 ); +} + +#else + +#include <machine.h> +#include <slots.h> +#include <seq.h> +#include <labels.h> +#include <codeproto.h> +#include <basecode.h> + +Method *findMethodNoSig(Hjava_lang_Class *cl, Utf8Const *name) +{ + Method *retval = 0; + int lpc; + + assert(cl != 0); + assert(name != 0); + + for( lpc = 0; (lpc < CLASS_NMETHODS(cl)) && !retval; lpc++ ) + { + if( CLASS_METHODS(cl)[lpc].name == name ) + retval = &CLASS_METHODS(cl)[lpc]; + } + + assert(retval != 0); + + return( retval ); +} + +#define MAX_TEST_FIELD_COMPONENTS 64 + +struct testField { + char *tf_Name; + int tf_ComponentCount; + int tf_MethodIndex; + parsedString tf_Components[MAX_TEST_FIELD_COMPONENTS]; +}; + +static +int fieldComponentHandler(struct testField *tf) +{ + int retval = 1; + + tf->tf_ComponentCount += 1; + tf->tf_Components[tf->tf_ComponentCount] = tf->tf_Components[0]; + if( tf->tf_Components[0].len == 0 ) + tf->tf_MethodIndex = tf->tf_ComponentCount + 1; + return( retval ); +} + +int parseTestField(struct testField *tf) +{ + return parseString( + tf->tf_Name, + SPO_NotEmpty, + SPO_Do, + SPO_String, &tf->tf_Components[0], + SPO_While, "_", "", + SPO_Handle, fieldComponentHandler, tf, + SPO_End, + SPO_End, + SPO_End); +} + +int field2values(jvalue *dst, parsed_signature_t *ps, struct testField *tf) +{ + int lpc, retval = 1; + + for( lpc = 1; (lpc <= ps->nargs) && retval; lpc++ ) + { + parsedString *arg; + char *str; + + arg = &tf->tf_Components[lpc + 1]; + switch( ps->signature->data[ps->ret_and_args[lpc]] ) + { + case 'Z': + dst[lpc - 1].z = !cmpPStrStr(arg, "true"); + break; + case 'B': + dst[lpc - 1].b = (char)strtol(arg->data, 0, 0); + break; + case 'C': + dst[lpc - 1].c = arg->data[0]; + break; + case 'S': + dst[lpc - 1].s = (short)strtol(arg->data, 0, 0); + break; + case 'I': + dst[lpc - 1].i = strtoul(arg->data, 0, 0); + break; + case 'J': +#if defined(HAVE_STRTOULL) + dst[lpc - 1].j = (long long)strtoull(arg->data, 0, 0); +#elif defined(HAVE_STRTOUQ) + dst[lpc - 1].j = (long long)strtouq(arg->data, 0, 0); +#else +#error "jitBasic needs either strtoull or strtouq." +#endif + break; + case 'D': + case 'F': + if( (str = promoteParsedString(arg)) ) + { + double value; + char *sep; + + if( (sep = strchr(str, 'd')) ) + { + *sep = '.'; + } + value = strtod(str, 0); + if( ps->signature->data[ps->ret_and_args[lpc]] + == 'D' ) + { + dst[lpc - 1].d = value; + } + else + { + dst[lpc - 1].f = (float)value; + } + gc_free(str); + } + else + { + retval = 0; + } + break; + default: + assert(0); + break; + } + } + return( retval ); +} + +int testMethod(Hjava_lang_Class *cl, Field *field) +{ + struct testField tf; + errorInfo einfo; + int retval = 0; + + tf.tf_Name = (char *)field->name->data; + tf.tf_ComponentCount = 0; + if( parseTestField(&tf) ) + { + Utf8Const *utf; + Method *meth; + + utf = utf8ConstFromString(tf.tf_Components[tf.tf_MethodIndex].data); + meth = findMethodNoSig(cl, utf); + if( translate(meth, &einfo) ) + { + jvalue args[MAX_TEST_FIELD_COMPONENTS]; + jvalue rc, actual; + void *methblock; + + field2values(args, METHOD_PSIG(meth), &tf); + methblock = KGC_getObjectBase(main_collector, + METHOD_NATIVECODE(meth)); + memset(&rc, 0, sizeof(rc)); + memset(&actual, 0, sizeof(actual)); + KaffeVM_callMethodA(meth, + METHOD_NATIVECODE(meth), + 0, + args, + &rc, + 0); + switch( field->bsize ) + { + case sizeof(jbyte): + actual.i = ((char *)field->info.addr)[0]; + break; + case sizeof(jshort): + actual.i = ((short *)field->info.addr)[0]; + break; + case sizeof(jint): + memcpy(&actual.i, + field->info.addr, + field->bsize); + break; + case sizeof(jdouble): + memcpy(&actual.d, + field->info.addr, + field->bsize); + break; + default: + assert(0); + break; + } + if( !memcmp(&rc, &actual, sizeof(rc)) ) + { + kaffe_dprintf("Success %08x\n", rc.i); + retval = 1; + } + else + { + kaffe_dprintf("Failure for %s, got: %08x %f\n" + " expected: %08x %f\n", + field->name->data, + rc.i, rc.d, + actual.i, actual.d); + } + } + else + { + assert(0); + } + } + return( retval ); +} + +int internal_test(parsedString *ps) +{ + char *class_name; + int retval = 0; + + if( (class_name = promoteParsedString(ps)) ) + { + Hjava_lang_Class *cl; + errorInfo einfo; + int lpc; + + retval = 1; + loadStaticClass(&cl, class_name); + processClass(cl, CSTATE_COMPLETE, &einfo); + kaffe_dprintf("class: %s\n", cl->name->data); + for( lpc = 0; (lpc < CLASS_NSFIELDS(cl)) && retval; lpc++ ) + { + Field *field; + uint32 expected_value; + + field = &CLASS_SFIELDS(cl)[lpc]; + + switch (field->bsize) { + case 1: + expected_value = ((uint8 *)field->info.addr)[0]; + break; + case 2: + expected_value = ((uint16 *)field->info.addr)[0]; + break; + case 4: + expected_value = ((uint32 *)field->info.addr)[0]; + break; + default: + expected_value = 0; + } + kaffe_dprintf(" field: %s = 0x%08x\n", + field->name->data, + expected_value); + if( !strncmp("test_", field->name->data, 5) ) + { + retval = testMethod(cl, field); + } + } + gc_free(class_name); + } + return( retval ); +} + +#endif Index: kaffe/test/internal/jit_stub.c diff -u kaffe/test/internal/jit_stub.c:1.13 kaffe/test/internal/jit_stub.c:1.14 --- kaffe/test/internal/jit_stub.c:1.13 Mon Apr 17 17:58:16 2006 +++ kaffe/test/internal/jit_stub.c Sat Apr 22 01:53:43 2006 @@ -124,20 +124,20 @@ initNative(); /* Create the initialise and finalize names and signatures. */ - init_name = utf8ConstNew("<clinit>", -1); - final_name = utf8ConstNew("finalize", -1); - void_signature = utf8ConstNew("()V", -1); - constructor_name = utf8ConstNew("<init>", -1); - Code_name = utf8ConstNew("Code", -1); - LineNumberTable_name = utf8ConstNew("LineNumberTable", -1); - LocalVariableTable_name = utf8ConstNew("LocalVariableTable", -1); - ConstantValue_name = utf8ConstNew("ConstantValue", -1); - Exceptions_name = utf8ConstNew("Exceptions", -1); - SourceFile_name = utf8ConstNew("SourceFile", -1); - InnerClasses_name = utf8ConstNew("InnerClasses", -1); - Synthetic_name = utf8ConstNew("Synthetic", -1); - Signature_name = utf8ConstNew("Signature", -1); - EnclosingMethod_name = utf8ConstNew("EnclosingMethod", -1); + init_name = utf8ConstFromString("<clinit>"); + final_name = utf8ConstFromString("finalize"); + void_signature = utf8ConstFromString("()V"); + constructor_name = utf8ConstFromString("<init>"); + Code_name = utf8ConstFromString("Code"); + LineNumberTable_name = utf8ConstFromString("LineNumberTable"); + LocalVariableTable_name = utf8ConstFromString("LocalVariableTable"); + ConstantValue_name = utf8ConstFromString("ConstantValue"); + Exceptions_name = utf8ConstFromString("Exceptions"); + SourceFile_name = utf8ConstFromString("SourceFile"); + InnerClasses_name = utf8ConstFromString("InnerClasses"); + Synthetic_name = utf8ConstFromString("Synthetic"); + Signature_name = utf8ConstFromString("Signature"); + EnclosingMethod_name = utf8ConstFromString("EnclosingMethod"); if (!(init_name && final_name && void_signature && constructor_name && Code_name && LineNumberTable_name && _______________________________________________ kaffe mailing list kaffe@kaffe.org http://kaffe.org/cgi-bin/mailman/listinfo/kaffe