Skip to content

Commit efff684

Browse files
authored
Merge pull request #711 from stakx/refactor/simple-ast
Various minor `SimpleAST` refactorings
2 parents 47e9e69 + 0ab4221 commit efff684

13 files changed

+39
-137
lines changed

src/Castle.Core/DynamicProxy/Generators/Emitters/CodeBuilder.cs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2004-2021 Castle Project - http://www.castleproject.org/
1+
// Copyright 2004-2025 Castle Project - http://www.castleproject.org/
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -22,14 +22,12 @@ namespace Castle.DynamicProxy.Generators.Emitters
2222

2323
internal sealed class CodeBuilder
2424
{
25-
private readonly List<LocalReference> locals;
2625
private readonly List<IStatement> statements;
2726
private bool isEmpty;
2827

2928
public CodeBuilder()
3029
{
3130
statements = new List<IStatement>();
32-
locals = new List<LocalReference>();
3331
isEmpty = true;
3432
}
3533

@@ -47,18 +45,11 @@ public CodeBuilder AddStatement(IStatement statement)
4745

4846
public LocalReference DeclareLocal(Type type)
4947
{
50-
var local = new LocalReference(type);
51-
locals.Add(local);
52-
return local;
48+
return new LocalReference(type);
5349
}
5450

5551
internal void Generate(ILGenerator il)
5652
{
57-
foreach (var local in locals)
58-
{
59-
local.Generate(il);
60-
}
61-
6253
foreach (var statement in statements)
6354
{
6455
statement.Emit(il);

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,21 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST
2020
using System.Diagnostics;
2121
using System.Reflection.Emit;
2222

23-
[DebuggerDisplay("{reference} as {type}")]
23+
[DebuggerDisplay("{expression} as {type}")]
2424
internal class AsTypeExpression : IExpression
2525
{
26-
private readonly Reference reference;
26+
private readonly IExpression expression;
2727
private readonly Type type;
2828

29-
public AsTypeExpression(Reference reference, Type type)
29+
public AsTypeExpression(IExpression expression, Type type)
3030
{
31-
this.reference = reference;
31+
this.expression = expression;
3232
this.type = type;
3333
}
3434

3535
public void Emit(ILGenerator gen)
3636
{
37-
reference.Emit(gen);
37+
expression.Emit(gen);
3838
gen.Emit(OpCodes.Isinst, type);
3939
}
4040
}

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

Lines changed: 0 additions & 38 deletions
This file was deleted.

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

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2004-2021 Castle Project - http://www.castleproject.org/
1+
// Copyright 2004-2025 Castle Project - http://www.castleproject.org/
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -42,34 +42,12 @@ public void Emit(ILGenerator gen)
4242
gen.Emit(OpCodes.Initobj, type);
4343
gen.Emit(OpCodes.Ldloc, local);
4444
}
45-
else if (type.IsByRef)
46-
{
47-
EmitByRef(gen);
48-
}
4945
else
5046
{
5147
throw new NotImplementedException("Can't emit default value for type " + type);
5248
}
5349
}
5450

55-
private void EmitByRef(ILGenerator gen)
56-
{
57-
var elementType = type.GetElementType();
58-
if (IsPrimitiveOrClass(elementType))
59-
{
60-
OpCodeUtil.EmitLoadOpCodeForDefaultValueOfType(gen, elementType);
61-
OpCodeUtil.EmitStoreIndirectOpCodeForType(gen, elementType);
62-
}
63-
else if (elementType.IsGenericParameter || elementType.IsValueType)
64-
{
65-
gen.Emit(OpCodes.Initobj, elementType);
66-
}
67-
else
68-
{
69-
throw new NotImplementedException("Can't emit default value for reference of type " + elementType);
70-
}
71-
}
72-
7351
private bool IsPrimitiveOrClass(Type type)
7452
{
7553
if (type.IsPrimitive && type != typeof(IntPtr) && type != typeof(UIntPtr))

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST
2020
using System.Reflection;
2121
using System.Reflection.Emit;
2222

23-
[DebuggerDisplay("{fieldBuilder.Name} ({fieldBuilder.FieldType})")]
23+
[DebuggerDisplay("{field.Name} ({field.FieldType})")]
2424
internal class FieldReference : Reference
2525
{
2626
private readonly FieldInfo field;

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

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,7 @@ internal class IfNullExpression : IExpression, IStatement
2323
{
2424
private readonly IExpressionOrStatement ifNotNull;
2525
private readonly IExpressionOrStatement ifNull;
26-
private readonly Reference? reference;
27-
private readonly IExpression? expression;
28-
29-
public IfNullExpression(Reference reference, IExpressionOrStatement ifNull, IExpressionOrStatement ifNotNull = null)
30-
{
31-
this.reference = reference ?? throw new ArgumentNullException(nameof(reference));
32-
this.ifNull = ifNull;
33-
this.ifNotNull = ifNotNull;
34-
}
26+
private readonly IExpression expression;
3527

3628
public IfNullExpression(IExpression expression, IExpressionOrStatement ifNull, IExpressionOrStatement ifNotNull = null)
3729
{
@@ -42,15 +34,7 @@ public IfNullExpression(IExpression expression, IExpressionOrStatement ifNull, I
4234

4335
public void Emit(ILGenerator gen)
4436
{
45-
if (reference != null)
46-
{
47-
reference.Emit(gen);
48-
}
49-
else if (expression != null)
50-
{
51-
expression.Emit(gen);
52-
}
53-
37+
expression.Emit(gen);
5438
var notNull = gen.DefineLabel();
5539
gen.Emit(OpCodes.Brtrue_S, notNull);
5640
ifNull.Emit(gen);

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,11 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST
2222
using System.Reflection.Emit;
2323

2424
/// <summary>
25-
/// Wraps a reference that is passed
26-
/// ByRef and provides indirect load/store support.
25+
/// Represents the storage location <c>X</c> referenced by a <see cref="Reference"/>
26+
/// holding a managed pointer ("by-ref") <c>&amp;X</c> to it.
27+
/// It essentially has the same function as the pointer indirection / dereferencing operator <c>*</c>.
2728
/// </summary>
28-
[DebuggerDisplay("&{OwnerReference}")]
29+
[DebuggerDisplay("*{byRefReference}")]
2930
internal class IndirectReference : Reference
3031
{
3132
private readonly Reference byRefReference;

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,32 +23,32 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST
2323
[DebuggerDisplay("local {Type}")]
2424
internal class LocalReference : Reference
2525
{
26-
private LocalBuilder? localBuilder;
26+
private LocalBuilder? local;
2727

2828
public LocalReference(Type type)
2929
: base(type)
3030
{
3131
}
3232

33-
public override void Generate(ILGenerator gen)
34-
{
35-
localBuilder = gen.DeclareLocal(base.Type);
36-
}
37-
3833
public override void EmitAddress(ILGenerator gen)
3934
{
40-
gen.Emit(OpCodes.Ldloca, localBuilder!);
35+
gen.Emit(OpCodes.Ldloca, GetInitializedLocal(gen));
4136
}
4237

4338
public override void Emit(ILGenerator gen)
4439
{
45-
gen.Emit(OpCodes.Ldloc, localBuilder!);
40+
gen.Emit(OpCodes.Ldloc, GetInitializedLocal(gen));
4641
}
4742

4843
public override void EmitStore(IExpression value, ILGenerator gen)
4944
{
5045
value.Emit(gen);
51-
gen.Emit(OpCodes.Stloc, localBuilder!);
46+
gen.Emit(OpCodes.Stloc, GetInitializedLocal(gen));
47+
}
48+
49+
private LocalBuilder GetInitializedLocal(ILGenerator gen)
50+
{
51+
return local ??= gen.DeclareLocal(Type);
5252
}
5353
}
5454
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2004-2021 Castle Project - http://www.castleproject.org/
1+
// Copyright 2004-2025 Castle Project - http://www.castleproject.org/
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -19,19 +19,19 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST
1919

2020
internal class NewArrayExpression : IExpression
2121
{
22-
private readonly Type arrayType;
22+
private readonly Type elementType;
2323
private readonly int size;
2424

25-
public NewArrayExpression(int size, Type arrayType)
25+
public NewArrayExpression(int size, Type elementType)
2626
{
2727
this.size = size;
28-
this.arrayType = arrayType;
28+
this.elementType = elementType;
2929
}
3030

3131
public void Emit(ILGenerator gen)
3232
{
3333
gen.Emit(OpCodes.Ldc_I4, size);
34-
gen.Emit(OpCodes.Newarr, arrayType);
34+
gen.Emit(OpCodes.Newarr, elementType);
3535
}
3636
}
3737
}

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,5 @@ public Type Type
3838
public abstract void Emit(ILGenerator gen);
3939

4040
public abstract void EmitStore(IExpression value, ILGenerator gen);
41-
42-
public virtual void Generate(ILGenerator gen)
43-
{
44-
}
4541
}
4642
}

0 commit comments

Comments
 (0)