Skip to content

Commit 39c079b

Browse files
committed
throw proper errors on an incorrect context in some ArrayBuffer and DataView methods
1 parent 7e0399d commit 39c079b

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
- Improved some cases handling of array-replacer in `JSON.stringify` symbols handling fix
3939
- Fixed many other old `JSON.{ parse, stringify }` bugs (numbers instead of strings as keys in replacer, handling negative zeroes, spaces, some more handling symbols cases, etc.)
4040
- Fixed configurability and `ToString` conversion of some accessors
41+
- Added throwing proper errors on an incorrect context in some `ArrayBuffer` and `DataView` methods
42+
- Some minor `DataView` polyfill optimizations
4143
- `RegExp.prototype.flags` marked as fixed from V8 ~ Chrome 111
4244
- Added Opera Android 73 compat data mapping
4345
- Added TypeScript definitions to `core-js-builder`

packages/core-js/internals/array-buffer.js

+18-13
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,14 @@ var InternalStateModule = require('../internals/internal-state');
2323

2424
var PROPER_FUNCTION_NAME = FunctionName.PROPER;
2525
var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;
26-
var getInternalState = InternalStateModule.get;
27-
var setInternalState = InternalStateModule.set;
2826
var ARRAY_BUFFER = 'ArrayBuffer';
2927
var DATA_VIEW = 'DataView';
3028
var PROTOTYPE = 'prototype';
3129
var WRONG_LENGTH = 'Wrong length';
3230
var WRONG_INDEX = 'Wrong index';
31+
var getInternalArrayBufferState = InternalStateModule.getterFor(ARRAY_BUFFER);
32+
var getInternalDataViewState = InternalStateModule.getterFor(DATA_VIEW);
33+
var setInternalState = InternalStateModule.set;
3334
var NativeArrayBuffer = global[ARRAY_BUFFER];
3435
var $ArrayBuffer = NativeArrayBuffer;
3536
var ArrayBufferPrototype = $ArrayBuffer && $ArrayBuffer[PROTOTYPE];
@@ -68,7 +69,7 @@ var packFloat64 = function (number) {
6869
return packIEEE754(number, 52, 8);
6970
};
7071

71-
var addGetter = function (Constructor, key) {
72+
var addGetter = function (Constructor, key, getInternalState) {
7273
defineBuiltInAccessor(Constructor[PROTOTYPE], key, {
7374
configurable: true,
7475
get: function () {
@@ -79,19 +80,19 @@ var addGetter = function (Constructor, key) {
7980

8081
var get = function (view, count, index, isLittleEndian) {
8182
var intIndex = toIndex(index);
82-
var store = getInternalState(view);
83+
var store = getInternalDataViewState(view);
8384
if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);
84-
var bytes = getInternalState(store.buffer).bytes;
85+
var bytes = store.bytes;
8586
var start = intIndex + store.byteOffset;
8687
var pack = arraySlice(bytes, start, start + count);
8788
return isLittleEndian ? pack : reverse(pack);
8889
};
8990

9091
var set = function (view, count, index, conversion, value, isLittleEndian) {
9192
var intIndex = toIndex(index);
92-
var store = getInternalState(view);
93+
var store = getInternalDataViewState(view);
9394
if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);
94-
var bytes = getInternalState(store.buffer).bytes;
95+
var bytes = store.bytes;
9596
var start = intIndex + store.byteOffset;
9697
var pack = conversion(+value);
9798
for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];
@@ -102,6 +103,7 @@ if (!NATIVE_ARRAY_BUFFER) {
102103
anInstance(this, ArrayBufferPrototype);
103104
var byteLength = toIndex(length);
104105
setInternalState(this, {
106+
type: ARRAY_BUFFER,
105107
bytes: fill(Array(byteLength), 0),
106108
byteLength: byteLength
107109
});
@@ -116,15 +118,18 @@ if (!NATIVE_ARRAY_BUFFER) {
116118
$DataView = function DataView(buffer, byteOffset, byteLength) {
117119
anInstance(this, DataViewPrototype);
118120
anInstance(buffer, ArrayBufferPrototype);
119-
var bufferLength = getInternalState(buffer).byteLength;
121+
var bufferState = getInternalArrayBufferState(buffer);
122+
var bufferLength = bufferState.byteLength;
120123
var offset = toIntegerOrInfinity(byteOffset);
121124
if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset');
122125
byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);
123126
if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);
124127
setInternalState(this, {
128+
type: DATA_VIEW,
125129
buffer: buffer,
126130
byteLength: byteLength,
127-
byteOffset: offset
131+
byteOffset: offset,
132+
bytes: bufferState.bytes
128133
});
129134
if (!DESCRIPTORS) {
130135
this.buffer = buffer;
@@ -136,10 +141,10 @@ if (!NATIVE_ARRAY_BUFFER) {
136141
DataViewPrototype = $DataView[PROTOTYPE];
137142

138143
if (DESCRIPTORS) {
139-
addGetter($ArrayBuffer, 'byteLength');
140-
addGetter($DataView, 'buffer');
141-
addGetter($DataView, 'byteLength');
142-
addGetter($DataView, 'byteOffset');
144+
addGetter($ArrayBuffer, 'byteLength', getInternalArrayBufferState);
145+
addGetter($DataView, 'buffer', getInternalDataViewState);
146+
addGetter($DataView, 'byteLength', getInternalDataViewState);
147+
addGetter($DataView, 'byteOffset', getInternalDataViewState);
143148
}
144149

145150
defineBuiltIns(DataViewPrototype, {

0 commit comments

Comments
 (0)