1.1 --- a/src/cpu/zero/vm/cppInterpreter_zero.cpp Mon Jan 11 13:41:45 2016 -0800 1.2 +++ b/src/cpu/zero/vm/cppInterpreter_zero.cpp Fri Jan 15 22:33:15 2016 +0000 1.3 @@ -1,5 +1,5 @@ 1.4 /* 1.5 - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. 1.6 + * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. 1.7 * Copyright 2007, 2008, 2009, 2010, 2011 Red Hat, Inc. 1.8 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.9 * 1.10 @@ -81,6 +81,29 @@ 1.11 return 0; 1.12 } 1.13 1.14 +intptr_t narrow(BasicType type, intptr_t result) { 1.15 + // mask integer result to narrower return type. 1.16 + switch (type) { 1.17 + case T_BOOLEAN: 1.18 + return result&1; 1.19 + case T_BYTE: 1.20 + return (intptr_t)(jbyte)result; 1.21 + case T_CHAR: 1.22 + return (intptr_t)(uintptr_t)(jchar)result; 1.23 + case T_SHORT: 1.24 + return (intptr_t)(jshort)result; 1.25 + case T_OBJECT: // nothing to do fall through 1.26 + case T_LONG: 1.27 + case T_INT: 1.28 + case T_FLOAT: 1.29 + case T_DOUBLE: 1.30 + case T_VOID: 1.31 + return result; 1.32 + default : ShouldNotReachHere(); 1.33 + } 1.34 +} 1.35 + 1.36 + 1.37 void CppInterpreter::main_loop(int recurse, TRAPS) { 1.38 JavaThread *thread = (JavaThread *) THREAD; 1.39 ZeroStack *stack = thread->zero_stack(); 1.40 @@ -194,8 +217,14 @@ 1.41 stack->set_sp(stack->sp() + method->max_locals()); 1.42 1.43 // Push our result 1.44 - for (int i = 0; i < result_slots; i++) 1.45 - stack->push(result[-i]); 1.46 + for (int i = 0; i < result_slots; i++) { 1.47 + // Adjust result to smaller 1.48 + intptr_t res = result[-i]; 1.49 + if (result_slots == 1) { 1.50 + res = narrow(result_type_of(method), res); 1.51 + } 1.52 + stack->push(res); 1.53 + } 1.54 } 1.55 1.56 int CppInterpreter::native_entry(Method* method, intptr_t UNUSED, TRAPS) { 1.57 @@ -528,6 +557,7 @@ 1.58 break; 1.59 1.60 case btos: 1.61 + case ztos: 1.62 SET_LOCALS_INT(object->byte_field_acquire(entry->f2_as_index()), 0); 1.63 break; 1.64 1.65 @@ -566,6 +596,7 @@ 1.66 break; 1.67 1.68 case btos: 1.69 + case ztos: 1.70 SET_LOCALS_INT(object->byte_field(entry->f2_as_index()), 0); 1.71 break; 1.72