Repository navigation
[ffigen] add Support passing C++ classes by value - #3677
Conversation
d05e85a to
9eb61ae
Compare
|
Hello @liamappelbe PTAL |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #3677 +/- ##
==========================================
- Coverage 87.93% 87.89% -0.05%
==========================================
Files 310 310
Lines 19799 19831 +32
==========================================
+ Hits 17411 17431 +20
- Misses 2388 2400 +12
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
9eb61ae to
99dd13c
Compare
liamappelbe
left a comment
There was a problem hiding this comment.
You've chosen a challenging feature as your first PR in ffigen 😉
High level comments, before I do a full review:
- It's not clear to me how your changes can tell the difference between a class by pointer and a class by value. My understanding is that
CppClassinherently represents a pointer to a class (though I didn't write this code, so I could be wrong; maybe class pointers are represented byPointer<CppClass>. How exactly is aFoo*represented in the AST differently to aFoo? - I was expecting there to be a flag on
CppClassthat says it's by-value, rather than these ad-hoc by value checks. - That would allow you to fold the by-value/by-pointer special casing into
getNativeType. Right now you have it re-implemented in several locations. - Consequently, your current approach will not work for other usages of
CppClass, such as global variables or top-level-functions.
Thanks, @liamappelbe, for your initial feedback. Yeah, I think it's tricky :) FirstTo clarify how
Because they are distinct AST types, BTW I took this approach as u mentioned in the issue description
SecondWhy not use a flag in As I mentioned before, ThirdCompletely agree with you at this point. I suggest adding glue-generation methods to Type (getNativeGlueType, generateGlueCallArg, and generateGlueReturn) and overriding them in CppClass and CppUniquePtrType. This encapsulates all the by-value/by-pointer conversions cleanly inside the type classes using polymorphism. FourthI think now, as I mentioned in point three Because the glue logic is now part of the shared Type class hierarchy, any future generator will simply call What are your thoughts now? I will test my approach also and tell u what the results I have got |
Sounds good. But call the functions |
66744b2 to
bb71cf7
Compare
Very good. I have implemented my approach and take your reviews in my mind. PTAL, and if there are any feedbacks, you can give them. thanks :) |
|
@Manar-Elhabbal7 Please avoid using |
|
You've got some analysis errors to fix, which prevent the tests from running. Make sure to run EDIT: The errors will go away if you sync to head. |
Ohh, sorry for that. It's my first time knowing this. noted :) |
Yeah, I have run both |
25465af to
c1c342d
Compare
|
Oh, @liamappelbe, I have clicked the update with the rebase button, and this made a force push. Sorry for that :( |
|
@liamappelbe PTAL |
Revisions updated by `dart tools/rev_sdk_deps.dart`. core (https://github.com/dart-lang/core/compare/08e4022..4d80610): 4d80610a Thu Oct 1 22:03:38 2026 +0000 dependabot[bot] Bump the github-actions group with 5 updates (dart-lang/core#1005) dartdoc (https://github.com/dart-lang/dartdoc/compare/2a040a8..5eb0f2c): 5eb0f2c7 Thu Oct 1 19:03:48 2026 +0000 dependabot[bot] Bump github/codeql-action/upload-sarif from 4.37.9 to 4.38.2 in the github-actions group (dart-lang/dartdoc#4291) http (https://github.com/dart-lang/http/compare/d8e8e9c..585d433): 585d433 Mon Oct 5 16:12:54 2026 -0700 Brian Quinlan fix(cupertino_http): fix a websocket memory leak (dart-lang/http#1991) 337adf3 Mon Oct 5 16:03:25 2026 -0700 Brian Quinlan fix(cupertino_http): add `autoReleasePool` use to `CupertinoClient` (dart-lang/http#1990) 47c57df Tue Sep 29 14:07:01 2026 -0700 Brian Quinlan fix(ok_http): fix `NetworkOnMainThreadException` (dart-lang/http#1995) d8cde5d Tue Sep 29 14:06:44 2026 -0700 Brian Quinlan fix test (dart-lang/http#1996) 31056fe Tue Sep 29 13:57:20 2026 -0700 Brian Quinlan chore(cronet_http): prepare to release 1.10.0 (dart-lang/http#1993) 9bc3a91 Tue Sep 29 13:53:25 2026 -0700 Brian Quinlan fix(cronet_http): one global reference per `onReadCompleted` (dart-lang/http#1992) 49ecd36 Mon Sep 28 14:20:26 2026 -0700 Brian Quinlan fix(conformance): `supportsAbort` not considered in response (dart-lang/http#1994) native (https://github.com/dart-lang/native/compare/27f7678..a2a6179): a2a617910 Tue Oct 6 13:53:17 2026 +0200 Daco Harkes [jni_flutter] Bump version for publishing (dart-lang/native#3730) d3a99d66b Tue Oct 6 19:46:34 2026 +1100 Liam Appelbe [infra] Fix ffigen and jni_flutter (dart-lang/native#3724) b66d0815a Tue Oct 6 04:28:35 2026 +0300 Manar Elhabbal [ffigen] add Support passing C++ classes by value (dart-lang/native#3677) f7ffe9667 Fri Oct 2 11:33:49 2026 +0200 Moritz [native_toolchain_c] Don't pass /INCLUDE per symbol with a generated .def on Windows (dart-lang/native#3718) 77a5e4169 Thu Oct 1 10:56:45 2026 +0300 Hassnaa Mohamed [ffigen] Fix cpp method filtering (dart-lang/native#3696) cca065ca6 Thu Oct 1 10:17:12 2026 +1000 Liam Appelbe [infra] Prepare to publish everything (dart-lang/native#3716) f13623ee3 Thu Oct 1 10:16:39 2026 +1000 Liam Appelbe [jnigen] API docs (dart-lang/native#3715) be618790c Thu Oct 1 10:05:26 2026 +1000 Liam Appelbe [objective_c] API docs (dart-lang/native#3708) a18dd1148 Thu Oct 1 10:04:38 2026 +1000 Liam Appelbe [ffigen] API docs (dart-lang/native#3707) 6fd87c3b2 Tue Sep 29 19:01:11 2026 -0700 Brian Quinlan [jni] Clarify `JBuffer.asUint8List` behavior (dart-lang/native#3704) 6d5bbcfad Wed Sep 30 09:35:47 2026 +1000 Liam Appelbe [jni] API documentation (dart-lang/native#3706) fbcbc894b Wed Sep 30 09:35:34 2026 +1000 Liam Appelbe [ffigen] Document autorelease issues (dart-lang/native#3705) f99449ec9 Tue Sep 29 09:39:27 2026 +1000 Liam Appelbe [infra] Add swift2objc to the workspace (dart-lang/native#3700) 31494fa08 Tue Sep 29 09:38:59 2026 +1000 Liam Appelbe [infra] Add jni_util to the workspace (dart-lang/native#3698) shelf (https://github.com/dart-lang/shelf/compare/e5c8dc6..b2cb503): b2cb503 Wed Sep 30 22:53:07 2026 -0700 Kevin Moore Resolve shelf.io.connection_info lazily (dart-lang/shelf#542) b70fafa Tue Sep 29 13:37:08 2026 -0700 Kevin Moore Match parameterless shelf_router routes without running a regex (dart-lang/shelf#544) test (https://github.com/dart-lang/test/compare/4f92d53..d749b10): d749b104 Mon Oct 5 15:42:46 2026 -0700 Nate Bosch Fail isolate suites when the test isolate exits (dart-lang/test#2775) da2157e9 Mon Oct 5 11:12:43 2026 -0700 Nate Bosch Wait longer for the Chrome test tab to appear (dart-lang/test#2771) 00bd0c99 Mon Oct 5 18:50:03 2026 +0300 Yusuf İhsan Görgel Fix broken links in architecture.md (dart-lang/test#2774) 3be2f547 Thu Oct 1 03:46:29 2026 +0000 dependabot[bot] Bump the github-actions group with 4 updates (dart-lang/test#2773) 40a5ad90 Tue Sep 29 12:07:31 2026 -0700 Nate Bosch Delete compilation artifacts once they are no longer needed (dart-lang/test#2764) 171ad0e5 Mon Sep 28 17:29:48 2026 -0700 Jacob MacDonald export additional types from package:test_api/backend.dart (dart-lang/test#2745) 52b45064 Mon Sep 28 15:04:08 2026 -0700 Nate Bosch Tag browser and node tests, relax flaky timeouts (dart-lang/test#2770) tools (https://github.com/dart-lang/tools/compare/d87eaf7..a66d517): a66d517d Tue Oct 6 09:41:32 2026 -0700 Phil Quitslund [analytics] `DASH__SUPPRESS_ANALYTICS` env handling (dart-lang/tools#2641) 00c6e4ad Fri Oct 2 17:17:49 2026 +0530 shivytyahoo Fix VersionConstraint.intersection throwing on disjoint ranges (dart-lang/tools#2622) d523e1f8 Thu Oct 1 11:09:16 2026 +0200 Morgan :) [unified_analytics] Append to the log file instead of rewriting it (dart-lang/tools#2613) 6993cbad Wed Sep 30 14:09:32 2026 +0300 Yusuf İhsan Görgel [yaml] Improve error messages when mixing list and key-value syntax (dart-lang/tools#2610) 068119b4 Tue Sep 29 23:21:03 2026 +0200 Lukas Klingsbo [pubspec_parse] Support tag_pattern for git dependencies (dart-lang/tools#2565) 7d859ed5 Mon Sep 28 20:28:23 2026 -0700 Kevin Moore [api_summary] Add expectApiSummaryClean and --write/--check CLI flags (dart-lang/tools#2603) web (https://github.com/dart-lang/web/compare/ec71a4c..63e6662): 63e6662 Sat Oct 3 00:23:21 2026 +0000 Natalie Weizenbaum Add a JSPair type (dart-lang/web#586) 2d68d90 Fri Oct 2 20:26:48 2026 +0000 Natalie Weizenbaum Use `js_interop` APIs in `js_interop_gen` (dart-lang/web#585) 037823c Thu Oct 1 21:59:21 2026 +0000 Natalie Weizenbaum Add JSMap, JSSet, and JSSetLike types (dart-lang/web#571) b2d1d6b Thu Oct 1 06:57:03 2026 +0000 dependabot[bot] Bump the github-actions group with 3 updates (dart-lang/web#584) 8dc8f75 Wed Sep 30 08:12:18 2026 -0700 Kevin Moore [js_interop_gen] Split union/intersection AST types and extract TypeTransformer (dart-lang/web#580) 751ccdf Wed Sep 30 08:12:18 2026 -0700 Kevin Moore [js_interop_gen] Decompose `Transformer._transformType` and deduplicate type caching (dart-lang/web#579) 6f3dd4e Wed Sep 30 08:12:17 2026 -0700 Kevin Moore [js_interop_gen] Deduplicate `UnionType` and `IntersectionType` via `UnionOrIntersectionType` (dart-lang/web#578) d9f095e Tue Sep 29 12:17:29 2026 -0700 Kevin Moore [js_interop_gen] Remove unused JS interop extension types and bindings (dart-lang/web#577) 07111ee Tue Sep 29 09:51:36 2026 -0700 Kevin Moore fix(js_interop_gen): update js_type_supertypes for Dart 3.12 (dart-lang/web#582) Change-Id: I4532049c45561fe8f8c57713ac8ec2153096fd9a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/560660 Commit-Queue: Nate Bosch <[email protected]> Reviewed-by: Brian Quinlan <[email protected]>
What does this PR introduce?
Adds support for passing and returning C++ classes by value:
*.newin C++ glue code and wrapped in Dart withtakeOwnership: true.classdecl_parser.dart.I followed a TDD approach: added by-value test methods in
cpp_class_testand verified they failed before implementing the fix. And it passed successfully : )Fixes #3603