Commit c325ad28 authored by mgravell's avatar mgravell

avoid having to hard-code when a size-local is needed in CreateParamInfoGenerator

parent 10d62ba8
...@@ -2379,7 +2379,8 @@ internal static IList<LiteralToken> GetLiteralTokens(string sql) ...@@ -2379,7 +2379,8 @@ internal static IList<LiteralToken> GetLiteralTokens(string sql)
var il = dm.GetILGenerator(); var il = dm.GetILGenerator();
bool isStruct = type.IsValueType; bool isStruct = type.IsValueType;
var sizeLocal = (LocalBuilder)null; var _sizeLocal = (LocalBuilder)null;
LocalBuilder GetSizeLocal() => _sizeLocal ?? (_sizeLocal = il.DeclareLocal(typeof(int)));
il.Emit(OpCodes.Ldarg_1); // stack is now [untyped-param] il.Emit(OpCodes.Ldarg_1); // stack is now [untyped-param]
LocalBuilder typedParameterLocal; LocalBuilder typedParameterLocal;
...@@ -2590,10 +2591,6 @@ internal static IList<LiteralToken> GetLiteralTokens(string sql) ...@@ -2590,10 +2591,6 @@ internal static IList<LiteralToken> GetLiteralTokens(string sql)
} }
if (checkForNull) if (checkForNull)
{ {
if ((dbType == DbType.String || dbType == DbType.AnsiString) && sizeLocal == null)
{
sizeLocal = il.DeclareLocal(typeof(int));
}
// relative stack: [boxed value] // relative stack: [boxed value]
il.Emit(OpCodes.Dup);// relative stack: [boxed value] [boxed value] il.Emit(OpCodes.Dup);// relative stack: [boxed value] [boxed value]
Label notNull = il.DefineLabel(); Label notNull = il.DefineLabel();
...@@ -2605,7 +2602,7 @@ internal static IList<LiteralToken> GetLiteralTokens(string sql) ...@@ -2605,7 +2602,7 @@ internal static IList<LiteralToken> GetLiteralTokens(string sql)
if (dbType == DbType.String || dbType == DbType.AnsiString) if (dbType == DbType.String || dbType == DbType.AnsiString)
{ {
EmitInt32(il, 0); EmitInt32(il, 0);
il.Emit(OpCodes.Stloc, sizeLocal); il.Emit(OpCodes.Stloc, GetSizeLocal());
} }
if (allDone != null) il.Emit(OpCodes.Br_S, allDone.Value); if (allDone != null) il.Emit(OpCodes.Br_S, allDone.Value);
il.MarkLabel(notNull); il.MarkLabel(notNull);
...@@ -2622,7 +2619,7 @@ internal static IList<LiteralToken> GetLiteralTokens(string sql) ...@@ -2622,7 +2619,7 @@ internal static IList<LiteralToken> GetLiteralTokens(string sql)
il.MarkLabel(isLong); il.MarkLabel(isLong);
EmitInt32(il, -1); // [string] [-1] EmitInt32(il, -1); // [string] [-1]
il.MarkLabel(lenDone); il.MarkLabel(lenDone);
il.Emit(OpCodes.Stloc, sizeLocal); // [string] il.Emit(OpCodes.Stloc, GetSizeLocal()); // [string]
} }
if (prop.PropertyType.FullName == LinqBinary) if (prop.PropertyType.FullName == LinqBinary)
{ {
...@@ -2646,6 +2643,7 @@ internal static IList<LiteralToken> GetLiteralTokens(string sql) ...@@ -2646,6 +2643,7 @@ internal static IList<LiteralToken> GetLiteralTokens(string sql)
if (prop.PropertyType == typeof(string)) if (prop.PropertyType == typeof(string))
{ {
var endOfSize = il.DefineLabel(); var endOfSize = il.DefineLabel();
var sizeLocal = GetSizeLocal();
// don't set if 0 // don't set if 0
il.Emit(OpCodes.Ldloc, sizeLocal); // [parameters] [[parameters]] [parameter] [size] il.Emit(OpCodes.Ldloc, sizeLocal); // [parameters] [[parameters]] [parameter] [size]
il.Emit(OpCodes.Brfalse_S, endOfSize); // [parameters] [[parameters]] [parameter] il.Emit(OpCodes.Brfalse_S, endOfSize); // [parameters] [[parameters]] [parameter]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment