NS_IMETHODIMP nsEventListenerInfo::ToSource(nsAString& aResult) { aResult.SetIsVoid(true); nsCOMPtr<nsIThreadJSContextStack> stack = nsContentUtils::ThreadJSContextStack(); if (stack) { JSContext* cx = stack->GetSafeJSContext(); if (cx && NS_SUCCEEDED(stack->Push(cx))) { { // Extra block to finish the auto request before calling pop JSAutoRequest ar(cx); mozilla::Maybe<JSAutoCompartment> ac; jsval v = JSVAL_NULL; if (GetJSVal(cx, ac, &v)) { JSString* str = JS_ValueToSource(cx, v); if (str) { nsDependentJSString depStr; if (depStr.init(cx, str)) { aResult.Assign(depStr); } } } } stack->Pop(&cx); } } return NS_OK; }
/* Mimick the behaviour exposed by standard Error objects (http://mxr.mozilla.org/mozilla-central/source/js/src/jsexn.cpp#554) */ static char* jsvalue_to_string(JSContext* cx, jsval val, gboolean* is_string) { char* value = NULL; JSString* value_str = NULL; if (JSVAL_IS_PRIMITIVE(val)) { value_str = JS_ValueToSource(cx, val); } else { JSObject *obj = JSVAL_TO_OBJECT(val); if (JS_ObjectIsFunction(cx, obj)) { JSFunction *fn = JS_ValueToFunction(cx, val); value_str = JS_GetFunctionId(fn); if (!value_str) value = g_strdup("[unknown function]"); } else { value = g_strdup_printf("[object %s]", JS_GetClass(cx, obj)->name); } } if (!value && value_str) value = gjs_value_debug_string(cx, val); if (is_string) *is_string = JSVAL_IS_STRING(val); return value; }
NS_IMETHODIMP nsEventListenerInfo::ToSource(nsAString& aResult) { aResult.SetIsVoid(PR_TRUE); nsresult rv; jsval v = JSVAL_NULL; nsAutoGCRoot root(&v, &rv); NS_ENSURE_SUCCESS(rv, rv); if (GetJSVal(&v)) { nsCOMPtr<nsIThreadJSContextStack> stack = nsContentUtils::ThreadJSContextStack(); if (stack) { JSContext* cx = nsnull; stack->GetSafeJSContext(&cx); if (cx && NS_SUCCEEDED(stack->Push(cx))) { JSAutoRequest ar(cx); JSString* str = JS_ValueToSource(cx, v); if (str) { aResult.Assign(nsDependentJSString(str)); } stack->Pop(&cx); } } } return NS_OK; }
NS_IMETHODIMP EventListenerInfo::ToSource(nsAString& aResult) { aResult.SetIsVoid(true); AutoSafeJSContext cx; Maybe<JSAutoCompartment> ac; JS::Rooted<JS::Value> v(cx); if (GetJSVal(cx, ac, &v)) { JSString* str = JS_ValueToSource(cx, v); if (str) { nsAutoJSString autoStr; if (autoStr.init(cx, str)) { aResult.Assign(autoStr); } } } return NS_OK; }
void afx_cmd() { if(!g_JsRunning) { pEngfuncs->Con_Printf("Error: script engine not running.\n"); return; } int argc = pEngfuncs->Cmd_Argc(); if(argc < 2) { // Print help and return: pEngfuncs->Con_Printf( "Usage: afx <script command(s)>\n" ); return; } // // concat arguments to full string: char *ttt, *ct; unsigned int len=0; // calculate required space: for(int i=0; i<argc; i++) len += strlen(pEngfuncs->Cmd_Argv(i))+1; if(len<1) len=1; ct = ttt = (char *)malloc(sizeof(char)*len); if(!ct) { pEngfuncs->Con_Printf("ERROR: malloc failed.\n"); return; } for(int i=1; i<argc; i++) { char const * cur = pEngfuncs->Cmd_Argv(i); unsigned int lcur = strlen(cur); if(1<i) { *ct = ' '; ct++; len--; } strcpy_s(ct, len, cur); ct += lcur; len -= lcur; } *ct = 0; // Term jsval rval; JSBool ok; JSAutoCompartment ac(g_JsCx, g_JsGlobal); pEngfuncs->Con_DPrintf("%s\n", ttt); ok = JS_EvaluateScript(g_JsCx, JS_GetGlobalForScopeChain(g_JsCx), ttt, strlen(ttt), NULL, 0, &rval); if(!ok) pEngfuncs->Con_Printf("Error.\n"); else if (!JSVAL_IS_VOID(rval)) { JSString *str = JS_ValueToSource(g_JsCx, rval); if(str) { char *c_str = JS_EncodeString(g_JsCx, str); if(c_str) { pEngfuncs->Con_Printf("Result: %s\n", c_str); JS_free(g_JsCx, c_str); } } else pEngfuncs->Con_Printf("Result error.\n"); } free(ttt); }