Skip to content

Commit 907e4bc

Browse files
committed
Remove expensive calls to System.Type.IsByRef
1 parent 0ebe8d0 commit 907e4bc

11 files changed

Lines changed: 26 additions & 19 deletions

File tree

src/WattleScript.Interpreter/DataTypes/DynValue.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1051,7 +1051,7 @@ public object ToObject()
10511051
public object ToObject(Type desiredType)
10521052
{
10531053
//Contract.Requires(desiredType != null);
1054-
return WattleScript.Interpreter.Interop.Converters.ScriptToClrConversions.DynValueToObjectOfType(this, desiredType, null, false);
1054+
return WattleScript.Interpreter.Interop.Converters.ScriptToClrConversions.DynValueToObjectOfType(this, desiredType, false, null, false);
10551055
}
10561056

10571057
/// <summary>

src/WattleScript.Interpreter/Interop/BasicDescriptors/ParameterDescriptor.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@ public sealed class ParameterDescriptor
4545
/// Gets the original type of the parameter before any restriction has been applied.
4646
/// </summary>
4747
public Type OriginalType { get { return m_OriginalType ?? Type; } }
48-
48+
49+
///
50+
/// Gets the IsByRef result of the Type
51+
///
52+
public bool TypeByRef { get; private set; }
4953

5054
/// <summary>
5155
/// If the type got restricted, the original type before the restriction.
@@ -72,6 +76,7 @@ public ParameterDescriptor(string name, Type type, bool hasDefaultValue = false,
7276
IsOut = isOut;
7377
IsRef = isRef;
7478
IsVarArgs = isVarArgs;
79+
TypeByRef = type.IsByRef;
7580
}
7681

