87ce9fce74
This CL fixes redesigns the current API, which does not correctly manage lifetimes of the shared object conveyors. See design doc at https://docs.google.com/document/d/1TV6agY9dafVJFvdPrUAGbEvos8wL2WDnsmf84n3OJVU/edit?usp=sharing This CL also removes the incorrect behavior of serializing all shared strings by sharing instead of copying. Shared strings may be sent to another process, which should still work. Bug: v8:12547 Change-Id: I7413abd2d871fd3d52c9b433445cfa1d03e4a732 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3868713 Commit-Queue: Shu-yu Guo <syg@chromium.org> Reviewed-by: Adam Klein <adamk@chromium.org> Reviewed-by: Michael Lippautz <mlippautz@chromium.org> Cr-Commit-Position: refs/heads/main@{#83044}
40 lines
1.2 KiB
JavaScript
40 lines
1.2 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 --allow-natives-syntax
|
|
|
|
"use strict";
|
|
|
|
if (this.Worker) {
|
|
|
|
(function TestSharedStructPostMessage() {
|
|
let workerScript =
|
|
`onmessage = function(struct) {
|
|
struct.struct_field.payload = 42;
|
|
struct.string_field = "worker";
|
|
postMessage("done");
|
|
};
|
|
postMessage("started");`;
|
|
|
|
let worker = new Worker(workerScript, { type: 'string' });
|
|
let started = worker.getMessage();
|
|
assertEquals("started", started);
|
|
|
|
let OuterStruct = new SharedStructType(['string_field', 'struct_field']);
|
|
let InnerStruct = new SharedStructType(['payload']);
|
|
let struct = new OuterStruct();
|
|
struct.struct_field = new InnerStruct();
|
|
struct.string_field = "main";
|
|
assertEquals("main", struct.string_field);
|
|
assertEquals(undefined, struct.struct_field.payload);
|
|
worker.postMessage(struct);
|
|
assertEquals("done", worker.getMessage());
|
|
assertEquals("worker", struct.string_field);
|
|
assertEquals(42, struct.struct_field.payload);
|
|
|
|
worker.terminate();
|
|
})();
|
|
|
|
}
|