Repository navigation
[objective_c] Link Foundation in the native support library - #3782
Conversation
The generated @Native class lookups (eg OBJC_CLASS_$_NSArray) are resolved through the objective_c.dylib handle. The dylib only linked libSystem, so every built-in Foundation class lookup threw an ArgumentError that getClass caught before falling back to objc_getClass. That stops debuggers that break on all exceptions.
|
Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA). View this failed invocation of the CLA check for more information. For the most up to date status, view the checks section at the bottom of the pull request. |
0398ce6 to
e20e95b
Compare
liamappelbe
left a comment
There was a problem hiding this comment.
Looks pretty good. How does this affect the size of the support library?
| ]; | ||
| final mFlags = [...cFlags, ...objCFlags]; | ||
| final linkFlags = cFlags; | ||
| // Link Foundation so that the generated `@Native` class lookups (eg |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #3782 +/- ##
==========================================
- Coverage 85.88% 85.88% -0.01%
==========================================
Files 322 322
Lines 20855 20855
==========================================
- Hits 17912 17911 -1
- Misses 2943 2944 +1
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
|
Thanks! Removed the comment. The size doesn't grow; the dylib ends up 16–24 bytes smaller. I built it with the hook's flags (without the test utils), with and without
The three extra |
Revisions updated by `dart tools/rev_sdk_deps.dart`. core (https://github.com/dart-lang/core/compare/36f57a9..fa0c6b7): fa0c6b77 Fri Nov 6 12:56:58 2026 +0100 Michael Thomsen Release os_detect 2.0.4 (dart-lang/core#1038) dartdoc (https://github.com/dart-lang/dartdoc/compare/03ec6df..7e2508c): 7e2508c6 Wed Nov 11 14:52:22 2026 +0200 Sergey G. Grekhov Add constructor doc comment tests for enums and extension types (dart-lang/dartdoc#4316) 03dfb467 Mon Nov 9 11:00:32 2026 +0200 Sergey G. Grekhov `#3330`. Split test for parameters to separate tests (dart-lang/dartdoc#4314) 23302d53 Mon Nov 9 10:56:34 2026 +0200 Sergey G. Grekhov Add tests for primary constructors (dart-lang/dartdoc#4313) ecosystem (https://github.com/dart-lang/ecosystem/compare/54e1673..1d2b5ff): 1d2b5ff Tue Nov 10 09:04:24 2026 -0800 Kevin Moore feat(repo_manage): add --replace-pattern to report changelog (dart-lang/ecosystem#482) http (https://github.com/dart-lang/http/compare/4646fe6..2bac218): 2bac218 Fri Nov 6 17:49:23 2026 -0800 dart-ecosystem-bot[bot] Tidy: package:cronet_http cdf967c Fri Nov 6 15:40:49 2026 -0800 Brian Quinlan chore(groundkeeper): use stable for flutter (dart-lang/http#2066) 6582177 Thu Nov 5 13:04:35 2026 -0800 Brian Quinlan doc: use timeout as an abort example (dart-lang/http#2062) native (https://github.com/dart-lang/native/compare/6287745..b21ef2d): b21ef2da3 Wed Nov 11 16:07:34 2026 +0530 dhairya05 [json_syntax_generator] Pass the parameter name to ArgumentError.value (dart-lang/native#3787) 20a607e48 Wed Nov 11 07:28:03 2026 -0300 Daco Harkes [code_assets] [hooks] [hooks_runner] Adopt `.g.dart` for generated files (dart-lang/native#3790) cc974ddec Wed Nov 11 19:59:39 2026 +1100 Liam Appelbe [objective_c] Fix `isValidObject` bug on iOS simulator (dart-lang/native#3788) f7edbdee3 Sun Nov 8 13:18:25 2026 +1100 Liam Appelbe [jni] Fix possible receiver NPEs (dart-lang/native#3784) 0ca7d6745 Fri Nov 6 10:20:21 2026 -0300 Daco Harkes [code_assets] [hooks_runner] [native_toolchain_c] Prepare for release (dart-lang/native#3781) baad15ab4 Fri Nov 6 02:56:52 2026 +0100 Kravchenko Igor [objective_c] Link Foundation in the native support library (dart-lang/native#3782) shelf (https://github.com/dart-lang/shelf/compare/9946de5..b175e9f): b175e9f Tue Nov 10 09:14:31 2026 +0530 Muhammad Uvesh shelf_static: ignore invalid If-Modified-Since headers (dart-lang/shelf#557) 02b5f94 Sat Nov 7 23:09:28 2026 +0530 dhairya05 Fix typo in shelf_router docs (dart-lang/shelf#556) test (https://github.com/dart-lang/test/compare/2a9e017..3533ae1): 3533ae1e Tue Nov 10 15:06:08 2026 -0800 Nate Bosch Never retry tearDownAll (dart-lang/test#2815) 5680b0b1 Fri Nov 6 12:52:11 2026 +0100 Sigurd Meldgaard Add globalSetup and addGlobalTearDown APIs for cross-suite setup and teardown (dart-lang/test#2714) b8dc888a Thu Nov 5 18:11:37 2026 -0800 Nate Bosch [checks_codegen] Skip private fields and fields referencing private types (dart-lang/test#2782) 66e062c4 Thu Nov 5 16:05:36 2026 -0800 Nate Bosch [checks_codegen] Generate full field types with imports (dart-lang/test#2781) tools (https://github.com/dart-lang/tools/compare/727fd9c..589d844): 589d844c4 Wed Nov 11 20:27:32 2026 +0300 Hasan Armoush fix(markdown): combine adjacent Text nodes when the element is last in its list (dart-lang/tools#2598) Change-Id: I13acaa7378c86f2c33d88f3c4b163acf2b48ff08 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/576820 Commit-Queue: Nate Bosch <[email protected]> Reviewed-by: Nicholas Shahan <[email protected]>
Description
The ObjC bindings load classes through their
OBJC_CLASS_$_Foosymbols, resolved via theobjective_c.dylibhandle, and fall back toobjc_getClasswhen that lookup throws (#3344). The native support library is linked with-undefined dynamic_lookupand no frameworks, so it only depends onlibSystem:As a result
dlsymcan never find a built-in Foundation class through that handle, and the first use of every Foundation class inpackage:objective_c(NSArray,NSString, ...) throws anArgumentErrorthatgetClasscatches before falling back:The result is still correct, but a debugger that breaks on all exceptions stops at app startup on any Flutter app that uses
path_provider(viapath_provider_foundation), with no way to skip just this exception.This PR links the support library against Foundation, so these symbols resolve through the dylib's dependencies, to the same class pointers
objc_getClassreturns. The dylib's own classes (DOBJC*) still resolve as before, and the fallback is kept for other frameworks.Related Issues
Follow-up to #3344 (which fixed #3338). There is no separate issue for this; happy to file one if preferred.
Testing
test/internal_test.dartthat resolvesOBJC_CLASS_$_NSArraythroughpackage:objective_c/objective_c.dyliband compares it withgetClass('NSArray'). It fails onmainwith theArgumentErrorabove and passes with this change.objective_c.yamlandffigen.ymllocally (macOS 27, Xcode 27.1, Flutter 3.47.9 / Dart 3.13.7):pkgs/objective_c:dart format --set-exit-if-changed,flutter analyze --fatal-infos, the snippet check anddart test(152 tests) pass.example/command_line:dart run lib/main.dartworks.example/flutter_app:flutter build macos,flutter build ios --no-codesignandxcodebuild analyze(warnings as errors) succeed.otool -Lon the bundledobjective_c.frameworknow lists Foundation for both macOS slices and iOS.pkgs/ffigen:dart testgives the same result with and without this change: 901 passed, 1 failed (verify_bindings_testforsdk_variable_test.dart, a bindings diff from the Xcode 27.1 SDK).Note: with the Xcode 27.1 SDK,
test/generate_code_test.dartregeneratesobjective_c_bindings_generated.dartwith a few newdeprecated 27.0.0annotations. That is unrelated to this change and not included.PR Checklist
dart tool/ci.dart --alllocally and resolved all issues identified. (It doesn't coverpkgs/objective_corpkgs/ffigen, so I also ran their workflow jobs, see Testing. Everything passes except 4swift2objcintegration tests, whose expected output differs with the local Xcode 27.1 Swift, and theswift2objcapitool missing-export check. This PR doesn't touchswift2objc, which doesn't depend onobjective_c.)CHANGELOG.mdfor the relevant packages.