Skip to content

Commit 74998ac

Browse files
committed
ConstReference is not a reference at all
This type gets used to emit constant values, so it obviously should not be a `Reference` because one can't load the address of a constant value nor store anything in it. `ConstReference` gets replaced with the existing `LiteralIntExpression` plus new sibling types `Literal{Bool,String}Expression`. This in turn makes a method inside `OpCodeUtil` obsolete.
1 parent cd9448d commit 74998ac

File tree

9 files changed

+64
-86
lines changed

9 files changed

+64
-86
lines changed

src/Castle.Core/DynamicProxy/Contributors/ClassProxySerializableContributor.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ protected override void CustomizeGetObjectData(CodeBuilder codebuilder, Argument
9696
new MethodInvocationExpression(
9797
serializationInfo,
9898
SerializationInfoMethods.AddValue_Bool,
99-
new ConstReference("__delegateToBase"),
100-
new ConstReference(delegateToBaseGetObjectData)));
99+
new LiteralStringExpression("__delegateToBase"),
100+
new LiteralBoolExpression(delegateToBaseGetObjectData)));
101101

102102
if (delegateToBaseGetObjectData == false)
103103
{
@@ -136,7 +136,7 @@ private void EmitCustomGetObjectData(CodeBuilder codebuilder, ArgumentReference
136136
var addValue = new MethodInvocationExpression(
137137
serializationInfo,
138138
SerializationInfoMethods.AddValue_Object,
139-
new ConstReference("__data"),
139+
new LiteralStringExpression("__data"),
140140
data);
141141
codebuilder.AddStatement(addValue);
142142
}
@@ -179,7 +179,7 @@ private void GenerateSerializationConstructor(ClassEmitter emitter)
179179
{
180180
var getValue = new MethodInvocationExpression(serializationInfo,
181181
SerializationInfoMethods.GetValue,
182-
new ConstReference(field.Reference.Name),
182+
new LiteralStringExpression(field.Reference.Name),
183183
new TypeTokenExpression(field.Reference.FieldType));
184184
ctor.CodeBuilder.AddStatement(new AssignStatement(
185185
field,

src/Castle.Core/DynamicProxy/Contributors/InterfaceProxySerializableContributor.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ protected override void CustomizeGetObjectData(CodeBuilder codebuilder, Argument
3838
new MethodInvocationExpression(
3939
serializationInfo,
4040
SerializationInfoMethods.AddValue_Object,
41-
new ConstReference("__targetFieldType"),
42-
new ConstReference(targetField.Reference.FieldType.AssemblyQualifiedName)));
41+
new LiteralStringExpression("__targetFieldType"),
42+
new LiteralStringExpression(targetField.Reference.FieldType.AssemblyQualifiedName)));
4343

4444
codebuilder.AddStatement(
4545
new MethodInvocationExpression(
4646
serializationInfo,
4747
SerializationInfoMethods.AddValue_Object,
48-
new ConstReference("__theInterface"),
49-
new ConstReference(targetType.AssemblyQualifiedName)));
48+
new LiteralStringExpression("__theInterface"),
49+
new LiteralStringExpression(targetType.AssemblyQualifiedName)));
5050
}
5151
}
5252
}

src/Castle.Core/DynamicProxy/Contributors/SerializableContributor.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ protected void ImplementGetObjectData(ClassEmitter emitter)
5757
new MethodInvocationExpression(
5858
null,
5959
TypeMethods.StaticGetType,
60-
new ConstReference(typeof(ProxyObjectReference).AssemblyQualifiedName),
61-
new ConstReference(1),
62-
new ConstReference(0))));
60+
new LiteralStringExpression(typeof(ProxyObjectReference).AssemblyQualifiedName),
61+
new LiteralBoolExpression(true),
62+
new LiteralBoolExpression(false))));
6363

6464
getObjectData.CodeBuilder.AddStatement(
6565
new MethodInvocationExpression(
@@ -93,36 +93,36 @@ protected void ImplementGetObjectData(ClassEmitter emitter)
9393
new AssignArrayStatement(
9494
interfacesLocal,
9595
i,
96-
new ConstReference(interfaces[i].AssemblyQualifiedName)));
96+
new LiteralStringExpression(interfaces[i].AssemblyQualifiedName)));
9797
}
9898

