diff src/share/vm/graal/graalCompilerToVM.cpp @ 16308:e5a8608f7d63

Narrowing down the return value (short, char and bool) of called method on Big Endian architectures.
author Stefan Anzinger <stefan.anzinger@gmail.com>
date Thu, 24 Apr 2014 14:02:20 +0200
parents affef8631cf4
children 151fe6b1e511
line wrap: on
line diff
--- a/src/share/vm/graal/graalCompilerToVM.cpp	Thu Apr 24 07:41:56 2014 +0200
+++ b/src/share/vm/graal/graalCompilerToVM.cpp	Thu Apr 24 14:02:20 2014 +0200
@@ -656,7 +656,23 @@
   } else if (jap.get_ret_type() == T_OBJECT || jap.get_ret_type() == T_ARRAY) {
     return JNIHandles::make_local((oop) result.get_jobject());
   } else {
-    oop o = java_lang_boxing_object::create(jap.get_ret_type(), (jvalue *) result.get_value_addr(), CHECK_NULL);
+    jvalue *value = (jvalue *) result.get_value_addr();
+    // Narrow the value down if required (Important on big endian machines)
+    switch (jap.get_ret_type()) {
+      case T_BOOLEAN:
+       value->z = (jboolean) value->i;
+       break;
+      case T_BYTE:
+       value->b = (jbyte) value->i;
+       break;
+      case T_CHAR:
+       value->c = (jchar) value->i;
+       break;
+      case T_SHORT:
+       value->s = (jshort) value->i;
+       break;
+     }
+    oop o = java_lang_boxing_object::create(jap.get_ret_type(), value, CHECK_NULL);
     return JNIHandles::make_local(o);
   }
 C2V_END