diff --git a/caps/src/nsScriptSecurityManager.cpp b/caps/src/nsScriptSecurityManager.cpp index 6223fbfa3946..41f67cc6050e 100644 --- a/caps/src/nsScriptSecurityManager.cpp +++ b/caps/src/nsScriptSecurityManager.cpp @@ -112,10 +112,10 @@ IDToString(JSContext *cx, jsid id_) if (JSID_IS_STRING(id)) return JS_GetInternedStringChars(JSID_TO_STRING(id)); - JS::Rooted idval(cx); - if (!JS_IdToValue(cx, id, idval.address())) + JS::Value idval; + if (!JS_IdToValue(cx, id, &idval)) return nullptr; - JSString *str = JS::ToString(cx, idval); + JSString *str = JS_ValueToString(cx, idval); if(!str) return nullptr; return JS_GetStringCharsZ(cx, str); diff --git a/content/base/public/Element.h b/content/base/public/Element.h index 5a280dc56a8b..0cd88e9814a5 100644 --- a/content/base/public/Element.h +++ b/content/base/public/Element.h @@ -1471,6 +1471,28 @@ NS_IMETHOD MozRemove() MOZ_FINAL \ nsINode::Remove(); \ return NS_OK; \ } \ +using nsINode::GetOnmouseenter; \ +using nsINode::SetOnmouseenter; \ +NS_IMETHOD GetOnmouseenter(JSContext* cx, JS::Value* aOnmouseenter) MOZ_FINAL \ +{ \ + return Element::GetOnmouseenter(cx, aOnmouseenter); \ +} \ +NS_IMETHOD SetOnmouseenter(JSContext* cx, \ + const JS::Value& aOnmouseenter) MOZ_FINAL \ +{ \ + return Element::SetOnmouseenter(cx, aOnmouseenter); \ +} \ +using nsINode::GetOnmouseleave; \ +using nsINode::SetOnmouseleave; \ +NS_IMETHOD GetOnmouseleave(JSContext* cx, JS::Value* aOnmouseleave) MOZ_FINAL \ +{ \ + return Element::GetOnmouseleave(cx, aOnmouseleave); \ +} \ +NS_IMETHOD SetOnmouseleave(JSContext* cx, \ + const JS::Value& aOnmouseleave) MOZ_FINAL \ +{ \ + return Element::SetOnmouseleave(cx, aOnmouseleave); \ +} \ NS_IMETHOD GetClientRects(nsIDOMClientRectList** _retval) MOZ_FINAL \ { \ *_retval = Element::GetClientRects().get(); \ diff --git a/content/base/public/nsINode.h b/content/base/public/nsINode.h index 7f19d4f8f5c8..374d5dd351d5 100644 --- a/content/base/public/nsINode.h +++ b/content/base/public/nsINode.h @@ -1709,7 +1709,9 @@ public: */ #define EVENT(name_, id_, type_, struct_) \ mozilla::dom::EventHandlerNonNull* GetOn##name_(); \ - void SetOn##name_(mozilla::dom::EventHandlerNonNull* listener); + void SetOn##name_(mozilla::dom::EventHandlerNonNull* listener); \ + NS_IMETHOD GetOn##name_(JSContext *cx, JS::Value *vp); \ + NS_IMETHOD SetOn##name_(JSContext *cx, const JS::Value &v); #define TOUCH_EVENT EVENT #define DOCUMENT_ONLY_EVENT EVENT #include "nsEventNameList.h" diff --git a/content/base/public/nsIXMLHttpRequest.idl b/content/base/public/nsIXMLHttpRequest.idl index 5ea99210820e..4a195c12f097 100644 --- a/content/base/public/nsIXMLHttpRequest.idl +++ b/content/base/public/nsIXMLHttpRequest.idl @@ -19,6 +19,13 @@ interface nsIDOMBlob; [scriptable, builtinclass, uuid(ac97e161-9f1d-4163-adc9-e9a59e18682c)] interface nsIXMLHttpRequestEventTarget : nsIDOMEventTarget { // event handler attributes + [implicit_jscontext] attribute jsval onabort; + [implicit_jscontext] attribute jsval onerror; + [implicit_jscontext] attribute jsval onload; + [implicit_jscontext] attribute jsval onloadstart; + [implicit_jscontext] attribute jsval onprogress; + [implicit_jscontext] attribute jsval ontimeout; + [implicit_jscontext] attribute jsval onloadend; }; [scriptable, builtinclass, uuid(df3796fa-d98a-4185-9dda-d2f2b56a5d38)] diff --git a/content/base/src/nsDOMBlobBuilder.cpp b/content/base/src/nsDOMBlobBuilder.cpp index 797dd29ff9ee..811222499573 100644 --- a/content/base/src/nsDOMBlobBuilder.cpp +++ b/content/base/src/nsDOMBlobBuilder.cpp @@ -268,7 +268,7 @@ nsDOMMultipartFile::ParseBlobArrayArgument(JSContext* aCx, JS::Value& aValue, } // coerce it to a string - JSString* str = JS::ToString(aCx, element); + JSString* str = JS_ValueToString(aCx, element); NS_ENSURE_TRUE(str, NS_ERROR_TYPE_ERR); blobSet.AppendString(str, aNativeEOL, aCx); } @@ -342,7 +342,7 @@ nsDOMMultipartFile::InitChromeFile(JSContext* aCx, mIsFromNsiFile = true; } else { // It's a string - JSString* str = JS::ToString(aCx, JS::Handle::fromMarkedLocation(&aArgv[0])); + JSString* str = JS_ValueToString(aCx, aArgv[0]); NS_ENSURE_TRUE(str, NS_ERROR_XPC_BAD_CONVERT_JS); nsDependentJSString xpcomStr; @@ -397,7 +397,7 @@ nsDOMMultipartFile::InitFile(JSContext* aCx, } // File name - JSString* str = JS::ToString(aCx, JS::Handle::fromMarkedLocation(&aArgv[1])); + JSString* str = JS_ValueToString(aCx, aArgv[1]); NS_ENSURE_TRUE(str, NS_ERROR_XPC_BAD_CONVERT_JS); nsDependentJSString xpcomStr; diff --git a/content/base/src/nsINode.cpp b/content/base/src/nsINode.cpp index 7cf4f1852873..2c3815d9b70e 100644 --- a/content/base/src/nsINode.cpp +++ b/content/base/src/nsINode.cpp @@ -2198,6 +2198,21 @@ nsINode::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const if (elm) { \ elm->SetEventHandler(nsGkAtoms::on##name_, EmptyString(), handler); \ } \ + } \ + NS_IMETHODIMP nsINode::GetOn##name_(JSContext *cx, JS::Value *vp) { \ + EventHandlerNonNull* h = GetOn##name_(); \ + vp->setObjectOrNull(h ? h->Callable().get() : nullptr); \ + return NS_OK; \ + } \ + NS_IMETHODIMP nsINode::SetOn##name_(JSContext *cx, const JS::Value &v) { \ + nsRefPtr handler; \ + JSObject *callable; \ + if (v.isObject() && \ + JS_ObjectIsCallable(cx, callable = &v.toObject())) { \ + handler = new EventHandlerNonNull(callable); \ + } \ + SetOn##name_(handler); \ + return NS_OK; \ } #define TOUCH_EVENT EVENT #define DOCUMENT_ONLY_EVENT EVENT diff --git a/content/base/src/nsXMLHttpRequest.cpp b/content/base/src/nsXMLHttpRequest.cpp index 1988a5494d78..1abd47205ea4 100644 --- a/content/base/src/nsXMLHttpRequest.cpp +++ b/content/base/src/nsXMLHttpRequest.cpp @@ -247,6 +247,14 @@ NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper) NS_IMPL_ADDREF_INHERITED(nsXHREventTarget, nsDOMEventTargetHelper) NS_IMPL_RELEASE_INHERITED(nsXHREventTarget, nsDOMEventTargetHelper) +NS_IMPL_EVENT_HANDLER(nsXHREventTarget, loadstart) +NS_IMPL_EVENT_HANDLER(nsXHREventTarget, progress) +NS_IMPL_EVENT_HANDLER(nsXHREventTarget, abort) +NS_IMPL_EVENT_HANDLER(nsXHREventTarget, error) +NS_IMPL_EVENT_HANDLER(nsXHREventTarget, load) +NS_IMPL_EVENT_HANDLER(nsXHREventTarget, timeout) +NS_IMPL_EVENT_HANDLER(nsXHREventTarget, loadend) + void nsXHREventTarget::DisconnectFromOwner() { diff --git a/content/html/content/src/HTMLBodyElement.cpp b/content/html/content/src/HTMLBodyElement.cpp index e555b934c525..aba1ff45f6e7 100644 --- a/content/html/content/src/HTMLBodyElement.cpp +++ b/content/html/content/src/HTMLBodyElement.cpp @@ -485,6 +485,32 @@ HTMLBodyElement::IsEventAttributeName(nsIAtom *aName) // nsGenericHTMLElement::GetOnError returns // already_AddRefed while other getters return // EventHandlerNonNull*, so allow passing in the type to use here. +#define FORWARDED_EVENT_HELPER(name_, forwardto_, type_, getter_type_) \ + NS_IMETHODIMP \ + HTMLBodyElement::GetOn##name_(JSContext *cx, JS::Value *vp) \ + { \ + getter_type_ h = forwardto_::GetOn##name_(); \ + vp->setObjectOrNull(h ? h->Callable().get() : nullptr); \ + return NS_OK; \ + } \ + NS_IMETHODIMP \ + HTMLBodyElement::SetOn##name_(JSContext *cx, const JS::Value &v) \ + { \ + nsRefPtr handler; \ + JSObject *callable; \ + if (v.isObject() && \ + JS_ObjectIsCallable(cx, callable = &v.toObject())) { \ + handler = new type_(callable); \ + } \ + forwardto_::SetOn##name_(handler); \ + return NS_OK; \ + } +#define FORWARDED_EVENT(name_, id_, type_, struct_) \ + FORWARDED_EVENT_HELPER(name_, nsGenericHTMLElement, EventHandlerNonNull, \ + EventHandlerNonNull*) +#define ERROR_EVENT(name_, id_, type_, struct_) \ + FORWARDED_EVENT_HELPER(name_, nsGenericHTMLElement, \ + EventHandlerNonNull, nsCOMPtr) #define WINDOW_EVENT_HELPER(name_, type_) \ type_* \ HTMLBodyElement::GetOn##name_() \ @@ -508,7 +534,8 @@ HTMLBodyElement::IsEventAttributeName(nsIAtom *aName) nsCOMPtr supports = do_QueryInterface(win); \ nsGlobalWindow* globalWin = nsGlobalWindow::FromSupports(supports); \ return globalWin->SetOn##name_(handler); \ - } + } \ + FORWARDED_EVENT_HELPER(name_, HTMLBodyElement, type_, type_*) #define WINDOW_EVENT(name_, id_, type_, struct_) \ WINDOW_EVENT_HELPER(name_, EventHandlerNonNull) #define BEFOREUNLOAD_EVENT(name_, id_, type_, struct_) \ @@ -517,6 +544,9 @@ HTMLBodyElement::IsEventAttributeName(nsIAtom *aName) #undef BEFOREUNLOAD_EVENT #undef WINDOW_EVENT #undef WINDOW_EVENT_HELPER +#undef ERROR_EVENT +#undef FORWARDED_EVENT +#undef FORWARDED_EVENT_HELPER #undef EVENT } // namespace dom diff --git a/content/html/content/src/HTMLBodyElement.h b/content/html/content/src/HTMLBodyElement.h index 4c0b43a1cf70..7c3595e51b19 100644 --- a/content/html/content/src/HTMLBodyElement.h +++ b/content/html/content/src/HTMLBodyElement.h @@ -55,6 +55,9 @@ public: // Event listener stuff; we need to declare only the ones we need to // forward to window that don't come from nsIDOMHTMLBodyElement. #define EVENT(name_, id_, type_, struct_) /* nothing; handled by the shim */ +#define FORWARDED_EVENT(name_, id_, type_, struct_) \ + NS_IMETHOD GetOn##name_(JSContext *cx, JS::Value *vp); \ + NS_IMETHOD SetOn##name_(JSContext *cx, const JS::Value &v); #define WINDOW_EVENT_HELPER(name_, type_) \ type_* GetOn##name_(); \ void SetOn##name_(type_* handler); @@ -66,6 +69,7 @@ public: #undef BEFOREUNLOAD_EVENT #undef WINDOW_EVENT #undef WINDOW_EVENT_HELPER +#undef FORWARDED_EVENT #undef EVENT void GetText(nsString& aText) diff --git a/content/html/content/src/HTMLFrameSetElement.cpp b/content/html/content/src/HTMLFrameSetElement.cpp index 1ef25a9940ed..efbbfcdb9f2d 100644 --- a/content/html/content/src/HTMLFrameSetElement.cpp +++ b/content/html/content/src/HTMLFrameSetElement.cpp @@ -345,6 +345,32 @@ HTMLFrameSetElement::IsEventAttributeName(nsIAtom *aName) // nsGenericHTMLElement::GetOnError returns // already_AddRefed while other getters return // EventHandlerNonNull*, so allow passing in the type to use here. +#define FORWARDED_EVENT_HELPER(name_, forwardto_, type_, getter_type_) \ + NS_IMETHODIMP \ + HTMLFrameSetElement::GetOn##name_(JSContext *cx, JS::Value *vp) \ + { \ + getter_type_ h = forwardto_::GetOn##name_(); \ + vp->setObjectOrNull(h ? h->Callable().get() : nullptr); \ + return NS_OK; \ + } \ + NS_IMETHODIMP \ + HTMLFrameSetElement::SetOn##name_(JSContext *cx, const JS::Value &v) \ + { \ + nsRefPtr handler; \ + JSObject *callable; \ + if (v.isObject() && \ + JS_ObjectIsCallable(cx, callable = &v.toObject())) { \ + handler = new type_(callable); \ + } \ + forwardto_::SetOn##name_(handler); \ + return NS_OK; \ + } +#define FORWARDED_EVENT(name_, id_, type_, struct_) \ + FORWARDED_EVENT_HELPER(name_, nsGenericHTMLElement, EventHandlerNonNull, \ + EventHandlerNonNull*) +#define ERROR_EVENT(name_, id_, type_, struct_) \ + FORWARDED_EVENT_HELPER(name_, nsGenericHTMLElement, \ + EventHandlerNonNull, nsCOMPtr) #define WINDOW_EVENT_HELPER(name_, type_) \ type_* \ HTMLFrameSetElement::GetOn##name_() \ @@ -368,7 +394,8 @@ HTMLFrameSetElement::IsEventAttributeName(nsIAtom *aName) nsCOMPtr supports = do_QueryInterface(win); \ nsGlobalWindow* globalWin = nsGlobalWindow::FromSupports(supports); \ return globalWin->SetOn##name_(handler); \ - } + } \ + FORWARDED_EVENT_HELPER(name_, HTMLFrameSetElement, type_, type_*) #define WINDOW_EVENT(name_, id_, type_, struct_) \ WINDOW_EVENT_HELPER(name_, EventHandlerNonNull) #define BEFOREUNLOAD_EVENT(name_, id_, type_, struct_) \ @@ -377,6 +404,9 @@ HTMLFrameSetElement::IsEventAttributeName(nsIAtom *aName) #undef BEFOREUNLOAD_EVENT #undef WINDOW_EVENT #undef WINDOW_EVENT_HELPER +#undef ERROR_EVENT +#undef FORWARDED_EVENT +#undef FORWARDED_EVENT_HELPER #undef EVENT } // namespace dom diff --git a/content/html/content/src/HTMLFrameSetElement.h b/content/html/content/src/HTMLFrameSetElement.h index 261b5d4c4549..5936fdaefd11 100644 --- a/content/html/content/src/HTMLFrameSetElement.h +++ b/content/html/content/src/HTMLFrameSetElement.h @@ -85,6 +85,9 @@ public: // Event listener stuff; we need to declare only the ones we need to // forward to window that don't come from nsIDOMHTMLFrameSetElement. #define EVENT(name_, id_, type_, struct_) /* nothing; handled by the superclass */ +#define FORWARDED_EVENT(name_, id_, type_, struct_) \ + NS_IMETHOD GetOn##name_(JSContext *cx, JS::Value *vp); \ + NS_IMETHOD SetOn##name_(JSContext *cx, const JS::Value &v); #define WINDOW_EVENT_HELPER(name_, type_) \ type_* GetOn##name_(); \ void SetOn##name_(type_* handler); @@ -96,6 +99,7 @@ public: #undef BEFOREUNLOAD_EVENT #undef WINDOW_EVENT #undef WINDOW_EVENT_HELPER +#undef FORWARDED_EVENT #undef EVENT // These override the SetAttr methods in nsGenericHTMLElement (need diff --git a/content/xslt/src/xslt/txMozillaXSLTProcessor.cpp b/content/xslt/src/xslt/txMozillaXSLTProcessor.cpp index 8cbae6c9d037..491d7ca29695 100644 --- a/content/xslt/src/xslt/txMozillaXSLTProcessor.cpp +++ b/content/xslt/src/xslt/txMozillaXSLTProcessor.cpp @@ -1444,8 +1444,8 @@ txVariable::Convert(nsIVariant *aValue, txAExprResult** aResult) JS::Rooted jsobj(cx, holder->GetJSObject()); NS_ENSURE_STATE(jsobj); - JS::Rooted v(cx, JS::ObjectValue(*jsobj)); - JS::Rooted str(cx, JS::ToString(cx, v)); + JS::Rooted str(cx, + JS_ValueToString(cx, OBJECT_TO_JSVAL(jsobj))); NS_ENSURE_TRUE(str, NS_ERROR_FAILURE); nsDependentJSString value; diff --git a/dom/audiochannel/AudioChannelService.cpp b/dom/audiochannel/AudioChannelService.cpp index 361c394c4929..c326222f0200 100644 --- a/dom/audiochannel/AudioChannelService.cpp +++ b/dom/audiochannel/AudioChannelService.cpp @@ -677,7 +677,7 @@ AudioChannelService::Observe(nsISupports* aSubject, const char* aTopic, const PR return NS_OK; } - JS::Rooted jsKey(cx, JS::ToString(cx, key)); + JS::Rooted jsKey(cx, JS_ValueToString(cx, key)); if (!jsKey) { return NS_OK; } diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index 85fd3ce292ab..db20a013d91c 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -616,10 +616,10 @@ IdToString(JSContext *cx, jsid id) { if (JSID_IS_STRING(id)) return JSID_TO_STRING(id); - JS::Rooted idval(cx); - if (!::JS_IdToValue(cx, id, idval.address())) + jsval idval; + if (!::JS_IdToValue(cx, id, &idval)) return nullptr; - return JS::ToString(cx, idval); + return JS_ValueToString(cx, idval); } static inline nsresult @@ -3292,7 +3292,7 @@ LocationSetterGuts(JSContext *cx, JSObject *obj, JS::MutableHandle vp NS_ENSURE_SUCCESS(rv, rv); // Grab the value we're being set to before we stomp on |vp| - JS::Rooted val(cx, JS::ToString(cx, vp)); + JS::Rooted val(cx, ::JS_ValueToString(cx, vp)); NS_ENSURE_TRUE(val, NS_ERROR_UNEXPECTED); // Make sure |val| stays alive below @@ -4198,10 +4198,9 @@ nsHTMLDocumentSH::ReleaseDocument(JSFreeOp *fop, JSObject *obj) bool nsHTMLDocumentSH::CallToGetPropMapper(JSContext *cx, unsigned argc, jsval *vp) { - JS::CallArgs args = JS::CallArgsFromVp(argc, vp); // Handle document.all("foo") style access to document.all. - if (args.length() != 1) { + if (argc != 1) { // XXX: Should throw NS_ERROR_XPC_NOT_ENOUGH_ARGS for argc < 1, // and create a new NS_ERROR_XPC_TOO_MANY_ARGS for argc > 1? IE // accepts nothing other than one arg. @@ -4211,7 +4210,7 @@ nsHTMLDocumentSH::CallToGetPropMapper(JSContext *cx, unsigned argc, jsval *vp) } // Convert all types to string. - JS::Rooted str(cx, JS::ToString(cx, args[0])); + JS::Rooted str(cx, ::JS_ValueToString(cx, JS_ARGV(cx, vp)[0])); if (!str) { return false; } @@ -4219,9 +4218,10 @@ nsHTMLDocumentSH::CallToGetPropMapper(JSContext *cx, unsigned argc, jsval *vp) // If we are called via document.all(id) instead of document.all.item(i) or // another method, use the document.all callee object as self. JSObject *self; - if (args.calleev().isObject() && - JS_GetClass(&args.calleev().toObject()) == &sHTMLDocumentAllClass) { - self = &args.calleev().toObject(); + JS::Value callee = JS_CALLEE(cx, vp); + if (callee.isObject() && + JS_GetClass(&callee.toObject()) == &sHTMLDocumentAllClass) { + self = JSVAL_TO_OBJECT(JS_CALLEE(cx, vp)); } else { self = JS_THIS_OBJECT(cx, vp); if (!self) @@ -4235,7 +4235,13 @@ nsHTMLDocumentSH::CallToGetPropMapper(JSContext *cx, unsigned argc, jsval *vp) return false; } - return ::JS_GetUCProperty(cx, self, chars, length, args.rval()); + JS::Rooted value(cx); + if (!::JS_GetUCProperty(cx, self, chars, length, &value)) { + return false; + } + + *vp = value; + return true; } // StringArray helper @@ -4430,8 +4436,7 @@ nsStorage2SH::SetProperty(nsIXPConnectWrappedNative *wrapper, nsDependentJSString keyStr; NS_ENSURE_TRUE(keyStr.init(cx, key), NS_ERROR_UNEXPECTED); - JS::Rooted val(cx, *vp); - JSString *value = JS::ToString(cx, val); + JSString *value = ::JS_ValueToString(cx, *vp); NS_ENSURE_TRUE(value, NS_ERROR_UNEXPECTED); nsDependentJSString valueStr; diff --git a/dom/base/nsJSEnvironment.cpp b/dom/base/nsJSEnvironment.cpp index cc8d506ba9da..0b0e9bff990d 100644 --- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -1536,16 +1536,16 @@ TraceMallocEnable(JSContext *cx, unsigned argc, JS::Value *vp) static bool TraceMallocOpenLogFile(JSContext *cx, unsigned argc, JS::Value *vp) { - JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + int fd; + JSString *str; if (!CheckUniversalXPConnectForTraceMalloc(cx)) return false; - int fd; if (argc == 0) { fd = -1; } else { - JSString *str = JS::ToString(cx, args[0]); + str = JS_ValueToString(cx, JS_ARGV(cx, vp)[0]); if (!str) return false; JSAutoByteString filename(cx, str); @@ -1557,7 +1557,7 @@ TraceMallocOpenLogFile(JSContext *cx, unsigned argc, JS::Value *vp) return false; } } - args.rva().setInt32(fd); + JS_SET_RVAL(cx, vp, INT_TO_JSVAL(fd)); return true; } @@ -1608,29 +1608,27 @@ TraceMallocCloseLogFD(JSContext *cx, unsigned argc, JS::Value *vp) static bool TraceMallocLogTimestamp(JSContext *cx, unsigned argc, JS::Value *vp) { - JS::CallArgs args = JS::CallArgsFromVp(argc, vp); if (!CheckUniversalXPConnectForTraceMalloc(cx)) return false; - JSString *str = JS::ToString(cx, args.get(0)); + JSString *str = JS_ValueToString(cx, argc ? JS_ARGV(cx, vp)[0] : JSVAL_VOID); if (!str) return false; JSAutoByteString caption(cx, str); if (!caption) return false; NS_TraceMallocLogTimestamp(caption.ptr()); - args.rval().setUndefined(); + JS_SET_RVAL(cx, vp, JSVAL_VOID); return true; } static bool TraceMallocDumpAllocations(JSContext *cx, unsigned argc, JS::Value *vp) { - JS::CallArgs args = JS::CallArgsFromVp(argc, vp); if (!CheckUniversalXPConnectForTraceMalloc(cx)) return false; - JSString *str = JS::ToString(cx, args.get(0)); + JSString *str = JS_ValueToString(cx, argc ? JS_ARGV(cx, vp)[0] : JSVAL_VOID); if (!str) return false; JSAutoByteString pathname(cx, str); @@ -1640,7 +1638,7 @@ TraceMallocDumpAllocations(JSContext *cx, unsigned argc, JS::Value *vp) JS_ReportError(cx, "can't dump to %s: %s", pathname.ptr(), strerror(errno)); return false; } - args.rval().setUndefined(); + JS_SET_RVAL(cx, vp, JSVAL_VOID); return true; } @@ -1670,8 +1668,7 @@ namespace dmd { static bool ReportAndDump(JSContext *cx, unsigned argc, JS::Value *vp) { - JS::CallArgs args = JS::CallArgsFromVp(argc, vp); - JSString *str = JS::ToString(cx, args.get(0)); + JSString *str = JS_ValueToString(cx, argc ? JS_ARGV(cx, vp)[0] : JSVAL_VOID); if (!str) return false; JSAutoByteString pathname(cx, str); @@ -1693,7 +1690,7 @@ ReportAndDump(JSContext *cx, unsigned argc, JS::Value *vp) fclose(fp); - args.rval().setUndefined(); + JS_SET_RVAL(cx, vp, JSVAL_VOID); return true; } diff --git a/dom/base/nsJSTimeoutHandler.cpp b/dom/base/nsJSTimeoutHandler.cpp index 8fa5d843813f..154d0ae6e1ed 100644 --- a/dom/base/nsJSTimeoutHandler.cpp +++ b/dom/base/nsJSTimeoutHandler.cpp @@ -317,8 +317,7 @@ nsJSScriptTimeoutHandler::Init(nsGlobalWindow *aWindow, bool *aIsInterval, case JSTYPE_STRING: case JSTYPE_OBJECT: { - JS::Rooted arg(cx, argv[0]); - JSString *str = JS::ToString(cx, arg); + JSString *str = ::JS_ValueToString(cx, argv[0]); if (!str) return NS_ERROR_OUT_OF_MEMORY; diff --git a/dom/base/nsJSUtils.cpp b/dom/base/nsJSUtils.cpp index abf4c8e8cb3d..a5231590d60a 100644 --- a/dom/base/nsJSUtils.cpp +++ b/dom/base/nsJSUtils.cpp @@ -278,8 +278,7 @@ nsJSUtils::EvaluateString(JSContext* aCx, } if (ok && aEvaluateOptions.coerceToString && !aRetValue->isUndefined()) { - JS::Rooted value(aCx, *aRetValue); - JSString* str = JS::ToString(aCx, value); + JSString* str = JS_ValueToString(aCx, *aRetValue); ok = !!str; *aRetValue = ok ? JS::StringValue(str) : JS::UndefinedValue(); } diff --git a/dom/base/nsScreen.cpp b/dom/base/nsScreen.cpp index f9a9c7b6188b..7fccd19220ec 100644 --- a/dom/base/nsScreen.cpp +++ b/dom/base/nsScreen.cpp @@ -81,6 +81,8 @@ NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper) NS_IMPL_ADDREF_INHERITED(nsScreen, nsDOMEventTargetHelper) NS_IMPL_RELEASE_INHERITED(nsScreen, nsDOMEventTargetHelper) +NS_IMPL_EVENT_HANDLER(nsScreen, mozorientationchange) + int32_t nsScreen::GetPixelDepth(ErrorResult& aRv) { @@ -239,11 +241,9 @@ nsScreen::GetLockOrientationPermission() const } NS_IMETHODIMP -nsScreen::MozLockOrientation(const JS::Value& aOrientation_, JSContext* aCx, +nsScreen::MozLockOrientation(const JS::Value& aOrientation, JSContext* aCx, bool* aReturn) { - JS::Rooted aOrientation(aCx, aOrientation_); - if (aOrientation.isObject()) { JS::Rooted seq(aCx, &aOrientation.toObject()); if (IsArrayLike(aCx, seq)) { @@ -264,7 +264,7 @@ nsScreen::MozLockOrientation(const JS::Value& aOrientation_, JSContext* aCx, return NS_ERROR_FAILURE; } - JS::Rooted jsString(aCx, JS::ToString(aCx, temp)); + JS::Rooted jsString(aCx, JS_ValueToString(aCx, temp)); if (!jsString) { return NS_ERROR_FAILURE; } @@ -283,7 +283,7 @@ nsScreen::MozLockOrientation(const JS::Value& aOrientation_, JSContext* aCx, } } - JS::Rooted jsString(aCx, JS::ToString(aCx, aOrientation)); + JS::Rooted jsString(aCx, JS_ValueToString(aCx, aOrientation)); if (!jsString) { return NS_ERROR_FAILURE; } diff --git a/dom/bindings/BindingUtils.cpp b/dom/bindings/BindingUtils.cpp index 2ae924b04438..a635a7d65c13 100644 --- a/dom/bindings/BindingUtils.cpp +++ b/dom/bindings/BindingUtils.cpp @@ -2108,7 +2108,7 @@ ConvertJSValueToByteString(JSContext* cx, JS::Handle v, return true; } - s = JS::ToString(cx, v); + s = JS_ValueToString(cx, v); if (!s) { return false; } diff --git a/dom/bindings/BindingUtils.h b/dom/bindings/BindingUtils.h index dcbb3f8b5945..bbd728a72859 100644 --- a/dom/bindings/BindingUtils.h +++ b/dom/bindings/BindingUtils.h @@ -900,11 +900,11 @@ EnumValueNotFound(JSContext* cx, const jschar* chars, size_t length, template inline int -FindEnumStringIndex(JSContext* cx, JS::Handle v, const EnumEntry* values, +FindEnumStringIndex(JSContext* cx, JS::Value v, const EnumEntry* values, const char* type, const char* sourceDescription, bool* ok) { // JS_StringEqualsAscii is slow as molasses, so don't use it here. - JSString* str = JS::ToString(cx, v); + JSString* str = JS_ValueToString(cx, v); if (!str) { *ok = false; return 0; @@ -1550,7 +1550,7 @@ ConvertJSValueToString(JSContext* cx, JS::Handle v, return true; } - s = JS::ToString(cx, v); + s = JS_ValueToString(cx, v); if (!s) { return false; } diff --git a/dom/file/LockedFile.cpp b/dom/file/LockedFile.cpp index bdc2ae3bfa35..8c53104ef369 100644 --- a/dom/file/LockedFile.cpp +++ b/dom/file/LockedFile.cpp @@ -213,12 +213,12 @@ CreateGenericEvent(mozilla::dom::EventTarget* aEventOwner, } inline nsresult -GetInputStreamForJSVal(JS::Handle aValue, JSContext* aCx, +GetInputStreamForJSVal(const JS::Value& aValue, JSContext* aCx, nsIInputStream** aInputStream, uint64_t* aInputLength) { nsresult rv; - if (aValue.isObject()) { + if (!JSVAL_IS_PRIMITIVE(aValue)) { JS::Rooted obj(aCx, &aValue.toObject()); if (JS_IsArrayBufferObject(obj)) { char* data = reinterpret_cast(JS_GetArrayBufferData(obj)); @@ -246,8 +246,14 @@ GetInputStreamForJSVal(JS::Handle aValue, JSContext* aCx, } } - JSString* jsstr = JS::ToString(aCx, aValue); - NS_ENSURE_TRUE(jsstr, NS_ERROR_XPC_BAD_CONVERT_JS); + JSString* jsstr; + if (JSVAL_IS_STRING(aValue)) { + jsstr = JSVAL_TO_STRING(aValue); + } + else { + jsstr = JS_ValueToString(aCx, aValue); + NS_ENSURE_TRUE(jsstr, NS_ERROR_XPC_BAD_CONVERT_JS); + } nsDependentJSString str; if (!str.init(aCx, jsstr)) { @@ -858,11 +864,10 @@ LockedFile::WriteOrAppend(const JS::Value& aValue, return NS_OK; } - JS::Rooted val(aCx, aValue); nsCOMPtr inputStream; uint64_t inputLength; nsresult rv = - GetInputStreamForJSVal(val, aCx, getter_AddRefs(inputStream), + GetInputStreamForJSVal(aValue, aCx, getter_AddRefs(inputStream), &inputLength); NS_ENSURE_SUCCESS(rv, rv); diff --git a/dom/indexedDB/KeyPath.cpp b/dom/indexedDB/KeyPath.cpp index 03369b9b890e..a733480f2150 100644 --- a/dom/indexedDB/KeyPath.cpp +++ b/dom/indexedDB/KeyPath.cpp @@ -255,9 +255,8 @@ KeyPath::Parse(JSContext* aCx, const mozilla::dom::Sequence& aStrings, // static nsresult -KeyPath::Parse(JSContext* aCx, const JS::Value& aValue_, KeyPath* aKeyPath) +KeyPath::Parse(JSContext* aCx, const JS::Value& aValue, KeyPath* aKeyPath) { - JS::Rooted aValue(aCx, aValue_); KeyPath keyPath(0); aKeyPath->SetType(NONEXISTENT); @@ -284,7 +283,7 @@ KeyPath::Parse(JSContext* aCx, const JS::Value& aValue_, KeyPath* aKeyPath) JSString* jsstr; nsDependentJSString str; if (!JS_GetElement(aCx, obj, index, &val) || - !(jsstr = JS::ToString(aCx, val)) || + !(jsstr = JS_ValueToString(aCx, val)) || !str.init(aCx, jsstr)) { return NS_ERROR_FAILURE; } @@ -298,7 +297,7 @@ KeyPath::Parse(JSContext* aCx, const JS::Value& aValue_, KeyPath* aKeyPath) else if (!JSVAL_IS_NULL(aValue) && !JSVAL_IS_VOID(aValue)) { JSString* jsstr; nsDependentJSString str; - if (!(jsstr = JS::ToString(aCx, aValue)) || + if (!(jsstr = JS_ValueToString(aCx, aValue)) || !str.init(aCx, jsstr)) { return NS_ERROR_FAILURE; } diff --git a/dom/interfaces/base/nsIDOMScreen.idl b/dom/interfaces/base/nsIDOMScreen.idl index 111c1954920f..a981996dd207 100644 --- a/dom/interfaces/base/nsIDOMScreen.idl +++ b/dom/interfaces/base/nsIDOMScreen.idl @@ -5,7 +5,7 @@ #include "nsIDOMEventTarget.idl" -[scriptable, builtinclass, uuid(bcdf4ce4-9785-4e31-a851-1d51ea16da20)] +[scriptable, builtinclass, uuid(310a1d9a-4271-4d85-9e35-9dae6683b2c1)] interface nsIDOMScreen : nsIDOMEventTarget { readonly attribute long top; @@ -27,6 +27,8 @@ interface nsIDOMScreen : nsIDOMEventTarget [binaryname(SlowMozOrientation)] readonly attribute DOMString mozOrientation; + [implicit_jscontext] attribute jsval onmozorientationchange; + /** * Lock the screen to the specified orientations(s). This method returns true * if the lock was acquired successfully, and false otherwise. diff --git a/dom/interfaces/core/nsIDOMElement.idl b/dom/interfaces/core/nsIDOMElement.idl index e7471968770d..fb7ecd551993 100644 --- a/dom/interfaces/core/nsIDOMElement.idl +++ b/dom/interfaces/core/nsIDOMElement.idl @@ -15,7 +15,7 @@ interface nsIDOMMozNamedAttrMap; * http://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#interface-element */ -[scriptable, uuid(989422ef-120d-4d29-8a56-6aa2505a8b02)] +[scriptable, uuid(c3646b5d-a07d-470a-8e40-784459833c9f)] interface nsIDOMElement : nsIDOMNode { readonly attribute DOMString tagName; @@ -80,6 +80,12 @@ interface nsIDOMElement : nsIDOMNode [binaryname(MozRemove)] void remove(); + + // HTML + [implicit_jscontext] attribute jsval onmouseenter; + [implicit_jscontext] attribute jsval onmouseleave; + + // CSSOM View /** * Retrieve a list of rectangles, one for each CSS border-box associated with diff --git a/dom/interfaces/html/nsIDOMHTMLBodyElement.idl b/dom/interfaces/html/nsIDOMHTMLBodyElement.idl index 4e63a3a61c4c..488137a98ad4 100644 --- a/dom/interfaces/html/nsIDOMHTMLBodyElement.idl +++ b/dom/interfaces/html/nsIDOMHTMLBodyElement.idl @@ -20,7 +20,7 @@ * http://www.whatwg.org/specs/web-apps/current-work/ */ -[scriptable, uuid(068630db-2c00-43dd-b167-495757a88236)] +[scriptable, uuid(cc19f3c8-82fe-4337-8174-d4cde5bedcee)] interface nsIDOMHTMLBodyElement : nsISupports { attribute DOMString aLink; @@ -29,4 +29,23 @@ interface nsIDOMHTMLBodyElement : nsISupports attribute DOMString link; attribute DOMString text; attribute DOMString vLink; + + [implicit_jscontext] attribute jsval onafterprint; + [implicit_jscontext] attribute jsval onbeforeprint; + [implicit_jscontext] attribute jsval onbeforeunload; + [implicit_jscontext] attribute jsval onhashchange; + [implicit_jscontext] attribute jsval onmessage; + [implicit_jscontext] attribute jsval onoffline; + [implicit_jscontext] attribute jsval ononline; + [implicit_jscontext] attribute jsval onpagehide; + [implicit_jscontext] attribute jsval onpageshow; + [implicit_jscontext] attribute jsval onpopstate; + // Not supported yet + // [implicit_jscontext] attribute jsval onredo; + [implicit_jscontext] attribute jsval onresize; + // Not supported yet + // [implicit_jscontext] attribute jsval onstorage; + // Not supported yet + // [implicit_jscontext] attribute jsval onundo; + [implicit_jscontext] attribute jsval onunload; }; diff --git a/dom/interfaces/html/nsIDOMHTMLFrameSetElement.idl b/dom/interfaces/html/nsIDOMHTMLFrameSetElement.idl index 4b0fcbcf646f..21be13197aa0 100644 --- a/dom/interfaces/html/nsIDOMHTMLFrameSetElement.idl +++ b/dom/interfaces/html/nsIDOMHTMLFrameSetElement.idl @@ -20,9 +20,28 @@ * http://www.whatwg.org/specs/web-apps/current-work/ */ -[scriptable, uuid(14b29269-c387-4cff-8463-b0871ca0be3a)] +[scriptable, uuid(aea59d1c-ff6f-4b26-88dc-2f9b4be1a138)] interface nsIDOMHTMLFrameSetElement : nsISupports { attribute DOMString cols; attribute DOMString rows; + + [implicit_jscontext] attribute jsval onafterprint; + [implicit_jscontext] attribute jsval onbeforeprint; + [implicit_jscontext] attribute jsval onbeforeunload; + [implicit_jscontext] attribute jsval onhashchange; + [implicit_jscontext] attribute jsval onmessage; + [implicit_jscontext] attribute jsval onoffline; + [implicit_jscontext] attribute jsval ononline; + [implicit_jscontext] attribute jsval onpagehide; + [implicit_jscontext] attribute jsval onpageshow; + [implicit_jscontext] attribute jsval onpopstate; + // Not supported yet + // [implicit_jscontext] attribute jsval onredo; + [implicit_jscontext] attribute jsval onresize; + // Not supported yet + // [implicit_jscontext] attribute jsval onstorage; + // Not supported yet + // [implicit_jscontext] attribute jsval onundo; + [implicit_jscontext] attribute jsval onunload; }; diff --git a/dom/media/MediaManager.cpp b/dom/media/MediaManager.cpp index 243f284e20b1..145552749f6b 100644 --- a/dom/media/MediaManager.cpp +++ b/dom/media/MediaManager.cpp @@ -110,7 +110,7 @@ static nsresult CompareDictionaries(JSContext* aCx, JSObject *aA, bool success = JS_IdToValue(aCx, props[i], nameval.address()); NS_ENSURE_TRUE(success, NS_ERROR_UNEXPECTED); - JS::Rooted namestr(aCx, JS::ToString(aCx, nameval)); + JS::Rooted namestr(aCx, JS_ValueToString(aCx, nameval)); NS_ENSURE_TRUE(namestr, NS_ERROR_UNEXPECTED); aDifference->Assign(JS_GetStringCharsZ(aCx, namestr)); return NS_OK; diff --git a/dom/src/jsurl/nsJSProtocolHandler.cpp b/dom/src/jsurl/nsJSProtocolHandler.cpp index 73ca411e12c1..01e6f8ed4ec5 100644 --- a/dom/src/jsurl/nsJSProtocolHandler.cpp +++ b/dom/src/jsurl/nsJSProtocolHandler.cpp @@ -286,7 +286,7 @@ nsresult nsJSThunk::EvaluateScript(nsIChannel *aChannel, sandboxObj = js::UncheckedUnwrap(sandboxObj); JSAutoCompartment ac(cx, sandboxObj); - // Push our JSContext on the context stack so the EvalInSandboxObject call (and + // Push our JSContext on the context stack so the JS_ValueToString call (and // JS_ReportPendingException, if relevant) will use the principal of cx. nsCxPusher pusher; pusher.Push(cx); diff --git a/dom/system/gonk/AutoMounterSetting.cpp b/dom/system/gonk/AutoMounterSetting.cpp index dabf39b84f91..d5c3ee2ab55a 100644 --- a/dom/system/gonk/AutoMounterSetting.cpp +++ b/dom/system/gonk/AutoMounterSetting.cpp @@ -243,7 +243,7 @@ AutoMounterSetting::Observe(nsISupports* aSubject, return NS_OK; } - JSString *jsKey = JS::ToString(cx, key); + JSString *jsKey = JS_ValueToString(cx, key); nsDependentJSString keyStr; if (!keyStr.init(cx, jsKey)) { return NS_OK; diff --git a/dom/workers/XMLHttpRequest.cpp b/dom/workers/XMLHttpRequest.cpp index 962cf8954380..7324cbfc29fa 100644 --- a/dom/workers/XMLHttpRequest.cpp +++ b/dom/workers/XMLHttpRequest.cpp @@ -1991,8 +1991,7 @@ XMLHttpRequest::Send(JSObject* aBody, ErrorResult& aRv) valToClone.setObject(*aBody); } else { - JS::Rooted obj(cx, JS::ObjectValue(*aBody)); - JSString* bodyStr = JS::ToString(cx, obj); + JSString* bodyStr = JS_ValueToString(cx, OBJECT_TO_JSVAL(aBody)); if (!bodyStr) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return; diff --git a/ipc/testshell/XPCShellEnvironment.cpp b/ipc/testshell/XPCShellEnvironment.cpp index 160d0a47b2cd..9a098c1a5a8d 100644 --- a/ipc/testshell/XPCShellEnvironment.cpp +++ b/ipc/testshell/XPCShellEnvironment.cpp @@ -85,12 +85,16 @@ Environment(Handle global) } static bool -Print(JSContext *cx, unsigned argc, JS::Value *vp) +Print(JSContext *cx, + unsigned argc, + JS::Value *vp) { - JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + unsigned i, n; + JSString *str; - for (unsigned i = 0; i < args.length(); i++) { - JSString *str = JS::ToString(cx, args[i]); + JS::Value *argv = JS_ARGV(cx, vp); + for (i = n = 0; i < argc; i++) { + str = JS_ValueToString(cx, argv[i]); if (!str) return false; JSAutoByteString bytes(cx, str); @@ -99,8 +103,10 @@ Print(JSContext *cx, unsigned argc, JS::Value *vp) fprintf(stdout, "%s%s", i ? " " : "", bytes.ptr()); fflush(stdout); } - fputc('\n', stdout); - args.rval().setUndefined(); + n++; + if (n) + fputc('\n', stdout); + JS_SET_RVAL(cx, vp, JSVAL_VOID); return true; } @@ -119,14 +125,17 @@ GetLine(char *bufp, } static bool -Dump(JSContext *cx, unsigned argc, JS::Value *vp) +Dump(JSContext *cx, + unsigned argc, + JS::Value *vp) { - JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + JS_SET_RVAL(cx, vp, JSVAL_VOID); - if (!args.length()) + JSString *str; + if (!argc) return true; - JSString *str = JS::ToString(cx, args[0]); + str = JS_ValueToString(cx, JS_ARGV(cx, vp)[0]); if (!str) return false; JSAutoByteString bytes(cx, str); @@ -143,16 +152,18 @@ Load(JSContext *cx, unsigned argc, JS::Value *vp) { - JS::CallArgs args = JS::CallArgsFromVp(argc, vp); + JS::Rooted result(cx); JS::Rooted obj(cx, JS_THIS_OBJECT(cx, vp)); if (!obj) return false; - for (unsigned i = 0; i < args.length(); i++) { - JS::Rooted str(cx, JS::ToString(cx, args[i])); + JS::Value *argv = JS_ARGV(cx, vp); + for (unsigned i = 0; i < argc; i++) { + JSString *str = JS_ValueToString(cx, argv[i]); if (!str) return false; + argv[i] = STRING_TO_JSVAL(str); JSAutoByteString filename(cx, str); if (!filename) return false; @@ -172,12 +183,11 @@ Load(JSContext *cx, if (!script) return false; - JS::Rooted result(cx); if (!JS_ExecuteScript(cx, obj, script, result.address())) { return false; } } - args.rval().setUndefined(); + JS_SET_RVAL(cx, vp, JSVAL_VOID); return true; } @@ -381,9 +391,9 @@ XPCShellEnvironment::ProcessFile(JSContext *cx, ok = JS_ExecuteScript(cx, obj, script, result.address()); if (ok && result != JSVAL_VOID) { - /* Suppress error reports from JS::ToString(). */ + /* Suppress error reports from JS_ValueToString(). */ older = JS_SetErrorReporter(cx, nullptr); - str = JS::ToString(cx, result); + str = JS_ValueToString(cx, result); JSAutoByteString bytes; if (str) bytes.encodeLatin1(cx, str); @@ -599,7 +609,7 @@ XPCShellEnvironment::EvaluateString(const nsString& aString, bool ok = JS_ExecuteScript(cx, global, script, result.address()); if (ok && result != JSVAL_VOID) { JSErrorReporter old = JS_SetErrorReporter(cx, nullptr); - JSString* str = JS::ToString(cx, result); + JSString* str = JS_ValueToString(cx, result); nsDependentJSString depStr; if (str) depStr.init(cx, str); diff --git a/js/ipc/JavaScriptShared.cpp b/js/ipc/JavaScriptShared.cpp index 27681aafccbb..30ef3ee4ed04 100644 --- a/js/ipc/JavaScriptShared.cpp +++ b/js/ipc/JavaScriptShared.cpp @@ -129,7 +129,7 @@ JavaScriptShared::convertIdToGeckoString(JSContext *cx, JS::HandleId id, nsStrin if (!JS_IdToValue(cx, id, idval.address())) return false; - RootedString str(cx, ToString(cx, idval)); + RootedString str(cx, JS_ValueToString(cx, idval)); if (!str) return false; diff --git a/js/jsd/jsd_stak.cpp b/js/jsd/jsd_stak.cpp index b5f7e0efd62f..ad4089ffe94f 100644 --- a/js/jsd/jsd_stak.cpp +++ b/js/jsd/jsd_stak.cpp @@ -486,8 +486,7 @@ jsd_ValToStringInStackFrame(JSDContext* jsdc, JS_ASSERT(cx); exceptionState = JS_SaveExceptionState(cx); - JS::RootedValue v(cx, val); - retval = JS::ToString(cx, v); + retval = JS_ValueToString(cx, val); JS_RestoreExceptionState(cx, exceptionState); return retval; diff --git a/js/jsd/jsd_val.cpp b/js/jsd/jsd_val.cpp index 72ea42c71c45..01e09cf7b025 100644 --- a/js/jsd/jsd_val.cpp +++ b/js/jsd/jsd_val.cpp @@ -189,8 +189,7 @@ jsd_GetValueString(JSDContext* jsdc, JSDValue* jsdval) { JSAutoCompartment ac(cx, scopeObj); AutoSaveExceptionState as(cx); - JS::RootedValue v(cx, jsdval->val); - string = JS::ToString(cx, v); + string = JS_ValueToString(cx, jsdval->val); } JSAutoCompartment ac2(cx, jsdc->glob); diff --git a/js/src/builtin/TestingFunctions.cpp b/js/src/builtin/TestingFunctions.cpp index a07cd7562819..008cd821025f 100644 --- a/js/src/builtin/TestingFunctions.cpp +++ b/js/src/builtin/TestingFunctions.cpp @@ -273,7 +273,7 @@ GCParameter(JSContext *cx, unsigned argc, Value *vp) { CallArgs args = CallArgsFromVp(argc, vp); - JSString *str = ToString(cx, args.get(0)); + JSString *str = JS_ValueToString(cx, args.get(0)); if (!str) return false; @@ -350,13 +350,12 @@ IsProxy(JSContext *cx, unsigned argc, Value *vp) static bool InternalConst(JSContext *cx, unsigned argc, jsval *vp) { - CallArgs args = CallArgsFromVp(argc, vp); - if (args.length() == 0) { + if (argc != 1) { JS_ReportError(cx, "the function takes exactly one argument"); return false; } - JSString *str = ToString(cx, args[0]); + JSString *str = JS_ValueToString(cx, vp[2]); if (!str) return false; JSFlatString *flat = JS_FlattenString(cx, str); @@ -685,8 +684,6 @@ static const struct TraceKindPair { static bool CountHeap(JSContext *cx, unsigned argc, jsval *vp) { - CallArgs args = CallArgsFromVp(argc, vp); - jsval v; int32_t traceKind; JSString *str; @@ -695,8 +692,8 @@ CountHeap(JSContext *cx, unsigned argc, jsval *vp) size_t counter; RootedValue startValue(cx, UndefinedValue()); - if (args.length() > 0) { - v = args[0]; + if (argc > 0) { + v = JS_ARGV(cx, vp)[0]; if (JSVAL_IS_TRACEABLE(v)) { startValue = v; } else if (!JSVAL_IS_NULL(v)) { @@ -708,8 +705,8 @@ CountHeap(JSContext *cx, unsigned argc, jsval *vp) } traceKind = -1; - if (args.length() > 1) { - str = ToString(cx, args[0]); + if (argc > 1) { + str = JS_ValueToString(cx, JS_ARGV(cx, vp)[1]); if (!str) return false; JSFlatString *flatStr = JS_FlattenString(cx, str); diff --git a/js/src/builtin/TypeRepresentation.cpp b/js/src/builtin/TypeRepresentation.cpp index cfac977b8b93..81d9abe64115 100644 --- a/js/src/builtin/TypeRepresentation.cpp +++ b/js/src/builtin/TypeRepresentation.cpp @@ -517,7 +517,8 @@ ArrayTypeRepresentation::appendStringArray(JSContext *cx, StringBuffer &contents if (!contents.append(", ")) return false; - if (!NumberValueToStringBuffer(cx, NumberValue(length()), contents)) + Value len = NumberValue(length()); + if (!contents.append(JS_ValueToString(cx, len))) return false; if (!contents.append(")")) diff --git a/js/src/ctypes/CTypes.cpp b/js/src/ctypes/CTypes.cpp index fe9bdba78a08..ca4f05f52314 100644 --- a/js/src/ctypes/CTypes.cpp +++ b/js/src/ctypes/CTypes.cpp @@ -6792,7 +6792,7 @@ CDataFinalizer::Methods::ToString(JSContext *cx, unsigned argc, jsval *vp) } else if (!CDataFinalizer::GetValue(cx, objThis, value.address())) { MOZ_ASSUME_UNREACHABLE("Could not convert an empty CDataFinalizer"); } else { - strMessage = ToString(cx, value); + strMessage = JS_ValueToString(cx, value); if (!strMessage) { return false; } diff --git a/js/src/jsapi-tests/testOOM.cpp b/js/src/jsapi-tests/testOOM.cpp index 5ade048fa110..c0a1dea7fe82 100644 --- a/js/src/jsapi-tests/testOOM.cpp +++ b/js/src/jsapi-tests/testOOM.cpp @@ -8,8 +8,7 @@ BEGIN_TEST(testOOM) { - JS::RootedValue v(cx, JS::Int32Value(9)); - JS::RootedString jsstr(cx, JS::ToString(cx, v)); + JS::RootedString jsstr(cx, JS_ValueToString(cx, INT_TO_JSVAL(9))); mozilla::DebugOnly s = JS_GetStringCharsZ(cx, jsstr); JS_ASSERT(s[0] == '9' && s[1] == '\0'); return true; diff --git a/js/src/jsapi-tests/tests.h b/js/src/jsapi-tests/tests.h index 517e3603aae2..191e4facc5ce 100644 --- a/js/src/jsapi-tests/tests.h +++ b/js/src/jsapi-tests/tests.h @@ -210,7 +210,7 @@ class JSAPITest JS::RootedValue v(cx); JS_GetPendingException(cx, &v); JS_ClearPendingException(cx); - JSString *s = JS::ToString(cx, v); + JSString *s = JS_ValueToString(cx, v); if (s) { JSAutoByteString bytes(cx, s); if (!!bytes) @@ -237,10 +237,9 @@ class JSAPITest static bool print(JSContext *cx, unsigned argc, jsval *vp) { - JS::CallArgs args = JS::CallArgsFromVp(argc, vp); - - for (unsigned i = 0; i < args.length(); i++) { - JSString *str = JS::ToString(cx, args[i]); + jsval *argv = JS_ARGV(cx, vp); + for (unsigned i = 0; i < argc; i++) { + JSString *str = JS_ValueToString(cx, argv[i]); if (!str) return false; char *bytes = JS_EncodeString(cx, str); @@ -252,7 +251,7 @@ class JSAPITest putchar('\n'); fflush(stdout); - args.rval().setUndefined(); + JS_SET_RVAL(cx, vp, JSVAL_VOID); return true; } diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index fb3d972b3395..8fc806d824e0 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -406,6 +406,16 @@ JS_ValueToConstructor(JSContext *cx, HandleValue value) return ReportIfNotFunction(cx, value); } +JS_PUBLIC_API(JSString *) +JS_ValueToString(JSContext *cx, jsval valueArg) +{ + RootedValue value(cx, valueArg); + AssertHeapIsIdle(cx); + CHECK_REQUEST(cx); + assertSameCompartment(cx, value); + return ToString(cx, value); +} + JS_PUBLIC_API(JSString *) JS_ValueToSource(JSContext *cx, jsval valueArg) { diff --git a/js/src/jsapi.h b/js/src/jsapi.h index 0e54bab8d9ab..3d061f816dec 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -1042,6 +1042,9 @@ JS_ValueToFunction(JSContext *cx, JS::HandleValue v); extern JS_PUBLIC_API(JSFunction *) JS_ValueToConstructor(JSContext *cx, JS::HandleValue v); +extern JS_PUBLIC_API(JSString *) +JS_ValueToString(JSContext *cx, jsval v); + extern JS_PUBLIC_API(JSString *) JS_ValueToSource(JSContext *cx, jsval v); @@ -1057,12 +1060,6 @@ ToNumberSlow(JSContext *cx, JS::Value v, double *dp); */ extern JS_PUBLIC_API(bool) ToBooleanSlow(JS::HandleValue v); - -/* - * DO NOT CALL THIS. Use JS::ToString - */ -extern JS_PUBLIC_API(JSString*) -ToStringSlow(JSContext *cx, JS::HandleValue v); } /* namespace js */ namespace JS { @@ -1102,14 +1099,6 @@ ToBoolean(HandleValue v) return js::ToBooleanSlow(v); } -JS_ALWAYS_INLINE JSString* -ToString(JSContext *cx, HandleValue v) -{ - if (v.isString()) - return v.toString(); - return js::ToStringSlow(cx, v); -} - } /* namespace JS */ extern JS_PUBLIC_API(bool) diff --git a/js/src/jsstr.cpp b/js/src/jsstr.cpp index 898035495fba..695399ebc199 100644 --- a/js/src/jsstr.cpp +++ b/js/src/jsstr.cpp @@ -3989,12 +3989,6 @@ js::ToStringSlow(ExclusiveContext *cx, HandleValue arg); template JSString * js::ToStringSlow(ExclusiveContext *cx, Value arg); -JS_PUBLIC_API(JSString *) -js::ToStringSlow(JSContext *cx, HandleValue v) -{ - return ToStringSlow(cx, v); -} - JSString * js::ValueToSource(JSContext *cx, HandleValue v) { diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp index 104eeb048033..a76968824d73 100644 --- a/js/src/shell/js.cpp +++ b/js/src/shell/js.cpp @@ -207,6 +207,43 @@ extern JS_EXPORT_API(void) add_history(char *line); } // extern "C" #endif +static void +ReportException(JSContext *cx) +{ + if (JS_IsExceptionPending(cx)) { + if (!JS_ReportPendingException(cx)) + JS_ClearPendingException(cx); + } +} + +class ToStringHelper +{ + public: + ToStringHelper(JSContext *aCx, HandleValue v, bool aThrow = false) + : cx(aCx), mStr(cx, JS_ValueToString(cx, v)) + { + if (!aThrow && !mStr) + ReportException(cx); + } + ToStringHelper(JSContext *aCx, HandleId id, bool aThrow = false) + : cx(aCx), mStr(cx, JS_ValueToString(cx, IdToValue(id))) + { + if (!aThrow && !mStr) + ReportException(cx); + } + bool threw() { return !mStr; } + jsval getJSVal() { return STRING_TO_JSVAL(mStr); } + const char *getBytes() { + if (mStr && (mBytes.ptr() || mBytes.encodeLatin1(cx, mStr))) + return mBytes.ptr(); + return "(error converting value)"; + } + private: + JSContext *cx; + RootedString mStr; // Objects of this class are always stack-allocated. + JSAutoByteString mBytes; +}; + static char * GetLine(FILE *file, const char * prompt) { @@ -656,7 +693,7 @@ Options(JSContext *cx, unsigned argc, jsval *vp) JS::ContextOptions oldOptions = JS::ContextOptionsRef(cx); for (unsigned i = 0; i < args.length(); i++) { - JSString *str = JS::ToString(cx, args[i]); + JSString *str = JS_ValueToString(cx, args[i]); if (!str) return false; args[i].setString(str); @@ -731,7 +768,7 @@ LoadScript(JSContext *cx, unsigned argc, jsval *vp, bool scriptRelative) RootedString str(cx); for (unsigned i = 0; i < args.length(); i++) { - str = JS::ToString(cx, args[i]); + str = JS_ValueToString(cx, args[i]); if (!str) { JS_ReportErrorNumber(cx, my_GetErrorMessage, nullptr, JSSMSG_INVALID_ARGS, "load"); return false; @@ -897,7 +934,7 @@ Evaluate(JSContext *cx, unsigned argc, jsval *vp) if (v.isNull()) { fileName = nullptr; } else if (!v.isUndefined()) { - JSString *s = ToString(cx, v); + JSString *s = JS_ValueToString(cx, v); if (!s) return false; fileName = fileNameBytes.encodeLatin1(cx, s); @@ -913,7 +950,7 @@ Evaluate(JSContext *cx, unsigned argc, jsval *vp) if (!JS_GetProperty(cx, opts, "sourceURL", &v)) return false; if (!v.isUndefined()) { - sourceURL = ToString(cx, v); + sourceURL = JS_ValueToString(cx, v); if (!sourceURL) return false; } @@ -921,7 +958,7 @@ Evaluate(JSContext *cx, unsigned argc, jsval *vp) if (!JS_GetProperty(cx, opts, "sourceMapURL", &v)) return false; if (!v.isUndefined()) { - sourceMapURL = ToString(cx, v); + sourceMapURL = JS_ValueToString(cx, v); if (!sourceMapURL) return false; } @@ -963,7 +1000,7 @@ Evaluate(JSContext *cx, unsigned argc, jsval *vp) if (!JS_GetProperty(cx, opts, "sourcePolicy", &v)) return false; if (!v.isUndefined()) { - JSString *s = ToString(cx, v); + JSString *s = JS_ValueToString(cx, v); if (!s) return false; char *policy = JS_EncodeStringToUTF8(cx, s); @@ -1148,7 +1185,7 @@ Run(JSContext *cx, unsigned argc, jsval *vp) if (!thisobj) return false; - JSString *str = JS::ToString(cx, args[0]); + JSString *str = JS_ValueToString(cx, args[0]); if (!str) return false; args[0].setString(str); @@ -1271,7 +1308,7 @@ PutStr(JSContext *cx, unsigned argc, jsval *vp) CallArgs args = CallArgsFromVp(argc, vp); if (args.length() != 0) { - JSString *str = JS::ToString(cx, args[0]); + JSString *str = JS_ValueToString(cx, args[0]); if (!str) return false; char *bytes = JSStringToUTF8(cx, str); @@ -1299,7 +1336,7 @@ static bool PrintInternal(JSContext *cx, const CallArgs &args, FILE *file) { for (unsigned i = 0; i < args.length(); i++) { - JSString *str = JS::ToString(cx, args[i]); + JSString *str = JS_ValueToString(cx, args[i]); if (!str) return false; char *bytes = JSStringToUTF8(cx, str); @@ -1528,7 +1565,7 @@ Trap(JSContext *cx, unsigned argc, jsval *vp) return false; } argc = args.length() - 1; - RootedString str(cx, JS::ToString(cx, args[argc])); + RootedString str(cx, JS_ValueToString(cx, args[argc])); if (!str) return false; args[argc].setString(str); @@ -1573,7 +1610,7 @@ SetDebuggerHandler(JSContext *cx, unsigned argc, jsval *vp) return false; } - JSString *str = JS::ToString(cx, args[0]); + JSString *str = JS_ValueToString(cx, args[0]); if (!str) return false; @@ -1593,7 +1630,7 @@ SetThrowHook(JSContext *cx, unsigned argc, jsval *vp) return false; } - str = JS::ToString(cx, args[0]); + str = JS_ValueToString(cx, args[0]); if (!str) return false; @@ -1996,8 +2033,7 @@ DisassFile(JSContext *cx, unsigned argc, jsval *vp) if (!thisobj) return false; - // We should change DisassembleOptionParser to store CallArgs. - JSString *str = JS::ToString(cx, HandleValue::fromMarkedLocation(&p.argv[0])); + JSString *str = JS_ValueToString(cx, p.argv[0]); if (!str) return false; JSAutoByteString filename(cx, str); @@ -2134,7 +2170,7 @@ DumpHeap(JSContext *cx, unsigned argc, jsval *vp) JSAutoByteString fileName; if (args.hasDefined(0)) { - RootedString str(cx, JS::ToString(cx, args[0])); + RootedString str(cx, JS_ValueToString(cx, args[0])); if (!str) return false; @@ -2233,7 +2269,7 @@ static bool Intern(JSContext *cx, unsigned argc, jsval *vp) { CallArgs args = CallArgsFromVp(argc, vp); - JSString *str = JS::ToString(cx, args.get(0)); + JSString *str = JS_ValueToString(cx, args.length() == 0 ? UndefinedValue() : args[0]); if (!str) return false; @@ -3377,7 +3413,7 @@ ReadFile(JSContext *cx, unsigned argc, jsval *vp, bool scriptRelative) return false; if (args.length() > 1) { - JSString *opt = JS::ToString(cx, args[1]); + JSString *opt = JS_ValueToString(cx, args[1]); if (!opt) return false; bool match; @@ -3459,24 +3495,24 @@ RedirectOutput(JSContext *cx, unsigned argc, jsval *vp) static bool System(JSContext *cx, unsigned argc, jsval *vp) { - CallArgs args = CallArgsFromVp(argc, vp); + JSString *str; - if (args.length() == 0) { + if (argc != 1) { JS_ReportErrorNumber(cx, my_GetErrorMessage, nullptr, JSSMSG_INVALID_ARGS, "system"); return false; } - JSString *str = JS::ToString(cx, args[0]); + str = JS_ValueToString(cx, JS_ARGV(cx, vp)[0]); if (!str) return false; - JSAutoByteString command(cx, str); if (!command) return false; int result = system(command.ptr()); - args.rval().setInt32(result); + + JS_SET_RVAL(cx, vp, Int32Value(result)); return true; } @@ -3596,7 +3632,7 @@ NestedShell(JSContext *cx, unsigned argc, jsval *vp) // The arguments to nestedShell are stringified and append to argv. RootedString str(cx); for (unsigned i = 0; i < args.length(); i++) { - str = ToString(cx, args[i]); + str = JS_ValueToString(cx, args[i]); if (!str || !argv.append(JS_EncodeString(cx, str))) return false; @@ -3893,7 +3929,7 @@ class ShellSourceHook: public SourceHook { 1, filenameValue.address(), &result)) return false; - str = JS::ToString(cx, result); + str = JS_ValueToString(cx, result); if (!str) return false; @@ -4464,8 +4500,6 @@ my_ErrorReporter(JSContext *cx, const char *message, JSErrorReport *report) static bool Exec(JSContext *cx, unsigned argc, jsval *vp) { - CallArgs args = CallArgsFromVp(argc, vp); - JSFunction *fun; const char *name, **nargv; unsigned i, nargc; @@ -4493,7 +4527,7 @@ Exec(JSContext *cx, unsigned argc, jsval *vp) nargv[0] = name; jsval *argv = JS_ARGV(cx, vp); for (i = 0; i < nargc; i++) { - str = (i == 0) ? fun->atom : JS::ToString(cx, args[i-1]); + str = (i == 0) ? fun->atom : JS_ValueToString(cx, argv[i-1]); if (!str) { ok = false; goto done; @@ -4620,21 +4654,15 @@ env_setProperty(JSContext *cx, HandleObject obj, HandleId id, bool strict, Mutab #if !defined XP_OS2 && !defined SOLARIS int rv; - RootedValue idvalue(cx, IdToValue(id)); - JSAutoByteString idstr; - if (!idstr.encodeLatin1(cx, idvalue.toString())) + ToStringHelper idstr(cx, id, true); + if (idstr.threw()) return false; - - RootedString value(cx, ToString(cx, vp)); - if (!value) + ToStringHelper valstr(cx, vp, true); + if (valstr.threw()) return false; - JSAutoByteString valstr; - if (!valstr.encodeLatin1(cx, value)) - return false; - #if defined XP_WIN || defined HPUX || defined OSF1 { - char *waste = JS_smprintf("%s=%s", idstr.ptr(), valstr.ptr()); + char *waste = JS_smprintf("%s=%s", idstr.getBytes(), valstr.getBytes()); if (!waste) { JS_ReportOutOfMemory(cx); return false; @@ -4652,13 +4680,13 @@ env_setProperty(JSContext *cx, HandleObject obj, HandleId id, bool strict, Mutab #endif } #else - rv = setenv(idstr.ptr(), valstr.ptr(), 1); + rv = setenv(idstr.getBytes(), valstr.getBytes(), 1); #endif if (rv < 0) { - JS_ReportError(cx, "can't set env variable %s to %s", idstr.ptr(), valstr.ptr()); + JS_ReportError(cx, "can't set env variable %s to %s", idstr.getBytes(), valstr.getBytes()); return false; } - vp.set(StringValue(value)); + vp.set(valstr.getJSVal()); #endif /* !defined XP_OS2 && !defined SOLARIS */ return true; } @@ -4695,15 +4723,17 @@ static bool env_resolve(JSContext *cx, HandleObject obj, HandleId id, unsigned flags, MutableHandleObject objp) { - RootedValue idvalue(cx, IdToValue(id)); - JSAutoByteString idstr; - if (!idstr.encodeLatin1(cx, idvalue.toString())) + JSString *valstr; + const char *name, *value; + + ToStringHelper idstr(cx, id, true); + if (idstr.threw()) return false; - const char *name = idstr.ptr(); - const char *value = getenv(name); + name = idstr.getBytes(); + value = getenv(name); if (value) { - RootedString valstr(cx, JS_NewStringCopyZ(cx, value)); + valstr = JS_NewStringCopyZ(cx, value); if (!valstr) return false; if (!JS_DefineProperty(cx, obj, name, STRING_TO_JSVAL(valstr), diff --git a/js/src/vm/Debugger.cpp b/js/src/vm/Debugger.cpp index ebcddb734d23..65e2c5cc2e92 100644 --- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -4337,7 +4337,7 @@ DebuggerGenericEval(JSContext *cx, const char *fullMethodName, const Value &code if (!JS_GetProperty(cx, opts, "url", &v)) return false; if (!v.isUndefined()) { - RootedString url_str(cx, ToString(cx, v)); + RootedString url_str(cx, JS_ValueToString(cx, v)); if (!url_str) return false; url = JS_EncodeString(cx, url_str); diff --git a/js/xpconnect/loader/mozJSComponentLoader.cpp b/js/xpconnect/loader/mozJSComponentLoader.cpp index 16da70c20a0a..5c42d9986908 100644 --- a/js/xpconnect/loader/mozJSComponentLoader.cpp +++ b/js/xpconnect/loader/mozJSComponentLoader.cpp @@ -106,14 +106,13 @@ static PRLogModuleInfo *gJSCLLog; #define ERROR_SETTING_SYMBOL "%s - Could not set symbol '%s' on target object." static bool -Dump(JSContext *cx, unsigned argc, Value *vp) +Dump(JSContext *cx, unsigned argc, jsval *vp) { - CallArgs args = CallArgsFromVp(argc, vp); - - if (args.length() == 0) + JSString *str; + if (!argc) return true; - JSString *str = JS::ToString(cx, args[0]); + str = JS_ValueToString(cx, JS_ARGV(cx, vp)[0]); if (!str) return false; diff --git a/js/xpconnect/src/Sandbox.cpp b/js/xpconnect/src/Sandbox.cpp index f6227c8f99a7..e39a003768b5 100644 --- a/js/xpconnect/src/Sandbox.cpp +++ b/js/xpconnect/src/Sandbox.cpp @@ -80,12 +80,11 @@ xpc::NewSandboxConstructor() static bool SandboxDump(JSContext *cx, unsigned argc, jsval *vp) { - CallArgs args = CallArgsFromVp(argc, vp); - - if (args.length() == 0) + JSString *str; + if (!argc) return true; - RootedString str(cx, ToString(cx, args[0])); + str = JS_ValueToString(cx, JS_ARGV(cx, vp)[0]); if (!str) return false; @@ -112,7 +111,7 @@ SandboxDump(JSContext *cx, unsigned argc, jsval *vp) fputs(cstr, stdout); fflush(stdout); NS_Free(cstr); - args.rval().setBoolean(true); + JS_SET_RVAL(cx, vp, JSVAL_TRUE); return true; } @@ -139,7 +138,7 @@ SandboxImport(JSContext *cx, unsigned argc, Value *vp) RootedString funname(cx); if (args.length() > 1) { // Use the second parameter as the function name. - funname = ToString(cx, args[1]); + funname = JS_ValueToString(cx, args[1]); if (!funname) return false; } else { @@ -1641,7 +1640,7 @@ xpc::EvalInSandbox(JSContext *cx, HandleObject sandboxArg, const nsAString& sour PromiseFlatString(source).get(), source.Length(), v.address()); if (ok && returnStringOnly && !v.isUndefined()) { - JSString *str = ToString(sandcx, v); + JSString *str = JS_ValueToString(sandcx, v); ok = !!str; v = ok ? JS::StringValue(str) : JS::UndefinedValue(); } @@ -1653,7 +1652,7 @@ xpc::EvalInSandbox(JSContext *cx, HandleObject sandboxArg, const nsAString& sour if (returnStringOnly) { // The caller asked for strings only, convert the // exception into a string. - JSString *str = ToString(sandcx, exn); + JSString *str = JS_ValueToString(sandcx, exn); exn = str ? JS::StringValue(str) : JS::UndefinedValue(); } } diff --git a/js/xpconnect/src/XPCComponents.cpp b/js/xpconnect/src/XPCComponents.cpp index 16f0aaf52bcb..79431e6754fc 100644 --- a/js/xpconnect/src/XPCComponents.cpp +++ b/js/xpconnect/src/XPCComponents.cpp @@ -1576,7 +1576,7 @@ nsXPCComponents_ID::CallOrConstruct(nsIXPConnectWrappedNative *wrapper, JSAutoByteString bytes; nsID id; - if (!(jsstr = ToString(cx, args[0])) || + if (!(jsstr = JS_ValueToString(cx, args[0])) || !bytes.encodeLatin1(cx, jsstr) || !id.Parse(bytes.ptr())) { return ThrowAndFail(NS_ERROR_XPC_BAD_ID_STRING, cx, _retval); @@ -1837,7 +1837,7 @@ struct MOZ_STACK_CLASS ExceptionArgParser */ bool parseMessage(HandleValue v) { - JSString *str = ToString(cx, v); + JSString *str = JS_ValueToString(cx, v); if (!str) return false; eMsg = messageBytes.encodeLatin1(cx, str); @@ -2450,7 +2450,7 @@ nsXPCComponents_Constructor::CallOrConstruct(nsIXPConnectWrappedNative *wrapper, if (args.length() >= 3) { // args[2] is an initializer function or property name - RootedString str(cx, ToString(cx, args[2])); + RootedString str(cx, JS_ValueToString(cx, args[2])); if (!str || !(cInitializer = cInitializerBytes.encodeLatin1(cx, str))) return ThrowAndFail(NS_ERROR_XPC_BAD_CONVERT_JS, cx, _retval); } @@ -2476,7 +2476,7 @@ nsXPCComponents_Constructor::CallOrConstruct(nsIXPConnectWrappedNative *wrapper, return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval); } - RootedString str(cx, ToString(cx, args[1])); + RootedString str(cx, JS_ValueToString(cx, args[1])); RootedId id(cx); if (!str || !JS_ValueToId(cx, StringValue(str), id.address())) return ThrowAndFail(NS_ERROR_XPC_BAD_CONVERT_JS, cx, _retval); @@ -2525,7 +2525,7 @@ nsXPCComponents_Constructor::CallOrConstruct(nsIXPConnectWrappedNative *wrapper, return ThrowAndFail(NS_ERROR_XPC_UNEXPECTED, cx, _retval); } - RootedString str(cx, ToString(cx, args[0])); + RootedString str(cx, JS_ValueToString(cx, args[0])); RootedId id(cx); if (!str || !JS_ValueToId(cx, StringValue(str), id.address())) return ThrowAndFail(NS_ERROR_XPC_BAD_CONVERT_JS, cx, _retval); @@ -2665,7 +2665,7 @@ nsXPCComponents_Utils::ReportError(const Value &errorArg, JSContext *cx) } // It's not a JS Error object, so we synthesize as best we're able. - RootedString msgstr(cx, ToString(cx, error)); + RootedString msgstr(cx, JS_ValueToString(cx, error)); if (!msgstr) return NS_OK; @@ -2698,7 +2698,7 @@ nsXPCComponents_Utils::ReportError(const Value &errorArg, JSContext *cx) NS_IMETHODIMP nsXPCComponents_Utils::EvalInSandbox(const nsAString& source, const Value& sandboxValArg, - const Value& versionArg, + const Value& version, const Value& filenameVal, int32_t lineNumber, JSContext *cx, @@ -2706,7 +2706,6 @@ nsXPCComponents_Utils::EvalInSandbox(const nsAString& source, Value *retval) { RootedValue sandboxVal(cx, sandboxValArg); - RootedValue version(cx, versionArg); RootedObject sandbox(cx); if (!JS_ValueToObject(cx, sandboxVal, &sandbox) || !sandbox) return NS_ERROR_INVALID_ARG; @@ -2714,7 +2713,7 @@ nsXPCComponents_Utils::EvalInSandbox(const nsAString& source, // Optional third argument: JS version, as a string. JSVersion jsVersion = JSVERSION_DEFAULT; if (optionalArgc >= 1) { - JSString *jsVersionStr = ToString(cx, version); + JSString *jsVersionStr = JS_ValueToString(cx, version); if (!jsVersionStr) return NS_ERROR_INVALID_ARG; @@ -2738,8 +2737,7 @@ nsXPCComponents_Utils::EvalInSandbox(const nsAString& source, nsXPIDLCString filename; int32_t lineNo = (optionalArgc >= 3) ? lineNumber : 1; if (optionalArgc >= 2) { - RootedValue value(cx, filenameVal); - JSString *filenameStr = ToString(cx, value); + JSString *filenameStr = JS_ValueToString(cx, filenameVal); if (!filenameStr) return NS_ERROR_INVALID_ARG; diff --git a/js/xpconnect/src/XPCConvert.cpp b/js/xpconnect/src/XPCConvert.cpp index 755fe87f934b..8040790b58c4 100644 --- a/js/xpconnect/src/XPCConvert.cpp +++ b/js/xpconnect/src/XPCConvert.cpp @@ -194,15 +194,18 @@ XPCConvert::NativeData2JS(MutableHandleValue d, const void* s, if (!p->IsVoid()) { nsStringBuffer* buf; - if (!XPCStringConvert::ReadableToJSVal(cx, *p, &buf, d)) + jsval str = XPCStringConvert::ReadableToJSVal(cx, *p, &buf); + if (JSVAL_IS_NULL(str)) return false; if (buf) buf->AddRef(); + + d.set(str); } // *d is defaulted to JSVAL_NULL so no need to set it // again if p is a "void" string - MOZ_ASSERT_IF(p->IsVoid(), d.isNull()); + break; } @@ -410,7 +413,7 @@ XPCConvert::JSData2Native(void* d, HandleValue s, return ConvertToPrimitive(cx, s, static_cast(d)); case nsXPTType::T_CHAR : { - JSString* str = ToString(cx, s); + JSString* str = JS_ValueToString(cx, s); if (!str) { return false; } @@ -429,7 +432,7 @@ XPCConvert::JSData2Native(void* d, HandleValue s, case nsXPTType::T_WCHAR : { JSString* str; - if (!(str = ToString(cx, s))) { + if (!(str = JS_ValueToString(cx, s))) { return false; } size_t length; @@ -495,7 +498,7 @@ XPCConvert::JSData2Native(void* d, HandleValue s, length = 0; } } else if (!JSVAL_IS_NULL(s)) { - str = ToString(cx, s); + str = JS_ValueToString(cx, s); if (!str) return false; @@ -559,7 +562,7 @@ XPCConvert::JSData2Native(void* d, HandleValue s, return true; } - JSString* str = ToString(cx, s); + JSString* str = JS_ValueToString(cx, s); if (!str) { return false; } @@ -600,7 +603,7 @@ XPCConvert::JSData2Native(void* d, HandleValue s, return true; } - if (!(str = ToString(cx, s))) { + if (!(str = JS_ValueToString(cx, s))) { return false; } if (!(chars = JS_GetStringCharsZ(cx, str))) { @@ -643,7 +646,7 @@ XPCConvert::JSData2Native(void* d, HandleValue s, // The JS val is neither null nor void... - if (!(str = ToString(cx, s))|| + if (!(str = JS_ValueToString(cx, s))|| !(chars = JS_GetStringCharsZ(cx, str))) { return false; } @@ -686,7 +689,7 @@ XPCConvert::JSData2Native(void* d, HandleValue s, } // The JS val is neither null nor void... - JSString* str = ToString(cx, s); + JSString* str = JS_ValueToString(cx, s); if (!str) { return false; } @@ -1164,7 +1167,7 @@ XPCConvert::JSValToXPCException(MutableHandleValue s, if (nullptr != (report = JS_ErrorFromException(cx, s))) { JSAutoByteString message; JSString* str; - if (nullptr != (str = ToString(cx, s))) + if (nullptr != (str = JS_ValueToString(cx, s))) message.encodeLatin1(cx, str); return JSErrorToXPCException(message.ptr(), ifaceName, methodName, report, exceptn); @@ -1201,7 +1204,7 @@ XPCConvert::JSValToXPCException(MutableHandleValue s, // otherwise we'll just try to convert it to a string - JSString* str = ToString(cx, s); + JSString* str = JS_ValueToString(cx, s); if (!str) return NS_ERROR_FAILURE; @@ -1272,7 +1275,7 @@ XPCConvert::JSValToXPCException(MutableHandleValue s, // otherwise we'll just try to convert it to a string // Note: e.g., bools get converted to JSStrings by this code. - JSString* str = ToString(cx, s); + JSString* str = JS_ValueToString(cx, s); if (str) { JSAutoByteString strBytes(cx, str); if (!!strBytes) { @@ -1793,7 +1796,7 @@ XPCConvert::JSStringWithSize2Native(void* d, HandleValue s, return true; } - JSString* str = ToString(cx, s); + JSString* str = JS_ValueToString(cx, s); if (!str) { return false; } @@ -1848,7 +1851,7 @@ XPCConvert::JSStringWithSize2Native(void* d, HandleValue s, return true; } - if (!(str = ToString(cx, s))) { + if (!(str = JS_ValueToString(cx, s))) { return false; } diff --git a/js/xpconnect/src/XPCDebug.cpp b/js/xpconnect/src/XPCDebug.cpp index 92b7262b2bce..85b071ca952f 100644 --- a/js/xpconnect/src/XPCDebug.cpp +++ b/js/xpconnect/src/XPCDebug.cpp @@ -106,7 +106,7 @@ xpc_DumpEvalInJSStackFrame(JSContext* cx, uint32_t frameno, const char* text) JSString* str; JSAutoByteString bytes; if (frame.evaluateInStackFrame(cx, text, strlen(text), "eval", 1, &rval) && - nullptr != (str = ToString(cx, rval)) && + nullptr != (str = JS_ValueToString(cx, rval)) && bytes.encodeLatin1(cx, str)) { DebugDump("%s\n", bytes.ptr()); } else diff --git a/js/xpconnect/src/XPCQuickStubs.cpp b/js/xpconnect/src/XPCQuickStubs.cpp index 031fb155bb5c..ccb6e1d630e1 100644 --- a/js/xpconnect/src/XPCQuickStubs.cpp +++ b/js/xpconnect/src/XPCQuickStubs.cpp @@ -748,28 +748,56 @@ xpc_qsUnwrapArgImpl(JSContext *cx, } bool -xpc_qsJsvalToCharStr(JSContext *cx, HandleValue v, JSAutoByteString *bytes) +xpc_qsJsvalToCharStr(JSContext *cx, jsval v, JSAutoByteString *bytes) { + JSString *str; + MOZ_ASSERT(!bytes->ptr()); - - if (v.isNullOrUndefined()) - return true; - - JSString *str = ToString(cx, v); - if (!str) - return false; + if (JSVAL_IS_STRING(v)) { + str = JSVAL_TO_STRING(v); + } else if (JSVAL_IS_VOID(v) || JSVAL_IS_NULL(v)) { + return true; + } else { + if (!(str = JS_ValueToString(cx, v))) + return false; + } return !!bytes->encodeLatin1(cx, str); } +bool +xpc_qsJsvalToWcharStr(JSContext *cx, jsval v, jsval *pval, const PRUnichar **pstr) +{ + JSString *str; + + if (JSVAL_IS_STRING(v)) { + str = JSVAL_TO_STRING(v); + } else if (JSVAL_IS_VOID(v) || JSVAL_IS_NULL(v)) { + *pstr = nullptr; + return true; + } else { + if (!(str = JS_ValueToString(cx, v))) + return false; + *pval = STRING_TO_JSVAL(str); // Root the new string. + } + + const jschar *chars = JS_GetStringCharsZ(cx, str); + if (!chars) + return false; + + *pstr = static_cast(chars); + return true; +} + namespace xpc { bool NonVoidStringToJsval(JSContext *cx, nsAString &str, MutableHandleValue rval) { nsStringBuffer* sharedBuffer; - if (!XPCStringConvert::ReadableToJSVal(cx, str, &sharedBuffer, rval)) - return false; - + jsval jsstr = XPCStringConvert::ReadableToJSVal(cx, str, &sharedBuffer); + if (JSVAL_IS_NULL(jsstr)) + return false; + rval.set(jsstr); if (sharedBuffer) { // The string was shared but ReadableToJSVal didn't addref it. // Move the ownership from str to jsstr. diff --git a/js/xpconnect/src/XPCQuickStubs.h b/js/xpconnect/src/XPCQuickStubs.h index 92f0e07494ad..6f1d635ad575 100644 --- a/js/xpconnect/src/XPCQuickStubs.h +++ b/js/xpconnect/src/XPCQuickStubs.h @@ -227,7 +227,7 @@ protected: * when |v| is JSVAL_IS_NULL and JSVAL_IS_VOID respectively. */ template - JSString* InitOrStringify(JSContext* cx, JS::HandleValue v, + JSString* InitOrStringify(JSContext* cx, jsval v, JS::MutableHandleValue pval, bool notpassed, StringificationBehavior nullBehavior, @@ -255,7 +255,7 @@ protected: return nullptr; } - s = JS::ToString(cx, v); + s = JS_ValueToString(cx, v); if (!s) { mValid = false; return nullptr; diff --git a/js/xpconnect/src/XPCShellImpl.cpp b/js/xpconnect/src/XPCShellImpl.cpp index 6887a536ddff..6362cd5ff803 100644 --- a/js/xpconnect/src/XPCShellImpl.cpp +++ b/js/xpconnect/src/XPCShellImpl.cpp @@ -211,20 +211,18 @@ GetLine(JSContext *cx, char *bufp, FILE *file, const char *prompt) { static bool ReadLine(JSContext *cx, unsigned argc, jsval *vp) { - CallArgs args = CallArgsFromVp(argc, vp); - // While 4096 might be quite arbitrary, this is something to be fixed in // bug 105707. It is also the same limit as in ProcessFile. char buf[4096]; - RootedString str(cx); + JSString *str; /* If a prompt was specified, construct the string */ - if (args.length() > 0) { - str = JS::ToString(cx, args[0]); + if (argc > 0) { + str = JS_ValueToString(cx, JS_ARGV(cx, vp)[0]); if (!str) return false; } else { - str = JS_GetEmptyString(JS_GetRuntime(cx)); + str = JSVAL_TO_STRING(JS_GetEmptyStringValue(cx)); } /* Get a line from the infile */ @@ -255,11 +253,12 @@ ReadLine(JSContext *cx, unsigned argc, jsval *vp) static bool Print(JSContext *cx, unsigned argc, jsval *vp) { - CallArgs args = CallArgsFromVp(argc, vp); + unsigned i, n; + JSString *str; - RootedString str(cx); - for (unsigned i = 0; i < args.length(); i++) { - str = ToString(cx, args[i]); + jsval *argv = JS_ARGV(cx, vp); + for (i = n = 0; i < argc; i++) { + str = JS_ValueToString(cx, argv[i]); if (!str) return false; JSAutoByteString strBytes(cx, str); @@ -268,22 +267,23 @@ Print(JSContext *cx, unsigned argc, jsval *vp) fprintf(gOutFile, "%s%s", i ? " " : "", strBytes.ptr()); fflush(gOutFile); } - fputc('\n', gOutFile); - args.rval().setUndefined(); + n++; + if (n) + fputc('\n', gOutFile); + JS_SET_RVAL(cx, vp, JSVAL_VOID); return true; } static bool Dump(JSContext *cx, unsigned argc, jsval *vp) { - CallArgs args = CallArgsFromVp(argc, vp); + JS_SET_RVAL(cx, vp, JSVAL_VOID); - args.rval().setUndefined(); + JSString *str; + if (!argc) + return true; - if (!args.length()) - return true; - - RootedString str(cx, ToString(cx, args[0])); + str = JS_ValueToString(cx, JS_ARGV(cx, vp)[0]); if (!str) return false; @@ -302,17 +302,16 @@ Dump(JSContext *cx, unsigned argc, jsval *vp) static bool Load(JSContext *cx, unsigned argc, jsval *vp) { - CallArgs args = CallArgsFromVp(argc, vp); - JS::Rooted obj(cx, JS_THIS_OBJECT(cx, vp)); if (!obj) return false; - RootedString str(cx); - for (unsigned i = 0; i < args.length(); i++) { - str = ToString(cx, args[i]); + jsval *argv = JS_ARGV(cx, vp); + for (unsigned i = 0; i < argc; i++) { + JSString *str = JS_ValueToString(cx, argv[i]); if (!str) return false; + argv[i] = STRING_TO_JSVAL(str); JSAutoByteString filename(cx, str); if (!filename) return false; @@ -336,7 +335,7 @@ Load(JSContext *cx, unsigned argc, jsval *vp) if (!compileOnly && !JS_ExecuteScript(cx, obj, script, result.address())) return false; } - args.rval().setUndefined(); + JS_SET_RVAL(cx, vp, JSVAL_VOID); return true; } @@ -431,32 +430,33 @@ GCZeal(JSContext *cx, unsigned argc, jsval *vp) #endif static bool -SendCommand(JSContext *cx, unsigned argc, Value *vp) +SendCommand(JSContext* cx, + unsigned argc, + jsval* vp) { - CallArgs args = CallArgsFromVp(argc, vp); - - if (args.length() == 0) { + if (argc == 0) { JS_ReportError(cx, "Function takes at least one argument!"); return false; } - JSString* str = ToString(cx, args[0]); + jsval *argv = JS_ARGV(cx, vp); + JSString* str = JS_ValueToString(cx, argv[0]); if (!str) { JS_ReportError(cx, "Could not convert argument 1 to string!"); return false; } - if (args.length() > 1 && JS_TypeOfValue(cx, args[1]) != JSTYPE_FUNCTION) { + if (argc > 1 && JS_TypeOfValue(cx, argv[1]) != JSTYPE_FUNCTION) { JS_ReportError(cx, "Could not convert argument 2 to function!"); return false; } - if (!XRE_SendTestShellCommand(cx, str, args.length() > 1 ? args[1].address() : nullptr)) { + if (!XRE_SendTestShellCommand(cx, str, argc > 1 ? &argv[1] : nullptr)) { JS_ReportError(cx, "Couldn't send command!"); return false; } - args.rval().setUndefined(); + JS_SET_RVAL(cx, vp, JSVAL_VOID); return true; } @@ -467,7 +467,7 @@ Options(JSContext *cx, unsigned argc, jsval *vp) ContextOptions oldOptions = ContextOptionsRef(cx); for (unsigned i = 0; i < argc; ++i) { - JSString *str = ToString(cx, args[i]); + JSString *str = JS_ValueToString(cx, args[i]); if (!str) return false; @@ -731,12 +731,12 @@ env_setProperty(JSContext *cx, HandleObject obj, HandleId id, bool strict, Mutab JS::Rooted idstr(cx); int rv; - RootedValue idval(cx); - if (!JS_IdToValue(cx, id, idval.address())) + jsval idval; + if (!JS_IdToValue(cx, id, &idval)) return false; - idstr = ToString(cx, idval); - valstr = ToString(cx, vp); + idstr = JS_ValueToString(cx, idval); + valstr = JS_ValueToString(cx, vp); if (!idstr || !valstr) return false; JSAutoByteString name(cx, idstr); @@ -814,11 +814,11 @@ env_resolve(JSContext *cx, HandleObject obj, HandleId id, unsigned flags, { JSString *idstr, *valstr; - RootedValue idval(cx); - if (!JS_IdToValue(cx, id, idval.address())) + jsval idval; + if (!JS_IdToValue(cx, id, &idval)) return false; - idstr = ToString(cx, idval); + idstr = JS_ValueToString(cx, idval); if (!idstr) return false; JSAutoByteString name(cx, idstr); @@ -954,9 +954,9 @@ ProcessFile(JSContext *cx, JS::Handle obj, const char *filename, FILE if (!compileOnly) { ok = JS_ExecuteScript(cx, obj, script, result.address()); if (ok && result != JSVAL_VOID) { - /* Suppress error reports from JS::ToString(). */ + /* Suppress error reports from JS_ValueToString(). */ older = JS_SetErrorReporter(cx, nullptr); - str = ToString(cx, result); + str = JS_ValueToString(cx, result); JS_SetErrorReporter(cx, older); JSAutoByteString bytes; if (str && bytes.encodeLatin1(cx, str)) diff --git a/js/xpconnect/src/XPCString.cpp b/js/xpconnect/src/XPCString.cpp index 9a5017e8895d..2e21f7aadeaa 100644 --- a/js/xpconnect/src/XPCString.cpp +++ b/js/xpconnect/src/XPCString.cpp @@ -24,7 +24,6 @@ #include "jsapi.h" #include "xpcpublic.h" -using namespace JS; // static void @@ -60,34 +59,35 @@ const JSStringFinalizer XPCStringConvert::sDOMStringFinalizer = // convert a readable to a JSString, copying string data // static -bool +jsval XPCStringConvert::ReadableToJSVal(JSContext *cx, const nsAString &readable, - nsStringBuffer** sharedBuffer, - MutableHandleValue vp) + nsStringBuffer** sharedBuffer) { + JSString *str; *sharedBuffer = nullptr; uint32_t length = readable.Length(); - if (length == 0) { - vp.set(JS_GetEmptyStringValue(cx)); - return true; - } + + if (length == 0) + return JS_GetEmptyStringValue(cx); nsStringBuffer *buf = nsStringBuffer::FromString(readable); if (buf) { + JS::RootedValue val(cx); bool shared; - if (!StringBufferToJSVal(cx, buf, length, vp, &shared)) - return false; - if (shared) + bool ok = StringBufferToJSVal(cx, buf, length, &val, &shared); + if (!ok) { + return JS::NullValue(); + } + + if (shared) { *sharedBuffer = buf; - return true; + } + return val; } // blech, have to copy. - JSString *str = JS_NewUCStringCopyN(cx, readable.BeginReading(), length); - if (!str) - return false; - vp.setString(str); - return true; + str = JS_NewUCStringCopyN(cx, readable.BeginReading(), length); + return str ? JS::StringValue(str) : JS::NullValue(); } diff --git a/js/xpconnect/src/XPCWrappedJSClass.cpp b/js/xpconnect/src/XPCWrappedJSClass.cpp index 682f1029b78f..ff836aeb0447 100644 --- a/js/xpconnect/src/XPCWrappedJSClass.cpp +++ b/js/xpconnect/src/XPCWrappedJSClass.cpp @@ -326,6 +326,9 @@ nsXPCWrappedJSClass::GetNamedPropertyAsVariant(XPCCallContext& ccx, { JSContext* cx = ccx.GetJSContext(); RootedObject aJSObj(cx, aJSObjArg); + bool ok; + RootedId id(cx); + nsresult rv = NS_ERROR_FAILURE; AutoScriptEvaluate scriptEval(cx); if (!scriptEval.StartEvaluating(aJSObj)) @@ -334,21 +337,16 @@ nsXPCWrappedJSClass::GetNamedPropertyAsVariant(XPCCallContext& ccx, // Wrap the string in a jsval after the AutoScriptEvaluate, so that the // resulting value ends up in the correct compartment. nsStringBuffer* buf; - RootedValue value(cx); - if (!XPCStringConvert::ReadableToJSVal(ccx, aName, &buf, &value)) + jsval jsstr = XPCStringConvert::ReadableToJSVal(ccx, aName, &buf); + if (JSVAL_IS_NULL(jsstr)) return NS_ERROR_OUT_OF_MEMORY; if (buf) buf->AddRef(); - RootedId id(cx); - nsresult rv = NS_OK; - if (!JS_ValueToId(cx, value, id.address()) || - !GetNamedPropertyAsVariantRaw(ccx, aJSObj, id, aResult, &rv)) { - if (NS_FAILED(rv)) - return rv; - return NS_ERROR_FAILURE; - } - return NS_OK; + ok = JS_ValueToId(cx, jsstr, id.address()) && + GetNamedPropertyAsVariantRaw(ccx, aJSObj, id, aResult, &rv); + + return ok ? NS_OK : NS_FAILED(rv) ? rv : NS_ERROR_FAILURE; } /***************************************************************************/ @@ -388,7 +386,7 @@ nsXPCWrappedJSClass::BuildPropertyEnumerator(XPCCallContext& ccx, if (!JS_IdToValue(cx, idName, jsvalName.address())) return NS_ERROR_FAILURE; - JSString* name = ToString(cx, jsvalName); + JSString* name = JS_ValueToString(cx, jsvalName); if (!name) return NS_ERROR_FAILURE; diff --git a/js/xpconnect/src/qsgen.py b/js/xpconnect/src/qsgen.py index 7a7e3a456415..04be318801ec 100644 --- a/js/xpconnect/src/qsgen.py +++ b/js/xpconnect/src/qsgen.py @@ -454,6 +454,11 @@ argumentUnboxingTemplates = { " return false;\n" " char *${name} = ${name}_bytes.ptr();\n", + 'wstring': + " const PRUnichar *${name};\n" + " if (!xpc_qsJsvalToWcharStr(cx, ${argVal}, ${argPtr}, &${name}))\n" + " return false;\n", + '[cstring]': " xpc_qsACString ${name}(cx, ${argVal}, ${argPtr}, ${notPassed});\n" " if (!${name}.IsValid())\n" diff --git a/js/xpconnect/src/xpcpublic.h b/js/xpconnect/src/xpcpublic.h index 5b279f05976b..f631994d7c73 100644 --- a/js/xpconnect/src/xpcpublic.h +++ b/js/xpconnect/src/xpcpublic.h @@ -198,9 +198,8 @@ public: // If the string shares the readable's buffer, that buffer will // get assigned to *sharedBuffer. Otherwise null will be // assigned. - static bool ReadableToJSVal(JSContext *cx, const nsAString &readable, - nsStringBuffer** sharedBuffer, - JS::MutableHandleValue vp); + static jsval ReadableToJSVal(JSContext *cx, const nsAString &readable, + nsStringBuffer** sharedBuffer); // Convert the given stringbuffer/length pair to a jsval static MOZ_ALWAYS_INLINE bool diff --git a/security/manager/ssl/src/nsCrypto.cpp b/security/manager/ssl/src/nsCrypto.cpp index dad3b02f7215..4b61ba3c4a79 100644 --- a/security/manager/ssl/src/nsCrypto.cpp +++ b/security/manager/ssl/src/nsCrypto.cpp @@ -957,8 +957,7 @@ cryptojs_ReadArgsAndGenerateKey(JSContext *cx, } keySize = JSVAL_TO_INT(argv[0]); if (!JSVAL_IS_NULL(argv[1])) { - JS::Rooted v(cx, argv[1]); - jsString = JS::ToString(cx, v); + jsString = JS_ValueToString(cx,argv[1]); NS_ENSURE_TRUE(jsString, NS_ERROR_OUT_OF_MEMORY); argv[1] = STRING_TO_JSVAL(jsString); params.encodeLatin1(cx, jsString); @@ -970,8 +969,7 @@ cryptojs_ReadArgsAndGenerateKey(JSContext *cx, "key generation type not specified"); return NS_ERROR_FAILURE; } - JS::Rooted v(cx, argv[2]); - jsString = JS::ToString(cx, v); + jsString = JS_ValueToString(cx, argv[2]); NS_ENSURE_TRUE(jsString, NS_ERROR_OUT_OF_MEMORY); argv[2] = STRING_TO_JSVAL(jsString); nsDependentJSString dependentKeyGenAlg;