9999
getObjectData.CodeBuilder.AddStatement(
100100
new MethodInvocationExpression(
101101
info,
102102
SerializationInfoMethods.AddValue_Object,
103-
new ConstReference("__interfaces"),
103+
new LiteralStringExpression("__interfaces"),
104104
interfacesLocal));
105105

106106
getObjectData.CodeBuilder.AddStatement(
107107
new MethodInvocationExpression(
108108
info,
109109
SerializationInfoMethods.AddValue_Object,
110-
new ConstReference("__baseType"),
111-
new ConstReference(emitter.BaseType.AssemblyQualifiedName)));
110+
new LiteralStringExpression("__baseType"),
111+
new LiteralStringExpression(emitter.BaseType.AssemblyQualifiedName)));
112112

113113
getObjectData.CodeBuilder.AddStatement(
114114
new MethodInvocationExpression(
115115
info,
116116
SerializationInfoMethods.AddValue_Object,
117-
new ConstReference("__proxyGenerationOptions"),
117+
new LiteralStringExpression("__proxyGenerationOptions"),
118118
emitter.GetField("proxyGenerationOptions")));
119119

120120
getObjectData.CodeBuilder.AddStatement(
121121
new MethodInvocationExpression(
122122
info,
123123
SerializationInfoMethods.AddValue_Object,
124-
new ConstReference("__proxyTypeId"),
125-
new ConstReference(proxyTypeId)));
124+
new LiteralStringExpression("__proxyTypeId"),
125+
new LiteralStringExpression(proxyTypeId)));
126126

127127
CustomizeGetObjectData(getObjectData.CodeBuilder, info, getObjectData.Arguments[1], emitter);
128128

@@ -136,7 +136,7 @@ protected virtual void AddAddValueInvocation(ArgumentReference serializationInfo
136136
new MethodInvocationExpression(
137137
serializationInfo,
138138
SerializationInfoMethods.AddValue_Object,
139-
new ConstReference(field.Reference.Name),
139+
new LiteralStringExpression(field.Reference.Name),
140140
field));
141141
return;
142142
}

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

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -62,32 +62,6 @@ public static void EmitLoadIndirectOpCodeForType(ILGenerator gen, Type type)
6262
}
6363
}
6464

65-
/// <summary>
66-
/// Emits a load opcode of the appropriate kind for a constant string or
67-
/// primitive value.
68-
/// </summary>
69-
public static void EmitLoadOpCodeForConstantValue(ILGenerator gen, object value)
70-
{
71-
if (value is string)
72-
{
73-
gen.Emit(OpCodes.Ldstr, value.ToString());
74-
}
75-
else if (value is Int32)
76-
{
77-
var code = LdcOpCodesDictionary.Instance[value.GetType()];
78-
gen.Emit(code, (int)value);
79-
}
80-
else if (value is bool)
81-
{
82-
var code = LdcOpCodesDictionary.Instance[value.GetType()];
83-
gen.Emit(code, Convert.ToInt32(value));
84-
}
85-
else
86-
{
87-
throw new NotSupportedException();
88-
}
89-
}
90-
9165
/// <summary>
9266
/// Emits a load opcode of the appropriate kind for the constant default value of a
9367
/// type, such as 0 for value types and null for reference types.
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright 2004-2021 Castle Project - http://www.castleproject.org/
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST
16+
{
17+
using System.Reflection.Emit;
18+
19+
internal class LiteralBoolExpression : IExpression
20+
{
21+
private readonly bool value;
22+
23+
public LiteralBoolExpression(bool value)
24+
{
25+
this.value = value;
26+
}
27+
28+
public void Emit(IMemberEmitter member, ILGenerator gen)
29+
{
30+
gen.Emit(value ? OpCodes.Ldc_I4_1 : OpCodes.Ldc_I4_0);
31+
}
32+
}
33+
}

src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/ConstReference.cs renamed to src/Castle.Core/DynamicProxy/Generators/Emitters/SimpleAST/LiteralStringExpression.cs

Lines changed: 5 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,41 +14,22 @@
1414

