< prev index next >
src/hotspot/cpu/arm/interpreterRT_arm.cpp
Print this page
rev 54072 : 8213845: ARM32: Interpreter doesn't call result handler after native calls
Summary: Fix mapping of native jboolean result to 0..1 on ARM32
Reviewed-by: aph, phh
Contributed-by: christoph.goettschkes@microdoc.com
*** 84,98 ****
BasicType ret_type = (BasicType) (fingerprint & SignatureIterator::result_feature_mask);
// For ARM, the fast signature handler only needs to know whether
// the return value must be unboxed. T_OBJECT and T_ARRAY need not
// be distinguished from each other and all other return values
! // behave like integers with respect to the handler.
bool unbox = (ret_type == T_OBJECT) || (ret_type == T_ARRAY);
if (unbox) {
ret_type = T_OBJECT;
! } else {
ret_type = T_INT;
}
result |= ((uint64_t) ret_type) << shift;
shift += SignatureIterator::result_feature_size;
fingerprint >>= SignatureIterator::result_feature_size;
--- 84,99 ----
BasicType ret_type = (BasicType) (fingerprint & SignatureIterator::result_feature_mask);
// For ARM, the fast signature handler only needs to know whether
// the return value must be unboxed. T_OBJECT and T_ARRAY need not
// be distinguished from each other and all other return values
! // behave like integers with respect to the handler except T_BOOLEAN
! // which must be mapped to the range 0..1.
bool unbox = (ret_type == T_OBJECT) || (ret_type == T_ARRAY);
if (unbox) {
ret_type = T_OBJECT;
! } else if (ret_type != T_BOOLEAN) {
ret_type = T_INT;
}
result |= ((uint64_t) ret_type) << shift;
shift += SignatureIterator::result_feature_size;
fingerprint >>= SignatureIterator::result_feature_size;
*** 279,296 ****
BasicType result_type = SignatureIterator::return_type(fingerprint);
address result_handler = Interpreter::result_handler(result_type);
- #ifdef AARCH64
- __ mov_slow(R0, (address)result_handler);
- #else
- // Check that result handlers are not real handler on ARM (0 or -1).
- // This ensures the signature handlers do not need symbolic information.
- assert((result_handler == NULL)||(result_handler==(address)0xffffffff),"");
__ mov_slow(R0, (intptr_t)result_handler);
- #endif
__ ret();
}
--- 280,290 ----
< prev index next >