Add internal properties [[ArrayBufferData]] and [[ArrayBufferByteLength]]

New internal properties expose the byte length of an ArrayBuffer as well
as the pointer to the backing store, which will serve as a unique ID
to show when SharedArrayBuffers in different workers are the same buffer.

Bug: chromium:1163800
Change-Id: I49930765cb38f75ba5c6cee5a0a6827f4fec42d5
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2618242
Commit-Queue: Eric Leese <leese@chromium.org>
Reviewed-by: Benedikt Meurer <bmeurer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#72000}
This commit is contained in:
Eric Leese 2021-01-11 09:10:56 +01:00 committed by Commit Bot
parent 85b1d24b3f
commit 82bb7c93ba
5 changed files with 38 additions and 5 deletions

View File

@ -324,7 +324,8 @@ MaybeHandle<JSArray> Runtime::GetInternalProperties(Isolate* isolate,
kExternalInt16Array,
kExternalInt32Array,
};
Handle<FixedArray> result = factory->NewFixedArray(arraysize(kTypes) * 2);
Handle<FixedArray> result =
factory->NewFixedArray((2 + arraysize(kTypes)) * 2);
int index = 0;
for (auto type : kTypes) {
switch (type) {
@ -346,6 +347,23 @@ MaybeHandle<JSArray> Runtime::GetInternalProperties(Isolate* isolate,
UNREACHABLE();
}
}
Handle<String> byte_length_str =
factory->NewStringFromAsciiChecked("[[ArrayBufferByteLength]]");
result->set(index++, *byte_length_str);
Handle<Object> byte_length_obj = factory->NewNumberFromSize(byte_length);
result->set(index++, *byte_length_obj);
Handle<String> buffer_data_str =
factory->NewStringFromAsciiChecked("[[ArrayBufferData]]");
result->set(index++, *buffer_data_str);
// Use the backing store pointer as a unique ID
EmbeddedVector<char, 32> buffer_data_vec;
int len =
SNPrintF(buffer_data_vec, V8PRIxPTR_FMT,
reinterpret_cast<Address>(js_array_buffer->backing_store()));
Handle<String> buffer_id =
factory->InternalizeUtf8String(buffer_data_vec.SubVector(0, len));
result->set(index++, *buffer_id);
return factory->NewJSArrayWithElements(result, PACKED_ELEMENTS, index);
} else if (object->IsWasmModuleObject()) {
auto module_object = Handle<WasmModuleObject>::cast(object);

View File

@ -56,5 +56,7 @@ Running test: testArrayBuffer
Running test: testArrayBufferWithBrokenUintCtor
__proto__ own object undefined
Internal properties
[[ArrayBufferByteLength]] number 7
[[ArrayBufferData]] string 0x...
[[Int8Array]] object undefined
[[Uint8Array]] object undefined

View File

@ -98,7 +98,11 @@ let { Protocol } = InspectorTest.start('Checks Runtime.getProperties method whil
for (var i = 0; i < internalPropertyArray.length; i++) {
var p = internalPropertyArray[i];
var v = p.value;
InspectorTest.log(` ${p.name} ${v.type} ${v.value}`);
if (p.name === "[[ArrayBufferData]]")
// Hex value for pointer is non-deterministic
InspectorTest.log(` ${p.name} ${v.type} ${v.value.substr(0, 2)}...`);
else
InspectorTest.log(` ${p.name} ${v.type} ${v.value}`);
}
}

View File

@ -102,6 +102,8 @@ Running test: testArrayBuffer
0 own number 16843009
1 own number 16843009
__proto__ own object undefined
[[ArrayBufferByteLength]]
[[ArrayBufferData]]
Running test: testDetachedArrayBuffer
[[IsDetached]] true
@ -109,5 +111,7 @@ Running test: testDetachedArrayBuffer
Running test: testArrayBufferWithBrokenUintCtor
__proto__ own object undefined
Internal properties
[[ArrayBufferByteLength]] number 7
[[ArrayBufferData]] string 0x...
[[Int8Array]] object undefined
[[Uint8Array]] object undefined

View File

@ -52,7 +52,8 @@ InspectorTest.runAsyncTestSuite([
}
for (let prop of props.result.internalProperties) {
InspectorTest.log(prop.name);
await logGetPropertiesResult(prop.value.objectId);
if (prop.value.objectId)
await logGetPropertiesResult(prop.value.objectId);
}
},
@ -112,7 +113,7 @@ async function logGetPropertiesResult(objectId, flags = { ownProperties: true })
var v = p.value;
var own = p.isOwn ? "own" : "inherited";
if (v)
InspectorTest.log(" " + p.name + " " + own + " " + v.type + " " + v.value);
InspectorTest.log(` ${p.name} ${own} ${v.type} ${v.value}`);
else
InspectorTest.log(" " + p.name + " " + own + " no value" +
(hasGetterSetter(p, "get") ? ", getter" : "") + (hasGetterSetter(p, "set") ? ", setter" : ""));
@ -125,7 +126,11 @@ async function logGetPropertiesResult(objectId, flags = { ownProperties: true })
for (var i = 0; i < array.length; i++) {
var p = array[i];
var v = p.value;
InspectorTest.log(' ' + p.name + ' ' + v.type + ' ' + v.value);
if (p.name == "[[ArrayBufferData]]")
// Hex value for pointer is non-deterministic
InspectorTest.log(` ${p.name} ${v.type} ${v.value.substr(0, 2)}...`);
else
InspectorTest.log(` ${p.name} ${v.type} ${v.value}`);
}
}