static JSBool XrayToString(JSContext *cx, uintN argc, jsval *vp) { JSObject *wrapper = JS_THIS_OBJECT(cx, vp); if (!wrapper->isWrapper() || !WrapperFactory::IsXrayWrapper(wrapper)) { JS_ReportError(cx, "XrayToString called on an incompatible object"); return false; } JSObject *holder = GetHolder(wrapper); XPCWrappedNative *wn = GetWrappedNativeFromHolder(holder); JSObject *wrappednative = wn->GetFlatJSObject(); XPCCallContext ccx(JS_CALLER, cx, wrappednative); char *wrapperStr = wn->ToString(ccx); if (!wrapperStr) { JS_ReportOutOfMemory(cx); return false; } nsAutoString result(NS_LITERAL_STRING("[object XrayWrapper ")); result.AppendASCII(wrapperStr); JS_smprintf_free(wrapperStr); result.Append(']'); JSString *str = JS_NewUCStringCopyN(cx, reinterpret_cast<const jschar *>(result.get()), result.Length()); if (!str) return false; *vp = STRING_TO_JSVAL(str); return true; }
static bool ToStringGuts(XPCCallContext& ccx) { char* sz; XPCWrappedNative* wrapper = ccx.GetWrapper(); if (wrapper) sz = wrapper->ToString(ccx.GetTearOff()); else sz = JS_smprintf("[xpconnect wrapped native prototype]"); if (!sz) { JS_ReportOutOfMemory(ccx); return false; } JSString* str = JS_NewStringCopyZ(ccx, sz); JS_smprintf_free(sz); if (!str) return false; ccx.SetRetVal(JS::StringValue(str)); return true; }