private static void HandleInvokeFailure(IntPtr cx, IntPtr jsObject, string name) { var exception = SpiderMonkey.JS_GetPendingException(cx); if (exception != IntPtr.Zero) { var exceptionJsVal = JsVal.FromPtr(exception); string st = string.Empty; try { st = GetStackTrace(cx, jsObject, exceptionJsVal); } catch { // ignored // we failed to get stack trace info, but still want to continue reporting exception. } var msg = exceptionJsVal.ToString(); msg += st; throw new GeckoException($"Calling function '{name}' failed: '{msg}'"); } throw new GeckoException($"Failed to call function '{name}'"); }
/// <summary> /// JS_CallFunctionName without args /// </summary> /// <param name="cx"></param> /// <param name="jsObject"></param> /// <param name="name"></param> /// <returns></returns> public static JsVal JS_CallFunctionName(IntPtr cx, IntPtr jsObject, string name) { bool result; JsVal value; int parameterCount = 0; var mutableHandle = new MutableHandleValue(); if (!JS_CallFunctionName(cx, ref jsObject, name, ref parameterCount, ref mutableHandle)) { HandleInvokeFailure(cx, jsObject, name); } value = JsVal.FromPtr(mutableHandle.Handle); return(value); }
public static JsVal JS_CallFunctionValue(IntPtr cx, IntPtr jsObject, JsVal func) { var mutableHandle = new MutableHandleValue(); bool success; using (var args = new HandleValueArray(0, new JsVal[0])) success = JS_CallFunctionValue(cx, jsObject, ref func, args.Ptr, ref mutableHandle); if (success) { return(JsVal.FromPtr(mutableHandle.Handle)); } HandleInvokeFailure(cx, jsObject, func.ToString()); throw new Exception("HandleInvokeFailure always throws execption, so this line is never reached."); }
public static bool JS_ExecuteScript(IntPtr cx, string script, out JsVal jsval) { jsval = default(JsVal); var scriptHandle = new MutableHandle(); if (!JS_CompileUCScript(cx, script, script.Length, GetCompileOptions(cx), ref scriptHandle)) { throw new GeckoException("Failed to compile script."); } var val = new MutableHandleValue(); var handle = scriptHandle.Handle; if (!JS_ExecuteScript(cx, ref handle, ref val)) { return(false); } jsval = JsVal.FromPtr(val.Handle); return(true); }