void CancelLoad(const CStrW& message) { // Cancel loader LDR_Cancel(); // Call the cancelOnError GUI function, defined in ..gui/common/functions_utility_error.js // So all GUI pages that load games should include this script if (g_GUI && g_GUI->HasPages()) { JSContext* cx = g_ScriptingHost.getContext(); jsval fval, rval; JSBool ok = JS_GetProperty(cx, g_GUI->GetScriptObject(), "cancelOnError", &fval); ENSURE(ok); jsval msgval = ToJSVal(message); if (ok && !JSVAL_IS_VOID(fval)) JS_CallFunctionValue(cx, g_GUI->GetScriptObject(), fval, 1, &msgval, &rval); } }
JSBool SMJS_FUNCTION(widget_show_notification) { jsval fval; SMJS_OBJ SMJS_ARGS GF_WidgetInstance *wid = (GF_WidgetInstance *)SMJS_GET_PRIVATE(c, obj); if (!wid) return JS_TRUE; if ((JS_LookupProperty(c, wid->widget->wm->obj, "showNotification", &fval)==JS_TRUE) && JSVAL_IS_OBJECT(fval)) { jsval *vars; u32 i; vars = gf_malloc(sizeof(jsval)*(argc+1)); vars[0] = OBJECT_TO_JSVAL(wid->obj); for (i=0; i<argc; i++) vars[i+1] = argv[i]; JS_CallFunctionValue(c, wid->widget->wm->obj, fval, argc+1, vars, SMJS_GET_RVAL); } return JS_TRUE; }
bool AddonWrapper<Base>::get(JSContext* cx, JS::Handle<JSObject*> wrapper, JS::Handle<JSObject*> receiver, JS::Handle<jsid> id, JS::MutableHandle<JS::Value> vp) const { Rooted<JSPropertyDescriptor> desc(cx); if (!InterposeProperty(cx, wrapper, nullptr, id, &desc)) return false; if (!desc.object()) return Base::get(cx, wrapper, receiver, id, vp); if (desc.getter()) { MOZ_ASSERT(desc.hasGetterObject()); AutoValueVector args(cx); RootedValue fval(cx, ObjectValue(*desc.getterObject())); return JS_CallFunctionValue(cx, receiver, fval, args, vp); } else { vp.set(desc.value()); return true; } }
void __JSDownloaderDelegator::onSuccess(const std::string &srcUrl, const std::string &storagePath, const std::string &customId) { Image *image = new Image(); jsval valArr[2]; JSContext *cx = ScriptingCore::getInstance()->getGlobalContext(); JSObject *global = ScriptingCore::getInstance()->getGlobalObject(); JSAutoCompartment ac(_cx, _obj); if(image->initWithImageData(_buffer, _size)) { Texture2D *tex = Director::getInstance()->getTextureCache()->addImage(image, srcUrl); valArr[0] = BOOLEAN_TO_JSVAL(true); js_type_class_t *classType = js_get_type_from_native<cocos2d::Texture2D>(tex); assert(classType); JSObject *obj = JS_NewObject(cx, classType->jsclass, classType->proto, classType->parentProto); // link the native object with the javascript object js_proxy_t* p = jsb_new_proxy(tex, obj); JS_AddNamedObjectRoot(cx, &p->obj, "cocos2d::Texture2D"); valArr[1] = OBJECT_TO_JSVAL(p->obj); } else { valArr[0] = BOOLEAN_TO_JSVAL(false); valArr[1] = JSVAL_NULL; } image->release(); if (!JSVAL_IS_NULL(_jsCallback)) { jsval retval; JS_AddValueRoot(cx, valArr); JS_CallFunctionValue(cx, global, _jsCallback, 2, valArr, &retval); JS_RemoveValueRoot(cx, valArr); JS_RemoveValueRoot(cx, &_jsCallback); } this->release(); }
/* JSCall function by name, cvalues will be converted * * deactivates controller if any script errors! * * format values: * case 'b': BOOLEAN_TO_JSVAL((JSBool) va_arg(ap, int)); * case 'c': INT_TO_JSVAL((uint16) va_arg(ap, unsigned int)); * case 'i': * case 'j': js_NewNumberValue(cx, (jsdouble) va_arg(ap, int32), sp) * case 'u': js_NewNumberValue(cx, (jsdouble) va_arg(ap, uint32), sp) * case 'd': * case 'I': js_NewDoubleValue(cx, va_arg(ap, jsdouble), sp) * case 's': JS_NewStringCopyZ(cx, va_arg(ap, char *)) * case 'W': JS_NewUCStringCopyZ(cx, va_arg(ap, jschar *)) * case 'S': va_arg(ap, JSString *) * case 'o': OBJECT_TO_JSVAL(va_arg(ap, JSObject *) * case 'f': * fun = va_arg(ap, JSFunction *); * fun ? OBJECT_TO_JSVAL(fun->object) : JSVAL_NULL; * case 'v': va_arg(ap, jsval); */ bool ControllerListener::call(const char *funcname, int argc, const char *format, ...) { va_list ap; jsval fval = JSVAL_VOID; jsval ret = JSVAL_VOID; func("%s try calling method %s.%s(argc:%i)", __func__, name, funcname, argc); JS_SetContextThread(jsContext); JS_BeginRequest(jsContext); int res = JS_GetProperty(jsContext, jsObject, funcname, &fval); if(JSVAL_IS_VOID(fval)) { warning("method unresolved by JS_GetProperty"); } else { jsval *argv; void *markp; va_start(ap, format); argv = JS_PushArgumentsVA(jsContext, &markp, format, ap); va_end(ap); res = JS_CallFunctionValue(jsContext, jsObject, fval, argc, argv, &ret); JS_PopArguments(jsContext, &markp); if (res) { if(!JSVAL_IS_VOID(ret)) { JSBool ok; JS_ValueToBoolean(jsContext, ret, &ok); if (ok) // JSfunc returned 'true', so event is done { JS_EndRequest(jsContext); JS_ClearContextThread(jsContext); return true; } } } } JS_EndRequest(jsContext); JS_ClearContextThread(jsContext); return false; // no callback, redo on next controller }
void GLNode::draw() { js_proxy_t* proxy = NULL; JSContext *cx = ScriptingCore::getInstance()->getGlobalContext(); proxy = js_get_or_create_proxy<cocos2d::Node>(cx, this); if( proxy ) { JSObject *jsObj = proxy->obj; if (jsObj) { bool found; JSB_AUTOCOMPARTMENT_WITH_GLOBAL_OBJCET JS_HasProperty(cx, jsObj, "draw", &found); if (found == true) { JS::RootedValue rval(cx); JS::RootedValue fval(cx); jsval *argv = NULL; unsigned argc=0; JS_GetProperty(cx, jsObj, "draw", &fval); JS_CallFunctionValue(cx, jsObj, fval, argc, argv, rval.address()); } } } }
void GLNode::draw() { js_proxy_t* proxy = NULL; JSContext *cx = ScriptingCore::getInstance()->getGlobalContext(); proxy = js_get_or_create_proxy<cocos2d::Node>(cx, this); //JSB_CCNode *proxy = objc_getAssociatedObject(self, &JSB_association_proxy_key); if( proxy ) { JSObject *jsObj = proxy->obj; if (jsObj) { JSBool found; JSB_ENSURE_AUTOCOMPARTMENT(cx, jsObj); JS_HasProperty(cx, jsObj, "draw", &found); if (found == JS_TRUE) { jsval rval, fval; jsval *argv = NULL; unsigned argc=0; JS_GetProperty(cx, jsObj, "draw", &fval); JS_CallFunctionValue(cx, jsObj, fval, argc, argv, &rval); } } } }
static int nidium_timerng_wrapper(void *arg) { struct nidium_sm_timer *params = static_cast<struct nidium_sm_timer *>(arg); JSAutoRequest ar(params->cx); JS::RootedValue rval(params->cx); JS::AutoValueVector arr(params->cx); JS::RootedValue func(params->cx, params->func); JS::RootedObject global(params->cx, params->global); arr.resize(params->argc); for (int i = 0; i < params->argc; i++) { arr[i].set(params->argv[i]->get()); } JS_CallFunctionValue(params->cx, global, func, arr, &rval); // timers_stats_print(&((ape_global // *)JS_GetContextPrivate(params->cx))->timersng); return params->ms; }
static JSBool SMJS_FUNCTION(widget_call_message_reply_callback) { JSObject *list; jsval *vals, fval; u32 i, count; SMJS_OBJ SMJS_ARGS GF_WidgetMessage *msg = SMJS_GET_PRIVATE(c, obj); if (!msg || !argc || !JSVAL_IS_OBJECT(argv[0]) ) return JS_FALSE; if ((JS_LookupProperty(c, obj, "replyCallback", &fval)==JS_TRUE) && JSVAL_IS_OBJECT(fval)) { list = JSVAL_TO_OBJECT(argv[0]); JS_GetArrayLength(c, list, (jsuint*) &count); vals = gf_malloc(sizeof(jsval)*(count+1)); vals[0] = OBJECT_TO_JSVAL(obj); for (i=0; i<count; i++) { JS_GetElement(c, list, (jsint) i, &vals[i+1]); } JS_CallFunctionValue(c, obj, fval, count, vals, SMJS_GET_RVAL); gf_free(vals); } return JS_TRUE; }
static JSBool XPC_COW_FunctionWrapper(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { JSObject *wrappedObj; // Allow 'this' to be either a COW, in which case we unwrap it or something // that isn't a COW. We disallow invalid COWs that have no wrapped object. wrappedObj = GetWrapper(obj); if (wrappedObj) { wrappedObj = GetWrappedObject(cx, wrappedObj); if (!wrappedObj) { return ThrowException(NS_ERROR_ILLEGAL_VALUE, cx); } } else { wrappedObj = obj; } jsval funToCall; if (!JS_GetReservedSlot(cx, JSVAL_TO_OBJECT(argv[-2]), XPCWrapper::eWrappedFunctionSlot, &funToCall)) { return JS_FALSE; } for (uintN i = 0; i < argc; ++i) { if (!XPC_COW_RewrapForChrome(cx, obj, &argv[i])) { return JS_FALSE; } } if (!JS_CallFunctionValue(cx, wrappedObj, funToCall, argc, argv, rval)) { return JS_FALSE; } return XPC_COW_RewrapForContent(cx, obj, rval); }
ScriptValuePtr TraceMonkeyValue::call(std::string funcName, ScriptValueArgs& args) { assert(isValid()); Logging::log(Logging::DEBUG, "TMV::call(%s, (%d))\r\n", funcName.c_str(), args.args.size()); printJSVAL(value); assert(JSVAL_IS_OBJECT(value)); jsval func; bool success = JS_GetProperty(TraceMonkeyEngine::context, JSVAL_TO_OBJECT(value), funcName.c_str(), &func); assert(success); assert(JSVAL_IS_OBJECT(func)); assert(!JSVAL_IS_NULL(func)); int numArgs = args.args.size(); jsval jsArgs[numArgs+1]; // +1 for safety in case of 0 args for (int i = 0; i < numArgs; i++) { jsArgs[i] = dynamic_cast<TraceMonkeyValue*>(args.args[i].get())->value; } jsval ret; JS_CallFunctionValue(TraceMonkeyEngine::context, JSVAL_TO_OBJECT(value), func, numArgs, jsArgs, &ret); success = JS_AddNamedRoot(TraceMonkeyEngine::context, &ret, "TraceMonkeyValue::call temp val"); // Ensure our value won't be GCed assert(success); Logging::log(Logging::DEBUG, "returning: \r\n"); printJSVAL(ret); ScriptValuePtr retValue(new TraceMonkeyValue(engine, true, ret)); success = JS_RemoveRoot(TraceMonkeyEngine::context, &ret); // Allow GCing, it is already marked in the retValue assert(success); return retValue; }
void def_animate_finish(void *a) { JSObject *js_anim = (JSObject*)a; LOGFN("js_animate_finish"); JSContext *cx = get_js_context(); JS_BeginRequest(cx); view_animation *anim = (view_animation *)JS_GetPrivate(js_anim); JSObject *js_group = (JSObject*)anim->js_group; jsval finish_val; JS_GetProperty(cx, js_group, "onAnimationFinish", &finish_val); if (JSVAL_IS_OBJECT(finish_val)) { JSObject *finish = JSVAL_TO_OBJECT(finish_val); jsval args[] = {OBJECT_TO_JSVAL(js_anim)}; if (JS_ObjectIsFunction(cx, finish)) { jsval ret; JS_CallFunctionValue(cx, js_group, finish_val, 1, args, &ret); } } JS_EndRequest(cx); LOGFN("end def_animate_finish"); }
int to_erl_from_handler(emonk_buf_t* buf, JSContext* cx, JSObject* obj) { JSObject* func; jsval tojson; jsval rval; if(!JS_GetProperty(cx, obj, "toJSON", &tojson)) { return ERROR; } if(!JSVAL_IS_OBJECT(tojson)) return IGNORE; func = JSVAL_TO_OBJECT(tojson); if(func == NULL) return ERROR; if(!JS_ObjectIsFunction(cx, func)) return IGNORE; if(!JS_CallFunctionValue(cx, obj, tojson, 0, NULL, &rval)) { return ERROR; } return to_erl_intern(buf, cx, rval); }
static void smjs_loading_callback(struct download *download, void *data) { struct session *saved_smjs_ses = smjs_ses; struct smjs_load_uri_hop *hop = data; jsval args[1], rval; JSObject *cache_entry_object; if (is_in_progress_state(download->state)) return; if (!download->cached) goto end; /* download->cached->object.refcount is typically 0 here * because no struct document uses the cache entry. Because * the connection is no longer using the cache entry either, * it can be garbage collected. Don't let that happen while * the script is using it. */ object_lock(download->cached); smjs_ses = hop->ses; cache_entry_object = smjs_get_cache_entry_object(download->cached); if (!cache_entry_object) goto end; args[0] = OBJECT_TO_JSVAL(cache_entry_object); JS_CallFunctionValue(smjs_ctx, NULL, hop->callback, 1, args, &rval); end: if (download->cached) object_unlock(download->cached); JS_RemoveValueRoot(smjs_ctx, &hop->callback); mem_free(download->data); mem_free(download); smjs_ses = saved_smjs_ses; }
int to_erl_convert(ErlNifEnv* env, JSContext* cx, JSObject* obj, ERL_NIF_TERM* term) { JSObject* func; jsval tojson; jsval rval; if(!JS_GetProperty(cx, obj, "toJSON", &tojson)) { return ERROR; } if(!JSVAL_IS_OBJECT(tojson)) return ERROR; func = JSVAL_TO_OBJECT(tojson); if(func == NULL) return ERROR; if(!JS_ObjectIsFunction(cx, func)) return ERROR; if(!JS_CallFunctionValue(cx, obj, tojson, 0, NULL, &rval)) { return ERROR; } return to_erl_intern(env, cx, rval, term); }
JSBool gjs_call_function_value(JSContext *context, JSObject *obj, jsval fval, uintN argc, jsval *argv, jsval *rval) { JSBool result; JSContext *call_context; JS_BeginRequest(context); call_context = gjs_runtime_get_call_context(JS_GetRuntime(context)); JS_BeginRequest(call_context); result = JS_CallFunctionValue(call_context, obj, fval, argc, argv, rval); gjs_move_exception(call_context, context); JS_EndRequest(call_context); JS_EndRequest(context); return result; }
static JSBool SMJS_FUNCTION(widget_invoke_message_reply) { jsval oval; SMJS_OBJ SMJS_ARGS GF_WidgetMessage *msg = NULL; GF_WidgetInterfaceInstance *bifce = (GF_WidgetInterfaceInstance *)SMJS_GET_PRIVATE(c, obj); if (!bifce) return JS_FALSE; SMJS_SET_RVAL( JSVAL_NULL ); if (!JSVAL_IS_OBJECT(argv[0])) return JS_FALSE; if (JSVAL_IS_NULL(argv[0])) return JS_FALSE; msg = (GF_WidgetMessage *)SMJS_GET_PRIVATE(c, JSVAL_TO_OBJECT(argv[0]) ); if (!msg) return JS_FALSE; /*look for JS Callback "invokeReply" in the widget manager script*/ if (JS_LookupProperty(c, bifce->ifce->obj, "invokeReply", &oval)==JS_TRUE) { if (JSVAL_IS_OBJECT(oval)) { JS_CallFunctionValue(bifce->wid->widget->wm->ctx, bifce->ifce->obj, oval, argc, argv, SMJS_GET_RVAL); } } return JS_TRUE; }
static gboolean peas_extension_gjs_call (PeasExtensionWrapper *exten, GType exten_type, GICallableInfo *func_info, const gchar *method_name, GIArgument *args, GIArgument *retval) { PeasExtensionGjs *gexten = PEAS_EXTENSION_GJS (exten); gboolean success = FALSE; jsval js_method, js_retval; jsval *js_args; CachedArg *arg_cache; gint i, n_args, nth_out_arg; gint n_in_args = 0; gint n_out_args = 0; gint cached_args = 0; /* Fetch the JS method we want to call */ if (!JS_GetProperty (gexten->js_context, gexten->js_object, method_name, &js_method) || JSVAL_IS_VOID (js_method)) { g_warning ("Method '%s.%s' was not found", g_type_name (exten_type), method_name); return FALSE; } if (JSVAL_IS_NULL (js_method) || !JSVAL_IS_OBJECT (js_method) || !JS_ObjectIsFunction (gexten->js_context, JSVAL_TO_OBJECT (js_method))) { g_warning ("Method '%s.%s' in not a function", g_type_name (exten_type), method_name); return FALSE; } n_args = g_callable_info_get_n_args (func_info); if (n_args < 0) { g_warn_if_fail (n_args >= 0); return FALSE; } js_args = g_newa (jsval, n_args); arg_cache = g_newa (CachedArg, n_args + 1); /* Return value is an out arg */ g_callable_info_load_return_type (func_info, &arg_cache[0].type_info); if (g_type_info_get_tag (&arg_cache[0].type_info) != GI_TYPE_TAG_VOID) { ++n_out_args; arg_cache[cached_args++].ptr = &retval->v_pointer; } /* Handle the arguments */ for (i = 0; i < n_args; ++i, ++cached_args) { GIDirection direction; g_callable_info_load_arg (func_info, i, &arg_cache[cached_args].arg_info); direction = g_arg_info_get_direction (&arg_cache[cached_args].arg_info); g_arg_info_load_type (&arg_cache[cached_args].arg_info, &arg_cache[cached_args].type_info); if (direction == GI_DIRECTION_IN && !gjs_value_from_g_argument (gexten->js_context, &js_args[n_in_args++], &arg_cache[cached_args].type_info, &args[i], TRUE)) { g_warning ("Error failed to convert argument '%s'", g_base_info_get_name (&arg_cache[cached_args].arg_info)); return FALSE; } if (direction == GI_DIRECTION_INOUT) { GIArgument arg; peas_gi_pointer_to_argument (&arg_cache[cached_args].type_info, args[i].v_pointer, &arg); if (!gjs_value_from_g_argument (gexten->js_context, &js_args[n_in_args++], &arg_cache[cached_args].type_info, &arg, TRUE)) { g_warning ("Error failed to convert argument '%s'", g_base_info_get_name (&arg_cache[cached_args].arg_info)); return FALSE; } } if (direction == GI_DIRECTION_OUT || direction == GI_DIRECTION_INOUT) { ++n_out_args; arg_cache[cached_args].ptr = args[i].v_pointer; } } success = JS_CallFunctionValue (gexten->js_context, gexten->js_object, js_method, n_in_args, js_args, &js_retval); if (!success) { if (!gjs_log_exception (gexten->js_context, NULL)) { g_warning ("Error while calling '%s.%s'", g_type_name (exten_type), method_name); } return FALSE; } /* First we need to release in argument */ for (i = 0; i < cached_args; ++i) { GIDirection direction; /* First cached argument may be the return value */ if (i == 0 && cached_args > n_args) continue; direction = g_arg_info_get_direction (&arg_cache[i].arg_info); if (direction == GI_DIRECTION_IN || direction == GI_DIRECTION_INOUT) { GITransfer transfer; transfer = g_arg_info_get_ownership_transfer (&arg_cache[i].arg_info); if (!gjs_g_argument_release_in_arg (gexten->js_context, transfer, &arg_cache[i].type_info, &args[i])) { g_warning ("Error failed to release IN argument '%s'", g_base_info_get_name (&arg_cache[i].arg_info)); } } } /* Check that we have a valid return value */ if (n_out_args > 1) { if (!JSVAL_IS_OBJECT (js_retval) || !JS_IsArrayObject (gexten->js_context, JSVAL_TO_OBJECT (js_retval))) { g_warning ("Error return value is not an array"); return FALSE; } } /* Set out arguments */ for (i = 0, nth_out_arg = 0; i < cached_args && success; ++i) { gboolean is_return_value; is_return_value = i == 0 && cached_args > n_args; /* Return value does not have a GIArgInfo and is always out */ if (!is_return_value) { GIDirection direction; direction = g_arg_info_get_direction (&arg_cache[i].arg_info); if (direction == GI_DIRECTION_IN) continue; } if (n_out_args == 1) { success = set_out_arg (gexten->js_context, func_info, is_return_value, &arg_cache[i].arg_info, &arg_cache[i].type_info, arg_cache[i].ptr, js_retval); break; } else if (n_out_args > 1) { jsval js_value; if (!JS_GetElement (gexten->js_context, JSVAL_TO_OBJECT (js_retval), nth_out_arg++, &js_value) || js_value == JSVAL_VOID) { g_warning ("Error failed to get out argument %i", nth_out_arg); return FALSE; } else { success = set_out_arg (gexten->js_context, func_info, is_return_value, &arg_cache[i].arg_info, &arg_cache[i].type_info, arg_cache[i].ptr, js_value); } } } return success; }
ENTERM vm_call(JSContext* cx, JSObject* gl, job_ptr job) { ENTERM resp; ENTERM head; ENTERM tail; jsval func; jsval args[256]; jsval rval; jsid idp; int argc; // Get the function object. func = to_js(job->env, cx, job->name); if(func == JSVAL_VOID) { resp = vm_mk_error(job->env, util_mk_atom(job->env, "invalid_name")); goto send; } if(!JS_ValueToId(cx, func, &idp)) { resp = vm_mk_error(job->env, util_mk_atom(job->env, "internal_error")); goto send; } if(!JS_GetPropertyById(cx, gl, idp, &func)) { resp = vm_mk_error(job->env, util_mk_atom(job->env, "bad_property")); goto send; } if(JS_TypeOfValue(cx, func) != JSTYPE_FUNCTION) { resp = vm_mk_error(job->env, util_mk_atom(job->env, "not_a_function")); goto send; } // Creating function arguments. if(enif_is_empty_list(job->env, job->args)) { argc = 0; } else { if(!enif_get_list_cell(job->env, job->args, &head, &tail)) { resp = vm_mk_error(job->env, util_mk_atom(job->env, "invalid_argv")); goto send; } argc = 0; do { args[argc++] = to_js(job->env, cx, head); } while(enif_get_list_cell(job->env, tail, &head, &tail) && argc < 256); } // Call function if(!JS_CallFunctionValue(cx, gl, func, argc, args, &rval)) { if(job->error != 0) { resp = vm_mk_error(job->env, job->error); } else { resp = vm_mk_error(job->env, util_mk_atom(job->env, "unknown")); } } else { resp = vm_mk_ok(job->env, to_erl(job->env, cx, rval)); } send: return enif_make_tuple2(job->env, job->ref, resp); }
/** * call a method of Native JSObject. * * @param jEnv - JNIEnv on which the call is being made. * @param obj - A Native JS Object. * @param name - Name of a method. * @param jobjArr - Array of jobjects representing parameters of method being caled. * @param pjobj - return value. */ NS_METHOD nsCLiveconnect::Call(JNIEnv *jEnv, lcjsobject obj, const jchar *name, jsize length, jobjectArray java_args, void* principalsArray[], int numPrincipals, nsISupports *securitySupports, jobject *pjobj) { if(jEnv == NULL || obj == 0) { return NS_ERROR_FAILURE; } int i = 0; int argc = 0; int arg_num = 0; jsval *argv = 0; JSJavaThreadState *jsj_env = NULL; JSObjectHandle *handle = (JSObjectHandle*)obj; JSObject *js_obj = handle->js_obj; JSContext *cx = NULL; jsval js_val; jsval function_val = 0; int dummy_cost = 0; JSBool dummy_bool = PR_FALSE; JSErrorReporter saved_state = NULL; jobject result = NULL; jsj_env = jsj_enter_js(jEnv, mJavaClient, NULL, &cx, NULL, &saved_state, principalsArray, numPrincipals, securitySupports); if (!jsj_env) return NS_ERROR_FAILURE; result = NULL; AutoPushJSContext autopush(securitySupports, cx); if (NS_FAILED(autopush.ResultOfPush())) goto done; if (!name) { JS_ReportError(cx, "illegal null JavaScript function name"); goto done; } /* Allocate space for JS arguments */ argc = java_args ? jEnv->GetArrayLength(java_args) : 0; if (argc) { argv = (jsval*)JS_malloc(cx, argc * sizeof(jsval)); if (!argv) goto done; } else { argv = 0; } /* Convert arguments from Java to JS values */ for (arg_num = 0; arg_num < argc; arg_num++) { jobject arg = jEnv->GetObjectArrayElement(java_args, arg_num); JSBool ret = jsj_ConvertJavaObjectToJSValue(cx, jEnv, arg, &argv[arg_num]); jEnv->DeleteLocalRef(arg); if (!ret) goto cleanup_argv; JS_AddRoot(cx, &argv[arg_num]); } if (!JS_GetUCProperty(cx, js_obj, name, length, &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 (!jsj_exit_js(cx, jsj_env, saved_state)) return NS_ERROR_FAILURE; *pjobj = result; return NS_OK; }
/* * Class: com_google_gwt_dev_shell_moz_LowLevelMoz * Method: _invoke * Signature: (ILjava/lang/String;I[I)I */ extern "C" JNIEXPORT jboolean JNICALL Java_com_google_gwt_dev_shell_moz_LowLevelMoz__1invoke (JNIEnv* env, jclass, jint scriptObjInt, jstring methodName, jint jsThisInt, jintArray jsArgsInt, jint jsRetValInt) { Tracer tracer("LowLevelMoz._invoke"); JStringWrap methodStr(env, methodName); if (!methodStr.str()) { tracer.setFail("null method name"); return JNI_FALSE; } JsRootedValue* jsThisRV = reinterpret_cast<JsRootedValue*>(jsThisInt); jint jsArgc = env->GetArrayLength(jsArgsInt); tracer.log("method=%s, jsthis=%08x, #args=%d", methodStr.str(), jsThisInt, jsArgc); JSContext* cx = JsRootedValue::currentContext(); nsIScriptGlobalObject* scriptObject = NS_REINTERPRET_CAST(nsIScriptGlobalObject*, scriptObjInt); JSObject* scriptWindow = reinterpret_cast<JSObject*>(scriptObject->GetGlobalJSObject()); jsval fval; if (!JS_GetProperty(cx, scriptWindow, methodStr.str(), &fval)) { tracer.setFail("JS_GetProperty(method) failed"); return JNI_FALSE; } JSFunction* jsFunction = JS_ValueToFunction(cx, fval); if (!jsFunction) { tracer.setFail("JS_ValueToFunction failed"); return JNI_FALSE; } // extract arguments in jsval form nsAutoArrayPtr<jint> jsargvals(new jint[jsArgc]); if (!jsargvals) { tracer.setFail("failed to allocate arg array"); return JNI_FALSE; } env->GetIntArrayRegion(jsArgsInt, 0, jsArgc, jsargvals); if (env->ExceptionCheck()) { tracer.setFail("copy from Java array failed"); return JNI_FALSE; } nsAutoArrayPtr<jsval> jsargs(new jsval[jsArgc]); for (int i = 0; i < jsArgc; ++i) { JsRootedValue* arg = reinterpret_cast<JsRootedValue*>(jsargvals[i]); jsargs[i] = arg->getValue(); } jsval jsrval; JSObject* jsThis; if (jsThisRV->isNull()) { jsThis = scriptWindow; } else { jsThis = jsThisRV->getObject(); } PrintJSValue(cx, OBJECT_TO_JSVAL(jsThis), "jsThis="); for (int i = 0; i < jsArgc; ++i) { char buf[256]; snprintf(buf, sizeof(buf), "arg[%d]=", i); PrintJSValue(cx, jsargs[i], buf); } //tracer.log("fval = %08x, args=%08x", fval, jsargs.get()); if (!JS_CallFunctionValue(cx, jsThis, fval, jsArgc, jsargs.get(), &jsrval)) { tracer.setFail("JS_CallFunctionValue failed"); return JNI_FALSE; } PrintJSValue(cx, jsrval, "return value="); JsRootedValue* returnVal = reinterpret_cast<JsRootedValue*>(jsRetValInt); returnVal->setValue(jsrval); return JNI_TRUE; }
bool JSFunctionWrapper::invoke(unsigned int argc, jsval *argv, jsval &rval) { //JSB_AUTOCOMPARTMENT_WITH_GLOBAL_OBJCET return JS_CallFunctionValue(this->_cx, this->_jsthis, this->_fval, argc, argv, &rval); }
/* * Class: netscape_javascript_JSObject * Method: call * Signature: (Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object; */ JNIEXPORT jobject JNICALL Java_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; }
NS_IMETHODIMP mozJSComponentLoader::LoadModule(nsILocalFile* aComponentFile, nsIModule* *aResult) { nsresult rv; nsCAutoString leafName; aComponentFile->GetNativeLeafName(leafName); if (!StringTail(leafName, 3).LowerCaseEqualsLiteral(".js")) return NS_ERROR_INVALID_ARG; if (!mInitialized) { rv = ReallyInit(); if (NS_FAILED(rv)) return rv; } nsCOMPtr<nsIHashable> lfhash(do_QueryInterface(aComponentFile)); if (!lfhash) { NS_ERROR("nsLocalFile not implementing nsIHashable"); return NS_NOINTERFACE; } ModuleEntry* mod; if (mModules.Get(lfhash, &mod)) { NS_ASSERTION(mod->module, "Bad hashtable data!"); NS_ADDREF(*aResult = mod->module); return NS_OK; } nsAutoPtr<ModuleEntry> entry(new ModuleEntry); if (!entry) return NS_ERROR_OUT_OF_MEMORY; rv = GlobalForLocation(aComponentFile, &entry->global, &entry->location); if (NS_FAILED(rv)) { #ifdef DEBUG_shaver fprintf(stderr, "GlobalForLocation failed!\n"); #endif return rv; } nsCOMPtr<nsIXPConnect> xpc = do_GetService(kXPConnectServiceContractID, &rv); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsIComponentManager> cm; rv = NS_GetComponentManager(getter_AddRefs(cm)); if (NS_FAILED(rv)) return rv; JSCLContextHelper cx(mContext); JSObject* cm_jsobj; nsCOMPtr<nsIXPConnectJSObjectHolder> cm_holder; rv = xpc->WrapNative(cx, entry->global, cm, NS_GET_IID(nsIComponentManager), getter_AddRefs(cm_holder)); if (NS_FAILED(rv)) { #ifdef DEBUG_shaver fprintf(stderr, "WrapNative(%p,%p,nsIComponentManager) failed: %x\n", (void *)(JSContext*)cx, (void *)mCompMgr, rv); #endif return rv; } rv = cm_holder->GetJSObject(&cm_jsobj); if (NS_FAILED(rv)) { #ifdef DEBUG_shaver fprintf(stderr, "GetJSObject of ComponentManager failed\n"); #endif return rv; } JSObject* file_jsobj; nsCOMPtr<nsIXPConnectJSObjectHolder> file_holder; rv = xpc->WrapNative(cx, entry->global, aComponentFile, NS_GET_IID(nsIFile), getter_AddRefs(file_holder)); if (NS_FAILED(rv)) { return rv; } rv = file_holder->GetJSObject(&file_jsobj); if (NS_FAILED(rv)) { return rv; } JSCLAutoErrorReporterSetter aers(cx, mozJSLoaderErrorReporter); jsval argv[2], retval, NSGetModule_val; if (!JS_GetProperty(cx, entry->global, "NSGetModule", &NSGetModule_val) || JSVAL_IS_VOID(NSGetModule_val)) { return NS_ERROR_FAILURE; } if (JS_TypeOfValue(cx, NSGetModule_val) != JSTYPE_FUNCTION) { nsCAutoString path; aComponentFile->GetNativePath(path); JS_ReportError(cx, "%s has NSGetModule property that is not a function", path.get()); return NS_ERROR_FAILURE; } argv[0] = OBJECT_TO_JSVAL(cm_jsobj); argv[1] = OBJECT_TO_JSVAL(file_jsobj); if (!JS_CallFunctionValue(cx, entry->global, NSGetModule_val, 2, argv, &retval)) { return NS_ERROR_FAILURE; } #ifdef DEBUG_shaver_off JSString *s = JS_ValueToString(cx, retval); fprintf(stderr, "mJCL: %s::NSGetModule returned %s\n", registryLocation, JS_GetStringBytes(s)); #endif JSObject *jsModuleObj; if (!JS_ValueToObject(cx, retval, &jsModuleObj)) { /* XXX report error properly */ return NS_ERROR_FAILURE; } rv = xpc->WrapJS(cx, jsModuleObj, NS_GET_IID(nsIModule), getter_AddRefs(entry->module)); if (NS_FAILED(rv)) { /* XXX report error properly */ #ifdef DEBUG fprintf(stderr, "mJCL: couldn't get nsIModule from jsval\n"); #endif return rv; } // Cache this module for later if (!mModules.Put(lfhash, entry)) return NS_ERROR_OUT_OF_MEMORY; NS_ADDREF(*aResult = entry->module); // The hash owns the ModuleEntry now, forget about it entry.forget(); return NS_OK; }
static JSBool js_db_txn(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { js_db_t *jd = JS_GetPrivate(cx, obj); if(js_db_check(cx, jd)) return JS_FALSE; if(argc != 1) { JS_ReportError(cx, "Invalid number of arguments"); return JS_FALSE; } if(jd->jd_transaction) { JS_ReportError(cx, "Nesting transactions is not allowed"); return JS_FALSE; } retry: if(db_begin(jd->jd_db)) { JS_ReportError(cx, "Failed to start transaction"); return JS_FALSE; } jd->jd_transaction = 1; int r = JS_CallFunctionValue(cx, NULL, argv[0], 0, NULL, rval); jd->jd_transaction = 0; if(jd->jd_stmt) { sqlite3_finalize(jd->jd_stmt); jd->jd_stmt = NULL; } if(!r) { if(jd->jd_debug) TRACE(TRACE_DEBUG, "JS", "Transaction rollbacked due to error"); db_rollback(jd->jd_db); if(JS_IsExceptionPending(cx)) { jsval exn; if(!JS_GetPendingException(cx, &exn)) { return JS_FALSE; } if(JSVAL_IS_OBJECT(exn)) { JSClass *c = JS_GetClass(cx, JSVAL_TO_OBJECT(exn)); if(c == &db_deadlock_exn) { if(jd->jd_debug) TRACE(TRACE_DEBUG, "JS", "Catched deadlock exception, retrying"); JS_ClearPendingException(cx); JS_BeginRequest(cx); usleep(100000); JS_EndRequest(cx); goto retry; } } } return JS_FALSE; } if(*rval == JSVAL_TRUE) { if(jd->jd_debug) TRACE(TRACE_DEBUG, "JS", "Transaction committed"); db_commit(jd->jd_db); } else { if(jd->jd_debug) TRACE(TRACE_DEBUG, "JS", "Transaction rollbacked"); db_rollback(jd->jd_db); } return JS_TRUE; }
void runWebCallBacks(JSContext *cx){ if(!curlHandle) return; int p; curl_multi_perform(curlHandle, &p); CURLMsg *msg = NULL; while( msg = curl_multi_info_read(curlHandle,&p)){ if( msg->msg == CURLMSG_DONE ) { if( msg->data.result == CURLE_OK){ JSObject *ob = NULL; ob = JS_NewObject(cx,&webRespClass,NULL,NULL); if(!ob){ fprint(stderr,"Error creating http response javascript object\n"); exit(EXIT_FAILURE); } JS_SetPrivate(cx,ob,msg); static JSFunctionSpec responseFuncSpec[3]= { JS_FS("toString", webRspData,0,0), JS_FS("getImage", webRspGetImg,0,0), //JS_FS("hasHeaderLine", webRspHL,0,0), JS_FS_END }; if(!JS_DefineFunctions(cx, ob, responseFuncSpec)) fprint(stderr,"Unable to create http response object\n"); //Create an instance of webResponseObject, with private data set. jsval result; jsval oj = OBJECT_TO_JSVAL(ob); rqPrivate *rq = NULL; curl_easy_getinfo(msg->easy_handle,CURLINFO_PRIVATE,(char**)&rq); if(!rq){ fprint(stderr,"Error retrieving data from the handle"); exit( EXIT_FAILURE); } JS_CallFunctionValue(cx, NULL,rq->success, 1, &oj , &result); } else { /* Just return error string -> Cleanup now */ char *errCode = (char*)curl_easy_strerror(msg->data.result); if(!errCode) errCode = "FAILED WITH NO REASON GIVEN"; JSString *string; string = JS_NewStringCopyZ(cx, errCode); jsval result, errString = STRING_TO_JSVAL(string); rqPrivate *rq = NULL; curl_easy_getinfo(msg->easy_handle,CURLINFO_PRIVATE,(char**)&rq); if(!rq){ fprint(stderr,"Error retrieving data from the handle"); exit( EXIT_FAILURE); } JS_CallFunctionValue(cx, NULL,rq->failure, 1, &errString, &result); curl_multi_remove_handle(curlHandle,msg->easy_handle); if(rq->data) free(rq->data); free(rq); curl_easy_cleanup(msg->easy_handle); } } } }
LRESULT WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { CxObj *cxobj = (CxObj*)GetWindowLong(hWnd, GWL_USERDATA); if ( cxobj == NULL ) return DefWindowProc(hWnd, message, wParam, lParam); JSContext *cx = cxobj->cx; JS::RootedObject obj(cx, cxobj->obj); jsval rval; jsval functionVal; LRESULT returnValue = 0; switch (message) { //case WM_COMMAND: //case WM_PAINT case WM_DESTROY: PostQuitMessage(0); return 0; case WM_CHAR: JS_GetProperty(cx, obj, "onchar", &functionVal); if ( !functionVal.isUndefined() ) { JL_ASSERT_FUNCTION(functionVal); // (TBD) return value of assert is not compatible with this function (WndProc) char c = wParam; jsval argv[] = { STRING_TO_JSVAL(JS_NewStringCopyN(cx, &c, 1)), INT_TO_JSVAL(lParam) }; JSTempValueRooter tvr; JS_PUSH_TEMP_ROOT(cx, COUNTOF(argv), argv, &tvr); // needed to protect the new string bool status = JS_CallFunctionValue(cx, obj, functionVal, COUNTOF(argv), argv, &rval); JS_POP_TEMP_ROOT(cx, &tvr); JL_CHK( status ); return 0; } break; case WM_KEYUP: JS_GetProperty(cx, obj, "onkeyup", &functionVal); if ( !functionVal.isUndefined() ) { JL_ASSERT_FUNCTION(functionVal); // (TBD) return value of assert is not compatible with this function (WndProc) jsval argv[] = { INT_TO_JSVAL(wParam), INT_TO_JSVAL(lParam) }; JSTempValueRooter tvr; JS_PUSH_TEMP_ROOT(cx, COUNTOF(argv), argv, &tvr); // not really needed bool status = JS_CallFunctionValue(cx, obj, functionVal, COUNTOF(argv), argv, &rval); JS_POP_TEMP_ROOT(cx, &tvr); JL_CHK( status ); return 0; } break; case WM_KEYDOWN: JS_GetProperty(cx, obj, "onkeydown", &functionVal); if ( !functionVal.isUndefined() ) { JL_ASSERT_FUNCTION(functionVal); // (TBD) return value of assert is not compatible with this function (WndProc) jsval argv[] = { INT_TO_JSVAL(wParam), INT_TO_JSVAL(lParam) }; JSTempValueRooter tvr; JS_PUSH_TEMP_ROOT(cx, COUNTOF(argv), argv, &tvr); // not really needed bool status = JS_CallFunctionValue(cx, obj, functionVal, COUNTOF(argv), argv, &rval); JS_POP_TEMP_ROOT(cx, &tvr); JL_CHK( status ); return 0; } break; case WM_ACTIVATE: JS_GetProperty(cx, obj, "onactivate", &functionVal); if ( !functionVal.isUndefined() ) { JL_ASSERT_FUNCTION(functionVal); // (TBD) return value of assert is not compatible with this function (WndProc) jsval argv[] = { BOOLEAN_TO_JSVAL(wParam != WA_INACTIVE) }; JSTempValueRooter tvr; JS_PUSH_TEMP_ROOT(cx, COUNTOF(argv), argv, &tvr); // not really needed bool status = JS_CallFunctionValue(cx, obj, functionVal, COUNTOF(argv), argv, &rval); JS_POP_TEMP_ROOT(cx, &tvr); JL_CHK( status ); return 0; } break; // case WM_SIZING: case WM_SIZE: JS_GetProperty(cx, obj, "onsize", &functionVal); if ( !functionVal.isUndefined() ) { JL_ASSERT_FUNCTION(functionVal); // (TBD) return value of assert is not compatible with this function (WndProc) jsval argv[] = { INT_TO_JSVAL((short)LOWORD(lParam)), INT_TO_JSVAL((short)HIWORD(lParam)) }; JSTempValueRooter tvr; JS_PUSH_TEMP_ROOT(cx, COUNTOF(argv), argv, &tvr); // not really needed bool status = JS_CallFunctionValue(cx, obj, functionVal, COUNTOF(argv), argv, &rval); JS_POP_TEMP_ROOT(cx, &tvr); JL_CHK( status ); return 0; } break; case WM_MOUSEMOVE: JS_GetProperty(cx, obj, "onmousemove", &functionVal); if ( !functionVal.isUndefined() ) { JL_ASSERT_FUNCTION(functionVal); // (TBD) return value of assert is not compatible with this function (WndProc) jsval argv[] = { INT_TO_JSVAL(MAKEPOINTS(lParam).x), INT_TO_JSVAL(MAKEPOINTS(lParam).y), BOOLEAN_TO_JSVAL(wParam & MK_LBUTTON), BOOLEAN_TO_JSVAL(wParam & MK_RBUTTON), BOOLEAN_TO_JSVAL(wParam & MK_MBUTTON) }; JSTempValueRooter tvr; JS_PUSH_TEMP_ROOT(cx, COUNTOF(argv), argv, &tvr); // not really needed bool status = JS_CallFunctionValue(cx, obj, functionVal, COUNTOF(argv), argv, &rval); JS_POP_TEMP_ROOT(cx, &tvr); JL_CHK( status ); return 0; } break; case WM_MOUSEWHEEL: JS_GetProperty(cx, obj, "onmousewheel", &functionVal); if ( !functionVal.isUndefined() ) { JL_ASSERT_FUNCTION(functionVal); // (TBD) return value of assert is not compatible with this function (WndProc) jsval argv[] = { INT_TO_JSVAL( GET_WHEEL_DELTA_WPARAM(wParam)/WHEEL_DELTA ), BOOLEAN_TO_JSVAL(wParam & MK_LBUTTON), BOOLEAN_TO_JSVAL(wParam & MK_RBUTTON), BOOLEAN_TO_JSVAL(wParam & MK_MBUTTON) }; JSTempValueRooter tvr; JS_PUSH_TEMP_ROOT(cx, COUNTOF(argv), argv, &tvr); // not really needed bool status = JS_CallFunctionValue(cx, obj, functionVal, COUNTOF(argv), argv, &rval); JS_POP_TEMP_ROOT(cx, &tvr); JL_CHK( status ); return 0; } break; case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: JS_GetProperty(cx, obj, "onmousedown", &functionVal); if ( !functionVal.isUndefined() ) { // xPos = GET_X_LPARAM(lParam); // yPos = GET_Y_LPARAM(lParam); JL_ASSERT_FUNCTION(functionVal); // (TBD) return value of assert is not compatible with this function (WndProc) jsval argv[] = { INT_TO_JSVAL( message==WM_LBUTTONDOWN ? 1 : message==WM_RBUTTONDOWN ? 2 : message==WM_MBUTTONDOWN ? 3 : 0 ), JSVAL_TRUE }; // BOOLEAN_TO_JSVAL(wParam & MK_LBUTTON), // BOOLEAN_TO_JSVAL(wParam & MK_RBUTTON), // BOOLEAN_TO_JSVAL(wParam & MK_MBUTTON) }; JSTempValueRooter tvr; JS_PUSH_TEMP_ROOT(cx, COUNTOF(argv), argv, &tvr); // not really needed bool status = JS_CallFunctionValue(cx, obj, functionVal, COUNTOF(argv), argv, &rval); JS_POP_TEMP_ROOT(cx, &tvr); JL_CHK( status ); return 0; } break; case WM_LBUTTONUP: case WM_MBUTTONUP: case WM_RBUTTONUP: JS_GetProperty(cx, obj, "onmouseup", &functionVal); if ( !functionVal.isUndefined() ) { // xPos = GET_X_LPARAM(lParam); // yPos = GET_Y_LPARAM(lParam); JL_ASSERT( JS_TypeOfValue( cx, functionVal ) == JSTYPE_FUNCTION, "Need a function." ); jsval argv[] = { INT_TO_JSVAL( message==WM_LBUTTONUP ? 1 : message==WM_RBUTTONUP ? 2 : message==WM_MBUTTONUP ? 3 : 0 ), JSVAL_FALSE }; JSTempValueRooter tvr; JS_PUSH_TEMP_ROOT(cx, COUNTOF(argv), argv, &tvr); // not really needed bool status = JS_CallFunctionValue(cx, obj, functionVal, COUNTOF(argv), argv, &rval); JS_POP_TEMP_ROOT(cx, &tvr); JL_CHK( status ); return 0; } break; //case WM_MOUSELEAVE: // need TrackMouseEvent() ... // JS_GetProperty(cx, obj, "onmouseleave", &functionVal); // if ( !JSVAL_IS_VOID( functionVal ) ) { // JS_CallFunctionValue(cx, obj, functionVal, 0, NULL, &rval); // } // break; } return DefWindowProc(hWnd, message, wParam, lParam); // We do not want to handle this message so pass back to Windows to handle it in a default way }
PyObject* Function_call(Function* self, PyObject* args, PyObject* kwargs) { PyObject* item = NULL; PyObject* ret = NULL; Py_ssize_t argc; Py_ssize_t idx; JSContext* cx; JSObject* parent; jsval func; jsval* argv = NULL; jsval rval; JSBool started_counter = JS_FALSE; JS_BeginRequest(self->obj.cx->cx); argc = PySequence_Length(args); if(argc < 0) goto error; argv = malloc(sizeof(jsval) * argc); if(argv == NULL) { PyErr_NoMemory(); goto error; } for(idx = 0; idx < argc; idx++) { item = PySequence_GetItem(args, idx); if(item == NULL) goto error; argv[idx] = py2js(self->obj.cx, item); if(argv[idx] == JSVAL_VOID) goto error; Py_DECREF(item); item = NULL; // Prevent double decref. } func = self->obj.val; cx = self->obj.cx->cx; parent = JSVAL_TO_OBJECT(self->parent); // Mark us for execution time if not already marked if(self->obj.cx->start_time == 0) { started_counter = JS_TRUE; self->obj.cx->start_time = time(NULL); } if(!JS_CallFunctionValue(cx, parent, func, argc, argv, &rval)) { if(!PyErr_Occurred()) { PyErr_SetString(PyExc_RuntimeError, "JavaScript Function failed to execute"); } goto error; } ret = js2py(self->obj.cx, rval); JS_EndRequest(self->obj.cx->cx); JS_MaybeGC(cx); goto success; error: if(argv != NULL) free(argv); JS_EndRequest(self->obj.cx->cx); success: // Reset the time counter if we started it. if(started_counter) { self->obj.cx->start_time = 0; } Py_XDECREF(item); return ret; }
/* * See: * https://bugzilla.mozilla.org/show_bug.cgi?id=166436 * https://bugzilla.mozilla.org/show_bug.cgi?id=215173 * * Very surprisingly, jsapi.h lacks any way to "throw new Error()" * * So here is an awful hack inspired by * http://egachine.berlios.de/embedding-sm-best-practice/embedding-sm-best-practice.html#error-handling */ static void gjs_throw_valist(JSContext *context, const char *format, va_list args) { char *s; jsval retval; jsval argv[1]; JSFunction *func; const char *body; JSBool result; const char *names[] = { "message" }; guint options; s = g_strdup_vprintf(format, args); JS_BeginRequest(context); if (JS_IsExceptionPending(context)) { /* Often it's unclear whether a given jsapi.h function * will throw an exception, so we will throw ourselves * "just in case"; in those cases, we don't want to * overwrite an exception that already exists. * (Do log in case our second exception adds more info, * but don't log as topic ERROR because if the exception is * caught we don't want an ERROR in the logs.) */ gjs_debug(GJS_DEBUG_CONTEXT, "Ignoring second exception: '%s'", s); g_free(s); return; } result = JS_FALSE; JS_EnterLocalRootScope(context); if (!gjs_string_from_utf8(context, s, -1, &argv[0])) { JS_ReportError(context, "Failed to copy exception string"); goto out; } body = "throw new Error(message);"; func = JS_CompileFunction(context, JS_GetGlobalObject(context), /* parent object (scope chain) */ NULL, /* name of function if we wanted to define it in parent */ 1, /* nargs */ &names[0], /* array of arg names if we had args */ body, strlen(body), "gjs_throw", /* file */ 0); /* line */ if (func == NULL) { JS_ReportError(context, "Failed to compile function"); goto out; } /* we need JS_CallFunctionValue() to leave the exception set */ options = JS_GetOptions(context); if (!(options & JSOPTION_DONT_REPORT_UNCAUGHT)) { JS_SetOptions(context, options | JSOPTION_DONT_REPORT_UNCAUGHT); } retval = JSVAL_VOID; /* note the return value is whether function succeeded, which it shouldn't, since it * throws... */ JS_CallFunctionValue(context, JS_GetGlobalObject(context), OBJECT_TO_JSVAL(JS_GetFunctionObject(func)), 1, &argv[0], &retval); if (!(options & JSOPTION_DONT_REPORT_UNCAUGHT)) { JS_SetOptions(context, options); } if (!JS_IsExceptionPending(context)) { JS_ReportError(context, "Failed to set exception by calling our exception-setting function"); goto out; } result = JS_TRUE; out: JS_LeaveLocalRootScope(context); if (!result) { /* try just reporting it to error handler? should not * happen though pretty much */ JS_ReportError(context, "Failed to throw exception '%s'", s); } g_free(s); JS_EndRequest(context); }
NPT_Result GPAC_GenericController::OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata) { #ifdef GPAC_HAS_SPIDERMONKEY u32 i, count; GPAC_DeviceItem *item = NULL; GPAC_ServiceItem *serv = NULL; GPAC_ActionArgListener *argl, *act_l; PLT_Service* service = action->GetActionDesc().GetService(); NPT_String uuid; GPAC_ActionUDTA *act_udta = (GPAC_ActionUDTA *)userdata; /*this is NOT an actionResponse to an action triggered on a generic device*/ if (act_udta && act_udta->m_Reserved) act_udta = NULL; GF_LOG(GF_LOG_INFO, GF_LOG_NETWORK, ("[UPnP] Receive %s Response - error code %d\n", (char *) action->GetActionDesc().GetName(), res)); gf_mx_p(m_ControlPointLock); /*get our device*/ uuid = service->GetDevice()->GetUUID(); count = gf_list_count(m_Devices); for (i=0; i<count; i++) { item = (GPAC_DeviceItem *) gf_list_get(m_Devices, i); if (item->m_UUID == uuid ) { break; } item = NULL; } gf_mx_v(m_ControlPointLock); if (!item) { GF_LOG(GF_LOG_ERROR, GF_LOG_NETWORK, ("[UPnP] Receive %s Response on unknown device (uuid %s)\n", (char *) action->GetActionDesc().GetName(), (char *) uuid)); goto exit; } /*get our service*/ count = gf_list_count(item->m_Services); for (i=0; i<count; i++) { serv = (GPAC_ServiceItem *)gf_list_get(item->m_Services, i); if (serv->m_service == service) break; } if (!serv) { GF_LOG(GF_LOG_ERROR, GF_LOG_NETWORK, ("[UPnP] Receive %s Response on unknown service %s\n", (char *) action->GetActionDesc().GetName(), (char *) service->GetServiceType())); goto exit; } /*locate our listeners*/ act_l = NULL; i=0; while ((argl = (GPAC_ActionArgListener *)gf_list_enum(serv->m_ArgListeners, &i))) { NPT_String value; GF_LOG(GF_LOG_INFO, GF_LOG_NETWORK, ("[UPnP] checking argument %s\n", (char *) argl->action->GetName() )); if (argl->action->GetName() != action->GetActionDesc().GetName() ) continue; /*global action listener*/ if (argl->arg==NULL) { act_l = argl; continue; } /*if error don't trigger listeners*/ if (res != NPT_SUCCESS) { GF_LOG(GF_LOG_WARNING, GF_LOG_NETWORK, ("[UPnP] Receive %s Response: error on remote device %d\n", (char *) action->GetActionDesc().GetName(), res)); continue; } /*action arg listener*/ if (action->GetArgumentValue(argl->arg->GetName(), value) == NPT_SUCCESS) { jsval argv[1], rval; GF_LOG(GF_LOG_INFO, GF_LOG_NETWORK, ("[UPnP] Calling handler for response %s argument %s\n", (char *) action->GetActionDesc().GetName(), (char *) argl->arg->GetName() )); m_pUPnP->LockJavascript(GF_TRUE); argv[0] = STRING_TO_JSVAL( JS_NewStringCopyZ(serv->js_ctx, value) ); JS_CallFunctionValue(serv->js_ctx, serv->obj, argl->on_event, 1, argv, &rval); m_pUPnP->LockJavascript(GF_FALSE); } else { GF_LOG(GF_LOG_ERROR, GF_LOG_NETWORK, ("[UPnP] %s Response: couldn't get argument %s value\n", (char *) action->GetActionDesc().GetName(), (char *) argl->arg->GetName() )); } } if (act_l) { jsval rval; m_pUPnP->LockJavascript(GF_TRUE); if (act_l->is_script) { JSObject *act_obj; jsval argv[2]; GF_LOG(GF_LOG_INFO, GF_LOG_NETWORK, ("[UPnP] Calling handler for response %s\n", (char *) action->GetActionDesc().GetName())); act_obj = JS_NewObject(serv->js_ctx, &item->m_pUPnP->upnpDeviceClass._class, 0, item->obj); SMJS_SET_PRIVATE(serv->js_ctx, act_obj, (void *)action.AsPointer() ); JS_DefineFunction(serv->js_ctx, act_obj, "GetArgumentValue", upnp_action_get_argument_value, 1, 0); JS_DefineFunction(serv->js_ctx, act_obj, "GetErrorCode", upnp_action_get_error_code, 1, 0); JS_DefineFunction(serv->js_ctx, act_obj, "GetError", upnp_action_get_error, 1, 0); gf_js_add_root(serv->js_ctx, &act_obj, GF_JSGC_OBJECT); argv[0] = OBJECT_TO_JSVAL(act_obj); if (act_udta) { argv[1] = act_udta->udta; JS_CallFunctionValue(serv->js_ctx, serv->obj, act_l->on_event, 2, argv, &rval); } else { JS_CallFunctionValue(serv->js_ctx, serv->obj, act_l->on_event, 1, argv, &rval); } gf_js_remove_root(serv->js_ctx, &act_obj, GF_JSGC_OBJECT); } /*if error don't trigger listeners*/ else if (res == NPT_SUCCESS) { GF_LOG(GF_LOG_INFO, GF_LOG_NETWORK, ("[UPnP] Calling handler for response %s\n", (char *) action->GetActionDesc().GetName())); JS_CallFunctionValue(serv->js_ctx, serv->obj, act_l->on_event, 0, 0, &rval); } else { GF_LOG(GF_LOG_ERROR, GF_LOG_NETWORK, ("[UPnP] response %s has error %d\n", (char *) action->GetActionDesc().GetName(), res )); } m_pUPnP->LockJavascript(GF_FALSE); } GF_LOG(GF_LOG_INFO, GF_LOG_NETWORK, ("[UPnP] Done processing response %s\n", (char *) action->GetActionDesc().GetName())); exit: if (act_udta) { gf_js_remove_root(serv->js_ctx, &act_udta->udta, GF_JSGC_VAL); delete act_udta; } return NPT_SUCCESS; #else return NPT_SUCCESS; #endif }