From 562ff1637faf0ce60e65c13a9a7c27015b6226bc Mon Sep 17 00:00:00 2001
From: Anthony Green <green@redhat.com>
Date: Fri, 1 Mar 2002 05:36:31 +0000
Subject: Add pointer support to the reflection code.

From-SVN: r50180
---
 libjava/java/lang/reflect/natMethod.cc | 65 +++++++++++++++++++---------------
 1 file changed, 36 insertions(+), 29 deletions(-)

(limited to 'libjava/java/lang')

diff --git a/libjava/java/lang/reflect/natMethod.cc b/libjava/java/lang/reflect/natMethod.cc
index e11e5c36..d4cbb72 100644
--- a/libjava/java/lang/reflect/natMethod.cc
+++ b/libjava/java/lang/reflect/natMethod.cc
@@ -426,6 +426,7 @@ _Jv_CallAnyMethodA (jobject obj,
   union
   {
     ffi_arg i;
+    jobject o;
     jlong l;
     jfloat f;
     jdouble d;
@@ -448,37 +449,43 @@ _Jv_CallAnyMethodA (jobject obj,
   // a narrowing conversion for jbyte, jchar, etc. results.
   // Note that boolean is handled either by the FFI_TYPE_SINT8 or
   // FFI_TYPE_SINT32 case.
-  switch (rtype->type)
-    {
-    case FFI_TYPE_VOID:
-      break;
-    case FFI_TYPE_SINT8:
-      result->b = (jbyte)ffi_result.i;
-      break;
-    case FFI_TYPE_SINT16:
-      result->s = (jshort)ffi_result.i;
-      break;
-    case FFI_TYPE_UINT16:
-      result->c = (jchar)ffi_result.i;
-      break;
-    case FFI_TYPE_SINT32:
-      result->i = (jint)ffi_result.i;
-      break;
-    case FFI_TYPE_SINT64:
-      result->j = (jlong)ffi_result.l;
-      break;
-    case FFI_TYPE_FLOAT:
-      result->f = (jfloat)ffi_result.f;
-      break;
-    case FFI_TYPE_DOUBLE:
-      result->d = (jdouble)ffi_result.d;
-      break;
-    default:
-      JvFail ("Unknown ffi_call return type");
-      break;
-    }
   if (is_constructor)
     result->l = obj;
+  else
+    {
+      switch (rtype->type)
+	{
+	case FFI_TYPE_VOID:
+	  break;
+	case FFI_TYPE_SINT8:
+	  result->b = (jbyte)ffi_result.i;
+	  break;
+	case FFI_TYPE_SINT16:
+	  result->s = (jshort)ffi_result.i;
+	  break;
+	case FFI_TYPE_UINT16:
+	  result->c = (jchar)ffi_result.i;
+	  break;
+	case FFI_TYPE_SINT32:
+	  result->i = (jint)ffi_result.i;
+	  break;
+	case FFI_TYPE_SINT64:
+	  result->j = (jlong)ffi_result.l;
+	  break;
+	case FFI_TYPE_FLOAT:
+	  result->f = (jfloat)ffi_result.f;
+	  break;
+	case FFI_TYPE_DOUBLE:
+	  result->d = (jdouble)ffi_result.d;
+	  break;
+	case FFI_TYPE_POINTER:
+	  result->l = (jobject)ffi_result.o;
+	  break;
+	default:
+	  JvFail ("Unknown ffi_call return type");
+	  break;
+	}
+    }
 
   return ex;
 #else
-- 
cgit v1.1