Bug 1120503 - Fix seal/freeze for typed arrays. r=Waldo

This commit is contained in:
Tom Schuster
2015-02-18 13:04:12 +01:00
parent e2703a37d2
commit 3bed6d833f
2 changed files with 54 additions and 18 deletions

View File

@@ -1098,7 +1098,7 @@ js::SetIntegrityLevel(JSContext *cx, HandleObject obj, IntegrityLevel level)
return true;
}
/* ES6 rev 29 (6 Dec 2014) 7.3.14. */
// ES6 draft rev33 (12 Feb 2015) 7.3.15
bool
js::TestIntegrityLevel(JSContext *cx, HandleObject obj, IntegrityLevel level, bool *result)
{
@@ -1111,38 +1111,26 @@ js::TestIntegrityLevel(JSContext *cx, HandleObject obj, IntegrityLevel level, bo
return true;
}
if (IsAnyTypedArray(obj)) {
if (level == IntegrityLevel::Sealed) {
// Typed arrays are considered sealed (bug 1120503).
*result = true;
} else {
// Typed arrays cannot be frozen, but an empty typed array is
// considered frozen (bug 1120503).
*result = (AnyTypedArrayLength(obj) == 0);
}
return true;
}
// Steps 7-8.
AutoIdVector props(cx);
if (!GetPropertyKeys(cx, obj, JSITER_HIDDEN | JSITER_OWNONLY | JSITER_SYMBOLS, &props))
return false;
// Step 11.
// Step 9.
RootedId id(cx);
Rooted<PropertyDescriptor> desc(cx);
for (size_t i = 0, len = props.length(); i < len; i++) {
id = props[i];
// Steps 11.a-b.
// Steps 9.a-b.
if (!GetOwnPropertyDescriptor(cx, obj, id, &desc))
return false;
// Step 11.c.
// Step 9.c.
if (!desc.object())
continue;
// Steps 11.c.i-ii.
// Steps 9.c.i-ii.
if (!desc.isPermanent() ||
(level == IntegrityLevel::Frozen && desc.isDataDescriptor() && desc.isWritable()))
{
@@ -1151,7 +1139,7 @@ js::TestIntegrityLevel(JSContext *cx, HandleObject obj, IntegrityLevel level, bo
}
}
// Step 12.
// Step 10.
*result = true;
return true;
}