blob: e0f4e68949238e0c3b7b35acd956051df8b319bc [file] [log] [blame]
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:isolate';
import 'dart:ffi';
import 'package:expect/async_helper.dart' show asyncEnd, asyncStart;
import 'package:expect/expect.dart';
import 'package:ffi/ffi.dart';
@Native<Handle Function(Int64 port)>(symbol: 'Dart_NewSendPort')
external SendPort newSendPort(int obj);
@Native<Handle Function(Handle, Pointer<Int64>)>(symbol: 'Dart_SendPortGetId')
external Object sendPortGetId(Object sendPort, Pointer<Int64> outId);
final class PortEx extends Struct {
@Int64()
external int portId;
@Int64()
external int originId;
}
@Native<Handle Function(PortEx portex)>(symbol: 'Dart_NewSendPortEx')
external SendPort newSendPortEx(PortEx portEx);
@Native<Handle Function(Handle, Pointer<PortEx>)>(
symbol: 'Dart_SendPortGetIdEx',
)
external Object sendPortGetIdEx(Object sendPort, Pointer<PortEx> outPortExId);
class A {}
main() async {
asyncStart();
final rp = ReceivePort();
rp.close();
{
Pointer<Int64> portId = calloc();
sendPortGetId(rp.sendPort, portId);
final sendPortThroughAPI = newSendPort(portId.value);
sendPortThroughAPI.send('A');
Expect.throwsArgumentError(() {
sendPortThroughAPI.send(A());
});
calloc.free(portId);
}
{
Pointer<PortEx> portExId = calloc();
sendPortGetIdEx(rp.sendPort, portExId);
final sendPortThroughAPI = newSendPortEx(portExId[0]);
sendPortThroughAPI.send('A');
sendPortThroughAPI.send(A());
calloc.free(portExId);
}
asyncEnd();
}