|
|
@@ -24,7 +24,6 @@ namespace Js
|
|
|
uint32 byteLength = 0;
|
|
|
uint32 mappedLength;
|
|
|
int32 offset = 0;
|
|
|
- double numberOffset = 0;
|
|
|
ArrayBufferBase* arrayBuffer = nullptr;
|
|
|
DataView* dataView;
|
|
|
|
|
|
@@ -49,7 +48,7 @@ namespace Js
|
|
|
{
|
|
|
case S_OK:
|
|
|
case S_FALSE:
|
|
|
- arrayBuffer = static_cast<ArrayBuffer *> (ab);
|
|
|
+ arrayBuffer = ab;
|
|
|
// Both of these cases will be handled by the arrayBuffer null check.
|
|
|
break;
|
|
|
|
|
|
@@ -74,33 +73,21 @@ namespace Js
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- //4. Let numberOffset be ToNumber(byteOffset).
|
|
|
- //5. Let offset be ToInteger(numberOffset).
|
|
|
- //6. ReturnIfAbrupt(offset).
|
|
|
- //7. If numberOffset <> offset or offset < 0, throw a RangeError exception.
|
|
|
+ //4. Let offset be ToIndex(byteOffset).
|
|
|
if (args.Info.Count > 2)
|
|
|
{
|
|
|
Var secondArgument = args[2];
|
|
|
- numberOffset = JavascriptConversion::ToNumber(secondArgument, scriptContext);
|
|
|
- offset = JavascriptConversion::ToInt32(numberOffset);
|
|
|
-
|
|
|
- if (offset < 0 ||
|
|
|
- numberOffset != offset)
|
|
|
- {
|
|
|
- JavascriptError::ThrowRangeError(
|
|
|
- scriptContext, JSERR_DataView_InvalidArgument, _u("byteOffset"));
|
|
|
- }
|
|
|
+ offset = ArrayBuffer::ToIndex(secondArgument, JSERR_ArrayLengthConstructIncorrect, scriptContext, ArrayBuffer::MaxArrayBufferLength, false);
|
|
|
}
|
|
|
|
|
|
- //8. If IsDetachedBuffer(buffer) is true, throw a TypeError exception.
|
|
|
+ //5. If IsDetachedBuffer(buffer) is true, throw a TypeError exception.
|
|
|
if (arrayBuffer->IsDetached())
|
|
|
{
|
|
|
JavascriptError::ThrowTypeError(scriptContext, JSERR_This_NeedDataView);
|
|
|
}
|
|
|
|
|
|
- //9. Let bufferByteLength be the value of buffer's[[ArrayBufferByteLength]] internal slot.
|
|
|
- //10. If offset > bufferByteLength, throw a RangeError exception.
|
|
|
-
|
|
|
+ //6. Let bufferByteLength be the value of buffer's[[ArrayBufferByteLength]] internal slot.
|
|
|
+ //7. If offset > bufferByteLength, throw a RangeError exception.
|
|
|
byteLength = arrayBuffer->GetByteLength();
|
|
|
if ((uint32)offset > byteLength)
|
|
|
{
|
|
|
@@ -108,16 +95,15 @@ namespace Js
|
|
|
scriptContext, JSERR_DataView_InvalidArgument, _u("byteOffset"));
|
|
|
}
|
|
|
|
|
|
- //11. If byteLength is undefined, then
|
|
|
+ //8. If byteLength is either not present or is undefined, then
|
|
|
// a. Let viewByteLength be bufferByteLength - offset.
|
|
|
- //12. Else,
|
|
|
- // a. Let viewByteLength be ToLength(byteLength).
|
|
|
- // b. ReturnIfAbrupt(viewLength).
|
|
|
- // c. If offset + viewByteLength > bufferByteLength, throw a RangeError exception.
|
|
|
+ //9. Else,
|
|
|
+ // a. Let viewByteLength be ToIndex(byteLength).
|
|
|
+ // b. If offset + viewByteLength > bufferByteLength, throw a RangeError exception.
|
|
|
if (args.Info.Count > 3 && !JavascriptOperators::IsUndefinedObject(args[3]))
|
|
|
{
|
|
|
Var thirdArgument = args[3];
|
|
|
- mappedLength = (uint32)JavascriptConversion::ToLength(thirdArgument, scriptContext);
|
|
|
+ mappedLength = ArrayBuffer::ToIndex(thirdArgument, JSERR_ArrayLengthConstructIncorrect, scriptContext, ArrayBuffer::MaxArrayBufferLength, false);
|
|
|
uint32 viewRange = mappedLength + offset;
|
|
|
|
|
|
if (viewRange > byteLength || viewRange < mappedLength) // overflow indicates out-of-range
|
|
|
@@ -131,13 +117,12 @@ namespace Js
|
|
|
mappedLength = byteLength - offset;
|
|
|
}
|
|
|
|
|
|
- //13. Let O be OrdinaryCreateFromConstructor(NewTarget, "%DataViewPrototype%", [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]]).
|
|
|
- //14. ReturnIfAbrupt(O).
|
|
|
- //15. Set O's[[DataView]] internal slot to true.
|
|
|
- //16. Set O's[[ViewedArrayBuffer]] internal slot to buffer.
|
|
|
- //17. Set O's[[ByteLength]] internal slot to viewByteLength.
|
|
|
- //18. Set O's[[ByteOffset]] internal slot to offset.
|
|
|
- //19. Return O.
|
|
|
+ //10. Let O be OrdinaryCreateFromConstructor(NewTarget, "%DataViewPrototype%", [[DataView]], [[ViewedArrayBuffer]], [[ByteLength]], [[ByteOffset]]).
|
|
|
+ //11. Set O's[[DataView]] internal slot to true.
|
|
|
+ //12. Set O's[[ViewedArrayBuffer]] internal slot to buffer.
|
|
|
+ //13. Set O's[[ByteLength]] internal slot to viewByteLength.
|
|
|
+ //14. Set O's[[ByteOffset]] internal slot to offset.
|
|
|
+ //15. Return O.
|
|
|
dataView = scriptContext->GetLibrary()->CreateDataView(arrayBuffer, offset, mappedLength);
|
|
|
return isCtorSuperCall ?
|
|
|
JavascriptOperators::OrdinaryCreateFromConstructor(RecyclableObject::FromVar(newTarget), dataView, nullptr, scriptContext) :
|