Patch: Constructor invocation

Tom Tromey tromey@cygnus.com
Wed Jan 5 09:22:00 GMT 2000


I'm committing this patch.  It fixes a potential bug in method
invocation regarding the size of booleans, and it changes the
invocation code to understand that the constructor method itself
"returns" void.

2000-01-05  Tom Tromey  <tromey@cygnus.com>

	* java/lang/reflect/natMethod.cc (get_ffi_type): Test size of
	jboolean and select correct ffi type on that basis.
	(_Jv_CallNonvirtualMethodA): Handle `void' return type.
	Constructor call always has `void' return type.

Tom

Index: java/lang/reflect/natMethod.cc
===================================================================
RCS file: /cvs/java/libgcj/libjava/java/lang/reflect/natMethod.cc,v
retrieving revision 1.4
diff -u -r1.4 natMethod.cc
--- natMethod.cc	2000/01/04 08:46:52	1.4
+++ natMethod.cc	2000/01/05 17:20:53
@@ -131,8 +131,14 @@
     r = &ffi_type_double;
   else if (klass == JvPrimClass (boolean))
     {
-      // FIXME.
-      r = &ffi_type_sint8;
+      // On some platforms a bool is a byte, on others an int.
+      if (sizeof (jboolean) == sizeof (jbyte))
+	r = &ffi_type_sint8;
+      else
+	{
+	  JvAssert (sizeof (jboolean) == sizeof (jint));
+	  r = &ffi_type_sint32;
+	}
     }
   else if (klass == JvPrimClass (char))
     r = &ffi_type_uint16;
@@ -333,7 +339,12 @@
   if (needs_this)
     ++param_count;
 
-  ffi_type *rtype = get_ffi_type (return_type);
+  ffi_type *rtype;
+  // A constructor itself always returns void.
+  if (is_constructor || return_type == JvPrimClass (void))
+    rtype = &ffi_type_void;
+  else
+    rtype = get_ffi_type (return_type);
   ffi_type **argtypes = (ffi_type **) alloca (param_count
 					      * sizeof (ffi_type *));
 
@@ -451,7 +462,9 @@
 
   jobject r;
 #define VAL(Wrapper, Type)  (new Wrapper (* (Type *) &ret_value))
-  if (return_type == JvPrimClass (byte))
+  if (is_constructor)
+    r = obj;
+  else if (return_type == JvPrimClass (byte))
     r = VAL (java::lang::Byte, jbyte);
   else if (return_type == JvPrimClass (short))
     r = VAL (java::lang::Short, jshort);


More information about the Java-patches mailing list