📄 jsj_jsobject.c
字号:
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 + -