Mercurial > hg > truffle
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