[TrimmableTypeMap] Fix constructor UCO generation#11296
Open
Copilot wants to merge 7 commits into
Open
Conversation
Agent-Logs-Url: https://github.com/dotnet/android/sessions/2a0c90c9-484f-417c-875c-bea6afda1c98 Co-authored-by: simonrozsival <374616+simonrozsival@users.noreply.github.com>
Agent-Logs-Url: https://github.com/dotnet/android/sessions/2a0c90c9-484f-417c-875c-bea6afda1c98 Co-authored-by: simonrozsival <374616+simonrozsival@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Fix generated constructor UCO methods in TrimmableTypeMap
Fix trimmable typemap constructor UCO generation
May 6, 2026
Contributor
There was a problem hiding this comment.
Pull request overview
This PR fixes trimmable typemap-generated UCO constructor wrappers so they invoke the correct managed constructor when Java calls a constructor with parameters (instead of always activating via the (IntPtr, JniHandleOwnership) activation constructor). This aligns constructor behavior with the Java signature and ensures JNI arguments are properly resolved (including object-handle conversion).
Changes:
- Extend scanner/model to carry concrete managed constructor parameter types (and declaring type/assembly) into the typemap model.
- Update typemap IL emission to support direct managed constructor invocation, converting JNI object handles via
JavaConvert.FromJniHandle<T>()and setting peer references before the call. - Add generator tests that inspect emitted IL to verify direct constructor calls and JNI handle conversion.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/Generator/TypeMapAssemblyGeneratorTests.cs | Adds IL-inspection regression tests for UCO constructor direct-call behavior and handle conversion. |
| src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerScanner.cs | Captures managed constructor parameter type info (and resolves parameter type assemblies) for constructors during scanning. |
| src/Microsoft.Android.Sdk.TrimmableTypeMap/Scanner/JavaPeerInfo.cs | Extends scanner data model with managed constructor parameter metadata and introduces ManagedParameterInfo. |
| src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/TypeMapAssemblyEmitter.cs | Emits direct managed-constructor activation IL path and supports encoding managed parameter types + JavaConvert.FromJniHandle<T>() calls. |
| src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/ModelBuilder.cs | Plumbs constructor parameter metadata into UcoConstructorData for emitter consumption. |
| src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/Model/TypeMapAssemblyData.cs | Extends UcoConstructorData with managed constructor parameter metadata and declaring type info. |
| src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/MetadataHelper.cs | Updates typemap content fingerprint to include UCO constructor managed-parameter metadata (but needs a null vs empty fix). |
Comment on lines
+51
to
+52
| writer.Write (0); | ||
| } else { |
Comment on lines
892
to
901
| bool isConstructor = registerInfo.JniName == "<init>" || registerInfo.JniName == ".ctor"; | ||
| bool isExport = exportInfo is not null; | ||
| string managedName = index.Reader.GetString (methodDef.Name); | ||
| string jniSignature = registerInfo.Signature ?? "()V"; | ||
|
|
||
| string declaringTypeName = ""; | ||
| string declaringAssemblyName = ""; | ||
| ParseConnectorDeclaringType (registerInfo.Connector, out declaringTypeName, out declaringAssemblyName); | ||
| var sig = methodDef.DecodeSignature (SignatureTypeProvider.Instance, genericContext: default); | ||
|
|
Member
|
@copilot address review comments |
Agent-Logs-Url: https://github.com/dotnet/android/sessions/b8ec3a3d-baa2-4abe-8db9-4a2aa9cfb59c Co-authored-by: simonrozsival <374616+simonrozsival@users.noreply.github.com>
Agent-Logs-Url: https://github.com/dotnet/android/sessions/b8ec3a3d-baa2-4abe-8db9-4a2aa9cfb59c Co-authored-by: simonrozsival <374616+simonrozsival@users.noreply.github.com>
Contributor
Author
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Generated trimmable typemap constructor UCO wrappers were activating peers through the
(IntPtr, JniHandleOwnership)constructor even when Java invoked a managed constructor with parameters. This skipped JNI argument resolution and called the wrong constructor.Constructor metadata flow
UCO IL generation
JavaConvert.FromJniHandle<T>().Regression coverage
nctor_*_ucocalling the matching managed constructor.Example generated behavior now follows the Java constructor signature: