JSDataView* JSDataView::create( ExecState* exec, Structure* structure, PassRefPtr<ArrayBuffer> passedBuffer, unsigned byteOffset, unsigned byteLength) { RefPtr<ArrayBuffer> buffer = passedBuffer; if (!ArrayBufferView::verifySubRange<uint8_t>(buffer, byteOffset, byteLength)) { throwVMError( exec, createRangeError(exec, "Byte offset and length out of range of buffer")); return 0; } VM& vm = exec->vm(); ConstructionContext context( structure, buffer, byteOffset, byteLength, ConstructionContext::DataView); ASSERT(context); JSDataView* result = new (NotNull, allocateCell<JSDataView>(vm.heap)) JSDataView(vm, context, buffer.get()); result->finishCreation(vm); return result; }
JSDataView* JSDataView::create( ExecState* exec, Structure* structure, PassRefPtr<ArrayBuffer> passedBuffer, unsigned byteOffset, unsigned byteLength) { RefPtr<ArrayBuffer> buffer = passedBuffer; if (!ArrayBufferView::verifySubRangeLength(buffer, byteOffset, byteLength, sizeof(uint8_t))) { throwVMError(exec, createRangeError(exec, ASCIILiteral("Length out of range of buffer"))); return nullptr; } if (!ArrayBufferView::verifyByteOffsetAlignment(byteOffset, sizeof(uint8_t))) { exec->vm().throwException(exec, createRangeError(exec, ASCIILiteral("Byte offset is not aligned"))); return nullptr; } VM& vm = exec->vm(); ConstructionContext context( structure, buffer, byteOffset, byteLength, ConstructionContext::DataView); ASSERT(context); JSDataView* result = new (NotNull, allocateCell<JSDataView>(vm.heap)) JSDataView(vm, context, buffer.get()); result->finishCreation(vm); return result; }