summaryrefslogtreecommitdiff
path: root/js/src/vm
diff options
context:
space:
mode:
authorBrian Smith <brian@dbsoft.org>2023-07-19 16:36:58 -0500
committerBrian Smith <brian@dbsoft.org>2023-07-19 16:36:58 -0500
commit2b198142f021e33ca5a6bef52abc04b95042fb33 (patch)
treed7940ee1d19c8f68b175cf49d668b4c6f604f5f4 /js/src/vm
parent700bead8ba82020d32eb0050bd809f8743192088 (diff)
downloaduxp-2b198142f021e33ca5a6bef52abc04b95042fb33.tar.gz
Issue #1240 - Part 6b - Use ToIndex when constructing TypedArray with length argument.
https://bugzilla.mozilla.org/show_bug.cgi?id=1317383 Part 2.
Diffstat (limited to 'js/src/vm')
-rw-r--r--js/src/vm/ArrayBufferObject.cpp21
-rw-r--r--js/src/vm/TypedArrayObject.cpp33
-rw-r--r--js/src/vm/TypedArrayObject.h2
3 files changed, 13 insertions, 43 deletions
diff --git a/js/src/vm/ArrayBufferObject.cpp b/js/src/vm/ArrayBufferObject.cpp
index 5d355ada9d..3bed40af47 100644
--- a/js/src/vm/ArrayBufferObject.cpp
+++ b/js/src/vm/ArrayBufferObject.cpp
@@ -264,27 +264,24 @@ ArrayBufferObject::fun_isView(JSContext* cx, unsigned argc, Value* vp)
return true;
}
-/*
- * new ArrayBuffer(byteLength)
- */
+
+// ES2017 draft 24.1.2.1
bool
ArrayBufferObject::class_constructor(JSContext* cx, unsigned argc, Value* vp)
{
CallArgs args = CallArgsFromVp(argc, vp);
+ // Step 1.
if (!ThrowIfNotConstructing(cx, args, "ArrayBuffer"))
return false;
- int32_t nbytes = 0;
- if (argc > 0 && !ToInt32(cx, args[0], &nbytes))
+ // Step 2.
+ uint64_t byteLength;
+ if (!ToIndex(cx, args.get(0), &byteLength))
return false;
- if (nbytes < 0) {
- /*
- * We're just not going to support arrays that are bigger than what will fit
- * as an integer value; if someone actually ever complains (validly), then we
- * can fix.
- */
+ // Non-standard: Refuse to allocate buffers larger than ~2 GiB.
+ if (byteLength > INT32_MAX) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_ARRAY_LENGTH);
return false;
}
@@ -294,7 +291,7 @@ ArrayBufferObject::class_constructor(JSContext* cx, unsigned argc, Value* vp)
if (!GetPrototypeFromConstructor(cx, newTarget, &proto))
return false;
- JSObject* bufobj = create(cx, uint32_t(nbytes), proto);
+ JSObject* bufobj = create(cx, uint32_t(byteLength), proto);
if (!bufobj)
return false;
args.rval().setObject(*bufobj);
diff --git a/js/src/vm/TypedArrayObject.cpp b/js/src/vm/TypedArrayObject.cpp
index 0225c0578c..ac93ec9b14 100644
--- a/js/src/vm/TypedArrayObject.cpp
+++ b/js/src/vm/TypedArrayObject.cpp
@@ -1898,10 +1898,8 @@ DataViewObject::class_constructor(JSContext* cx, unsigned argc, Value* vp)
template <typename NativeType>
/* static */ uint8_t*
-DataViewObject::getDataPointer(JSContext* cx, Handle<DataViewObject*> obj, double offset)
+DataViewObject::getDataPointer(JSContext* cx, Handle<DataViewObject*> obj, uint64_t offset)
{
- MOZ_ASSERT(offset >= 0);
-
const size_t TypeSize = sizeof(NativeType);
if (offset > UINT32_MAX - TypeSize || offset + TypeSize > obj->byteLength()) {
JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_ARG_INDEX_OUT_OF_RANGE,
@@ -1989,31 +1987,6 @@ struct DataViewIO
}
};
-static bool
-ToIndex(JSContext* cx, HandleValue v, double* index)
-{
- if (v.isUndefined()) {
- *index = 0.0;
- return true;
- }
-
- double integerIndex;
- if (!ToInteger(cx, v, &integerIndex))
- return false;
-
- // Inlined version of ToLength.
- // 1. Already an integer
- // 2. Step eliminates < 0, +0 == -0 with SameValueZero
- // 3/4. Limit to <= 2^53-1, so everything above should fail.
- if (integerIndex < 0 || integerIndex > 9007199254740991) {
- JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr, JSMSG_BAD_INDEX);
- return false;
- }
-
- *index = integerIndex;
- return true;
-}
-
template<typename NativeType>
/* static */ bool
DataViewObject::read(JSContext* cx, Handle<DataViewObject*> obj,
@@ -2023,7 +1996,7 @@ DataViewObject::read(JSContext* cx, Handle<DataViewObject*> obj,
// Step 3. unnecessary assert
// Step 4.
- double getIndex;
+ uint64_t getIndex;
if (!ToIndex(cx, args.get(0), &getIndex))
return false;
@@ -2111,7 +2084,7 @@ DataViewObject::write(JSContext* cx, Handle<DataViewObject*> obj,
// Step 3. unnecessary assert
// Step 4.
- double getIndex;
+ uint64_t getIndex;
if (!ToIndex(cx, args.get(0), &getIndex))
return false;
diff --git a/js/src/vm/TypedArrayObject.h b/js/src/vm/TypedArrayObject.h
index ccdee22bee..196d347075 100644
--- a/js/src/vm/TypedArrayObject.h
+++ b/js/src/vm/TypedArrayObject.h
@@ -442,7 +442,7 @@ class DataViewObject : public NativeObject
template <typename NativeType>
static uint8_t*
- getDataPointer(JSContext* cx, Handle<DataViewObject*> obj, double offset);
+ getDataPointer(JSContext* cx, Handle<DataViewObject*> obj, uint64_t offset);
template<Value ValueGetter(DataViewObject* view)>
static bool