OSDN Git Service

PR target/51500
authorktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Feb 2012 10:46:36 +0000 (10:46 +0000)
committerktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Feb 2012 10:46:36 +0000 (10:46 +0000)
* interpret.cc (_Jv_init_cif): Handle thiscall
convention for 32-bit Windows.
* java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA):
Likewise.
* java/lang/reflect/natVMProxy.cc (invoke_t): Add
thiscall-attribute for 32-bit Windows.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183794 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/interpret.cc
libjava/java/lang/reflect/natMethod.cc
libjava/java/lang/reflect/natVMProxy.cc

index 7ac0a66..5f78e05 100644 (file)
@@ -1,3 +1,13 @@
+2012-02-01  Kai Tietz  <ktietz@redhat.com>
+
+       PR target/51500
+       * interpret.cc (_Jv_init_cif): Handle thiscall
+       convention for 32-bit Windows.
+       * java/lang/reflect/natMethod.cc (_Jv_CallAnyMethodA):
+       Likewise.
+       * java/lang/reflect/natVMProxy.cc (invoke_t): Add
+       thiscall-attribute for 32-bit Windows.
+
 2012-01-01  Jakub Jelinek  <jakub@redhat.com>
 
        * gnu/gcj/convert/Convert.java (version): Update copyright notice
index ab28836..78686fd 100644 (file)
@@ -1303,7 +1303,12 @@ _Jv_init_cif (_Jv_Utf8Const* signature,
   if (ptr != (unsigned char*)signature->chars() + signature->len())
     throw_internal_error ("did not find end of signature");
 
-  if (ffi_prep_cif (cif, FFI_DEFAULT_ABI,
+  ffi_abi cabi = FFI_DEFAULT_ABI;
+#if defined (X86_WIN32) && !defined (__CYGWIN__)
+  if (!staticp)
+    cabi = FFI_THISCALL;
+#endif
+  if (ffi_prep_cif (cif, cabi,
                    arg_count, rtype, arg_types) != FFI_OK)
     throw_internal_error ("ffi_prep_cif failed");
 
index d95c92f..8ac87fc 100644 (file)
@@ -436,7 +436,12 @@ _Jv_CallAnyMethodA (jobject obj,
       p += size_per_arg;
     }
 
-  if (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, param_count,
+  ffi_abi cabi = FFI_DEFAULT_ABI;
+#if defined (X86_WIN32) && !defined (__CYGWIN__)
+  if (needs_this)
+    cabi = FFI_THISCALL;
+#endif
+  if (ffi_prep_cif (&cif, cabi, param_count,
                    rtype, argtypes) != FFI_OK)
     throw new java::lang::VirtualMachineError(JvNewStringLatin1("internal error: ffi_prep_cif failed"));
 
index 4c3fd74..e46263d 100644 (file)
@@ -79,7 +79,11 @@ typedef void (*closure_fun) (ffi_cif*, void*, void**, void*);
 static void *ncode (int method_index, jclass klass, _Jv_Method *self, closure_fun fun);
 static void run_proxy (ffi_cif*, void*, void**, void*);
 
-typedef jobject invoke_t (jobject, Proxy *, Method *, JArray< jobject > *);
+typedef jobject
+#if defined (X86_WIN32) && !defined (__CYGWIN__)
+ __attribute__ ((thiscall))
+#endif
+ invoke_t (jobject, Proxy *, Method *, JArray< jobject > *);
 
 // True if pc points to a proxy frame.