⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jsj_method.c

📁 caffeine-monkey java实现的js模拟引擎
💻 C
📖 第 1 页 / 共 5 页
字号:
        break;        case JAVA_SIGNATURE_LONG:        CALL_JAVA_METHOD(Long, j);        break;        case JAVA_SIGNATURE_SHORT:        CALL_JAVA_METHOD(Short, s);        break;        case JAVA_SIGNATURE_BOOLEAN:        CALL_JAVA_METHOD(Boolean, z);        break;        case JAVA_SIGNATURE_VOID:        if (is_static_method)            (*jEnv)->CallStaticVoidMethodA(jEnv, java_class, methodID, jargv);        else            (*jEnv)->CallVoidMethodA(jEnv, java_object, methodID, jargv);        if ((*jEnv)->ExceptionOccurred(jEnv)) {            jsj_ReportJavaError(cx, jEnv, "Error calling method %s.%s()",                                class_descriptor->name, method->name);            error_occurred = JS_TRUE;            goto out;        }        break;            case JAVA_SIGNATURE_UNKNOWN:        JS_ASSERT(0);        error_occurred = JS_TRUE;        goto out;                /* Non-primitive (reference) type */    default:        JS_ASSERT(IS_REFERENCE_TYPE(return_val_signature->type));        CALL_JAVA_METHOD(Object, l);        break;    }out:    if (localv) {        for (i = 0; i < argc; i++) {            if (localv[i])                (*jEnv)->DeleteLocalRef(jEnv, jargv[i].l);        }        JS_free(cx, localv);    }    if (jargv)       JS_free(cx, jargv);#ifdef JSJ_THREADSAFE    JS_BeginRequest(cx);#endif    if (!error_occurred) {        success = jsj_ConvertJavaValueToJSValue(cx, jEnv, return_val_signature, &java_value, vp);        if (IS_REFERENCE_TYPE(return_val_signature->type))            (*jEnv)->DeleteLocalRef(jEnv, java_value.l);    }    return success;}static JSBoolinvoke_overloaded_java_method(JSContext *cx, JSJavaThreadState *jsj_env,                              JavaMemberDescriptor *member,                              JSBool is_static_method,                              jobject java_class_or_instance,                              JavaClassDescriptor *class_descriptor,                              uintN argc, jsval *argv,                              jsval *vp){    JavaMethodSpec *method;    JNIEnv *jEnv;    jEnv = jsj_env->jEnv;    method = resolve_overloaded_method(cx, jEnv, member, class_descriptor,                                       is_static_method, argc, argv);    if (!method)        return JS_FALSE;    return invoke_java_method(cx, jsj_env, java_class_or_instance, class_descriptor,                               method, is_static_method, argv, vp);}static JSBoolinvoke_java_constructor(JSContext *cx,                        JSJavaThreadState *jsj_env,                        jclass java_class,                JavaMethodSpec *method,                jsval *argv, jsval *vp){    jvalue *jargv;    uintN argc, i;    jobject java_object;    jmethodID methodID;    JavaMethodSignature *signature;    JNIEnv *jEnv;    JSBool *localv;    JSBool success, error_occurred;    java_object = NULL;	    /* Stifle gcc uninitialized variable warning */    success = error_occurred = JS_FALSE;        methodID = method->methodID;    signature = &method->signature;    argc = signature->num_args;    jEnv = jsj_env->jEnv;    jargv = NULL;    localv = NULL;    if (argc) {        jargv = convert_JS_method_args_to_java_argv(cx, jEnv, argv, method, &localv);        if (!jargv) {            error_occurred = JS_TRUE;            goto out;        }    }    /* Prevent deadlocking if we re-enter JS on another thread as a result of a Java       method call and that new thread wants to perform a GC. */#ifdef JSJ_THREADSAFE    JS_EndRequest(cx);#endif    /* Call the constructor */    java_object = (*jEnv)->NewObjectA(jEnv, java_class, methodID, jargv);#ifdef JSJ_THREADSAFE    JS_BeginRequest(cx);#endif    if (!java_object) {        jsj_ReportJavaError(cx, jEnv, "Error while constructing instance of %s",                            jsj_GetJavaClassName(cx, jEnv, java_class));        error_occurred = JS_TRUE;        goto out;    }out:    if (localv) {        for (i = 0; i < argc; i++) {            if (localv[i])                (*jEnv)->DeleteLocalRef(jEnv, jargv[i].l);        }        JS_free(cx, localv);    }    if (jargv)       JS_free(cx, jargv);            if (!error_occurred)        success = jsj_ConvertJavaObjectToJSValue(cx, jEnv, java_object, vp);    (*jEnv)->DeleteLocalRef(jEnv, java_object);    return success;}static JSBoolinvoke_overloaded_java_constructor(JSContext *cx,                                   JSJavaThreadState *jsj_env,                                   JavaMemberDescriptor *member,                                   JavaClassDescriptor *class_descriptor,                                   uintN argc, jsval *argv,                                   jsval *vp){    jclass java_class;    JavaMethodSpec *method;    JNIEnv *jEnv;    jEnv = jsj_env->jEnv;    method = resolve_overloaded_method(cx, jEnv, member, class_descriptor, JS_TRUE,                                        argc, argv);    if (!method)        return JS_FALSE;    java_class = class_descriptor->java_class;    return invoke_java_constructor(cx, jsj_env, java_class, method, argv, vp);}static JSBooljava_constructor_wrapper(JSContext *cx, JSJavaThreadState *jsj_env,                         JavaMemberDescriptor *member_descriptor,                         JavaClassDescriptor *class_descriptor,                         uintN argc, jsval *argv, jsval *vp){    jint modifiers;    JNIEnv *jEnv;    jEnv = jsj_env->jEnv;        /* Get class/interface flags and check them */    modifiers = class_descriptor->modifiers;    if (modifiers & ACC_ABSTRACT) {        JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,                             JSJMSG_ABSTRACT_JCLASS, class_descriptor->name);        return JS_FALSE;    }    if (modifiers & ACC_INTERFACE) {        JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,                             JSJMSG_IS_INTERFACE, class_descriptor->name);        return JS_FALSE;    }    if ( !(modifiers & ACC_PUBLIC) ) {        JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,                             JSJMSG_NOT_PUBLIC, class_descriptor->name);        return JS_FALSE;    }        if (!member_descriptor) {        JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,                             JSJMSG_NO_CONSTRUCTORS, class_descriptor->name);        return JS_FALSE;    }    return invoke_overloaded_java_constructor(cx, jsj_env, member_descriptor,                                              class_descriptor, argc, argv, vp);}JS_EXPORT_API(JSBool)jsj_JavaConstructorWrapper(JSContext *cx, JSObject *obj,                           uintN argc, jsval *argv, jsval *vp){    JavaClassDescriptor *class_descriptor;    JavaMemberDescriptor *member_descriptor;    JSJavaThreadState *jsj_env;    JNIEnv *jEnv;    JSBool result;    obj = JSVAL_TO_OBJECT(argv[-2]);    class_descriptor = JS_GetPrivate(cx, obj);    JS_ASSERT(class_descriptor);    if (!class_descriptor)        return JS_FALSE;    /* XXX, workaround for bug 200016, all classes in sun.plugin package should not        be accessible in liveconnect.       Ideally, this checking should be done in JPI side, but it's not going to happen        until Sun JRE 1.5.1 */    if (strstr(class_descriptor->name, "sun.plugin.") == class_descriptor->name)        return JS_FALSE;      /* Get the Java per-thread environment pointer for this JSContext */    jsj_env = jsj_EnterJava(cx, &jEnv);    if (!jEnv)        return JS_FALSE;    member_descriptor = jsj_LookupJavaClassConstructors(cx, jEnv, class_descriptor);    result = java_constructor_wrapper(cx, jsj_env, member_descriptor,                                       class_descriptor, argc, argv, vp);    jsj_ExitJava(jsj_env);    return result;}static JSBoolstatic_method_wrapper(JSContext *cx, JSJavaThreadState *jsj_env,                      JavaClassDescriptor *class_descriptor,                      jsid id,                      uintN argc, jsval *argv, jsval *vp){    JNIEnv *jEnv;    JavaMemberDescriptor *member_descriptor;    jEnv = jsj_env->jEnv;    member_descriptor = jsj_LookupJavaStaticMemberDescriptorById(cx, jEnv, class_descriptor, id);        /* Is it a static method that is not a constructor ? */    if (member_descriptor && strcmp(member_descriptor->name, "<init>")) {        return invoke_overloaded_java_method(cx, jsj_env, member_descriptor, JS_TRUE,                                              class_descriptor->java_class,                                             class_descriptor, argc, argv, vp);    }    JS_ASSERT(member_descriptor);    if (!member_descriptor)        return JS_FALSE;        /* Must be an explicitly resolved overloaded constructor */    return java_constructor_wrapper(cx, jsj_env, member_descriptor,                                    class_descriptor, argc, argv, vp);}JS_EXTERN_API(JSBool)jsj_JavaStaticMethodWrapper(JSContext *cx, JSObject *obj,                            uintN argc, jsval *argv, jsval *vp){    JSFunction *function;    JavaClassDescriptor *class_descriptor;    jsid id;    jsval idval;    JNIEnv *jEnv;    JSJavaThreadState *jsj_env;    JSBool result;        class_descriptor = JS_GetPrivate(cx, obj);    if (!class_descriptor)        return JS_FALSE;    /* Get the Java per-thread environment pointer for this JSContext */    jsj_env = jsj_EnterJava(cx, &jEnv);    if (!jEnv)        return JS_FALSE;        JS_ASSERT(JS_TypeOfValue(cx, argv[-2]) == JSTYPE_FUNCTION);    function = JS_GetPrivate(cx, JSVAL_TO_OBJECT(argv[-2]));    idval = STRING_TO_JSVAL(JS_InternString(cx, JS_GetFunctionName(function)));    JS_ValueToId(cx, idval, &id);    result = static_method_wrapper(cx, jsj_env, class_descriptor, id, argc, argv, vp);    jsj_ExitJava(jsj_env);    return result;}JS_EXPORT_API(JSBool)jsj_JavaInstanceMethodWrapper(JSContext *cx, JSObject *obj,                              uintN argc, jsval *argv, jsval *vp){    JSFunction *function;    JavaMemberDescriptor *member_descriptor;    JavaObjectWrapper *java_wrapper;    JavaClassDescriptor *class_descriptor;    jsid id;    jsval idval;    JSJavaThreadState *jsj_env;    JNIEnv *jEnv;    jobject java_obj;    JSBool result;        java_wrapper = JS_GetPrivate(cx, obj);    if (!java_wrapper)        return JS_FALSE;    java_obj = java_wrapper->java_obj;        JS_ASSERT(JS_TypeOfValue(cx, argv[-2]) == JSTYPE_FUNCTION);    function = JS_GetPrivate(cx, JSVAL_TO_OBJECT(argv[-2]));    idval = STRING_TO_JSVAL(JS_InternString(cx, JS_GetFunctionName(function)));    JS_ValueToId(cx, idval, &id);    class_descriptor = java_wrapper->class_descriptor;        /* Get the Java per-thread environment pointer for this JSContext */    jsj_env = jsj_EnterJava(cx, &jEnv);    if (!jEnv)        return JS_FALSE;    if (jaApplet && (*jEnv)->IsInstanceOf(jEnv, java_obj, jaApplet)) {        jsj_JSIsCallingApplet = JS_TRUE;    }    /* Try to find an instance method with the given name first */    member_descriptor = jsj_LookupJavaMemberDescriptorById(cx, jEnv, class_descriptor, id);    if (member_descriptor)        result = invoke_overloaded_java_method(cx, jsj_env, member_descriptor,                                               JS_FALSE, java_obj,                                                class_descriptor, argc, argv, vp);    /* If no instance method was found, try for a static method or constructor */    else	result = static_method_wrapper(cx, jsj_env, class_descriptor, id, argc, argv, vp);    jsj_ExitJava(jsj_env);    return result;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -