Skip to content

Commit 5a5600d

Browse files
committed
add DataView get/set Uint8C methods
1 parent 114fe23 commit 5a5600d

File tree

14 files changed

+146
-3
lines changed

14 files changed

+146
-3
lines changed

packages/core-js-compat/src/data.mjs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1973,6 +1973,10 @@ export const data = {
19731973
},
19741974
'esnext.composite-symbol': {
19751975
},
1976+
'esnext.data-view.get-uint8c': {
1977+
},
1978+
'esnext.data-view.set-uint8c': {
1979+
},
19761980
'esnext.disposable-stack.constructor': {
19771981
},
19781982
'esnext.function.demethodize': {

packages/core-js-compat/src/modules-by-versions.mjs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,4 +213,8 @@ export default {
213213
'web.url-search-params.delete',
214214
'web.url-search-params.has',
215215
],
216+
3.32: [
217+
'esnext.data-view.get-uint8c',
218+
'esnext.data-view.set-uint8c',
219+
],
216220
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// empty
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// empty
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
'use strict';
22
var parent = require('../../actual/data-view');
3+
require('../../modules/esnext.data-view.get-uint8c');
4+
require('../../modules/esnext.data-view.set-uint8c');
35

46
module.exports = parent;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
var round = Math.round;
2+
3+
module.exports = function (it) {
4+
var value = round(it);
5+
return value < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;
6+
};

packages/core-js/internals/typed-array-constructor.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ var isIntegralNumber = require('../internals/is-integral-number');
1313
var toLength = require('../internals/to-length');
1414
var toIndex = require('../internals/to-index');
1515
var toOffset = require('../internals/to-offset');
16+
var toUint8C = require('../internals/to-uint8c');
1617
var toPropertyKey = require('../internals/to-property-key');
1718
var hasOwn = require('../internals/has-own-property');
1819
var classof = require('../internals/classof');
@@ -36,7 +37,6 @@ var setInternalState = InternalStateModule.set;
3637
var enforceInternalState = InternalStateModule.enforce;
3738
var nativeDefineProperty = definePropertyModule.f;
3839
var nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;
39-
var round = Math.round;
4040
var RangeError = global.RangeError;
4141
var ArrayBuffer = ArrayBufferModule.ArrayBuffer;
4242
var ArrayBufferPrototype = ArrayBuffer.prototype;
@@ -137,8 +137,7 @@ if (DESCRIPTORS) {
137137

138138
var setter = function (that, index, value) {
139139
var data = getInternalState(that);
140-
if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;
141-
data.view[SETTER](index * BYTES + data.byteOffset, value, true);
140+
data.view[SETTER](index * BYTES + data.byteOffset, CLAMPED ? toUint8C(value) : value, true);
142141
};
143142

144143
var addElement = function (that, index) {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
'use strict';
2+
var $ = require('../internals/export');
3+
var uncurryThis = require('../internals/function-uncurry-this');
4+
5+
// eslint-disable-next-line es/no-typed-arrays -- safe
6+
var getUint8 = uncurryThis(DataView.prototype.getUint8);
7+
8+
// `DataView.prototype.getUint8C` method
9+
// https://github.com/ljharb/proposal-dataview-get-set-uint8c
10+
$({ target: 'DataView', proto: true, forced: true }, {
11+
getUint8C: function getUint8C(byteOffset) {
12+
return getUint8(this, byteOffset);
13+
}
14+
});
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
'use strict';
2+
var $ = require('../internals/export');
3+
var uncurryThis = require('../internals/function-uncurry-this');
4+
var classof = require('../internals/classof');
5+
var toIndex = require('../internals/to-index');
6+
var toUint8C = require('../internals/to-uint8c');
7+
8+
var $TypeError = TypeError;
9+
// eslint-disable-next-line es/no-typed-arrays -- safe
10+
var setUint8 = uncurryThis(DataView.prototype.setUint8);
11+
12+
// `DataView.prototype.setUint8C` method
13+
// https://github.com/ljharb/proposal-dataview-get-set-uint8c
14+
$({ target: 'DataView', proto: true, forced: true }, {
15+
setUint8C: function setUint8C(byteOffset, value) {
16+
if (classof(this) !== 'DataView') throw $TypeError('Incorrect receiver');
17+
var offset = toIndex(byteOffset);
18+
return setUint8(this, offset, toUint8C(value));
19+
}
20+
});
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
// https://github.com/ljharb/proposal-dataview-get-set-uint8c
2+
require('../modules/esnext.data-view.get-uint8c');
3+
require('../modules/esnext.data-view.set-uint8c');

packages/core-js/stage/2.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ var parent = require('./3');
33

44
require('../proposals/array-is-template-object');
55
require('../proposals/async-iterator-helpers');
6+
require('../proposals/dataview-get-set-uint8c');
67
require('../proposals/iterator-range');
78
require('../proposals/map-upsert-stage-2');
89
require('../proposals/string-dedent');

tests/compat/tests.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1532,6 +1532,12 @@ GLOBAL.tests = {
15321532
'esnext.composite-symbol': function () {
15331533
return compositeSymbol;
15341534
},
1535+
'esnext.data-view.get-uint8c': [ARRAY_BUFFER_SUPPORT, function () {
1536+
return DataView.prototype.getUint8C;
1537+
}],
1538+
'esnext.data-view.set-uint8c': [ARRAY_BUFFER_SUPPORT, function () {
1539+
return DataView.prototype.setUint8C;
1540+
}],
15351541
'esnext.disposable-stack.constructor': function () {
15361542
return typeof DisposableStack == 'function';
15371543
},

tests/entries/unit.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,7 @@ for (PATH of ['core-js-pure', 'core-js']) {
910910
load('proposals/change-array-by-copy-stage-4');
911911
load('proposals/collection-methods');
912912
load('proposals/collection-of-from');
913+
load('proposals/dataview-get-set-uint8c');
913914
load('proposals/decorator-metadata');
914915
load('proposals/decorator-metadata-v2');
915916
load('proposals/decorators');
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
import { DESCRIPTORS } from '../helpers/constants';
2+
3+
QUnit.test('DataView.prototype.{ getUint8C, setUint8C }', assert => {
4+
const { getUint8C, setUint8C } = DataView.prototype;
5+
6+
assert.isFunction(getUint8C);
7+
assert.arity(getUint8C, 1);
8+
assert.name(getUint8C, 'getUint8C');
9+
10+
assert.isFunction(setUint8C);
11+
assert.arity(setUint8C, 2);
12+
assert.name(setUint8C, 'setUint8C');
13+
14+
assert.same(new DataView(new ArrayBuffer(8)).setUint8C(0, 0), undefined, 'void');
15+
16+
function toString(it) {
17+
return it === 0 && 1 / it === -Infinity ? '-0' : it;
18+
}
19+
20+
const data = [
21+
[0, 0, [0]],
22+
[-0, 0, [0]],
23+
[1, 1, [1]],
24+
[-1, 0, [0]],
25+
[1.1, 1, [1]],
26+
[-1.1, 0, [0]],
27+
[1.9, 2, [2]],
28+
[-1.9, 0, [0]],
29+
[127, 127, [127]],
30+
[-127, 0, [0]],
31+
[128, 128, [128]],
32+
[-128, 0, [0]],
33+
[255, 255, [255]],
34+
[-255, 0, [0]],
35+
[255.1, 255, [255]],
36+
[255.9, 255, [255]],
37+
[256, 255, [255]],
38+
[32767, 255, [255]],
39+
[-32767, 0, [0]],
40+
[32768, 255, [255]],
41+
[-32768, 0, [0]],
42+
[65535, 255, [255]],
43+
[65536, 255, [255]],
44+
[65537, 255, [255]],
45+
[65536.54321, 255, [255]],
46+
[-65536.54321, 0, [0]],
47+
[2147483647, 255, [255]],
48+
[-2147483647, 0, [0]],
49+
[2147483648, 255, [255]],
50+
[-2147483648, 0, [0]],
51+
[2147483649, 255, [255]],
52+
[-2147483649, 0, [0]],
53+
[4294967295, 255, [255]],
54+
[4294967296, 255, [255]],
55+
[4294967297, 255, [255]],
56+
[9007199254740991, 255, [255]],
57+
[-9007199254740991, 0, [0]],
58+
[9007199254740992, 255, [255]],
59+
[-9007199254740992, 0, [0]],
60+
[9007199254740994, 255, [255]],
61+
[-9007199254740994, 0, [0]],
62+
[Infinity, 255, [255]],
63+
[-Infinity, 0, [0]],
64+
[-1.7976931348623157e+308, 0, [0]],
65+
[1.7976931348623157e+308, 255, [255]],
66+
[5e-324, 0, [0]],
67+
[-5e-324, 0, [0]],
68+
[NaN, 0, [0]],
69+
];
70+
71+
const buffer = new ArrayBuffer(1);
72+
const view = new DataView(buffer);
73+
const array = DESCRIPTORS ? new Uint8Array(buffer) : null;
74+
75+
for (const [value, conversion, little] of data) {
76+
view.setUint8C(0, value);
77+
assert.same(view.getUint8C(0, value), conversion, `DataView.prototype.setUint8C + DataView.prototype.getUint8C, ${ toString(value) } -> ${ toString(conversion) }`);
78+
assert.same(view.getUint8(0, value), conversion, `DataView.prototype.setUint8C + DataView.prototype.getUint8, ${ toString(value) } -> ${ toString(conversion) }`);
79+
if (DESCRIPTORS) assert.arrayEqual(array, little, `DataView.prototype.setUint8C + Uint8Array ${ toString(value) } -> [${ little }]`);
80+
}
81+
});

0 commit comments

Comments
 (0)