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 + -
显示快捷键?