void do_return (byte numWords) { StackFrame *stackFrame; STACKWORD *fromStackPtr; stackFrame = current_stackframe(); #if DEBUG_BYTECODE printf ("\n------ return ----- %d ------------------\n\n", stackFrame->methodRecord->signatureId); #endif #if DEBUG_METHODS printf ("do_return: method: %d # num. words: %d\n", stackFrame->methodRecord->signatureId, numWords); #endif #ifdef VERIFY assert (stackFrame != null, LANGUAGE3); #endif if (stackFrame->monitor != null) exit_monitor (currentThread, stackFrame->monitor); #if DEBUG_THREADS || DEBUG_METHODS printf ("do_return: stack frame array size: %d\n", currentThread->stackFrameArraySize); #endif if (currentThread->stackFrameArraySize == 1) { #if DEBUG_METHODS printf ("do_return: thread is done: %d\n", (int) currentThread); #endif currentThread->state = DEAD; schedule_request (REQUEST_SWITCH_THREAD); return; } // Place source ptr below data to be copied up the stack fromStackPtr = get_stack_ptr_at (numWords); // Pop stack frame currentThread->stackFrameArraySize--; stackFrame--; // Assign registers update_registers (stackFrame); #if DEBUG_METHODS printf ("do_return: stack reset to:\n"); printf ("-- stack ptr = %d\n", (int) get_stack_ptr()); #endif while (numWords--) { push_word (*(++fromStackPtr)); } }
bool add_exit_monitor(monitor_list *tTable, const client_id *hHandle, entity_handle cClient, text_info nName) { if (!tTable) return false; exit_monitor find_temp(cClient, nName); if (tTable->exits.f_find(find_temp, &exit_monitor_list::find_by_value) != data::not_found) return false; tTable->exits.add_element( exit_monitor_list::new_element((entity_handle) hHandle, exit_monitor(cClient, nName)) ); return true; }
/** * Perform a return from a method call. Clean up the stack, setup * the return of any results, release any monitor and finally set the * PC for the return address. */ void do_return (int numWords) { StackFrame *stackFrame; STACKWORD *fromStackPtr; stackFrame = current_stackframe(); #if DEBUG_BYTECODE printf ("\n------ return ----- %d ------------------\n\n", stackFrame->methodRecord->signatureId); #endif #if DEBUG_METHODS printf ("do_return: method: %d # num. words: %d\n", stackFrame->methodRecord->signatureId, numWords); #endif #ifdef VERIFY assert (stackFrame != null, LANGUAGE3); #endif if (stackFrame->monitor != null) { // if this was a class init then mark the class as now complete if (stackFrame->methodRecord->signatureId == _6clinit_7_4_5V) set_init_state((ClassRecord *)(stackFrame->monitor), C_INITIALIZED); exit_monitor (currentThread, stackFrame->monitor); } #if DEBUG_THREADS || DEBUG_METHODS printf ("do_return: stack frame array size: %d\n", currentThread->stackFrameIndex); #endif // Place source ptr below data to be copied up the stack fromStackPtr = get_stack_ptr_at_cur(numWords); // Pop stack frame currentThread->stackFrameIndex--; stackFrame--; // Assign registers update_registers (stackFrame); #if DEBUG_METHODS printf ("do_return: stack reset to:\n"); //printf ("-- stack ptr = %d\n", (int) get_stack_ptr()); #endif while (numWords--) { push_word_cur (*(++fromStackPtr)); } }