invoker.c
来自「This is a resource based on j2me embedde」· C语言 代码 · 共 764 行 · 第 1/2 页
C
764 行
request->method, request->arguments); break; case JDWP_TAG(LONG): request->returnValue.j = JNI_FUNC_PTR(env,CallStaticLongMethodA)(env, request->clazz, request->method, request->arguments); break; case JDWP_TAG(SHORT): request->returnValue.s = JNI_FUNC_PTR(env,CallStaticShortMethodA)(env, request->clazz, request->method, request->arguments); break; case JDWP_TAG(BOOLEAN): request->returnValue.z = JNI_FUNC_PTR(env,CallStaticBooleanMethodA)(env, request->clazz, request->method, request->arguments); break; case JDWP_TAG(VOID): JNI_FUNC_PTR(env,CallStaticVoidMethodA)(env, request->clazz, request->method, request->arguments); break; default: EXIT_ERROR(AGENT_ERROR_NULL_POINTER,"Invalid method signature"); break; }}static void invokeVirtual(JNIEnv *env, InvokeRequest *request){ switch(returnTypeTag(request->methodSignature)) { case JDWP_TAG(OBJECT): case JDWP_TAG(ARRAY): { jobject object; object = JNI_FUNC_PTR(env,CallObjectMethodA)(env, request->instance, request->method, request->arguments); request->returnValue.l = NULL; if (object != NULL) { saveGlobalRef(env, object, &(request->returnValue.l)); } break; } case JDWP_TAG(BYTE): request->returnValue.b = JNI_FUNC_PTR(env,CallByteMethodA)(env, request->instance, request->method, request->arguments); break; case JDWP_TAG(CHAR): request->returnValue.c = JNI_FUNC_PTR(env,CallCharMethodA)(env, request->instance, request->method, request->arguments); break; case JDWP_TAG(FLOAT): request->returnValue.f = JNI_FUNC_PTR(env,CallFloatMethodA)(env, request->instance, request->method, request->arguments); break; case JDWP_TAG(DOUBLE): request->returnValue.d = JNI_FUNC_PTR(env,CallDoubleMethodA)(env, request->instance, request->method, request->arguments); break; case JDWP_TAG(INT): request->returnValue.i = JNI_FUNC_PTR(env,CallIntMethodA)(env, request->instance, request->method, request->arguments); break; case JDWP_TAG(LONG): request->returnValue.j = JNI_FUNC_PTR(env,CallLongMethodA)(env, request->instance, request->method, request->arguments); break; case JDWP_TAG(SHORT): request->returnValue.s = JNI_FUNC_PTR(env,CallShortMethodA)(env, request->instance, request->method, request->arguments); break; case JDWP_TAG(BOOLEAN): request->returnValue.z = JNI_FUNC_PTR(env,CallBooleanMethodA)(env, request->instance, request->method, request->arguments); break; case JDWP_TAG(VOID): JNI_FUNC_PTR(env,CallVoidMethodA)(env, request->instance, request->method, request->arguments); break; default: EXIT_ERROR(AGENT_ERROR_NULL_POINTER,"Invalid method signature"); break; }}static void invokeNonvirtual(JNIEnv *env, InvokeRequest *request){ switch(returnTypeTag(request->methodSignature)) { case JDWP_TAG(OBJECT): case JDWP_TAG(ARRAY): { jobject object; object = JNI_FUNC_PTR(env,CallNonvirtualObjectMethodA)(env, request->instance, request->clazz, request->method, request->arguments); request->returnValue.l = NULL; if (object != NULL) { saveGlobalRef(env, object, &(request->returnValue.l)); } break; } case JDWP_TAG(BYTE): request->returnValue.b = JNI_FUNC_PTR(env,CallNonvirtualByteMethodA)(env, request->instance, request->clazz, request->method, request->arguments); break; case JDWP_TAG(CHAR): request->returnValue.c = JNI_FUNC_PTR(env,CallNonvirtualCharMethodA)(env, request->instance, request->clazz, request->method, request->arguments); break; case JDWP_TAG(FLOAT): request->returnValue.f = JNI_FUNC_PTR(env,CallNonvirtualFloatMethodA)(env, request->instance, request->clazz, request->method, request->arguments); break; case JDWP_TAG(DOUBLE): request->returnValue.d = JNI_FUNC_PTR(env,CallNonvirtualDoubleMethodA)(env, request->instance, request->clazz, request->method, request->arguments); break; case JDWP_TAG(INT): request->returnValue.i = JNI_FUNC_PTR(env,CallNonvirtualIntMethodA)(env, request->instance, request->clazz, request->method, request->arguments); break; case JDWP_TAG(LONG): request->returnValue.j = JNI_FUNC_PTR(env,CallNonvirtualLongMethodA)(env, request->instance, request->clazz, request->method, request->arguments); break; case JDWP_TAG(SHORT): request->returnValue.s = JNI_FUNC_PTR(env,CallNonvirtualShortMethodA)(env, request->instance, request->clazz, request->method, request->arguments); break; case JDWP_TAG(BOOLEAN): request->returnValue.z = JNI_FUNC_PTR(env,CallNonvirtualBooleanMethodA)(env, request->instance, request->clazz, request->method, request->arguments); break; case JDWP_TAG(VOID): JNI_FUNC_PTR(env,CallNonvirtualVoidMethodA)(env, request->instance, request->clazz, request->method, request->arguments); break; default: EXIT_ERROR(AGENT_ERROR_NULL_POINTER,"Invalid method signature"); break; }}jbooleaninvoker_doInvoke(jthread thread){ JNIEnv *env; jboolean startNow; InvokeRequest *request; JDI_ASSERT(thread); debugMonitorEnter(invokerLock); request = threadControl_getInvokeRequest(thread); if (request == NULL) { EXIT_ERROR(AGENT_ERROR_INVALID_THREAD, "getting thread invoke request"); } request->available = JNI_FALSE; startNow = request->pending && !request->started; if (startNow) { request->started = JNI_TRUE; } debugMonitorExit(invokerLock); if (!startNow) { return JNI_FALSE; } env = getEnv(); WITH_LOCAL_REFS(env, 2) { /* 1 for obj return values, 1 for exception */ jobject exception; JNI_FUNC_PTR(env,ExceptionClear)(env); switch (request->invokeType) { case INVOKE_CONSTRUCTOR: invokeConstructor(env, request); break; case INVOKE_STATIC: invokeStatic(env, request); break; case INVOKE_INSTANCE: if (request->options & JDWP_INVOKE_OPTIONS(NONVIRTUAL) ) { invokeNonvirtual(env, request); } else { invokeVirtual(env, request); } break; default: JDI_ASSERT(JNI_FALSE); } request->exception = NULL; exception = JNI_FUNC_PTR(env,ExceptionOccurred)(env); if (exception != NULL) { JNI_FUNC_PTR(env,ExceptionClear)(env); saveGlobalRef(env, exception, &(request->exception)); } } END_WITH_LOCAL_REFS(env); return JNI_TRUE;}voidinvoker_completeInvokeRequest(jthread thread) { JNIEnv *env = getEnv(); PacketOutputStream out; jbyte tag; jobject exc; jvalue returnValue = {0}; jint id; InvokeRequest *request; jboolean detached; JDI_ASSERT(thread); /* Prevent gcc errors on uninitialized variables. */ tag = 0; exc = NULL; id = 0; eventHandler_lock(); /* for proper lock order */ debugMonitorEnter(invokerLock); request = threadControl_getInvokeRequest(thread); if (request == NULL) { EXIT_ERROR(AGENT_ERROR_INVALID_THREAD, "getting thread invoke request"); } JDI_ASSERT(request->pending); JDI_ASSERT(request->started); request->pending = JNI_FALSE; request->started = JNI_FALSE; request->available = JNI_TRUE; /* For next time around */ detached = request->detached; if (!detached) { if (request->options & JDWP_INVOKE_OPTIONS(SINGLE_THREADED)) { (void)threadControl_suspendThread(thread, JNI_FALSE); } else { (void)threadControl_suspendAll(); } if (request->invokeType == INVOKE_CONSTRUCTOR) { /* * Although constructors technically have a return type of * void, we return the object created. */ tag = specificTypeKey(env, request->returnValue.l); } else { tag = returnTypeTag(request->methodSignature); } id = request->id; exc = request->exception; returnValue = request->returnValue; } /* * Give up the lock before I/O operation */ debugMonitorExit(invokerLock); eventHandler_unlock(); if (!detached) { outStream_initReply(&out, id); (void)outStream_writeValue(env, &out, tag, returnValue); (void)outStream_writeObjectTag(env, &out, exc); (void)outStream_writeObjectRef(env, &out, exc); outStream_sendReply(&out); }}jboolean invoker_isPending(jthread thread){ InvokeRequest *request; JDI_ASSERT(thread); request = threadControl_getInvokeRequest(thread); if (request == NULL) { EXIT_ERROR(AGENT_ERROR_INVALID_THREAD, "getting thread invoke request"); } return request->pending;}void invoker_detach(InvokeRequest *request){ JDI_ASSERT(request); debugMonitorEnter(invokerLock); request->detached = JNI_TRUE; debugMonitorExit(invokerLock);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?