Bug 1072176 - Clean up misplaced assertions in public functions. r=waldo

--HG--
rename : js/src/jit-test/tests/sharedbuf/bug1068458-toolong.js => js/src/jit-test/tests/sharedbuf/toolong.js
This commit is contained in:
Lars T Hansen 2014-09-30 10:23:28 +02:00
parent 293f52a08f
commit 0a5f96352b
3 changed files with 38 additions and 42 deletions

View File

@ -1,14 +0,0 @@
// This used to assert, now it will throw because the limit
// (in bytes) on a SharedArrayBuffer is INT32_MAX.
if (!this.SharedUint16Array)
quit();
var thrown = false;
try {
new SharedUint16Array(2147483647);
}
catch (e) {
thrown = true;
}
assertEq(thrown, true);

View File

@ -0,0 +1,22 @@
// Various cases that used to assert, but will now throw (as they should).
if (!this.SharedUint16Array)
quit();
var thrown = false;
try {
new SharedUint16Array(2147483647); // Bug 1068458
}
catch (e) {
thrown = true;
}
assertEq(thrown, true);
var thrown = false;
try {
new SharedUint16Array(0xdeadbeef); // Bug 1072176
}
catch (e) {
thrown = true;
}
assertEq(thrown, true);

View File

@ -145,6 +145,8 @@ class SharedTypedArrayObjectTemplate : public SharedTypedArrayObject
static SharedTypedArrayObject *
makeTypedInstance(JSContext *cx, uint32_t len, AllocKind allocKind)
{
JS_ASSERT(len <= MAX_LENGTH / sizeof(NativeType));
// Multiplication is safe due to preconditions for makeInstance().
if (len * sizeof(NativeType) >= SharedTypedArrayObject::SINGLETON_TYPE_BYTE_LENGTH) {
return &NewBuiltinClassInstance(cx, instanceClass(), allocKind,
@ -173,8 +175,8 @@ class SharedTypedArrayObjectTemplate : public SharedTypedArrayObject
HandleObject proto)
{
JS_ASSERT(buffer);
JS_ASSERT(len <= MAX_LENGTH / sizeof(NativeType));
JS_ASSERT(byteOffset <= MAX_BYTEOFFSET);
JS_ASSERT(len <= MAX_LENGTH / sizeof(NativeType));
gc::AllocKind allocKind = GetGCObjectKind(instanceClass());
@ -304,18 +306,6 @@ class SharedTypedArrayObjectTemplate : public SharedTypedArrayObject
return fromBuffer(cx, dataObj, byteOffset, length);
}
static bool
createArrayBuffer(JSContext *cx, uint32_t nelements, MutableHandle<SharedArrayBufferObject *> buffer)
{
if (nelements > MAX_LENGTH / sizeof(NativeType)) {
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr,
JSMSG_NEED_DIET, "shared typed array");
return false;
}
buffer.set(SharedArrayBufferObject::New(cx, nelements * sizeof(NativeType)));
return !!buffer;
}
template<Value ValueGetter(SharedTypedArrayObject *tarr)>
static bool
GetterImpl(JSContext *cx, CallArgs args)
@ -412,6 +402,11 @@ class SharedTypedArrayObjectTemplate : public SharedTypedArrayObject
static Value getIndexValue(JSObject *tarray, uint32_t index);
static bool fun_subarray(JSContext *cx, unsigned argc, Value *vp);
static bool fun_copyWithin(JSContext *cx, unsigned argc, Value *vp);
static bool fun_set(JSContext *cx, unsigned argc, Value *vp);
public:
static JSObject *
fromBufferWithProto(JSContext *cx, HandleObject bufobj, uint32_t byteOffset, uint32_t length,
HandleObject proto)
@ -421,8 +416,6 @@ class SharedTypedArrayObjectTemplate : public SharedTypedArrayObject
return nullptr; // must be SharedArrayBuffer
}
JS_ASSERT(IsSharedArrayBuffer(bufobj) || bufobj->is<ProxyObject>());
if (bufobj->is<ProxyObject>()) {
// Complicated, see TypedArrayObject.cpp for code. For now, punt.
JS_ReportError(cx, "Permission denied to access object");
@ -437,7 +430,6 @@ class SharedTypedArrayObjectTemplate : public SharedTypedArrayObject
return nullptr;
}
JS_ASSERT(byteOffset <= buffer->byteLength());
uint32_t bytesAvailable = buffer->byteLength() - byteOffset;
if (length == LENGTH_NOT_PROVIDED) {
@ -449,23 +441,16 @@ class SharedTypedArrayObjectTemplate : public SharedTypedArrayObject
}
if (length > MAX_LENGTH / sizeof(NativeType) || length * sizeof(NativeType) > bytesAvailable) {
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_SHARED_TYPED_ARRAY_BAD_ARGS);
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_BAD_ARRAY_LENGTH);
return nullptr;
}
return makeInstance(cx, buffer, byteOffset, length, proto);
}
static bool fun_subarray(JSContext *cx, unsigned argc, Value *vp);
static bool fun_copyWithin(JSContext *cx, unsigned argc, Value *vp);
static bool fun_set(JSContext *cx, unsigned argc, Value *vp);
public:
static JSObject *
fromBuffer(JSContext *cx, HandleObject bufobj, uint32_t byteOffset, uint32_t length)
{
JS_ASSERT(byteOffset <= MAX_BYTEOFFSET);
JS_ASSERT(length <= MAX_LENGTH || length == LENGTH_NOT_PROVIDED);
RootedObject proto(cx, nullptr);
return fromBufferWithProto(cx, bufobj, byteOffset, length, proto);
}
@ -473,10 +458,13 @@ class SharedTypedArrayObjectTemplate : public SharedTypedArrayObject
static JSObject *
fromLength(JSContext *cx, uint32_t nelements)
{
JS_ASSERT(nelements <= MAX_LENGTH);
Rooted<SharedArrayBufferObject *> buffer(cx);
// Invariant established by createArrayBuffer(): nelements * sizeof(NativeType) <= MAX_LENGTH.
if (!createArrayBuffer(cx, nelements, &buffer))
if (nelements > MAX_LENGTH / sizeof(NativeType)) {
JS_ReportErrorNumber(cx, js_GetErrorMessage, nullptr, JSMSG_BAD_ARRAY_LENGTH);
return nullptr;
}
Rooted<SharedArrayBufferObject *> buffer(
cx, SharedArrayBufferObject::New(cx, nelements * sizeof(NativeType)));
if (!buffer)
return nullptr;
return makeInstance(cx, buffer, 0, nelements);
}