Skip to content

Commit 1910ea5

Browse files
committed
[ffigen] Pass destructor counter to getNode to verify destruction
1 parent be9a91f commit 1910ea5

5 files changed

Lines changed: 28 additions & 13 deletions

File tree

pkgs/ffigen/test/native_cpp_test/memory_edge_cases.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ int NodeManager::foo(Node* node) {
2121
return node->getValue();
2222
}
2323

24-
Node* NodeManager::getNode() {
25-
return new Node(100, nullptr);
24+
Node* NodeManager::getNode(int value, int* destructorCounter) {
25+
return new Node(value, destructorCounter);
2626
}
2727

2828

pkgs/ffigen/test/native_cpp_test/memory_edge_cases.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ class NodeManager {
1818
public:
1919
NodeManager();
2020
int foo(Node* node);
21-
Node* getNode();
21+
Node* getNode(int value, int* destructorCounter);
2222
Node* newNode(int value, int* destructorCounter);
2323
Node* getSingletonNode(int value, int* destructorCounter);
2424
int getValue(Node* node);

pkgs/ffigen/test/native_cpp_test/memory_edge_cases_bindings.dart

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -230,12 +230,14 @@ class NodeManager implements ffi.Finalizable {
230230
return _NodeManager_foo(_ptr, node._ptr);
231231
}
232232

233-
Node getNode() {
233+
Node getNode(int value, ffi.Pointer<ffi.Int> destructorCounter) {
234234
if (_ptr == ffi.nullptr) {
235235
throw StateError('This object has already been disposed.');
236236
}
237237

238-
return Node.fromPointer(_NodeManager_getNode(_ptr));
238+
return Node.fromPointer(
239+
_NodeManager_getNode(_ptr, value, destructorCounter),
240+
);
239241
}
240242

241243
Node newNode(int value, ffi.Pointer<ffi.Int> destructorCounter) {
@@ -305,10 +307,18 @@ external int _NodeManager_foo(
305307
ffi.Pointer<ffi.Void> node,
306308
);
307309

308-
@ffi.Native<ffi.Pointer<ffi.Void> Function(ffi.Pointer<ffi.Void>)>(
309-
symbol: 'NodeManager_getNode',
310-
)
311-
external ffi.Pointer<ffi.Void> _NodeManager_getNode(ffi.Pointer<ffi.Void> self);
310+
@ffi.Native<
311+
ffi.Pointer<ffi.Void> Function(
312+
ffi.Pointer<ffi.Void>,
313+
ffi.Int,
314+
ffi.Pointer<ffi.Int>,
315+
)
316+
>(symbol: 'NodeManager_getNode')
317+
external ffi.Pointer<ffi.Void> _NodeManager_getNode(
318+
ffi.Pointer<ffi.Void> self,
319+
int value,
320+
ffi.Pointer<ffi.Int> destructorCounter,
321+
);
312322

313323
@ffi.Native<
314324
ffi.Pointer<ffi.Void> Function(

pkgs/ffigen/test/native_cpp_test/memory_edge_cases_bindings.dart.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ FFIGEN_EXPORT int NodeManager_foo(NodeManager* self, Node* node) {
2828
return self->foo(node);
2929
}
3030

31-
FFIGEN_EXPORT Node* NodeManager_getNode(NodeManager* self) {
32-
return self->getNode();
31+
FFIGEN_EXPORT Node* NodeManager_getNode(NodeManager* self, int value, int * destructorCounter) {
32+
return self->getNode(value, destructorCounter);
3333
}
3434

3535
FFIGEN_EXPORT Node* NodeManager_newNode(NodeManager* self, int value, int * destructorCounter) {

pkgs/ffigen/test/native_cpp_test/memory_edge_cases_test.dart

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,18 +69,23 @@ void main() {
6969

7070
test('getNode() returns unowned pointer by default', () {
7171
final manager = NodeManager();
72-
final node = manager.getNode();
72+
final node = manager.getNode(100, nullptr);
7373
expect(node.getValue(), 100);
7474

7575
// Wrapper is unowned by default, releaseOwnership throws StateError.
7676
expect(node.releaseOwnership, throwsStateError);
7777
});
7878

7979
test('getNode() can take ownership via retainOwnership()', () {
80+
final counter = calloc<Int32>()..value = 0;
8081
final manager = NodeManager();
81-
final node = manager.getNode()..retainOwnership();
82+
final node = manager.getNode(100, counter.cast())..retainOwnership();
8283
expect(node.getValue(), 100);
84+
expect(counter.value, 0);
85+
8386
node.dispose();
87+
expect(counter.value, 1);
88+
calloc.free(counter);
8489
});
8590

8691
test('newNode() returns unowned by default, counter stays 0', () {

0 commit comments

Comments
 (0)