7782
/// <summary>
@@ -95,6 +100,7 @@ public ParameterDescriptor(string name, Type type, bool hasDefaultValue, object
95100
IsOut = isOut;
96101
IsRef = isRef;
97102
IsVarArgs = isVarArgs;
103+
TypeByRef = type.IsByRef;
98104

99105
if (typeRestriction != null)
100106
{
@@ -116,6 +122,7 @@ public ParameterDescriptor(ParameterInfo pi)
116122
IsOut = pi.IsOut;
117123
IsRef = pi.ParameterType.IsByRef;
118124
IsVarArgs = (pi.ParameterType.IsArray && pi.GetCustomAttributes(typeof(ParamArrayAttribute), true).Any());
125+
TypeByRef = pi.ParameterType.IsByRef;
119126
}
120127

121128

src/WattleScript.Interpreter/Interop/Converters/ScriptToClrConversions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,10 +186,10 @@ internal static T DynValueToObject<T>(DynValue value, T defaultValue, bool isOpt
186186
/// <summary>
187187
/// Converts a DynValue to a CLR object of a specific type
188188
/// </summary>
189-
internal static object DynValueToObjectOfType(DynValue value, Type desiredType, object defaultValue,
189+
internal static object DynValueToObjectOfType(DynValue value, Type desiredType, bool typeByRef, object defaultValue,
190190
bool isOptional)
191191
{
192-
if (desiredType.IsByRef)
192+
if (typeByRef)
193193
desiredType = desiredType.GetElementType();
194194

195195
var converter =
@@ -320,9 +320,9 @@ internal static object DynValueToObjectOfType(DynValue value, Type desiredType,
320320
/// Implementation must follow that of DynValueToObjectOfType.. it's not very DRY in that sense.
321321
/// However here we are in perf-sensitive path.. TODO : double-check the gain and see if a DRY impl is better.
322322
/// </summary>
323-
internal static int DynValueToObjectOfTypeWeight(DynValue value, Type desiredType, bool isOptional)
323+
internal static int DynValueToObjectOfTypeWeight(DynValue value, Type desiredType, bool desiredByRef, bool isOptional)
324324
{
325-
if (desiredType.IsByRef)
325+
if (desiredByRef)
326326
desiredType = desiredType.GetElementType();
327327

328328
var customConverter =

src/WattleScript.Interpreter/Interop/Converters/TableConversions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,8 @@ internal static object ConvertTableToDictionaryOfGenericType(Type dictionaryType
140140

141141
foreach (var kvp in table.Pairs)
142142
{
143-
object key = ScriptToClrConversions.DynValueToObjectOfType(kvp.Key, keyType, null, false);
144-
object val = ScriptToClrConversions.DynValueToObjectOfType(kvp.Value, valueType, null, false);
143+
object key = ScriptToClrConversions.DynValueToObjectOfType(kvp.Key, keyType, false, null, false);
144+
object val = ScriptToClrConversions.DynValueToObjectOfType(kvp.Value, valueType, false, null, false);
145145

146146
dic.Add(key, val);
147147
}
@@ -159,7 +159,7 @@ internal static object ConvertTableToArrayOfGenericType(Type arrayType, Type ite
159159
for (int i = 1, l = table.Length; i <= l; i++)
160160
{
161161
DynValue v = table.Get(i);
162-
object o = ScriptToClrConversions.DynValueToObjectOfType(v, itemType, null, false);
162+
object o = ScriptToClrConversions.DynValueToObjectOfType(v, itemType, false, null, false);
163163
lst.Add(o);
164164
}
165165

@@ -188,7 +188,7 @@ internal static object ConvertTableToListOfGenericType(Type listType, Type itemT
188188
for (int i = 1, l = table.Length; i <= l; i++)
189189
{
190190
DynValue v = table.Get(i);
191-
object o = ScriptToClrConversions.DynValueToObjectOfType(v, itemType, null, false);
191+
object o = ScriptToClrConversions.DynValueToObjectOfType(v, itemType, false, null, false);
192192
lst.Add(o);
193193
}
194194

src/WattleScript.Interpreter/Interop/PropertyTableAssigner.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ private bool TryAssignProperty(object obj, string name, DynValue value)
167167
else
168168
{
169169
o = Interop.Converters.ScriptToClrConversions.DynValueToObjectOfType(value,
170-
pi.PropertyType, null, false);
170+
pi.PropertyType, false,null, false);
171171
}
172172

173173
pi.GetSetMethod(true).Invoke(obj, new object[] { o });

src/WattleScript.Interpreter/Interop/StandardDescriptors/HardwiredDescriptors/HardwiredMemberDescriptor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public DynValue GetValue(Script script, object obj)
3333
public void SetValue(Script script, object obj, DynValue value)
3434
{
3535
this.CheckAccess(MemberDescriptorAccess.CanWrite, obj);
36-
object v = ScriptToClrConversions.DynValueToObjectOfType(value, MemberType, null, false);
36+
object v = ScriptToClrConversions.DynValueToObjectOfType(value, MemberType, false, null, false);
3737
SetValueImpl(script, obj, v);
3838
}
3939

src/WattleScript.Interpreter/Interop/StandardDescriptors/MemberDescriptors/ArrayMemberDescriptor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ private static object ArrayIndexerSet(object arrayObj, ScriptExecutionContext ct
5858

5959
Type elemType = array.GetType().GetElementType();
6060

61-
object objValue = ScriptToClrConversions.DynValueToObjectOfType(value, elemType, null, false);
61+
object objValue = ScriptToClrConversions.DynValueToObjectOfType(value, elemType, false, null, false);
6262

6363
array.SetValue(objValue, indices);
6464

src/WattleScript.Interpreter/Interop/StandardDescriptors/MemberDescriptors/FunctionMemberDescriptorBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ protected virtual object[] BuildArgumentList(Script script, object obj, ScriptEx
208208
for (int ii = 0; ii < extraArgs.Count; ii++)
209209
{
210210
vararg.SetValue(ScriptToClrConversions.DynValueToObjectOfType(extraArgs[ii], VarArgsElementType,
211-
null, false), ii);
211+
false, null, false), ii);
212212
}
213213

214214
pars[i] = vararg;
@@ -219,7 +219,7 @@ protected virtual object[] BuildArgumentList(Script script, object obj, ScriptEx
219219
{
220220
var arg = args.RawGet(j, false);
221221
pars[i] = ScriptToClrConversions.DynValueToObjectOfType(arg, parameters[i].Type,
222-
parameters[i].DefaultValue, parameters[i].HasDefaultValue);
222+
parameters[i].TypeByRef, parameters[i].DefaultValue, parameters[i].HasDefaultValue);
223223
j += 1;
224224
}
225225
}

src/WattleScript.Interpreter/Interop/StandardDescriptors/ReflectionMemberDescriptors/FieldMemberDescriptor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ public void SetValue(Script script, object obj, DynValue v)
159159
if (IsReadonly || IsConst)
160160
throw new ScriptRuntimeException("userdata field '{0}.{1}' cannot be written to.", this.FieldInfo.DeclaringType.Name, this.Name);
161161

162-
object value = ScriptToClrConversions.DynValueToObjectOfType(v, this.FieldInfo.FieldType, null, false);
162+
object value = ScriptToClrConversions.DynValueToObjectOfType(v, this.FieldInfo.FieldType, false, null, false);
163163

164164
try
165165
{

src/WattleScript.Interpreter/Interop/StandardDescriptors/ReflectionMemberDescriptors/OverloadedMethodMemberDescriptor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,9 +403,9 @@ private int CalcScoreForOverload(ScriptExecutionContext context, CallbackArgumen
403403
private static int CalcScoreForSingleArgument(ParameterDescriptor desc, Type parameterType, DynValue arg, bool isOptional)
404404
{
405405
int score = ScriptToClrConversions.DynValueToObjectOfTypeWeight(arg,
406-
parameterType, isOptional);
406+
parameterType, desc.TypeByRef, isOptional);
407407

408-
if (parameterType.IsByRef || desc.IsOut || desc.IsRef)
408+
if (desc.TypeByRef || desc.IsOut || desc.IsRef)
409409
score = Math.Max(0, score + ScriptToClrConversions.WEIGHT_BYREF_BONUSMALUS);
410410

411411
return score;

0 commit comments

Comments
 (0)