Skip to content

Commit e8ac902

Browse files
Reuse metadata signature encoder
Build the cached signatures through the existing SRM encoder so the optimization stays small and preserves the established encoding path. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
1 parent 3ebb677 commit e8ac902

2 files changed

Lines changed: 22 additions & 24 deletions

File tree

src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/PEAssemblyBuilder.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -159,15 +159,18 @@ public AssemblyReferenceHandle FindOrAddAssemblyRef (string assemblyName)
159159
/// Adds a member reference using the reusable signature blob builder.
160160
/// </summary>
161161
public MemberReferenceHandle AddMemberRef (EntityHandle parent, string name, Action<BlobEncoder> encodeSig)
162+
=> AddMemberRef (parent, name, GetOrAddSignature (encodeSig));
163+
164+
public MemberReferenceHandle AddMemberRef (EntityHandle parent, string name, BlobHandle signature)
165+
=> Metadata.AddMemberReference (parent, Metadata.GetOrAddString (name), signature);
166+
167+
public BlobHandle GetOrAddSignature (Action<BlobEncoder> encodeSig)
162168
{
163169
_sigBlob.Clear ();
164170
encodeSig (new BlobEncoder (_sigBlob));
165-
return AddMemberRef (parent, name, Metadata.GetOrAddBlob (_sigBlob));
171+
return Metadata.GetOrAddBlob (_sigBlob);
166172
}
167173

168-
public MemberReferenceHandle AddMemberRef (EntityHandle parent, string name, BlobHandle signature)
169-
=> Metadata.AddMemberReference (parent, Metadata.GetOrAddString (name), signature);
170-
171174
/// <summary>
172175
/// Resolves a <see cref="TypeRefData"/> to a TypeReference/TypeSpecification handle, with caching.
173176
/// </summary>
@@ -416,11 +419,9 @@ public MethodDefinitionHandle EmitBody (string name, MethodAttributes attrs,
416419
Action<BlobEncoder> encodeSig, Action<TrackedInstructionEncoder> emitIL,
417420
Action<BlobBuilder>? encodeLocals, bool useBranches)
418421
{
419-
_sigBlob.Clear ();
420-
encodeSig (new BlobEncoder (_sigBlob));
421422
// Capture the sig blob handle before emitIL, because emitIL callbacks
422423
// may call AddMemberRef which clears and repopulates _sigBlob.
423-
return EmitBody (name, attrs, Metadata.GetOrAddBlob (_sigBlob), emitIL, encodeLocals, useBranches);
424+
return EmitBody (name, attrs, GetOrAddSignature (encodeSig), emitIL, encodeLocals, useBranches);
424425
}
425426

426427
MethodDefinitionHandle EmitBody (string name, MethodAttributes attrs,

src/Microsoft.Android.Sdk.TrimmableTypeMap/Generator/TypeMapAssemblyEmitter.cs

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -974,30 +974,27 @@ MemberReferenceHandle AddActivationCtorRef (EntityHandle declaringTypeRef)
974974
BlobHandle GetActivationCtorSignature ()
975975
{
976976
if (_activationCtorSignature.IsNil) {
977-
var blob = new BlobBuilder (8);
978-
blob.WriteByte ((byte) SignatureAttributes.Instance);
979-
blob.WriteCompressedInteger (2);
980-
blob.WriteByte ((byte) SignatureTypeCode.Void);
981-
blob.WriteByte ((byte) SignatureTypeCode.IntPtr);
982-
blob.WriteByte ((byte) SignatureTypeKind.ValueType);
983-
blob.WriteCompressedInteger (CodedIndex.TypeDefOrRefOrSpec (_jniHandleOwnershipRef));
984-
_activationCtorSignature = _pe.Metadata.GetOrAddBlob (blob);
977+
_activationCtorSignature = _pe.GetOrAddSignature (
978+
sig => sig.MethodSignature (isInstanceMethod: true).Parameters (2,
979+
rt => rt.Void (),
980+
p => {
981+
p.AddParameter ().Type ().IntPtr ();
982+
p.AddParameter ().Type ().Type (_jniHandleOwnershipRef, true);
983+
}));
985984
}
986985
return _activationCtorSignature;
987986
}
988987

989988
BlobHandle GetCreateInstanceSignature ()
990989
{
991990
if (_createInstanceSignature.IsNil) {
992-
var blob = new BlobBuilder (8);
993-
blob.WriteByte ((byte) SignatureAttributes.Instance);
994-
blob.WriteCompressedInteger (2);
995-
blob.WriteByte ((byte) SignatureTypeKind.Class);
996-
blob.WriteCompressedInteger (CodedIndex.TypeDefOrRefOrSpec (_iJavaPeerableRef));
997-
blob.WriteByte ((byte) SignatureTypeCode.IntPtr);
998-
blob.WriteByte ((byte) SignatureTypeKind.ValueType);
999-
blob.WriteCompressedInteger (CodedIndex.TypeDefOrRefOrSpec (_jniHandleOwnershipRef));
1000-
_createInstanceSignature = _pe.Metadata.GetOrAddBlob (blob);
991+
_createInstanceSignature = _pe.GetOrAddSignature (
992+
sig => sig.MethodSignature (isInstanceMethod: true).Parameters (2,
993+
rt => rt.Type ().Type (_iJavaPeerableRef, false),
994+
p => {
995+
p.AddParameter ().Type ().IntPtr ();
996+
p.AddParameter ().Type ().Type (_jniHandleOwnershipRef, true);
997+
}));
1001998
}
1002999
return _createInstanceSignature;
10031000
}

0 commit comments

Comments
 (0)