From 71af9faae14827b868a34040ed40978b1304e06a Mon Sep 17 00:00:00 2001 From: Dominique Schuppli Date: Mon, 15 Dec 2025 23:49:23 +0100 Subject: [PATCH 1/5] Merge `ArgumentsUtil.EmitLoadOwnerAndReference` into `Reference.Emit` --- .../Generators/Emitters/ArgumentsUtil.cs | 14 +------------- .../Emitters/SimpleAST/AssignArgumentStatement.cs | 6 ++++-- .../Emitters/SimpleAST/AssignArrayStatement.cs | 6 ++++-- .../Emitters/SimpleAST/AssignStatement.cs | 6 ++++-- .../Emitters/SimpleAST/IfNullExpression.cs | 10 ++++++---- .../SimpleAST/LoadRefArrayElementExpression.cs | 6 ++++-- .../SimpleAST/MethodInvocationExpression.cs | 12 +++++++----- .../Generators/Emitters/SimpleAST/Reference.cs | 13 ++++++++----- .../SimpleAST/ReferencesToObjectArrayExpression.cs | 8 +++++--- .../Emitters/SimpleAST/ReturnStatement.cs | 10 ++++++---- 10 files changed, 49 insertions(+), 42 deletions(-) diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/ArgumentsUtil.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/ArgumentsUtil.cs index 2e0396df26..388ceb0282 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/ArgumentsUtil.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/ArgumentsUtil.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -58,18 +58,6 @@ public static IExpression[] ConvertToArgumentReferenceExpression(ParameterInfo[] return arguments; } - public static void EmitLoadOwnerAndReference(Reference reference, ILGenerator il) - { - if (reference == null) - { - return; - } - - EmitLoadOwnerAndReference(reference.OwnerReference, il); - - reference.LoadReference(il); - } - public static Type[] GetTypes(ParameterInfo[] parameters) { var types = new Type[parameters.Length]; diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignArgumentStatement.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignArgumentStatement.cs index 5c4b2a70f8..2967821031 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignArgumentStatement.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignArgumentStatement.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System.Reflection.Emit; @@ -29,7 +31,7 @@ public AssignArgumentStatement(ArgumentReference argument, IExpression expressio public void Emit(ILGenerator gen) { - ArgumentsUtil.EmitLoadOwnerAndReference(argument, gen); + argument.Emit(gen); expression.Emit(gen); } } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignArrayStatement.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignArrayStatement.cs index b8ea4d599f..d02432c480 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignArrayStatement.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignArrayStatement.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System.Reflection.Emit; @@ -31,7 +33,7 @@ public AssignArrayStatement(Reference targetArray, int targetPosition, IExpressi public void Emit(ILGenerator il) { - ArgumentsUtil.EmitLoadOwnerAndReference(targetArray, il); + targetArray.Emit(il); il.Emit(OpCodes.Ldc_I4, targetPosition); diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignStatement.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignStatement.cs index 4d33b78ac9..7f242ce4de 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignStatement.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignStatement.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System.Reflection.Emit; @@ -29,7 +31,7 @@ public AssignStatement(Reference target, IExpression expression) public void Emit(ILGenerator gen) { - ArgumentsUtil.EmitLoadOwnerAndReference(target.OwnerReference, gen); + target.OwnerReference?.Emit(gen); expression.Emit(gen); target.StoreReference(gen); } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IfNullExpression.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IfNullExpression.cs index 333a732ac2..470ea9af7f 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IfNullExpression.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IfNullExpression.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System; @@ -21,8 +23,8 @@ internal class IfNullExpression : IExpression, IStatement { private readonly IExpressionOrStatement ifNotNull; private readonly IExpressionOrStatement ifNull; - private readonly Reference reference; - private readonly IExpression expression; + private readonly Reference? reference; + private readonly IExpression? expression; public IfNullExpression(Reference reference, IExpressionOrStatement ifNull, IExpressionOrStatement ifNotNull = null) { @@ -42,7 +44,7 @@ public void Emit(ILGenerator gen) { if (reference != null) { - ArgumentsUtil.EmitLoadOwnerAndReference(reference, gen); + reference.Emit(gen); } else if (expression != null) { diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LoadRefArrayElementExpression.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LoadRefArrayElementExpression.cs index 311a46c432..d6db83640d 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LoadRefArrayElementExpression.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LoadRefArrayElementExpression.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System.Reflection.Emit; @@ -29,7 +31,7 @@ public LoadRefArrayElementExpression(int index, Reference arrayReference) public void Emit(ILGenerator gen) { - ArgumentsUtil.EmitLoadOwnerAndReference(arrayReference, gen); + arrayReference.Emit(gen); index.Emit(gen); gen.Emit(OpCodes.Ldelem_Ref); } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/MethodInvocationExpression.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/MethodInvocationExpression.cs index 4261758eea..55c7ea0672 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/MethodInvocationExpression.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/MethodInvocationExpression.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System.Reflection; @@ -21,7 +23,7 @@ internal class MethodInvocationExpression : IExpression, IStatement { protected readonly IExpression[] args; protected readonly MethodInfo method; - protected readonly Reference owner; + protected readonly Reference? owner; public MethodInvocationExpression(MethodInfo method, params IExpression[] args) : this(SelfReference.Self, method, args) @@ -33,12 +35,12 @@ public MethodInvocationExpression(MethodEmitter method, params IExpression[] arg { } - public MethodInvocationExpression(Reference owner, MethodEmitter method, params IExpression[] args) : + public MethodInvocationExpression(Reference? owner, MethodEmitter method, params IExpression[] args) : this(owner, method.MethodBuilder, args) { } - public MethodInvocationExpression(Reference owner, MethodInfo method, params IExpression[] args) + public MethodInvocationExpression(Reference? owner, MethodInfo method, params IExpression[] args) { this.owner = owner; this.method = method; @@ -49,7 +51,7 @@ public MethodInvocationExpression(Reference owner, MethodInfo method, params IEx public void Emit(ILGenerator gen) { - ArgumentsUtil.EmitLoadOwnerAndReference(owner, gen); + owner?.Emit(gen); foreach (var exp in args) { diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs index 6064317125..ceaed8143d 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,24 +12,26 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System.Reflection.Emit; internal abstract class Reference : IExpression { - protected Reference owner = SelfReference.Self; + protected Reference? owner = SelfReference.Self; protected Reference() { } - protected Reference(Reference owner) + protected Reference(Reference? owner) { this.owner = owner; } - public Reference OwnerReference + public Reference? OwnerReference { get { return owner; } set { owner = value; } @@ -47,7 +49,8 @@ public virtual void Generate(ILGenerator gen) public void Emit(ILGenerator gen) { - ArgumentsUtil.EmitLoadOwnerAndReference(this, gen); + OwnerReference?.Emit(gen); + LoadReference(gen); } } } \ No newline at end of file diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ReferencesToObjectArrayExpression.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ReferencesToObjectArrayExpression.cs index a611fd54f4..f67f17418b 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ReferencesToObjectArrayExpression.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ReferencesToObjectArrayExpression.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System; @@ -31,7 +33,7 @@ public ReferencesToObjectArrayExpression(params TypeReference[] args) public void Emit(ILGenerator gen) { - var local = gen.DeclareLocal(typeof(object[])); + var local = gen.DeclareLocal(typeof(object?[])); gen.Emit(OpCodes.Ldc_I4, args.Length); gen.Emit(OpCodes.Newarr, typeof(object)); @@ -58,7 +60,7 @@ public void Emit(ILGenerator gen) } #endif - ArgumentsUtil.EmitLoadOwnerAndReference(reference, gen); + reference.Emit(gen); if (reference.Type.IsByRef) { diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ReturnStatement.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ReturnStatement.cs index 35bd01daf2..c913945d1f 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ReturnStatement.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ReturnStatement.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,14 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System.Reflection.Emit; internal class ReturnStatement : IStatement { - private readonly IExpression expression; - private readonly Reference reference; + private readonly IExpression? expression; + private readonly Reference? reference; public ReturnStatement() { @@ -39,7 +41,7 @@ public void Emit(ILGenerator gen) { if (reference != null) { - ArgumentsUtil.EmitLoadOwnerAndReference(reference, gen); + reference.Emit(gen); } else if (expression != null) { From e2b6007be243393a492aa75a47de0a535417c37c Mon Sep 17 00:00:00 2001 From: Dominique Schuppli Date: Tue, 16 Dec 2025 00:43:20 +0100 Subject: [PATCH 2/5] Complete `Reference.StoreReference` impls with the missing bits from `AssignStatement` --- .../Emitters/SimpleAST/ArgumentReference.cs | 9 +++++-- .../Emitters/SimpleAST/AsTypeReference.cs | 24 ++++++++----------- .../Emitters/SimpleAST/AssignStatement.cs | 10 ++++---- .../Emitters/SimpleAST/ByRefReference.cs | 6 +++-- .../Emitters/SimpleAST/FieldReference.cs | 12 ++++++---- .../Emitters/SimpleAST/IndirectReference.cs | 8 +++++-- .../Emitters/SimpleAST/LocalReference.cs | 16 ++++++++----- .../Emitters/SimpleAST/Reference.cs | 2 +- .../Emitters/SimpleAST/SelfReference.cs | 9 ++++--- 9 files changed, 56 insertions(+), 40 deletions(-) diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs index 19be72db47..6ee623c3bd 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System; @@ -66,12 +68,15 @@ public override void LoadReference(ILGenerator gen) } } - public override void StoreReference(ILGenerator gen) + public override void StoreReference(IExpression value, ILGenerator gen) { if (Position == -1) { throw new InvalidOperationException("ArgumentReference uninitialized"); } + + OwnerReference?.Emit(gen); + value.Emit(gen); gen.Emit(OpCodes.Starg, Position); } } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs index 6f0ce6c0ca..6bd471bf80 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System; @@ -26,14 +28,6 @@ internal class AsTypeReference : Reference public AsTypeReference(Reference reference, Type type) { - if (reference == null) - { - throw new ArgumentNullException(nameof(reference)); - } - if (type == null) - { - throw new ArgumentNullException(nameof(type)); - } this.reference = reference; this.type = type; if (reference == OwnerReference) @@ -44,8 +38,9 @@ public AsTypeReference(Reference reference, Type type) public override void LoadAddressOfReference(ILGenerator gen) { - // NOTE: Or maybe throw new NotSupportedException() ? - reference.LoadAddressOfReference(gen); + // It does not make sense to take the address of a cast expression. + // The C# language would also forbid address-taking of the form `&(x as T)`. + throw new NotSupportedException(); } public override void LoadReference(ILGenerator gen) @@ -54,10 +49,11 @@ public override void LoadReference(ILGenerator gen) gen.Emit(OpCodes.Isinst, type); } - public override void StoreReference(ILGenerator gen) + public override void StoreReference(IExpression value, ILGenerator gen) { - // NOTE: Or maybe throw new NotSupportedException() ? - reference.StoreReference(gen); + // It does not make sense to assign a value to the result of a cast expression. + // The C# language would also forbid assignments of the form `(x as T) = y`. + throw new NotSupportedException(); } } } \ No newline at end of file diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignStatement.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignStatement.cs index 7f242ce4de..e3d1c69374 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignStatement.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignStatement.cs @@ -20,20 +20,18 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST internal class AssignStatement : IStatement { - private readonly IExpression expression; private readonly Reference target; + private readonly IExpression value; - public AssignStatement(Reference target, IExpression expression) + public AssignStatement(Reference target, IExpression value) { this.target = target; - this.expression = expression; + this.value = value; } public void Emit(ILGenerator gen) { - target.OwnerReference?.Emit(gen); - expression.Emit(gen); - target.StoreReference(gen); + target.StoreReference(value, gen); } } } \ No newline at end of file diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs index f6fc69ad5b..c2532b2b42 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System; @@ -40,7 +42,7 @@ public override void LoadReference(ILGenerator gen) localReference.LoadAddressOfReference(gen); } - public override void StoreReference(ILGenerator gen) + public override void StoreReference(IExpression value, ILGenerator gen) { throw new NotImplementedException(); } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs index ebd0112df1..1313e7a3e7 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System.Diagnostics; @@ -22,7 +24,7 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST internal class FieldReference : Reference { private readonly FieldInfo field; - private readonly FieldBuilder fieldBuilder; + private readonly FieldBuilder? fieldBuilder; private readonly bool isStatic; public FieldReference(FieldInfo field) @@ -46,7 +48,7 @@ public FieldReference(FieldBuilder fieldBuilder) } } - public FieldBuilder FieldBuilder + public FieldBuilder? FieldBuilder { get { return fieldBuilder; } } @@ -80,8 +82,10 @@ public override void LoadReference(ILGenerator gen) } } - public override void StoreReference(ILGenerator gen) + public override void StoreReference(IExpression value, ILGenerator gen) { + OwnerReference?.Emit(gen); + value.Emit(gen); if (isStatic) { gen.Emit(OpCodes.Stsfld, Reference); diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs index 321d43954d..64f54715a8 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System; @@ -47,8 +49,10 @@ public override void LoadReference(ILGenerator gen) OpCodeUtil.EmitLoadIndirectOpCodeForType(gen, Type); } - public override void StoreReference(ILGenerator gen) + public override void StoreReference(IExpression value, ILGenerator gen) { + OwnerReference?.Emit(gen); + value.Emit(gen); OpCodeUtil.EmitStoreIndirectOpCodeForType(gen, Type); } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs index 768bac77f3..25606cbccf 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System; @@ -21,7 +23,7 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST [DebuggerDisplay("local {Type}")] internal class LocalReference : TypeReference { - private LocalBuilder localBuilder; + private LocalBuilder? localBuilder; public LocalReference(Type type) : base(type) { @@ -34,17 +36,19 @@ public override void Generate(ILGenerator gen) public override void LoadAddressOfReference(ILGenerator gen) { - gen.Emit(OpCodes.Ldloca, localBuilder); + gen.Emit(OpCodes.Ldloca, localBuilder!); } public override void LoadReference(ILGenerator gen) { - gen.Emit(OpCodes.Ldloc, localBuilder); + gen.Emit(OpCodes.Ldloc, localBuilder!); } - public override void StoreReference(ILGenerator gen) + public override void StoreReference(IExpression value, ILGenerator gen) { - gen.Emit(OpCodes.Stloc, localBuilder); + OwnerReference?.Emit(gen); + value.Emit(gen); + gen.Emit(OpCodes.Stloc, localBuilder!); } } } \ No newline at end of file diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs index ceaed8143d..d0c38cc424 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs @@ -41,7 +41,7 @@ public Reference? OwnerReference public abstract void LoadReference(ILGenerator gen); - public abstract void StoreReference(ILGenerator gen); + public abstract void StoreReference(IExpression value, ILGenerator gen); public virtual void Generate(ILGenerator gen) { diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs index 085d964da1..22e4ed86c0 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs @@ -1,4 +1,4 @@ -// Copyright 2004-2021 Castle Project - http://www.castleproject.org/ +// Copyright 2004-2025 Castle Project - http://www.castleproject.org/ // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +#nullable enable + namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST { using System; @@ -37,9 +39,10 @@ public override void LoadReference(ILGenerator gen) gen.Emit(OpCodes.Ldarg_0); } - public override void StoreReference(ILGenerator gen) + public override void StoreReference(IExpression value, ILGenerator gen) { - gen.Emit(OpCodes.Ldarg_0); + // It does not make sense to assign a value to the this pointer. + throw new NotSupportedException(); } } } \ No newline at end of file From bd1ca742ad264541139647a45810a301b40e8386 Mon Sep 17 00:00:00 2001 From: Dominique Schuppli Date: Tue, 16 Dec 2025 00:01:03 +0100 Subject: [PATCH 3/5] Make each `Reference` subclass' choice of `owner` explicit --- .../Generators/Emitters/SimpleAST/ArgumentReference.cs | 4 ++-- .../Generators/Emitters/SimpleAST/AsTypeReference.cs | 1 + .../Generators/Emitters/SimpleAST/ByRefReference.cs | 2 +- .../Generators/Emitters/SimpleAST/FieldReference.cs | 2 ++ .../Generators/Emitters/SimpleAST/LocalReference.cs | 3 ++- .../DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs | 6 +----- .../Generators/Emitters/SimpleAST/TypeReference.cs | 4 ---- 7 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs index 6ee623c3bd..45bb0a5ffe 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs @@ -24,13 +24,13 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST internal class ArgumentReference : TypeReference { public ArgumentReference(Type argumentType) - : base(argumentType) + : base(null, argumentType) { Position = -1; } public ArgumentReference(Type argumentType, int position) - : base(argumentType) + : base(null, argumentType) { Position = position; } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs index 6bd471bf80..d74be83ad2 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs @@ -27,6 +27,7 @@ internal class AsTypeReference : Reference private readonly Type type; public AsTypeReference(Reference reference, Type type) + : base(SelfReference.Self) { this.reference = reference; this.type = type; diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs index c2532b2b42..b3eea33ed3 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs @@ -27,7 +27,7 @@ internal class ByRefReference : TypeReference private readonly LocalReference localReference; public ByRefReference(LocalReference localReference) - : base(localReference.Type) + : base(null, localReference.Type) { this.localReference = localReference; } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs index 1313e7a3e7..35eb91b777 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs @@ -28,6 +28,7 @@ internal class FieldReference : Reference private readonly bool isStatic; public FieldReference(FieldInfo field) + : base(SelfReference.Self) { this.field = field; if ((field.Attributes & FieldAttributes.Static) != 0) @@ -38,6 +39,7 @@ public FieldReference(FieldInfo field) } public FieldReference(FieldBuilder fieldBuilder) + : base(SelfReference.Self) { this.fieldBuilder = fieldBuilder; field = fieldBuilder; diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs index 25606cbccf..a5e22277cd 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs @@ -25,7 +25,8 @@ internal class LocalReference : TypeReference { private LocalBuilder? localBuilder; - public LocalReference(Type type) : base(type) + public LocalReference(Type type) + : base(null, type) { } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs index d0c38cc424..8b562f7cf8 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs @@ -20,11 +20,7 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST internal abstract class Reference : IExpression { - protected Reference? owner = SelfReference.Self; - - protected Reference() - { - } + protected Reference? owner; protected Reference(Reference? owner) { diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/TypeReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/TypeReference.cs index fa551e64fc..2289bda216 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/TypeReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/TypeReference.cs @@ -20,10 +20,6 @@ internal abstract class TypeReference : Reference { private readonly Type type; - protected TypeReference(Type argumentType) : this(null, argumentType) - { - } - protected TypeReference(Reference owner, Type type) : base(owner) { this.type = type; From 50a7f6d794713c3100de80e5cc29126dbaba578d Mon Sep 17 00:00:00 2001 From: Dominique Schuppli Date: Tue, 16 Dec 2025 00:48:34 +0100 Subject: [PATCH 4/5] `Reference` impls declare their own "owner" where appropriate --- .../Emitters/SimpleAST/ArgumentReference.cs | 5 ++--- .../Emitters/SimpleAST/AsTypeReference.cs | 5 ----- .../Emitters/SimpleAST/ByRefReference.cs | 2 +- .../Emitters/SimpleAST/FieldReference.cs | 11 +++++------ .../Emitters/SimpleAST/IndirectReference.cs | 13 +++++++++---- .../Emitters/SimpleAST/LocalReference.cs | 3 +-- .../Generators/Emitters/SimpleAST/Reference.cs | 14 -------------- .../Generators/Emitters/SimpleAST/SelfReference.cs | 2 +- .../Generators/Emitters/SimpleAST/TypeReference.cs | 2 +- 9 files changed, 20 insertions(+), 37 deletions(-) diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs index 45bb0a5ffe..d9700c055b 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs @@ -24,13 +24,13 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST internal class ArgumentReference : TypeReference { public ArgumentReference(Type argumentType) - : base(null, argumentType) + : base(argumentType) { Position = -1; } public ArgumentReference(Type argumentType, int position) - : base(null, argumentType) + : base(argumentType) { Position = position; } @@ -75,7 +75,6 @@ public override void StoreReference(IExpression value, ILGenerator gen) throw new InvalidOperationException("ArgumentReference uninitialized"); } - OwnerReference?.Emit(gen); value.Emit(gen); gen.Emit(OpCodes.Starg, Position); } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs index d74be83ad2..8ddec805e0 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs @@ -27,14 +27,9 @@ internal class AsTypeReference : Reference private readonly Type type; public AsTypeReference(Reference reference, Type type) - : base(SelfReference.Self) { this.reference = reference; this.type = type; - if (reference == OwnerReference) - { - OwnerReference = null; - } } public override void LoadAddressOfReference(ILGenerator gen) diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs index b3eea33ed3..c2532b2b42 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs @@ -27,7 +27,7 @@ internal class ByRefReference : TypeReference private readonly LocalReference localReference; public ByRefReference(LocalReference localReference) - : base(null, localReference.Type) + : base(localReference.Type) { this.localReference = localReference; } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs index 35eb91b777..a50251f307 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs @@ -28,25 +28,21 @@ internal class FieldReference : Reference private readonly bool isStatic; public FieldReference(FieldInfo field) - : base(SelfReference.Self) { this.field = field; if ((field.Attributes & FieldAttributes.Static) != 0) { isStatic = true; - owner = null; } } public FieldReference(FieldBuilder fieldBuilder) - : base(SelfReference.Self) { this.fieldBuilder = fieldBuilder; field = fieldBuilder; if ((fieldBuilder.Attributes & FieldAttributes.Static) != 0) { isStatic = true; - owner = null; } } @@ -68,6 +64,7 @@ public override void LoadAddressOfReference(ILGenerator gen) } else { + SelfReference.Self.Emit(gen); gen.Emit(OpCodes.Ldflda, Reference); } } @@ -80,20 +77,22 @@ public override void LoadReference(ILGenerator gen) } else { + SelfReference.Self.Emit(gen); gen.Emit(OpCodes.Ldfld, Reference); } } public override void StoreReference(IExpression value, ILGenerator gen) { - OwnerReference?.Emit(gen); - value.Emit(gen); if (isStatic) { + value.Emit(gen); gen.Emit(OpCodes.Stsfld, Reference); } else { + SelfReference.Self.Emit(gen); + value.Emit(gen); gen.Emit(OpCodes.Stfld, Reference); } } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs index 64f54715a8..36bb67137f 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs @@ -28,30 +28,35 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST [DebuggerDisplay("&{OwnerReference}")] internal class IndirectReference : TypeReference { - public IndirectReference(TypeReference byRefReference) : - base(byRefReference, byRefReference.Type.GetElementType()) + private readonly TypeReference byRefReference; + + public IndirectReference(TypeReference byRefReference) + : base(byRefReference.Type.GetElementType()) { if (!byRefReference.Type.IsByRef) { throw new ArgumentException("Expected an IsByRef reference", nameof(byRefReference)); } + + this.byRefReference = byRefReference; } public override void LoadAddressOfReference(ILGenerator gen) { - // Load of owner reference takes care of this. + byRefReference.Emit(gen); } // TODO: Better name public override void LoadReference(ILGenerator gen) { + byRefReference.Emit(gen); OpCodeUtil.EmitLoadIndirectOpCodeForType(gen, Type); } public override void StoreReference(IExpression value, ILGenerator gen) { - OwnerReference?.Emit(gen); + byRefReference.Emit(gen); value.Emit(gen); OpCodeUtil.EmitStoreIndirectOpCodeForType(gen, Type); } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs index a5e22277cd..9f60ec32b9 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs @@ -26,7 +26,7 @@ internal class LocalReference : TypeReference private LocalBuilder? localBuilder; public LocalReference(Type type) - : base(null, type) + : base(type) { } @@ -47,7 +47,6 @@ public override void LoadReference(ILGenerator gen) public override void StoreReference(IExpression value, ILGenerator gen) { - OwnerReference?.Emit(gen); value.Emit(gen); gen.Emit(OpCodes.Stloc, localBuilder!); } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs index 8b562f7cf8..4a729e44df 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs @@ -20,19 +20,6 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST internal abstract class Reference : IExpression { - protected Reference? owner; - - protected Reference(Reference? owner) - { - this.owner = owner; - } - - public Reference? OwnerReference - { - get { return owner; } - set { owner = value; } - } - public abstract void LoadAddressOfReference(ILGenerator gen); public abstract void LoadReference(ILGenerator gen); @@ -45,7 +32,6 @@ public virtual void Generate(ILGenerator gen) public void Emit(ILGenerator gen) { - OwnerReference?.Emit(gen); LoadReference(gen); } } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs index 22e4ed86c0..8823202468 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs @@ -25,7 +25,7 @@ internal class SelfReference : Reference { public static readonly SelfReference Self = new SelfReference(); - protected SelfReference() : base(null) + protected SelfReference() { } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/TypeReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/TypeReference.cs index 2289bda216..59a2e96661 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/TypeReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/TypeReference.cs @@ -20,7 +20,7 @@ internal abstract class TypeReference : Reference { private readonly Type type; - protected TypeReference(Reference owner, Type type) : base(owner) + protected TypeReference(Type type) { this.type = type; } From 3d3bf4a6a1654bff601fc1d6420d5d6d0c603a3a Mon Sep 17 00:00:00 2001 From: Dominique Schuppli Date: Tue, 16 Dec 2025 01:05:59 +0100 Subject: [PATCH 5/5] Rename `Reference` methods for better consistency --- .../Emitters/SimpleAST/ArgumentReference.cs | 6 +++--- .../Generators/Emitters/SimpleAST/AsTypeReference.cs | 8 ++++---- .../Generators/Emitters/SimpleAST/AssignStatement.cs | 2 +- .../Generators/Emitters/SimpleAST/ByRefReference.cs | 10 +++++----- .../Generators/Emitters/SimpleAST/FieldReference.cs | 6 +++--- .../Emitters/SimpleAST/IndirectReference.cs | 8 +++----- .../Generators/Emitters/SimpleAST/LocalReference.cs | 6 +++--- .../Generators/Emitters/SimpleAST/Reference.cs | 11 +++-------- .../Generators/Emitters/SimpleAST/SelfReference.cs | 6 +++--- 9 files changed, 28 insertions(+), 35 deletions(-) diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs index d9700c055b..afa5c9390f 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs @@ -37,12 +37,12 @@ public ArgumentReference(Type argumentType, int position) internal int Position { get; set; } - public override void LoadAddressOfReference(ILGenerator gen) + public override void EmitAddress(ILGenerator gen) { throw new NotSupportedException(); } - public override void LoadReference(ILGenerator gen) + public override void Emit(ILGenerator gen) { if (Position == -1) { @@ -68,7 +68,7 @@ public override void LoadReference(ILGenerator gen) } } - public override void StoreReference(IExpression value, ILGenerator gen) + public override void EmitStore(IExpression value, ILGenerator gen) { if (Position == -1) { diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs index 8ddec805e0..5d058f88ea 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AsTypeReference.cs @@ -32,20 +32,20 @@ public AsTypeReference(Reference reference, Type type) this.type = type; } - public override void LoadAddressOfReference(ILGenerator gen) + public override void EmitAddress(ILGenerator gen) { // It does not make sense to take the address of a cast expression. // The C# language would also forbid address-taking of the form `&(x as T)`. throw new NotSupportedException(); } - public override void LoadReference(ILGenerator gen) + public override void Emit(ILGenerator gen) { - reference.LoadReference(gen); + reference.Emit(gen); gen.Emit(OpCodes.Isinst, type); } - public override void StoreReference(IExpression value, ILGenerator gen) + public override void EmitStore(IExpression value, ILGenerator gen) { // It does not make sense to assign a value to the result of a cast expression. // The C# language would also forbid assignments of the form `(x as T) = y`. diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignStatement.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignStatement.cs index e3d1c69374..bf46a08fc7 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignStatement.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignStatement.cs @@ -31,7 +31,7 @@ public AssignStatement(Reference target, IExpression value) public void Emit(ILGenerator gen) { - target.StoreReference(value, gen); + target.EmitStore(value, gen); } } } \ No newline at end of file diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs index c2532b2b42..4df289d0cd 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ByRefReference.cs @@ -32,17 +32,17 @@ public ByRefReference(LocalReference localReference) this.localReference = localReference; } - public override void LoadAddressOfReference(ILGenerator gen) + public override void EmitAddress(ILGenerator gen) { - localReference.LoadAddressOfReference(gen); + localReference.EmitAddress(gen); } - public override void LoadReference(ILGenerator gen) + public override void Emit(ILGenerator gen) { - localReference.LoadAddressOfReference(gen); + localReference.EmitAddress(gen); } - public override void StoreReference(IExpression value, ILGenerator gen) + public override void EmitStore(IExpression value, ILGenerator gen) { throw new NotImplementedException(); } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs index a50251f307..e31d5ad176 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/FieldReference.cs @@ -56,7 +56,7 @@ public FieldInfo Reference get { return @field; } } - public override void LoadAddressOfReference(ILGenerator gen) + public override void EmitAddress(ILGenerator gen) { if (isStatic) { @@ -69,7 +69,7 @@ public override void LoadAddressOfReference(ILGenerator gen) } } - public override void LoadReference(ILGenerator gen) + public override void Emit(ILGenerator gen) { if (isStatic) { @@ -82,7 +82,7 @@ public override void LoadReference(ILGenerator gen) } } - public override void StoreReference(IExpression value, ILGenerator gen) + public override void EmitStore(IExpression value, ILGenerator gen) { if (isStatic) { diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs index 36bb67137f..df6ff66421 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs @@ -41,20 +41,18 @@ public IndirectReference(TypeReference byRefReference) this.byRefReference = byRefReference; } - public override void LoadAddressOfReference(ILGenerator gen) + public override void EmitAddress(ILGenerator gen) { byRefReference.Emit(gen); } - // TODO: Better name - - public override void LoadReference(ILGenerator gen) + public override void Emit(ILGenerator gen) { byRefReference.Emit(gen); OpCodeUtil.EmitLoadIndirectOpCodeForType(gen, Type); } - public override void StoreReference(IExpression value, ILGenerator gen) + public override void EmitStore(IExpression value, ILGenerator gen) { byRefReference.Emit(gen); value.Emit(gen); diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs index 9f60ec32b9..db02055a16 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs @@ -35,17 +35,17 @@ public override void Generate(ILGenerator gen) localBuilder = gen.DeclareLocal(base.Type); } - public override void LoadAddressOfReference(ILGenerator gen) + public override void EmitAddress(ILGenerator gen) { gen.Emit(OpCodes.Ldloca, localBuilder!); } - public override void LoadReference(ILGenerator gen) + public override void Emit(ILGenerator gen) { gen.Emit(OpCodes.Ldloc, localBuilder!); } - public override void StoreReference(IExpression value, ILGenerator gen) + public override void EmitStore(IExpression value, ILGenerator gen) { value.Emit(gen); gen.Emit(OpCodes.Stloc, localBuilder!); diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs index 4a729e44df..297eee6000 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/Reference.cs @@ -20,19 +20,14 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST internal abstract class Reference : IExpression { - public abstract void LoadAddressOfReference(ILGenerator gen); + public abstract void EmitAddress(ILGenerator gen); - public abstract void LoadReference(ILGenerator gen); + public abstract void Emit(ILGenerator gen); - public abstract void StoreReference(IExpression value, ILGenerator gen); + public abstract void EmitStore(IExpression value, ILGenerator gen); public virtual void Generate(ILGenerator gen) { } - - public void Emit(ILGenerator gen) - { - LoadReference(gen); - } } } \ No newline at end of file diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs index 8823202468..f2161a16e6 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs @@ -29,17 +29,17 @@ protected SelfReference() { } - public override void LoadAddressOfReference(ILGenerator gen) + public override void EmitAddress(ILGenerator gen) { throw new NotSupportedException(); } - public override void LoadReference(ILGenerator gen) + public override void Emit(ILGenerator gen) { gen.Emit(OpCodes.Ldarg_0); } - public override void StoreReference(IExpression value, ILGenerator gen) + public override void EmitStore(IExpression value, ILGenerator gen) { // It does not make sense to assign a value to the this pointer. throw new NotSupportedException();