Skip to content

Commit 50a7f6d

Browse files
committed
Reference impls declare their own "owner" where appropriate
1 parent bd1ca74 commit 50a7f6d

File tree

9 files changed

+20
-37
lines changed

9 files changed

+20
-37
lines changed

src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST
2424
internal class ArgumentReference : TypeReference
2525
{
2626
public ArgumentReference(Type argumentType)
27-
: base(null, argumentType)
27+
: base(argumentType)
2828
{
2929
Position = -1;
3030
}
3131

3232
public ArgumentReference(Type argumentType, int position)
33-
: base(null, argumentType)
33+
: base(argumentType)
3434
{
3535
Position = position;
3636
}
@@ -75,7 +75,6 @@ public override void StoreReference(IExpression value, ILGenerator gen)
7575
throw new InvalidOperationException("ArgumentReference uninitialized");
7676
}
7777

78-
OwnerReference?.Emit(gen);
7978
value.Emit(gen);
8079
gen.Emit(OpCodes.Starg, Position);
8180
}

src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,9 @@ internal class AsTypeReference : Reference
2727
private readonly Type type;
2828

2929
public AsTypeReference(Reference reference, Type type)
30-
: base(SelfReference.Self)
3130
{
3231
this.reference = reference;
3332
this.type = type;
34-
if (reference == OwnerReference)
35-
{
36-
OwnerReference = null;
37-
}
3833
}
3934

4035
public override void LoadAddressOfReference(ILGenerator gen)

src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ internal class ByRefReference : TypeReference
2727
private readonly LocalReference localReference;
2828

2929
public ByRefReference(LocalReference localReference)
30-
: base(null, localReference.Type)
30+
: base(localReference.Type)
3131
{
3232
this.localReference = localReference;
3333
}

src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,25 +28,21 @@ internal class FieldReference : Reference
2828
private readonly bool isStatic;
2929

3030
public FieldReference(FieldInfo field)
31-
: base(SelfReference.Self)
3231
{
3332
this.field = field;
3433
if ((field.Attributes & FieldAttributes.Static) != 0)
3534
{
3635
isStatic = true;
37-
owner = null;
3836
}
3937
}
4038

4139
public FieldReference(FieldBuilder fieldBuilder)
42-
: base(SelfReference.Self)
4340
{
4441
this.fieldBuilder = fieldBuilder;
4542
field = fieldBuilder;
4643
if ((fieldBuilder.Attributes & FieldAttributes.Static) != 0)
4744
{
4845
isStatic = true;
49-
owner = null;
5046
}
5147
}
5248

@@ -68,6 +64,7 @@ public override void LoadAddressOfReference(ILGenerator gen)
6864
}
6965
else
7066
{
67+
SelfReference.Self.Emit(gen);
7168
gen.Emit(OpCodes.Ldflda, Reference);
7269
}
7370
}
@@ -80,20 +77,22 @@ public override void LoadReference(ILGenerator gen)
8077
}
8178
else
8279
{
80+
SelfReference.Self.Emit(gen);
8381
gen.Emit(OpCodes.Ldfld, Reference);
8482
}
8583
}
8684

8785
public override void StoreReference(IExpression value, ILGenerator gen)
8886
{
89-
OwnerReference?.Emit(gen);
90-
value.Emit(gen);
9187
if (isStatic)
9288
{
89+
value.Emit(gen);
9390
gen.Emit(OpCodes.Stsfld, Reference);
9491
}
9592
else
9693
{
94+
SelfReference.Self.Emit(gen);
95+
value.Emit(gen);
9796
gen.Emit(OpCodes.Stfld, Reference);
9897
}
9998
}

src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,30 +28,35 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST
2828
[DebuggerDisplay("&{OwnerReference}")]
2929
internal class IndirectReference : TypeReference
3030
{
31-
public IndirectReference(TypeReference byRefReference) :
32-
base(byRefReference, byRefReference.Type.GetElementType())
31+
private readonly TypeReference byRefReference;
32+
33+
public IndirectReference(TypeReference byRefReference)
34+
: base(byRefReference.Type.GetElementType())
3335
{
3436
if (!byRefReference.Type.IsByRef)
3537
{
3638
throw new ArgumentException("Expected an IsByRef reference", nameof(byRefReference));
3739
}
40+
41+
this.byRefReference = byRefReference;
3842
}
3943

4044
public override void LoadAddressOfReference(ILGenerator gen)
4145
{
42-
// Load of owner reference takes care of this.
46+
byRefReference.Emit(gen);
4347
}
4448

4549
// TODO: Better name
4650

4751
public override void LoadReference(ILGenerator gen)
4852
{
53+
byRefReference.Emit(gen);
4954
OpCodeUtil.EmitLoadIndirectOpCodeForType(gen, Type);
5055
}
5156

5257
public override void StoreReference(IExpression value, ILGenerator gen)
5358
{
54-
OwnerReference?.Emit(gen);
59+
byRefReference.Emit(gen);
5560
value.Emit(gen);
5661
OpCodeUtil.EmitStoreIndirectOpCodeForType(gen, Type);
5762
}

src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ internal class LocalReference : TypeReference
2626
private LocalBuilder? localBuilder;
2727

2828
public LocalReference(Type type)
29-
: base(null, type)
29+
: base(type)
3030
{
3131
}
3232

@@ -47,7 +47,6 @@ public override void LoadReference(ILGenerator gen)
4747

4848
public override void StoreReference(IExpression value, ILGenerator gen)
4949
{
50-
OwnerReference?.Emit(gen);
5150
value.Emit(gen);
5251
gen.Emit(OpCodes.Stloc, localBuilder!);
5352
}

src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,6 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST
2020

2121
internal abstract class Reference : IExpression
2222
{
23-
protected Reference? owner;
24-
25-
protected Reference(Reference? owner)
26-
{
27-
this.owner = owner;
28-
}
29-
30-
public Reference? OwnerReference
31-
{
32-
get { return owner; }
33-
set { owner = value; }
34-
}
35-
3623
public abstract void LoadAddressOfReference(ILGenerator gen);
3724

3825
public abstract void LoadReference(ILGenerator gen);
@@ -45,7 +32,6 @@ public virtual void Generate(ILGenerator gen)
4532

4633
public void Emit(ILGenerator gen)
4734
{
48-
OwnerReference?.Emit(gen);
4935
LoadReference(gen);
5036
}
5137
}

src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ internal class SelfReference : Reference
2525
{
2626
public static readonly SelfReference Self = new SelfReference();
2727

28-
protected SelfReference() : base(null)
28+
protected SelfReference()
2929
{
3030
}
3131

src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/TypeReference.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ internal abstract class TypeReference : Reference
2020
{
2121
private readonly Type type;
2222

23-
protected TypeReference(Reference owner, Type type) : base(owner)
23+
protected TypeReference(Type type)
2424
{
2525
this.type = type;
2626
}

0 commit comments

Comments
 (0)