1.1 --- a/src/cpu/zero/vm/stubGenerator_zero.cpp Wed Apr 14 15:30:13 2010 -0700 1.2 +++ b/src/cpu/zero/vm/stubGenerator_zero.cpp Thu Apr 15 02:40:12 2010 -0700 1.3 @@ -1,6 +1,6 @@ 1.4 /* 1.5 * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved. 1.6 - * Copyright 2007, 2008 Red Hat, Inc. 1.7 + * Copyright 2007, 2008, 2010 Red Hat, Inc. 1.8 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.9 * 1.10 * This code is free software; you can redistribute it and/or modify it 1.11 @@ -60,38 +60,43 @@ 1.12 } 1.13 1.14 // Allocate and initialize our frame 1.15 - thread->push_zero_frame( 1.16 - EntryFrame::build(stack, parameters, parameter_words, call_wrapper)); 1.17 + EntryFrame *frame = 1.18 + EntryFrame::build(parameters, parameter_words, call_wrapper, THREAD); 1.19 1.20 - // Make the call 1.21 - Interpreter::invoke_method(method, entry_point, THREAD); 1.22 + if (!HAS_PENDING_EXCEPTION) { 1.23 + // Push the frame 1.24 + thread->push_zero_frame(frame); 1.25 1.26 - // Store result depending on type 1.27 - if (!HAS_PENDING_EXCEPTION) { 1.28 - switch (result_type) { 1.29 - case T_INT: 1.30 - *(jint *) result = *(jint *) stack->sp(); 1.31 - break; 1.32 - case T_LONG: 1.33 - *(jlong *) result = *(jlong *) stack->sp(); 1.34 - break; 1.35 - case T_FLOAT: 1.36 - *(jfloat *) result = *(jfloat *) stack->sp(); 1.37 - break; 1.38 - case T_DOUBLE: 1.39 - *(jdouble *) result = *(jdouble *) stack->sp(); 1.40 - break; 1.41 - case T_OBJECT: 1.42 - *(oop *) result = *(oop *) stack->sp(); 1.43 - break; 1.44 - default: 1.45 - ShouldNotReachHere(); 1.46 + // Make the call 1.47 + Interpreter::invoke_method(method, entry_point, THREAD); 1.48 + 1.49 + // Store the result 1.50 + if (!HAS_PENDING_EXCEPTION) { 1.51 + switch (result_type) { 1.52 + case T_INT: 1.53 + *(jint *) result = *(jint *) stack->sp(); 1.54 + break; 1.55 + case T_LONG: 1.56 + *(jlong *) result = *(jlong *) stack->sp(); 1.57 + break; 1.58 + case T_FLOAT: 1.59 + *(jfloat *) result = *(jfloat *) stack->sp(); 1.60 + break; 1.61 + case T_DOUBLE: 1.62 + *(jdouble *) result = *(jdouble *) stack->sp(); 1.63 + break; 1.64 + case T_OBJECT: 1.65 + *(oop *) result = *(oop *) stack->sp(); 1.66 + break; 1.67 + default: 1.68 + ShouldNotReachHere(); 1.69 + } 1.70 } 1.71 + 1.72 + // Unwind the frame 1.73 + thread->pop_zero_frame(); 1.74 } 1.75 1.76 - // Unwind our frame 1.77 - thread->pop_zero_frame(); 1.78 - 1.79 // Tear down the stack if necessary 1.80 if (stack_needs_teardown) 1.81 stack->teardown(); 1.82 @@ -226,13 +231,13 @@ 1.83 StubGenerator g(code, all); 1.84 } 1.85 1.86 -EntryFrame *EntryFrame::build(ZeroStack* stack, 1.87 - const intptr_t* parameters, 1.88 +EntryFrame *EntryFrame::build(const intptr_t* parameters, 1.89 int parameter_words, 1.90 - JavaCallWrapper* call_wrapper) { 1.91 - if (header_words + parameter_words > stack->available_words()) { 1.92 - Unimplemented(); 1.93 - } 1.94 + JavaCallWrapper* call_wrapper, 1.95 + TRAPS) { 1.96 + 1.97 + ZeroStack *stack = ((JavaThread *) THREAD)->zero_stack(); 1.98 + stack->overflow_check(header_words + parameter_words, CHECK_NULL); 1.99 1.100 stack->push(0); // next_frame, filled in later 1.101 intptr_t *fp = stack->sp();