5b4e8db550
This CL moves the remaining runtime DataView getters to Torque, namely DataViewGetBigInt64/BigUint64, and removes the associated runtime code that is now unneeded. All of the DataView getters are now implemented in Torque, which brings a nice performance improvement over the former C++ builtin code. Change-Id: I35cf2eabce3c79cc0d3200e7f24dbe0c3e5c2804 Reviewed-on: https://chromium-review.googlesource.com/1092736 Commit-Queue: Théotime Grohens <theotime@google.com> Reviewed-by: Tobias Tebbi <tebbi@chromium.org> Reviewed-by: Jakob Gruber <jgruber@chromium.org> Cr-Commit-Position: refs/heads/master@{#53765}
89 lines
2.8 KiB
JavaScript
89 lines
2.8 KiB
JavaScript
// Copyright 2018 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --harmony-bigint
|
|
|
|
var buffer = new ArrayBuffer(64);
|
|
var dataview = new DataView(buffer, 8, 24);
|
|
var bytes = new Uint8Array(buffer);
|
|
|
|
var b1 = 0xff1234567890abcdefn;
|
|
var b1_64 = BigInt.asUintN(64, b1);
|
|
|
|
dataview.setBigInt64(8, b1);
|
|
assertEquals(0x12, bytes[16]);
|
|
assertEquals(0x34, bytes[17]);
|
|
assertEquals(0x56, bytes[18]);
|
|
assertEquals(0x78, bytes[19]);
|
|
assertEquals(0x90, bytes[20]);
|
|
assertEquals(0xab, bytes[21]);
|
|
assertEquals(0xcd, bytes[22]);
|
|
assertEquals(0xef, bytes[23]);
|
|
assertEquals(b1_64, dataview.getBigInt64(8));
|
|
|
|
dataview.setBigInt64(8, b1, true); // Little-endian.
|
|
assertEquals(0xef, bytes[16]);
|
|
assertEquals(0xcd, bytes[17]);
|
|
assertEquals(0xab, bytes[18]);
|
|
assertEquals(0x90, bytes[19]);
|
|
assertEquals(0x78, bytes[20]);
|
|
assertEquals(0x56, bytes[21]);
|
|
assertEquals(0x34, bytes[22]);
|
|
assertEquals(0x12, bytes[23]);
|
|
assertEquals(b1_64, dataview.getBigInt64(8, true));
|
|
|
|
dataview.setBigUint64(8, b1);
|
|
assertEquals(0x12, bytes[16]);
|
|
assertEquals(0x34, bytes[17]);
|
|
assertEquals(0x56, bytes[18]);
|
|
assertEquals(0x78, bytes[19]);
|
|
assertEquals(0x90, bytes[20]);
|
|
assertEquals(0xab, bytes[21]);
|
|
assertEquals(0xcd, bytes[22]);
|
|
assertEquals(0xef, bytes[23]);
|
|
assertEquals(b1_64, dataview.getBigUint64(8));
|
|
|
|
dataview.setBigUint64(8, b1, true); // Little-endian.
|
|
assertEquals(0xef, bytes[16]);
|
|
assertEquals(0xcd, bytes[17]);
|
|
assertEquals(0xab, bytes[18]);
|
|
assertEquals(0x90, bytes[19]);
|
|
assertEquals(0x78, bytes[20]);
|
|
assertEquals(0x56, bytes[21]);
|
|
assertEquals(0x34, bytes[22]);
|
|
assertEquals(0x12, bytes[23]);
|
|
assertEquals(b1_64, dataview.getBigUint64(8, true));
|
|
|
|
var b2 = -0x76543210fedcba98n;
|
|
dataview.setBigInt64(8, b2, true);
|
|
assertEquals(0x68, bytes[16]);
|
|
assertEquals(0x45, bytes[17]);
|
|
assertEquals(0x23, bytes[18]);
|
|
assertEquals(0x01, bytes[19]);
|
|
assertEquals(0xef, bytes[20]);
|
|
assertEquals(0xcd, bytes[21]);
|
|
assertEquals(0xab, bytes[22]);
|
|
assertEquals(0x89, bytes[23]);
|
|
assertEquals(b2, dataview.getBigInt64(8, true));
|
|
assertEquals(0x89abcdef01234568n, dataview.getBigUint64(8, true));
|
|
|
|
var b3 = -0x8000000000000000n; // The int64_t minimum value.
|
|
dataview.setBigInt64(8, b3);
|
|
assertEquals(b3, dataview.getBigInt64(8));
|
|
assertEquals(-b3, dataview.getBigUint64(8));
|
|
|
|
var b4 = 0x8000000000000000n;
|
|
dataview.setBigInt64(8, b4);
|
|
assertEquals(-b4, dataview.getBigInt64(8));
|
|
assertEquals(b4, dataview.getBigUint64(8));
|
|
|
|
assertThrows(() => dataview.setBigInt64(0, 1), TypeError);
|
|
assertThrows(() => dataview.setBigUint64(0, 1), TypeError);
|
|
assertThrows(() => dataview.setInt32(0, 1n), TypeError);
|
|
assertThrows(() => dataview.setUint32(0, 1n), TypeError);
|
|
|
|
// None of the stores wrote out of bounds.
|
|
for (var i = 0; i < 16; i++) assertEquals(0, bytes[i]);
|
|
for (var i = 24; i < 64; i++) assertEquals(0, bytes[i]);
|