[ExposeObjCDirect] Adding a flag to expose symbols with objc_direct #170616
+72
−12
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
TL;DR
This is a stack of PRs implementing features to expose direct methods ABI.
You can see the RFC, design, and discussion here.
#170616 Flag -fexpose-objc-direct set up
#170617 Code refactoring to ease later reviews
#170618 Thunk generation
#170619 Optimizations, some class objects can be known to be realized
Implementation details
Add a flag. I used
expose-direct-methodinstead of-fobjc-direct-caller-thunksin the proposal for two reasons:a. It conveys our intention more clearly, that we are trying to remove the
\01byte before the name of direct method so the developers can expose a symbol if they wantb. Much of the code is actually handling corner cases of var_arg, which don't have a thunk. Thus the name
thunkcan be confusing.Clean up and set up helper functions to implement later
a.
canMessageReceiverBeNull/canClassObjectBeUnrealizedthese two functions will be helpful later to determine which function (true implementation or nil check thunk) we should dispatch a call to. Formatting.b.
getSymbolNameForMethodhas a new argumentincludePrefixByte, which allows us to erase the prefixing\01when the flag is enabledc.
shouldExposeSymbolis the single source of truth of what we should do. It not only checks for the flag, but also whether the method is qualified and we are in the right runtime. A method thatshouldExposeSymbolis eithershouldHaveNilCheckThunkorshouldHaveNilCheckInline.Tests
None, existing ones shouldn't break