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

📄 jsj_jsobject.c

📁 caffeine-monkey java实现的js模拟引擎
💻 C
📖 第 1 页 / 共 3 页
字号:
    return member;}/* * Class:     netscape_javascript_JSObject * Method:    getSlot * Signature: (I)Ljava/lang/Object; */JNIEXPORT jobject JNICALLJava_netscape_javascript_JSObject_getSlot(JNIEnv *jEnv,                                          jobject java_wrapper_obj,                                          jint slot){    JSContext *cx = NULL;    JSObject *js_obj;    jsval js_val;    int dummy_cost;    JSBool dummy_bool;    JSErrorReporter saved_reporter;    jobject member;    JSJavaThreadState *jsj_env;        jsj_env = jsj_enter_js(jEnv, NULL, java_wrapper_obj, &cx, &js_obj, &saved_reporter, NULL, 0, NULL);    if (!jsj_env)        return NULL;        if (!JS_GetElement(cx, js_obj, slot, &js_val))        goto done;    if (!jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv),                                        &dummy_cost, &member, &dummy_bool))        goto done;done:    if (!jsj_exit_js(cx, jsj_env, saved_reporter))        return NULL;        return member;}/* * Class:     netscape_javascript_JSObject * Method:    setMember * Signature: (Ljava/lang/String;Ljava/lang/Object;)V */JNIEXPORT void JNICALLJava_netscape_javascript_JSObject_setMember(JNIEnv *jEnv,                                            jobject java_wrapper_obj,                                            jstring property_name_jstr,                                            jobject java_obj){    JSContext *cx = NULL;    JSObject *js_obj;    jsval js_val;    const jchar *property_name_ucs2;    jsize property_name_len;    JSErrorReporter saved_reporter;    jboolean is_copy;    JSJavaThreadState *jsj_env;        jsj_env = jsj_enter_js(jEnv, NULL, java_wrapper_obj, &cx, &js_obj, &saved_reporter, NULL, 0, NULL);    if (!jsj_env)        return;        property_name_ucs2 = NULL;    if (!property_name_jstr) {        JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,                                            JSJMSG_NULL_MEMBER_NAME);        goto done;    }    /* Get the Unicode string for the JS property name */    property_name_ucs2 = (*jEnv)->GetStringChars(jEnv, property_name_jstr, &is_copy);    if (!property_name_ucs2) {        JS_ASSERT(0);        goto done;    }    property_name_len = (*jEnv)->GetStringLength(jEnv, property_name_jstr);        if (!jsj_ConvertJavaObjectToJSValue(cx, jEnv, java_obj, &js_val))        goto done;    JS_SetUCProperty(cx, js_obj, property_name_ucs2, property_name_len, &js_val);done:    if (property_name_ucs2)        (*jEnv)->ReleaseStringChars(jEnv, property_name_jstr, property_name_ucs2);    jsj_exit_js(cx, jsj_env, saved_reporter);}/* * Class:     netscape_javascript_JSObject * Method:    setSlot * Signature: (ILjava/lang/Object;)V */JNIEXPORT void JNICALLJava_netscape_javascript_JSObject_setSlot(JNIEnv *jEnv,                                          jobject java_wrapper_obj,                                          jint slot,                                          jobject java_obj){    JSContext *cx = NULL;    JSObject *js_obj;    jsval js_val;    JSErrorReporter saved_reporter;    JSJavaThreadState *jsj_env;        jsj_env = jsj_enter_js(jEnv, NULL, java_wrapper_obj, &cx, &js_obj, &saved_reporter, NULL, 0, NULL);    if (!jsj_env)        return;        if (!jsj_ConvertJavaObjectToJSValue(cx, jEnv, java_obj, &js_val))        goto done;    JS_SetElement(cx, js_obj, slot, &js_val);done:    jsj_exit_js(cx, jsj_env, saved_reporter);}/* * Class:     netscape_javascript_JSObject * Method:    removeMember * Signature: (Ljava/lang/String;)V */JNIEXPORT void JNICALLJava_netscape_javascript_JSObject_removeMember(JNIEnv *jEnv,                                               jobject java_wrapper_obj,                                               jstring property_name_jstr){    JSContext *cx = NULL;    JSObject *js_obj;    jsval js_val;    const jchar *property_name_ucs2;    jsize property_name_len;    JSErrorReporter saved_reporter;    jboolean is_copy;    JSJavaThreadState *jsj_env;        jsj_env = jsj_enter_js(jEnv, NULL, java_wrapper_obj, &cx, &js_obj, &saved_reporter, NULL, 0, NULL);    if (!jsj_env)        return;        if (!property_name_jstr) {        JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,                                            JSJMSG_NULL_MEMBER_NAME);        goto done;    }    /* Get the Unicode string for the JS property name */    property_name_ucs2 = (*jEnv)->GetStringChars(jEnv, property_name_jstr, &is_copy);    if (!property_name_ucs2) {        JS_ASSERT(0);        goto done;    }    property_name_len = (*jEnv)->GetStringLength(jEnv, property_name_jstr);        JS_DeleteUCProperty2(cx, js_obj, property_name_ucs2, property_name_len, &js_val);    (*jEnv)->ReleaseStringChars(jEnv, property_name_jstr, property_name_ucs2);done:    jsj_exit_js(cx, jsj_env, saved_reporter);    return;}/* * Class:     netscape_javascript_JSObject * Method:    call * Signature: (Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object; */JNIEXPORT jobject JNICALLJava_netscape_javascript_JSObject_call(JNIEnv *jEnv, jobject java_wrapper_obj,                                       jstring function_name_jstr, jobjectArray java_args){    int i, argc, arg_num;    jsval *argv;    JSContext *cx = NULL;    JSObject *js_obj;    jsval js_val, function_val;    int dummy_cost;    JSBool dummy_bool;    const jchar *function_name_ucs2;    jsize function_name_len;    JSErrorReporter saved_reporter;    jboolean is_copy;    jobject result;    JSJavaThreadState *jsj_env;        jsj_env = jsj_enter_js(jEnv, NULL, java_wrapper_obj, &cx, &js_obj, &saved_reporter, NULL, 0, NULL);    if (!jsj_env)        return NULL;        function_name_ucs2 = NULL;    result = NULL;    if (!function_name_jstr) {        JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,                                                    JSJMSG_NULL_FUNCTION_NAME);        goto done;    }    /* Get the function name to eval as raw Unicode characters */    function_name_ucs2 = (*jEnv)->GetStringChars(jEnv, function_name_jstr, &is_copy);    if (!function_name_ucs2) {        JS_ASSERT(0);        goto done;    }    function_name_len = (*jEnv)->GetStringLength(jEnv, function_name_jstr);        /* Allocate space for JS arguments */    if (java_args) {        argc = (*jEnv)->GetArrayLength(jEnv, java_args);        argv = (jsval*)JS_malloc(cx, argc * sizeof(jsval));    } else {        argc = 0;        argv = 0;    }    /* Convert arguments from Java to JS values */    for (arg_num = 0; arg_num < argc; arg_num++) {        jobject arg = (*jEnv)->GetObjectArrayElement(jEnv, java_args, arg_num);        if (!jsj_ConvertJavaObjectToJSValue(cx, jEnv, arg, &argv[arg_num]))            goto cleanup_argv;        JS_AddNamedRoot(cx, &argv[arg_num], "&argv[arg_num]");    }    if (!JS_GetUCProperty(cx, js_obj, function_name_ucs2, function_name_len,                          &function_val))        goto cleanup_argv;    if (!JS_CallFunctionValue(cx, js_obj, function_val, argc, argv, &js_val))        goto cleanup_argv;    jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv),                                   &dummy_cost, &result, &dummy_bool);cleanup_argv:    if (argv) {        for (i = 0; i < arg_num; i++)            JS_RemoveRoot(cx, &argv[i]);        JS_free(cx, argv);    }done:    if (function_name_ucs2)        (*jEnv)->ReleaseStringChars(jEnv, function_name_jstr, function_name_ucs2);    if (!jsj_exit_js(cx, jsj_env, saved_reporter))        return NULL;        return result;}/* * Class:     netscape_javascript_JSObject * Method:    eval * Signature: (Ljava/lang/String;)Ljava/lang/Object; */JNIEXPORT jobject JNICALLJava_netscape_javascript_JSObject_eval(JNIEnv *jEnv,                                       jobject java_wrapper_obj,                                       jstring eval_jstr){    const char *codebase;    JSPrincipals *principals;    JSContext *cx = NULL;    JSBool eval_succeeded;    JSObject *js_obj;    jsval js_val;    int dummy_cost;    JSBool dummy_bool;    const jchar *eval_ucs2;    jsize eval_len;    JSErrorReporter saved_reporter;    jboolean is_copy;    jobject result;    JSJavaThreadState *jsj_env;        jsj_env = jsj_enter_js(jEnv, NULL, java_wrapper_obj, &cx, &js_obj, &saved_reporter, NULL, 0, NULL);    if (!jsj_env)        return NULL;        result = NULL;    eval_ucs2 = NULL;    if (!eval_jstr) {        JS_ReportErrorNumber(cx, jsj_GetErrorMessage, NULL,                                                 JSJMSG_NULL_EVAL_ARG);        goto done;    }    /* Get the string to eval as raw Unicode characters */    eval_ucs2 = (*jEnv)->GetStringChars(jEnv, eval_jstr, &is_copy);    if (!eval_ucs2) {        JS_ASSERT(0);        goto done;    }    eval_len = (*jEnv)->GetStringLength(jEnv, eval_jstr);        /* Set up security stuff */    principals = NULL;    if (JSJ_callbacks && JSJ_callbacks->get_JSPrincipals_from_java_caller)        principals = JSJ_callbacks->get_JSPrincipals_from_java_caller(jEnv, cx, NULL, 0, NULL);    codebase = principals ? principals->codebase : NULL;    /* Have the JS engine evaluate the unicode string */    eval_succeeded = JS_EvaluateUCScriptForPrincipals(cx, js_obj, principals,                                                      eval_ucs2, eval_len,                                                      codebase, 0, &js_val);    if (!eval_succeeded)        goto done;    /* Convert result to a subclass of java.lang.Object */    jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv),                                   &dummy_cost, &result, &dummy_bool);done:    if (eval_ucs2)        (*jEnv)->ReleaseStringChars(jEnv, eval_jstr, eval_ucs2);    if (!jsj_exit_js(cx, jsj_env, saved_reporter))        return NULL;        return result;}/* * Class:     netscape_javascript_JSObject * Method:    toString * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALLJava_netscape_javascript_JSObject_toString(JNIEnv *jEnv,                                           jobject java_wrapper_obj){    jstring result;    JSContext *cx = NULL;    JSObject *js_obj;    JSString *jsstr;    JSErrorReporter saved_reporter;    JSJavaThreadState *jsj_env;        jsj_env = jsj_enter_js(jEnv, NULL, java_wrapper_obj, &cx, &js_obj, &saved_reporter, NULL, 0, NULL);    if (!jsj_env)        return NULL;        result = NULL;    jsstr = JS_ValueToString(cx, OBJECT_TO_JSVAL(js_obj));    if (jsstr)        result = jsj_ConvertJSStringToJavaString(cx, jEnv, jsstr);    if (!result)        result = (*jEnv)->NewStringUTF(jEnv, "*JavaObject*");    if (!jsj_exit_js(cx, jsj_env, saved_reporter))        return NULL;        return result;}/* * Class:     netscape_javascript_JSObject * Method:    getWindow * Signature: (Ljava/applet/Applet;)Lnetscape/javascript/JSObject; */JNIEXPORT jobject JNICALLJava_netscape_javascript_JSObject_getWindow(JNIEnv *jEnv,                                            jclass js_object_class,                                            jobject java_applet_obj){    char *err_msg;    JSContext *cx = NULL;    JSObject *js_obj = NULL;    jsval js_val;    int dummy_cost;    JSBool dummy_bool;    JSErrorReporter saved_reporter;    jobject java_obj;    JSJavaThreadState *jsj_env;        jsj_env = jsj_enter_js(jEnv, java_applet_obj, NULL, &cx, NULL, &saved_reporter, NULL, 0, NULL);    if (!jsj_env)        return NULL;        err_msg = NULL;    java_obj = NULL;    if (JSJ_callbacks && JSJ_callbacks->map_java_object_to_js_object)        js_obj = JSJ_callbacks->map_java_object_to_js_object(jEnv, java_applet_obj, &err_msg);    if (!js_obj) {        if (err_msg) {            JS_ReportError(cx, err_msg);            free(err_msg);        }        goto done;    }    js_val = OBJECT_TO_JSVAL(js_obj);    jsj_ConvertJSValueToJavaObject(cx, jEnv, js_val, jsj_get_jlObject_descriptor(cx, jEnv),                                   &dummy_cost, &java_obj, &dummy_bool);done:    if (!jsj_exit_js(cx, jsj_env, saved_reporter))        return NULL;        return java_obj;}/* * Class:     netscape_javascript_JSObject * Method:    finalize * Signature: ()V */JNIEXPORT void JNICALLJava_netscape_javascript_JSObject_finalize(JNIEnv *jEnv, jobject java_wrapper_obj){    JSBool success;    JSObjectHandle *handle;    success = JS_FALSE;#if JS_BYTES_PER_LONG == 8    handle = (JSObjectHandle *)((*jEnv)->GetLongField(jEnv, java_wrapper_obj, njJSObject_long_internal));#else        handle = (JSObjectHandle *)((*jEnv)->GetIntField(jEnv, java_wrapper_obj, njJSObject_internal));#endif    JS_ASSERT(handle);    if (!handle)        return;    success = JS_RemoveRootRT(handle->rt, &handle->js_obj);    free(handle);    JS_ASSERT(success);}/* * Class:     netscape_javascript_JSObject * Method:    equals * Signature: (Ljava/lang/Object;)Z */JNIEXPORT jboolean JNICALLJava_netscape_javascript_JSObject_equals(JNIEnv *jEnv,                                         jobject java_wrapper_obj,                                         jobject comparison_obj){#ifdef PRESERVE_JSOBJECT_IDENTITY#    error "Missing code should be added here"#else    JSObject *js_obj1, *js_obj2;    /* Check that we're comparing with another netscape.javascript.JSObject */    if (!comparison_obj)        return 0;    if (!(*jEnv)->IsInstanceOf(jEnv, comparison_obj, njJSObject))        return 0;    js_obj1 = jsj_UnwrapJSObjectWrapper(jEnv, java_wrapper_obj);    js_obj2 = jsj_UnwrapJSObjectWrapper(jEnv, comparison_obj);    return (js_obj1 == js_obj2);#endif  /* PRESERVE_JSOBJECT_IDENTITY */}

⌨️ 快捷键说明

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