Beispiel #1
0
            public InternalMethInfo(System.Reflection.MethodInfo target, ContextMethodAttribute binding)
            {
                _method = new Lazy <ContextCallableDelegate <TInstance> >(() =>
                {
                    var isFunc = target.ReturnType != typeof(void);
                    return(isFunc ? CreateFunction(target) : CreateProcedure(target));
                });

                MethodInfo = CreateMetadata(target, binding);
            }
Beispiel #2
0
            private static MethodInfo CreateMetadata(System.Reflection.MethodInfo target, ContextMethodAttribute binding)
            {
                var parameters = target.GetParameters();
                var isFunc     = target.ReturnType != typeof(void);
                var argNum     = parameters.Length;

                var paramDefs = new ParameterDefinition[argNum];

                for (int i = 0; i < argNum; i++)
                {
                    var pd = new ParameterDefinition();
                    if (parameters[i].GetCustomAttributes(typeof(ByRefAttribute), false).Length != 0)
                    {
                        if (parameters[i].ParameterType != typeof(IVariable))
                        {
                            throw new InvalidOperationException("Attribute ByRef can be applied only on IVariable parameters");
                        }
                        pd.IsByValue = false;
                    }
                    else
                    {
                        pd.IsByValue = true;
                    }

                    if (parameters[i].IsOptional)
                    {
                        pd.HasDefaultValue   = true;
                        pd.DefaultValueIndex = ParameterDefinition.UNDEFINED_VALUE_INDEX;
                    }

                    paramDefs[i] = pd;
                }

                var scriptMethInfo = new ScriptEngine.Machine.MethodInfo();

                scriptMethInfo.IsFunction           = isFunc;
                scriptMethInfo.IsExport             = true;
                scriptMethInfo.IsDeprecated         = binding.IsDeprecated;
                scriptMethInfo.ThrowOnUseDeprecated = binding.ThrowOnUse;
                scriptMethInfo.Name  = binding.GetName();
                scriptMethInfo.Alias = binding.GetAlias(target.Name);

                scriptMethInfo.Params = paramDefs;

                return(scriptMethInfo);
            }