Skip to content

Commit

Permalink
[msr] Handle IntPtr.Zero correctly.
Browse files Browse the repository at this point in the history
  • Loading branch information
rolfbjarne committed Aug 10, 2023
1 parent 4b16a0f commit 38771ad
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 0 deletions.
7 changes: 7 additions & 0 deletions tools/dotnet-linker/AppBundleRewriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,12 @@ public TypeReference System_IntPtr {
}
}

public FieldReference System_IntPtr_Zero {
get {
return GetFieldReference (CorlibAssembly, System_IntPtr, "Zero", "System.IntPtr::Zero", out var _);
}
}

public TypeReference System_Nullable_1 {
get {
return GetTypeReference (CorlibAssembly, "System.Nullable`1", out var _);
Expand Down Expand Up @@ -1174,6 +1180,7 @@ public void ClearCurrentAssembly ()
current_assembly = null;
type_map.Clear ();
method_map.Clear ();
field_map.Clear ();
}

public CustomAttribute CreateDynamicDependencyAttribute (string memberSignature)
Expand Down
13 changes: 13 additions & 0 deletions tools/dotnet-linker/Steps/ManagedRegistrarStep.cs
Original file line number Diff line number Diff line change
Expand Up @@ -929,11 +929,22 @@ bool EmitConversion (MethodDefinition method, ILProcessor il, TypeReference type
var loadHandle = il.Create (OpCodes.Ldloc, tmpVariable);
var done = il.Create (OpCodes.Nop);
il.Emit (OpCodes.Stloc, tmpVariable);
// objectVariable = null
il.Emit (OpCodes.Ldnull);
il.Emit (OpCodes.Stloc, objectVariable);
// if (handle == IntPtr.Zero)
// goto done;
il.Emit (OpCodes.Ldloc, tmpVariable); // handle
il.Emit (OpCodes.Ldsfld, abr.System_IntPtr_Zero);
il.Emit (OpCodes.Beq, done);
// objectVariable = TryGetNSObject (handle, false) as TargetType
il.Emit (OpCodes.Ldloc, tmpVariable); // handle
il.Emit (OpCodes.Ldc_I4_0); // false
il.Emit (OpCodes.Call, abr.Runtime_TryGetNSObject);
il.Emit (OpCodes.Castclass, targetType);
il.Emit (OpCodes.Stloc, objectVariable);
// if (objectVariable is null)
// objectVariable = new TargetType (handle, false)
il.Emit (OpCodes.Ldloc, objectVariable);
il.Emit (OpCodes.Brfalse, loadHandle);
il.Emit (OpCodes.Br, done);
Expand All @@ -943,6 +954,8 @@ bool EmitConversion (MethodDefinition method, ILProcessor il, TypeReference type
il.Emit (OpCodes.Ldc_I4_0); // false
il.Emit (OpCodes.Newobj, method.Module.ImportReference (ctor));
il.Emit (OpCodes.Stloc, objectVariable);
// done:
// (load objectVariable on the stack)
il.Append (done);
il.Emit (OpCodes.Ldloc, objectVariable);
}
Expand Down

0 comments on commit 38771ad

Please sign in to comment.