Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/ikvm-fork.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjfrijters <jfrijters>2011-08-09 08:27:38 +0400
committerjfrijters <jfrijters>2011-08-09 08:27:38 +0400
commit14adc626999d649b5515cfe4c5a0d46a19fecb15 (patch)
tree511aca8c4413409e1282b561dbc163c1032a154c /runtime/openjdk/java.lang.invoke.cs
parent81fa21974b85a2341cf6b3c1e51d72220ec45511 (diff)
Refactored DynamicMethodBuilder constructors.
Diffstat (limited to 'runtime/openjdk/java.lang.invoke.cs')
-rw-r--r--runtime/openjdk/java.lang.invoke.cs94
1 files changed, 38 insertions, 56 deletions
diff --git a/runtime/openjdk/java.lang.invoke.cs b/runtime/openjdk/java.lang.invoke.cs
index a12d4cec..4f5999f0 100644
--- a/runtime/openjdk/java.lang.invoke.cs
+++ b/runtime/openjdk/java.lang.invoke.cs
@@ -177,7 +177,7 @@ static partial class MethodHandleUtil
private readonly DynamicMethod dm;
private readonly CodeEmitter ilgen;
private readonly Type packedArgType;
- private readonly int packedArgPos = Int32.MaxValue;
+ private readonly int packedArgPos;
sealed class Container<T1, T2>
{
@@ -191,83 +191,65 @@ static partial class MethodHandleUtil
}
}
- internal DynamicMethodBuilder(string name, MethodType type)
+ private DynamicMethodBuilder(string name, MethodType type, Type container, object target, object value)
{
this.type = type;
- firstArg = 0;
- delegateType = CreateDelegateType(type);
+ this.delegateType = CreateDelegateType(type);
+ this.target = target;
+ this.value = value;
+ this.container = container;
MethodInfo mi = GetDelegateInvokeMethod(delegateType);
- dm = new DynamicMethod(name, mi.ReturnType, GetParameterTypes(mi), typeof(DynamicMethodBuilder), true);
- ilgen = CodeEmitter.Create(dm);
+ Type[] paramTypes;
+ if (container != null)
+ {
+ this.firstArg = 1;
+ paramTypes = GetParameterTypes(container, mi);
+ }
+ else if (target != null)
+ {
+ this.firstArg = 1;
+ paramTypes = GetParameterTypes(target.GetType(), mi);
+ }
+ else
+ {
+ paramTypes = GetParameterTypes(mi);
+ }
+ this.dm = new DynamicMethod(name, mi.ReturnType, paramTypes, typeof(DynamicMethodBuilder), true);
+ this.ilgen = CodeEmitter.Create(dm);
if (type.parameterCount() > MaxArity)
{
- ParameterInfo[] pi = GetDelegateInvokeMethod(delegateType).GetParameters();
- packedArgPos = pi.Length - 1;
- packedArgType = pi[packedArgPos].ParameterType;
+ ParameterInfo[] pi = mi.GetParameters();
+ this.packedArgType = pi[pi.Length - 1].ParameterType;
+ this.packedArgPos = pi.Length - 1 + firstArg;
+ }
+ else
+ {
+ this.packedArgPos = Int32.MaxValue;
}
}
+ internal DynamicMethodBuilder(string name, MethodType type)
+ : this(name, type, null, null, null)
+ {
+ }
+
internal DynamicMethodBuilder(string name, MethodType type, MethodHandle target)
+ : this(name, type, null, target.vmtarget, null)
{
- this.type = type;
- firstArg = 1;
- delegateType = CreateDelegateType(type);
- this.target = target.vmtarget;
- MethodInfo mi = GetDelegateInvokeMethod(delegateType);
- dm = new DynamicMethod(name, mi.ReturnType, GetParameterTypes(target.vmtarget.GetType(), mi), typeof(DynamicMethodBuilder), true);
- ilgen = CodeEmitter.Create(dm);
ilgen.Emit(OpCodes.Ldarg_0);
-
- if (type.parameterCount() > MaxArity)
- {
- ParameterInfo[] pi = GetDelegateInvokeMethod(delegateType).GetParameters();
- packedArgPos = pi.Length - 1;
- packedArgType = pi[packedArgPos].ParameterType;
- packedArgPos++;
- }
}
internal DynamicMethodBuilder(string name, MethodType type, MethodHandle target, object value)
+ : this(name, type, typeof(Container<,>).MakeGenericType(target.vmtarget.GetType(), value.GetType()), target.vmtarget, value)
{
- this.type = type;
- firstArg = 1;
- delegateType = CreateDelegateType(type);
- this.target = target.vmtarget;
- this.value = value;
- this.container = typeof(Container<,>).MakeGenericType(target.vmtarget.GetType(), value.GetType());
- MethodInfo mi = GetDelegateInvokeMethod(delegateType);
- dm = new DynamicMethod(name, mi.ReturnType, GetParameterTypes(container, mi), typeof(DynamicMethodBuilder), true);
- ilgen = CodeEmitter.Create(dm);
ilgen.Emit(OpCodes.Ldarg_0);
ilgen.Emit(OpCodes.Ldfld, container.GetField("target"));
-
- if (type.parameterCount() > MaxArity)
- {
- ParameterInfo[] pi = GetDelegateInvokeMethod(delegateType).GetParameters();
- packedArgPos = pi.Length - 1;
- packedArgType = pi[packedArgPos].ParameterType;
- packedArgPos++;
- }
}
internal DynamicMethodBuilder(string name, MethodType type, Type valueType)
+ : this(name, type, typeof(Container<,>).MakeGenericType(typeof(object), valueType), null, null)
{
- this.type = type;
- firstArg = 1;
- delegateType = CreateDelegateType(type);
- this.container = typeof(Container<,>).MakeGenericType(typeof(object), valueType);
- MethodInfo mi = GetDelegateInvokeMethod(delegateType);
- dm = new DynamicMethod(name, mi.ReturnType, GetParameterTypes(container, mi), typeof(DynamicMethodBuilder), true);
- ilgen = CodeEmitter.Create(dm);
-
- if (type.parameterCount() > MaxArity)
- {
- ParameterInfo[] pi = GetDelegateInvokeMethod(delegateType).GetParameters();
- packedArgPos = pi.Length - 1;
- packedArgType = pi[packedArgPos].ParameterType;
- packedArgPos++;
- }
}
internal void Emit(OpCode opc)