Bug 899693 - Fix unsafe reference hazards around HashableValue::setValue; r=sfink
authorTerrence Cole <terrence@mozilla.com>
Tue, 30 Jul 2013 16:30:27 -0700
changeset 140805 1d49d7996875ae564a6c6324610a5b1144973b0b
parent 140804 6088d570849702e5fea5c2fbebe4c1f726ef57c0
child 140806 31655889fdc6471b88c4280800f1ed2830e36116
push id1
push userroot
push dateMon, 20 Oct 2014 17:29:22 +0000
reviewerssfink
bugs899693
milestone25.0a1
Bug 899693 - Fix unsafe reference hazards around HashableValue::setValue; r=sfink
js/src/builtin/MapObject.cpp
js/src/builtin/MapObject.h
js/src/jsiter.h
--- a/js/src/builtin/MapObject.cpp
+++ b/js/src/builtin/MapObject.cpp
@@ -783,17 +783,17 @@ class OrderedHashSet
 };
 
 }  // namespace js
 
 
 /*** HashableValue *******************************************************************************/
 
 bool
-HashableValue::setValue(JSContext *cx, const Value &v)
+HashableValue::setValue(JSContext *cx, HandleValue v)
 {
     if (v.isString()) {
         // Atomize so that hash() and operator==() are fast and infallible.
         JSString *str = AtomizeString<CanGC>(cx, v.toString(), DoNotInternAtom);
         if (!str)
             return false;
         value = StringValue(str);
     } else if (v.isDouble()) {
--- a/js/src/builtin/MapObject.h
+++ b/js/src/builtin/MapObject.h
@@ -31,34 +31,34 @@ class HashableValue {
         static HashNumber hash(const Lookup &v) { return v.hash(); }
         static bool match(const HashableValue &k, const Lookup &l) { return k == l; }
         static bool isEmpty(const HashableValue &v) { return v.value.isMagic(JS_HASH_KEY_EMPTY); }
         static void makeEmpty(HashableValue *vp) { vp->value = MagicValue(JS_HASH_KEY_EMPTY); }
     };
 
     HashableValue() : value(UndefinedValue()) {}
 
-    bool setValue(JSContext *cx, const Value &v);
+    bool setValue(JSContext *cx, HandleValue v);
     HashNumber hash() const;
     bool operator==(const HashableValue &other) const;
     HashableValue mark(JSTracer *trc) const;
     Value get() const { return value.get(); }
 };
 
 class AutoHashableValueRooter : private AutoGCRooter
 {
   public:
     explicit AutoHashableValueRooter(JSContext *cx
                                      MOZ_GUARD_OBJECT_NOTIFIER_PARAM)
         : AutoGCRooter(cx, HASHABLEVALUE)
         {
             MOZ_GUARD_OBJECT_NOTIFIER_INIT;
         }
 
-    bool setValue(JSContext *cx, const Value &v) {
+    bool setValue(JSContext *cx, HandleValue v) {
         return value.setValue(cx, v);
     }
 
     operator const HashableValue & () {
         return value;
     }
 
     friend void AutoGCRooter::trace(JSTracer *trc);
--- a/js/src/jsiter.h
+++ b/js/src/jsiter.h
@@ -295,20 +295,20 @@ class ForOfIterator
     }
 
     bool next() {
         JS_ASSERT(!closed);
         ok = ok && Next(cx, iterator, &currentValue);
         return ok && !currentValue.get().isMagic(JS_NO_ITER_VALUE);
     }
 
-    Value &value() {
+    MutableHandleValue value() {
         JS_ASSERT(ok);
         JS_ASSERT(!closed);
-        return currentValue.get();
+        return &currentValue;
     }
 
     bool close() {
         JS_ASSERT(!closed);
         closed = true;
         if (!iterator)
             return false;
         bool throwing = cx->isExceptionPending();