Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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.");
            }
        }