1515
namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST
1616
{
17-
using System;
1817
using System.Diagnostics;
19-
using System.Reflection;
2018
using System.Reflection.Emit;
2119

2220
[DebuggerDisplay("{value}")]
23-
internal class ConstReference : TypeReference
21+
internal class LiteralStringExpression : IExpression
2422
{
25-
private readonly object value;
23+
private readonly string value;
2624

27-
public ConstReference(object value)
28-
: base(value.GetType())
25+
public LiteralStringExpression(string value)
2926
{
30-
Debug.Assert(value.GetType().IsPrimitive || value is string, "Invalid type to ConstReference");
31-
3227
this.value = value;
3328
}
3429

35-
public override void Generate(ILGenerator gen)
36-
{
37-
}
38-
39-
public override void LoadAddressOfReference(ILGenerator gen)
40-
{
41-
throw new NotSupportedException();
42-
}
43-
44-
public override void LoadReference(ILGenerator gen)
45-
{
46-
OpCodeUtil.EmitLoadOpCodeForConstantValue(gen, value);
47-
}
48-
49-
public override void StoreReference(ILGenerator gen)
30+
public void Emit(IMemberEmitter member, ILGenerator gen)
5031
{
51-
throw new NotImplementedException("ConstReference.StoreReference");
32+
gen.Emit(OpCodes.Ldstr, value);
5233
}
5334
}
5435
}

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,20 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST
2020
internal class LoadArrayElementExpression : IExpression
2121
{
2222
private readonly Reference arrayReference;
23-
private readonly ConstReference index;
23+
private readonly LiteralIntExpression index;
2424
private readonly Type returnType;
2525

2626
public LoadArrayElementExpression(int index, Reference arrayReference, Type returnType)
27-
: this(new ConstReference(index), arrayReference, returnType)
2827
{
29-
}
30-
31-
public LoadArrayElementExpression(ConstReference index, Reference arrayReference, Type returnType)
32-
{
33-
this.index = index;
28+
this.index = new LiteralIntExpression(index);
3429
this.arrayReference = arrayReference;
3530
this.returnType = returnType;
3631
}
3732

3833
public void Emit(IMemberEmitter member, ILGenerator gen)
3934
{
4035
ArgumentsUtil.EmitLoadOwnerAndReference(arrayReference, gen);
41-
ArgumentsUtil.EmitLoadOwnerAndReference(index, gen);
36+
index.Emit(member, gen);
4237
gen.Emit(OpCodes.Ldelem, returnType);
4338
}
4439
}

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,23 +19,18 @@ namespace Castle.DynamicProxy.Generators.Emitters.SimpleAST
1919
internal class LoadRefArrayElementExpression : IExpression
2020
{
2121
private readonly Reference arrayReference;
22-
private readonly ConstReference index;
22+
private readonly LiteralIntExpression index;
2323

2424
public LoadRefArrayElementExpression(int index, Reference arrayReference)
25-
: this(new ConstReference(index), arrayReference)
2625
{
27-
}
28-
29-
public LoadRefArrayElementExpression(ConstReference index, Reference arrayReference)
30-
{
31-
this.index = index;
26+
this.index = new LiteralIntExpression(index);
3227
this.arrayReference = arrayReference;
3328
}
3429

3530
public void Emit(IMemberEmitter member, ILGenerator gen)
3631
{
3732
ArgumentsUtil.EmitLoadOwnerAndReference(arrayReference, gen);
38-
ArgumentsUtil.EmitLoadOwnerAndReference(index, gen);
33+
index.Emit(member, gen);
3934
gen.Emit(OpCodes.Ldelem_Ref);
4035
}
4136
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public ThrowStatement(Type exceptionType, string errorMessage)
3232
public void Emit(IMemberEmitter member, ILGenerator gen)
3333
{
3434
var ci = exceptionType.GetConstructor(new[] { typeof(string) });
35-
var constRef = new ConstReference(errorMessage);
35+
var constRef = new LiteralStringExpression(errorMessage);
3636

3737
var creationStmt = new NewInstanceExpression(ci, constRef);
3838

0 commit comments

Comments
 (0)