public CorValue CreateCorValue(EvaluationContext ctx, CorType type, params CorValRef[] args) { CorEvaluationContext cctx = (CorEvaluationContext)ctx; CorValue[] vargs = new CorValue [args.Length]; for (int n = 0; n < args.Length; n++) { vargs [n] = args [n].Val; } Type t = type.GetTypeInfo(cctx.Session); MethodInfo ctor = null; foreach (MethodInfo met in t.GetMethods()) { if (met.IsSpecialName && met.Name == ".ctor") { ParameterInfo[] pinfos = met.GetParameters(); if (pinfos.Length == 1) { ctor = met; break; } } } if (ctor == null) { return(null); } CorFunction func = type.Class.Module.GetFunctionFromToken(ctor.MetadataToken); return(cctx.RuntimeInvoke(func, type.TypeParameters, null, vargs)); }
public override object RuntimeInvoke(EvaluationContext gctx, object gtargetType, object gtarget, string methodName, object[] ggenericArgTypes, object[] gargTypes, object[] gargValues) { // FIXME: support generic methods by using the genericArgTypes parameter CorType targetType = (CorType)gtargetType; CorValRef target = (CorValRef)gtarget; CorType[] argTypes = CastArray <CorType> (gargTypes); CorValRef[] argValues = CastArray <CorValRef> (gargValues); BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic; if (target != null) { flags |= BindingFlags.Instance; } else { flags |= BindingFlags.Static; } CorEvaluationContext ctx = (CorEvaluationContext)gctx; MethodInfo method = OverloadResolve(ctx, methodName, targetType, argTypes, flags, true); ParameterInfo[] parameters = method.GetParameters(); for (int n = 0; n < parameters.Length; n++) { if (parameters[n].ParameterType == typeof(object) && (IsValueType(ctx, argValues[n]))) { argValues[n] = Box(ctx, argValues[n]); } } if (method != null) { CorValRef v = new CorValRef(delegate { CorFunction func = targetType.Class.Module.GetFunctionFromToken(method.MetadataToken); CorValue[] args = new CorValue[argValues.Length]; for (int n = 0; n < args.Length; n++) { args[n] = argValues[n].Val; } return(ctx.RuntimeInvoke(func, new CorType[0], target != null ? target.Val : null, args)); }); if (v.Val == null) { return(null); } else { return(v); } } else { throw new EvaluatorException("Invalid method name or incompatible arguments."); } }