[kaffe] CVS kaffe (hkraemer): fixed creation of miranda methods

Kaffe CVS cvs-commits at kaffe.org
Thu Jun 9 03:57:11 PDT 2005


PatchSet 6611 
Date: 2005/06/09 10:52:23
Author: hkraemer
Branch: HEAD
Tag: (none) 
Log:
fixed creation of miranda methods

Members: 
	ChangeLog:1.4137->1.4138 
	kaffe/kaffevm/classMethod.c:1.145->1.146 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4137 kaffe/ChangeLog:1.4138
--- kaffe/ChangeLog:1.4137	Sun Jun  5 02:43:31 2005
+++ kaffe/ChangeLog	Thu Jun  9 10:52:23 2005
@@ -1,3 +1,11 @@
+2005-06-09  Helmer Kraemer  <hkraemer at freenet.de>
+
+	* kaffe/kaffevm/classMethod.c (expandMethods): create new parsed_signature_t for
+	created method
+	(duplicateParsedSignature): new method
+
+	Fixes bug reported by Daniel Bonniot <Daniel.Bonniot at inria.fr>
+
 2005-06-05  Ito Kazumitsu  <kaz at maczuka.gcd.org>
 
 	* libraries/javalib/gnu/java/nio/charset/iconv/IconvProvider.java
Index: kaffe/kaffe/kaffevm/classMethod.c
diff -u kaffe/kaffe/kaffevm/classMethod.c:1.145 kaffe/kaffe/kaffevm/classMethod.c:1.146
--- kaffe/kaffe/kaffevm/classMethod.c:1.145	Mon May 30 21:16:02 2005
+++ kaffe/kaffe/kaffevm/classMethod.c	Thu Jun  9 10:52:25 2005
@@ -75,6 +75,7 @@
 static bool resolveStaticFields(Hjava_lang_Class*, errorInfo *einfo);
 static bool resolveConstants(Hjava_lang_Class*, errorInfo *einfo);
 static bool resolveInterfaces(Hjava_lang_Class *class, errorInfo *einfo);
+static parsed_signature_t *duplicateParsedSignature (parsed_signature_t *, errorInfo *);
 
 static struct Hjava_security_ProtectionDomain  *defaultProtectionDomain;
 
@@ -703,15 +704,28 @@
 		int i;
 		
 		i = CLASS_NMETHODS(cl);
-		CLASS_NMETHODS(cl) = i + 1;
 		CLASS_METHODS(cl) = new_methods;
 		utf8ConstAddRef(imeth->name);
-		utf8ConstAddRef(imeth->parsed_sig->signature);
 		new_methods[i] = *imeth;
+
+		/* Allocate a new parsed_signature_t for the method. We can't use the one
+		 * of the implemented method as destroyClass would then try to free it
+		 * twice.
+		 */
+		new_methods[i].parsed_sig = duplicateParsedSignature (imeth->parsed_sig, einfo);
+		if (new_methods[i].parsed_sig == NULL)
+		{
+			gc_free (new_methods);
+			return 0;
+		}
+
 		new_methods[i].ndeclared_exceptions = -1;
 		new_methods[i].declared_exceptions_u.remote_exceptions =
 			imeth;
 		new_methods[i].class = cl;
+
+		CLASS_NMETHODS(cl) = i + 1;
+
 		retval = 1;
 	}
 	else
@@ -2010,7 +2024,7 @@
 			/* skip inaccessible methods */
 			if (!checkAccess (meth->class, super, mt->accflags))
 				continue;
- 
+
 			if (utf8ConstEqual (mt->name, meth->name) &&
 			    utf8ConstEqual (METHOD_SIG(mt), METHOD_SIG(meth)))
 			{
@@ -2784,6 +2798,31 @@
 	}
 
 	return (nargs);
+}
+
+/*
+ * Duplicates a parsed signature.
+ */
+static parsed_signature_t*
+duplicateParsedSignature(parsed_signature_t *orig, errorInfo *einfo)
+{
+	parsed_signature_t *ret;
+	size_t sizeOfSignature;
+
+	sizeOfSignature = sizeof(*ret) + orig->nargs * sizeof(ret->ret_and_args[0]);
+
+	ret = (parsed_signature_t *)gc_malloc (sizeOfSignature, KGC_ALLOC_CLASSMISC);
+
+	if (ret == NULL) {
+		postOutOfMemory(einfo);
+		return NULL;
+	}
+
+	memcpy (ret, orig, sizeOfSignature);
+
+	utf8ConstAddRef (PSIG_UTF8(ret));
+
+	return ret;
 }
 
 /*




More information about the kaffe mailing list