node/deps/v8/test/mjsunit/asm/large-heap.js
Michaël Zasso 09a8440b45
deps: update V8 to 12.2.281.27
PR-URL: https://github.com/nodejs/node/pull/51362
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com>
2024-03-31 15:36:07 +02:00

55 lines
1.7 KiB
JavaScript

// Copyright 2023 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: --mock-arraybuffer-allocator --allow-natives-syntax
function Asm(stdlib, foreign, buffer) {
"use asm";
var i32 = new stdlib.Int32Array(buffer);
function get(index) {
index = index|0;
return i32[index >> 2] | 0;
}
return { get: get };
}
var heap;
var allocation_succeeded = false;
try {
heap = new ArrayBuffer(0x8200_0000);
allocation_succeeded = true;
} catch (e) {
// On 32-bit platforms, the allocation will fail. Just skip the rest.
assertTrue(e instanceof RangeError);
}
(function CheckValidModule() {
var small_heap = new ArrayBuffer(64*1024);
Asm(globalThis, null, small_heap);
// With a small heap, the asm.js module is valid.
assertTrue(%IsAsmWasmCode(Asm));
})();
if (allocation_succeeded) {
console.log("allocation successful, running actual test");
var fast = Asm(this, null, heap);
// If we checked %IsAsmWasmCode(Asm) here, it would return false, because
// our fix for >2GiB addresses current consists of throwing such modules
// off the Asm fast path. But that's an implementation detail, so we don't
// want to assertFalse(...) that here either.
// This is an OOB access that should return 0 without trying to read from
// the actual ArrayBuffer (which is inaccessible due to this test using
// the mock allocator).
// To make this test meaningful without the mock allocator, write a
// recognizable value into the buffer, e.g.:
// let u8 = new Uint8Array(heap);
// u8[0x8000_0000] = 42;
// The call below should then still return 0, not 42.
assertEquals(0, fast.get(-0x8000_0000));
}