Skip to content

Commit eb33bae

Browse files
committed
ifnotnull optimiert
1 parent 6fd138a commit eb33bae

File tree

7 files changed

+8
-21
lines changed

7 files changed

+8
-21
lines changed

DeepCopy.Fody/Copy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ private bool TryCopy(PropertyDefinition property, out IEnumerable<Instruction> i
4444

4545
if (property.PropertyType.IsArray)
4646
{
47-
using (new IfNotNull(this, list, source))
47+
using (new IfNotNull(list, source))
4848
list.AddRange(CopyArray(property));
4949
return true;
5050
}

DeepCopy.Fody/CopyArray.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ private IEnumerable<Instruction> CopyArray(PropertyDefinition property)
1313

1414
var loopStart = Instruction.Create(OpCodes.Nop);
1515
var index = NewVariable(TypeSystem.Int32Definition);
16-
var valueCheck = NewVariable(TypeSystem.BooleanDefinition);
1716
var conditionStart = Instruction.Create(OpCodes.Ldloc, index);
1817

1918
var list = new List<Instruction>
@@ -49,10 +48,8 @@ private IEnumerable<Instruction> CopyArray(PropertyDefinition property)
4948
list.Add(Instruction.Create(OpCodes.Ldlen));
5049
list.Add(Instruction.Create(OpCodes.Conv_I4));
5150
list.Add(Instruction.Create(OpCodes.Clt));
52-
list.Add(Instruction.Create(OpCodes.Stloc, valueCheck));
5351

5452
// loop end
55-
list.Add(Instruction.Create(OpCodes.Ldloc, valueCheck));
5653
list.Add(Instruction.Create(OpCodes.Brtrue_S, loopStart));
5754

5855
return list;

DeepCopy.Fody/CopyDictionary.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ private IEnumerable<Instruction> CopyDictionary(TypeReference type, ValueSource
1313
var typeKeyValuePair = ImportType(typeof(KeyValuePair<,>), typesOfArguments);
1414

1515
var list = new List<Instruction>();
16-
using (new IfNotNull(this, list, source, target.IsTargetingBase))
16+
using (new IfNotNull(list, source, target.IsTargetingBase))
1717
{
1818
VariableDefinition variable = null;
1919
if (!target.IsTargetingBase)

DeepCopy.Fody/CopyList.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ private IEnumerable<Instruction> CopyList(TypeReference type, ValueSource source
1313
var typeOfArgument = type.GetGenericArguments().Single();
1414

1515
var list = new List<Instruction>();
16-
using (new IfNotNull(this, list, source, target.IsTargetingBase))
16+
using (new IfNotNull(list, source, target.IsTargetingBase))
1717
{
1818
VariableDefinition variable = null;
1919
if (!target.IsTargetingBase)

DeepCopy.Fody/CopySet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ private IEnumerable<Instruction> CopySet(TypeReference type, ValueSource source,
1313
var typeOfArgument = type.GetGenericArguments().Single();
1414

1515
var list = new List<Instruction>();
16-
using (new IfNotNull(this, list, source, target.IsTargetingBase))
16+
using (new IfNotNull(list, source, target.IsTargetingBase))
1717
{
1818
VariableDefinition variable = null;
1919
if (!target.IsTargetingBase)

DeepCopy.Fody/DeepCopyMethodExtension.cs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,6 @@ private void BuildMultiTypeSwitchMethodBody(MethodDefinition method, TypeDefinit
7070
{
7171
var body = method.Body;
7272
body.InitLocals = true;
73-
body.Variables.Add(new VariableDefinition(TypeSystem.BooleanDefinition));
74-
body.Variables.Add(new VariableDefinition(baseType));
7573
body.Instructions.Clear();
7674

7775
var processor = body.GetILProcessor();
@@ -82,12 +80,8 @@ private void BuildMultiTypeSwitchMethodBody(MethodDefinition method, TypeDefinit
8280
processor.Emit(OpCodes.Ldarg_0);
8381
processor.Emit(OpCodes.Ldnull);
8482
processor.Emit(OpCodes.Ceq);
85-
processor.Emit(OpCodes.Stloc_0);
86-
processor.Emit(OpCodes.Ldloc_0);
8783
processor.Emit(OpCodes.Brfalse_S, startType);
8884
processor.Emit(OpCodes.Ldnull);
89-
processor.Emit(OpCodes.Stloc_1);
90-
processor.Emit(OpCodes.Ldloc_1);
9185
processor.Emit(OpCodes.Ret);
9286

9387
var copiedTypes = new List<TypeDefinition>();
@@ -120,8 +114,6 @@ private void BuildMultiTypeSwitchMethodBody(MethodDefinition method, TypeDefinit
120114
processor.Emit(OpCodes.Ldloc, variable);
121115

122116
processor.Emit(OpCodes.Newobj, constructor);
123-
processor.Emit(OpCodes.Stloc_1);
124-
processor.Emit(OpCodes.Ldloc_1);
125117
processor.Emit(OpCodes.Ret);
126118

127119
processor.Append(endType);

DeepCopy.Fody/Utils/IfNotNull.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,22 @@ public class IfNotNull : IDisposable
99
private readonly Instruction _last;
1010
private readonly IList<Instruction> _instructions;
1111

12-
public IfNotNull(ModuleWeaver moduleWeaver, List<Instruction> instructions, ValueSource source, bool skip = false)
12+
public IfNotNull(List<Instruction> instructions, ValueSource source, bool skip = false)
1313
{
14+
if (skip)
15+
return;
1416
_instructions = instructions;
1517
_last = Instruction.Create(OpCodes.Nop);
1618

17-
var nullCheck = moduleWeaver.NewVariable(moduleWeaver.TypeSystem.BooleanDefinition);
18-
1919
instructions.AddRange(source);
2020
instructions.Add(Instruction.Create(OpCodes.Ldnull));
2121
instructions.Add(Instruction.Create(OpCodes.Cgt_Un));
22-
instructions.Add(Instruction.Create(OpCodes.Stloc, nullCheck));
23-
instructions.Add(Instruction.Create(OpCodes.Ldloc, nullCheck));
2422
instructions.Add(Instruction.Create(OpCodes.Brfalse, _last));
2523
}
2624

2725
public void Dispose()
2826
{
29-
_instructions.Add(_last);
27+
_instructions?.Add(_last);
3028
}
3129
}
3230
}

0 commit comments

Comments
 (0)