diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/ArgumentsUtil.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/ArgumentsUtil.cs index 2e0396df2..388ceb028 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/ArgumentReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ArgumentReference.cs index 19be72db4..afa5c9390 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; @@ -35,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) { @@ -66,12 +68,14 @@ public override void LoadReference(ILGenerator gen) } } - public override void StoreReference(ILGenerator gen) + public override void EmitStore(IExpression value, ILGenerator gen) { if (Position == -1) { throw new InvalidOperationException("ArgumentReference uninitialized"); } + + 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 6f0ce6c0c..5d058f88e 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,38 +28,28 @@ 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) - { - OwnerReference = null; - } } - public override void LoadAddressOfReference(ILGenerator gen) + public override void EmitAddress(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) + public override void Emit(ILGenerator gen) { - reference.LoadReference(gen); + reference.Emit(gen); gen.Emit(OpCodes.Isinst, type); } - public override void StoreReference(ILGenerator gen) + public override void EmitStore(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/AssignArgumentStatement.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/AssignArgumentStatement.cs index 5c4b2a70f..296782103 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 b8ea4d599..d02432c48 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 4d33b78ac..bf46a08fc 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,26 +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 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) { - ArgumentsUtil.EmitLoadOwnerAndReference(target.OwnerReference, gen); - expression.Emit(gen); - target.StoreReference(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 f6fc69ad5..4df289d0c 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; @@ -30,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(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 ebd0112df..e31d5ad17 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) @@ -31,7 +33,6 @@ public FieldReference(FieldInfo field) if ((field.Attributes & FieldAttributes.Static) != 0) { isStatic = true; - owner = null; } } @@ -42,11 +43,10 @@ public FieldReference(FieldBuilder fieldBuilder) if ((fieldBuilder.Attributes & FieldAttributes.Static) != 0) { isStatic = true; - owner = null; } } - public FieldBuilder FieldBuilder + public FieldBuilder? FieldBuilder { get { return fieldBuilder; } } @@ -56,7 +56,7 @@ public FieldInfo Reference get { return @field; } } - public override void LoadAddressOfReference(ILGenerator gen) + public override void EmitAddress(ILGenerator gen) { if (isStatic) { @@ -64,11 +64,12 @@ public override void LoadAddressOfReference(ILGenerator gen) } else { + SelfReference.Self.Emit(gen); gen.Emit(OpCodes.Ldflda, Reference); } } - public override void LoadReference(ILGenerator gen) + public override void Emit(ILGenerator gen) { if (isStatic) { @@ -76,18 +77,22 @@ public override void LoadReference(ILGenerator gen) } else { + SelfReference.Self.Emit(gen); gen.Emit(OpCodes.Ldfld, Reference); } } - public override void StoreReference(ILGenerator gen) + public override void EmitStore(IExpression value, ILGenerator 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/IfNullExpression.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IfNullExpression.cs index 333a732ac..470ea9af7 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/IndirectReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/IndirectReference.cs index 321d43954..df6ff6642 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; @@ -26,29 +28,34 @@ 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) + public override void EmitAddress(ILGenerator gen) { - // Load of owner reference takes care of this. + 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(ILGenerator gen) + public override void EmitStore(IExpression value, ILGenerator gen) { + byRefReference.Emit(gen); + value.Emit(gen); OpCodeUtil.EmitStoreIndirectOpCodeForType(gen, Type); } diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LoadRefArrayElementExpression.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LoadRefArrayElementExpression.cs index 311a46c43..d6db83640 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/LocalReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LocalReference.cs index 768bac77f..db02055a1 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,9 +23,10 @@ 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) + public LocalReference(Type type) + : base(type) { } @@ -32,19 +35,20 @@ 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); + gen.Emit(OpCodes.Ldloca, localBuilder!); } - public override void LoadReference(ILGenerator gen) + public override void Emit(ILGenerator gen) { - gen.Emit(OpCodes.Ldloc, localBuilder); + gen.Emit(OpCodes.Ldloc, localBuilder!); } - public override void StoreReference(ILGenerator gen) + public override void EmitStore(IExpression value, ILGenerator gen) { - gen.Emit(OpCodes.Stloc, localBuilder); + value.Emit(gen); + gen.Emit(OpCodes.Stloc, localBuilder!); } } } \ No newline at end of file diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/MethodInvocationExpression.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/MethodInvocationExpression.cs index 4261758ee..55c7ea067 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 606431712..297eee600 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,42 +12,22 @@ // 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() - { - } - - protected Reference(Reference owner) - { - this.owner = owner; - } + public abstract void EmitAddress(ILGenerator gen); - public Reference OwnerReference - { - get { return owner; } - set { owner = value; } - } - - public abstract void LoadAddressOfReference(ILGenerator gen); - - public abstract void LoadReference(ILGenerator gen); + public abstract void Emit(ILGenerator gen); - public abstract void StoreReference(ILGenerator gen); + public abstract void EmitStore(IExpression value, ILGenerator gen); public virtual void Generate(ILGenerator gen) { } - - public void Emit(ILGenerator gen) - { - ArgumentsUtil.EmitLoadOwnerAndReference(this, 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 a611fd54f..f67f17418 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 35bd01daf..c913945d1 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) { diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/SelfReference.cs index 085d964da..f2161a16e 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; @@ -23,23 +25,24 @@ internal class SelfReference : Reference { public static readonly SelfReference Self = new SelfReference(); - protected SelfReference() : base(null) + 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(ILGenerator gen) + public override void EmitStore(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 diff --git a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/TypeReference.cs b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/TypeReference.cs index fa551e64f..59a2e9666 100644 --- a/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/TypeReference.cs +++ b/src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/TypeReference.cs @@ -20,11 +20,7 @@ internal abstract class TypeReference : Reference { private readonly Type type; - protected TypeReference(Type argumentType) : this(null, argumentType) - { - } - - protected TypeReference(Reference owner, Type type) : base(owner) + protected TypeReference(Type type) { this.type = type; }