// The call stub is used to call Java from C static void call_stub( JavaCallWrapper *call_wrapper, intptr_t* result, BasicType result_type, methodOop method, address entry_point, intptr_t* parameters, int parameter_words, TRAPS) { JavaThread *thread = (JavaThread *) THREAD; ZeroStack *stack = thread->zero_stack(); // Make sure we have no pending exceptions assert(!HAS_PENDING_EXCEPTION, "call_stub called with pending exception"); // Set up the stack if necessary bool stack_needs_teardown = false; if (stack->needs_setup()) { size_t zero_stack_size = stack->suggest_size(thread); stack->setup(alloca(zero_stack_size), zero_stack_size); stack_needs_teardown = true; } // Allocate and initialize our frame EntryFrame *frame = EntryFrame::build(parameters, parameter_words, call_wrapper, THREAD); if (!HAS_PENDING_EXCEPTION) { // Push the frame thread->push_zero_frame(frame); // Make the call Interpreter::invoke_method(method, entry_point, THREAD); // Store the result if (!HAS_PENDING_EXCEPTION) { switch (result_type) { case T_INT: *(jint *) result = *(jint *) stack->sp(); break; case T_LONG: *(jlong *) result = *(jlong *) stack->sp(); break; case T_FLOAT: *(jfloat *) result = *(jfloat *) stack->sp(); break; case T_DOUBLE: *(jdouble *) result = *(jdouble *) stack->sp(); break; case T_OBJECT: *(oop *) result = *(oop *) stack->sp(); break; default: ShouldNotReachHere(); } } // Unwind the frame thread->pop_zero_frame(); } // Tear down the stack if necessary if (stack_needs_teardown) stack->teardown(); }