0407423bd0
Currently the Isolate is gotten off of the object that the operation is being performed on. Shared objects return the shared Isolate, which is incorrect as it shouldn't be used to run JS, nor does it have HandleScopes open. Plumb the executing Isolate through. Bug: v8:12547 Change-Id: I3d960751c798ac657a6122598154e36d9d504c31 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3606489 Reviewed-by: Adam Klein <adamk@chromium.org> Commit-Queue: Shu-yu Guo <syg@chromium.org> Cr-Commit-Position: refs/heads/main@{#80163}
76 lines
2.1 KiB
JavaScript
76 lines
2.1 KiB
JavaScript
// Copyright 2022 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: --shared-string-table --harmony-struct
|
|
|
|
"use strict";
|
|
|
|
let S = new SharedStructType(['field']);
|
|
|
|
(function TestNoPrototype() {
|
|
// For now the experimental shared structs don't have a prototype, unlike the
|
|
// proposal explainer which says accessing the prototype throws.
|
|
assertNull(S.prototype);
|
|
assertNull(Object.getPrototypeOf(new S()));
|
|
})();
|
|
|
|
(function TestPrimitives() {
|
|
// All primitives can be stored in fields.
|
|
let s = new S();
|
|
for (let prim of [42, -0, Math.random(),
|
|
undefined, null, true, false,
|
|
"foo"]) {
|
|
s.field = prim;
|
|
assertEquals(s.field, prim);
|
|
}
|
|
})();
|
|
|
|
(function TestObjects() {
|
|
let s = new S();
|
|
// Shared objects cannot point to non-shared objects.
|
|
assertThrows(() => { s.field = []; });
|
|
assertThrows(() => { s.field = {}; });
|
|
// Shared objects can point to other shared objects.
|
|
let shared_rhs = new S();
|
|
s.field = shared_rhs;
|
|
assertEquals(s.field, shared_rhs);
|
|
})();
|
|
|
|
(function TestNotExtensible() {
|
|
let s = new S();
|
|
// Shared structs are non-extensible.
|
|
assertThrows(() => { s.nonExistent = 42; });
|
|
assertThrows(() => { Object.setPrototypeOf(s, {}); });
|
|
assertThrows(() => { Object.defineProperty(s, 'nonExistent', { value: 42 }); });
|
|
})();
|
|
|
|
(function TestTooManyFields() {
|
|
let field_names = [];
|
|
for (let i = 0; i < 1000; i++) {
|
|
field_names.push('field' + i);
|
|
}
|
|
assertThrows(() => { new SharedStructType(field_names); });
|
|
})();
|
|
|
|
(function TestOwnPropertyEnumeration() {
|
|
let s = new S();
|
|
s.field = 42;
|
|
|
|
assertArrayEquals(['field'], Reflect.ownKeys(s));
|
|
|
|
let propDescs = Object.getOwnPropertyDescriptors(s);
|
|
let desc = propDescs['field'];
|
|
assertEquals(true, desc.writable);
|
|
assertEquals(false, desc.configurable);
|
|
assertEquals(true, desc.enumerable);
|
|
assertEquals(42, desc.value);
|
|
|
|
let vals = Object.values(s);
|
|
assertArrayEquals([42], vals);
|
|
|
|
let entries = Object.entries(s);
|
|
assertEquals(1, entries.length);
|
|
assertArrayEquals(['field', 42], entries[0]);
|
|
})();
|