Пример #1
0
        public Runtime()
        {
            unaryOps = new Dictionary<ExpressionType, UnaryOperationBinder>();
            binaryOps = new Dictionary<ExpressionType, BinaryOperationBinder>();
            InvokeCallSite = new InvokeBinder();
            ConvertCallSite = new ConvertBinder();
            GetIndexCallSite = new GetIndexBinder();
            SetIndexCallSite = new SetIndexBinder();

            BuiltIns = new Dictionary<string, Expression>();

            RegisterClass("Foo", null);
            RegisterFunction("range", args =>
                {
                    return Iter.Range(((Number)args[0]).Value, ((Number)args[1]).Value);
                });
            RegisterFunction("using", args =>
                {
                    var filename = args[0].ToString();
                    var scanner = new Scanner(File.ReadAllText(filename));
                    var parser = new Parser(this, scanner);
                    var expr = parser.Parse();

                    var func = expr.Compile();
                    return func();
                });
            RegisterFunction("print", args => Console.WriteLine(string.Join(" ", args)));

            RegisterModule("maths", new Dictionary<string, Any>
                {
                    {"PI", new Number(Math.PI)},
                    {"cos", new Function(args => new Number(Math.Cos(((Number) args[0]).Value)))},
                    {"sin", new Function(args => new Number(Math.Sin(((Number) args[0]).Value)))},

                });
        }
Пример #2
0
 /// <summary>
 /// Gets a Record Value by position Index.
 /// </summary>
 public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
 {
     result = this.GetStoredValue(GetFieldDefinitionFromIndexer(indexes));
     return(true);
 }
Пример #3
0
        public override bool TryGetIndex(
            GetIndexBinder binder,
            object[] indexes,
            out object result)
        {
            if (indexes.Length == 1)
            {
                var name = indexes[0].ToString();
                if (MethodNames.Contains(name))
                {
                    result = null;
                    return(false);
                }
                switch (Def.ExtendedColumnTypes.Get(name))
                {
                case "Class":
                    result = Model.GetClass(name);
                    return(true);

                case "Num":
                    result = Model.GetNum(name).Value;
                    return(true);

                case "Date":
                    result = Model.GetDate(name);
                    return(true);

                case "Description":
                    result = Model.GetDescription(name);
                    return(true);

                case "Check":
                    result = Model.GetCheck(name);
                    return(true);
                }
                switch (name)
                {
                case nameof(BaseItemModel.Ver):
                    result = Model.Ver;
                    return(true);

                case nameof(BaseItemModel.Creator):
                    result = Model.Creator.Id;
                    return(true);

                case nameof(BaseItemModel.Updator):
                    result = Model.Updator.Id;
                    return(true);

                case nameof(BaseItemModel.CreatedTime):
                    result = Model.CreatedTime.Value;
                    return(true);

                case nameof(BaseItemModel.UpdatedTime):
                    result = Model.UpdatedTime.Value;
                    return(true);

                case nameof(BaseItemModel.VerUp):
                    result = Model.VerUp;
                    return(true);

                case nameof(BaseItemModel.SiteId):
                    result = Model.SiteId;
                    return(true);

                case nameof(BaseItemModel.Body):
                    result = Model.Body;
                    return(true);

                case nameof(BaseItemModel.Title):
                    result = Model.Title.Value;
                    return(true);
                }
                if (Model is IssueModel issueModel)
                {
                    switch (name)
                    {
                    case nameof(IssueModel.IssueId):
                        result = issueModel.IssueId;
                        return(true);

                    case nameof(IssueModel.StartTime):
                        result = issueModel.StartTime;
                        return(true);

                    case nameof(IssueModel.CompletionTime):
                        result = issueModel.CompletionTime.Value;
                        return(true);

                    case nameof(IssueModel.WorkValue):
                        result = issueModel.WorkValue.Value;
                        return(true);

                    case nameof(IssueModel.ProgressRate):
                        result = issueModel.ProgressRate.Value;
                        return(true);

                    case nameof(IssueModel.RemainingWorkValue):
                        result = issueModel.RemainingWorkValue;
                        return(true);

                    case nameof(IssueModel.Status):
                        result = issueModel.Status.Value;
                        return(true);

                    case nameof(IssueModel.Manager):
                        result = issueModel.Manager.Id;
                        return(true);

                    case nameof(IssueModel.Owner):
                        result = issueModel.Owner.Id;
                        return(true);

                    case nameof(IssueModel.Locked):
                        result = issueModel.Locked;
                        return(true);

                    case nameof(IssueModel.ReadOnly):
                        result = issueModel.ReadOnly;
                        return(true);
                    }
                }
                else if (Model is ResultModel resultModel)
                {
                    switch (name)
                    {
                    case nameof(ResultModel.ResultId):
                        result = resultModel.ResultId;
                        return(true);

                    case nameof(ResultModel.Status):
                        result = resultModel.Status.Value;
                        return(true);

                    case nameof(ResultModel.Manager):
                        result = resultModel.Manager.Id;
                        return(true);

                    case nameof(ResultModel.Owner):
                        result = resultModel.Owner.Id;
                        return(true);

                    case nameof(ResultModel.Locked):
                        result = resultModel.Locked;
                        return(true);

                    case nameof(ResultModel.ReadOnly):
                        result = resultModel.ReadOnly;
                        return(true);
                    }
                }
            }
            result = null;
            return(false);
        }
 public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
 {
     return(this.TryGetMemberCommon((string)indexes[0], out result));
 }
Пример #5
0
 public override bool TryGetIndex(GetIndexBinder binder, object[] indices, out object result)
 {
     return(TryWrappedBindAndInvoke(binder, indices, out result));
 }
Пример #6
0
 public virtual bool TryGetIndex(T instance, GetIndexBinder binder, object[] indexes, out object result)
 {
     result = null;
     return(false);
 }
 public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) {
     ContractUtils.RequiresNotNull(binder, "binder");
     return binder.FallbackGetIndex(UnwrapSelf(), indexes);
 }
 /// <summary>
 /// Performs the binding of the dynamic get index operation.
 /// </summary>
 /// <param name="binder">An instance of the <see cref="GetIndexBinder"/> that represents the details of the dynamic operation.</param>
 /// <param name="indexes">An array of <see cref="DynamicMetaObject"/> instances - indexes for the get index operation.</param>
 /// <returns>The new <see cref="DynamicMetaObject"/> representing the result of the binding.</returns>
 public virtual DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) {
     ContractUtils.RequiresNotNull(binder, "binder");
     return binder.FallbackGetIndex(this, indexes);
 }
Пример #9
0
 public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes)
 {
     return(BindGetMember(indexes[0].Value, binder, BindingRestrictions.GetInstanceRestriction(indexes[0].Expression, indexes[0].Value), () => base.BindGetIndex(binder, indexes)));
 }
Пример #10
0
 public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes)
 {
     ContractUtils.RequiresNotNull(binder, "binder");
     return(binder.FallbackGetIndex(UnwrapSelf(), indexes));
 }
Пример #11
0
 public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
 {
     return(vals.TryGetValue((string)indexes[0], out result));
 }
Пример #12
0
 public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
 {
     return(this.fields.TryGetValue(indexes[0] as string, out result));
 }
Пример #13
0
 public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
 {
     return(TryHandleDynamicCall(indexes[0].ToString(), out result));
 }
Пример #14
0
 public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
 {
     return(base.TryGetIndex(binder, indexes, out result));
 }
Пример #15
0
 public sealed override bool TryGetIndex(GetIndexBinder b, object[] i, out object r) => ByMemberName(out r, (string)i[0]);
Пример #16
0
            public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
            {
                switch (indexes.Length)
                {
                    case 1:
                        if (indexes[0] is int)
                        {
                            int value = _oneDimension[(int)indexes[0]];
                            result = value;
                            return true;
                        }

                        break;
                    case 2:
                        if (indexes[0] is int && indexes[1] is int)
                        {
                            string value = _twoDimensions[Tuple.Create((int)indexes[0], (int)indexes[1])];
                            result = value;
                            return true;
                        }

                        break;
                }

                result = null;
                return false;
            }
Пример #17
0
        public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
        {
            IArrayType dataType = (IArrayType)base.DataType;

            return(TryGetIndex(this, dataType, binder, indexes, out result));
        }
Пример #18
0
 public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
 {
     result = ToValue(IsArray ? _data.Array[(int)indexes[0]] : _data.Dictionary[(string)indexes[0]]);
     return(true);
 }
            public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) {
                if (IsOverridden("TryGetIndex")) {
                    return CallMethodWithResult("TryGetIndex", binder, GetArgArray(indexes), (e) => binder.FallbackGetIndex(this, indexes, e));
                }

                return base.BindGetIndex(binder, indexes);
            }
Пример #20
0
 public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
 {
     result = this[indexes[0].ToString()];
     return(true);
 }
Пример #21
0
		public override DynamicMetaObject BindGetIndex( GetIndexBinder binder, DynamicMetaObject[] indexes )
		{
			DEBUG.IndentLine( "\n-- BindGetIndex: {0}", TypeHelper.ToString( MetaList2List( indexes ), "[]" ) );

			var obj = (DynamicNode)this.Value;
			var node = new DynamicNode.GetIndex( obj, MetaList2List( indexes ) ) { _Parser = obj._Parser };
			obj._Parser._LastNode = node;

			var par = Expression.Variable( typeof( DynamicNode ), "ret" );
			var exp = Expression.Block(
				new ParameterExpression[] { par },
				Expression.Assign( par, Expression.Constant( node ) )
				);

			DEBUG.Unindent();
			return new DynamicMetaNode( exp, this.Restrictions, node );
		}
Пример #22
0
 public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes)
 {
     return(BindGetOrInvoke(indexes, binder.CallInfo) ??
            base.BindGetIndex(binder, indexes));
 }
Пример #23
0
 public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes)
 {
     return(binder.FallbackGetIndex(_baseMetaObject,
                                    indexes,
                                    AddTypeRestrictions(_metaObject.BindGetIndex(binder, indexes))));
 }
Пример #24
0
 public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
 {
     return(GetMember(indexes[0].ToString(), out result));
 }
Пример #25
0
 public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes)
 {
     return(scriptItem.PostProcessBindResult(metaDynamic.BindGetIndex(binder, indexes)));
 }
Пример #26
0
 public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
 {
     return((IsArray)
         ? TryGet(xml.Elements().ElementAtOrDefault((int)indexes[0]), out result)
         : TryGet(xml.Element((string)indexes[0]), out result));
 }
Пример #27
0
 // TODO: access multi-dimesional
 // https://stackoverflow.com/questions/2783502/c-sharp-using-the-dynamic-keyword-to-access-properties-via-strings-without-refle
 public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
 {
     result = AsDynamic[indexes[0]];
     return(true);
 }
Пример #28
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="indexes"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
        {
            object index0 = indexes[0];

            return(TryGetColumn(index0, out result));
        }
Пример #29
0
 public sealed override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes)
 => VariantValue.BindGetIndex(binder, indexes);
Пример #30
0
 public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
 {
     result = GetTableValue(indexes[0].ToString());
     return(true);
 }
Пример #31
0
 public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes)
 {
     return(InteropBinder.GetIndex.Bind(new InteropBinder.GetIndex(Scope, binder.CallInfo), this, indexes));
 }
Пример #32
0
 public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes)
 {
     return(AddRestrictions(_metaForwardee.BindGetIndex(binder, indexes)));
 }
 public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) {
     return BindGetOrInvoke(indexes, binder.CallInfo) ??
         base.BindGetIndex(binder, indexes);
 }
Пример #34
0
 public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
 {
     result = Instance;
     return(true);
 }
Пример #35
0
        public static bool TryBindGetIndex(GetIndexBinder binder, DynamicMetaObject instance, DynamicMetaObject[] args, out DynamicMetaObject result) {
            ContractUtils.RequiresNotNull(binder, "binder");
            ContractUtils.RequiresNotNull(instance, "instance");
            ContractUtils.RequiresNotNull(args, "args");

            if (TryGetMetaObject(ref instance)) {
                //
                // Demand Full Trust to proceed with the binding.
                //

                new PermissionSet(PermissionState.Unrestricted).Demand();

                result = instance.BindGetIndex(binder, args);
                return true;
            } else {
                result = null;
                return false;
            }
        }
 public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) => this;
 public virtual bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) {
     result = null;
     return false;
 }
        /// <summary>
        /// Create call expression to any indexer that matches in the library.
        /// </summary>
        /// <param name="binder"></param>
        /// <param name="args"></param>
        /// <param name="dynamicObjectType">The LimitType property or value.GetType() of the dynamic object</param>
        /// <param name="dynamicObjectExpression">the Expression property of the dynamic object</param>
        /// <returns>new DynamicMetaObject or null</returns>
        public virtual DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] args, Type dynamicObjectType, Expression dynamicObjectExpression)
        {
            Type selfType = dynamicObjectType;

            foreach (PropertyInfo pi in Indexers)
            {
                MethodInfo mi = pi.GetGetMethod();
                if (mi == null)
                {
                    continue;
                }

                ParameterInfo[] pis = mi.GetParameters();

                // Test instance type matches
                if (!mi.DeclaringType.IsAssignableFrom(selfType))
                {
                    continue;
                }

                // Test if other parameters match arguments
                bool match = true;
                for (int i = 0; i < args.Length; i++)
                {
                    Type piType           = pis[i].ParameterType;
                    DynamicMetaObject arg = args[i];
                    bool argTypeMatches   =
                        arg.RuntimeType != null && piType.IsAssignableFrom(arg.RuntimeType) |
                        arg.LimitType != null && piType.IsAssignableFrom(arg.LimitType) |
                        arg.HasValue && piType.IsAssignableFrom(arg.Value.GetType()) |
                        arg.Expression != null && piType.IsAssignableFrom(arg.Expression.Type);
                    match &= argTypeMatches;
                    if (!match)
                    {
                        break;
                    }
                }
                if (!match)
                {
                    continue;
                }

                Expression selfExpression = dynamicObjectExpression;
                if (!selfExpression.Type.Equals(mi.DeclaringType))
                {
                    selfExpression = Expression.Convert(selfExpression, mi.DeclaringType);
                }
                Expression[]        argExps      = new Expression[args.Length];
                BindingRestrictions restrictions = BindingRestrictions.GetTypeRestriction(dynamicObjectExpression, dynamicObjectType);
                for (int i = 0; i < args.Length; i++)
                {
                    argExps[i] =
                        args[i].Expression.Type.Equals(pis[i].ParameterType) ?
                        args[i].Expression :
                        Expression.Convert(args[i].Expression, pis[i].ParameterType);
                    restrictions = restrictions.Merge(BindingRestrictions.GetTypeRestriction(args[i].Expression, pis[i].ParameterType));
                }
                Expression exp =
                    mi.IsStatic ?
                    Expression.Call(mi, argExps) :
                    Expression.Call(selfExpression, mi, argExps);
                //restrictions = restrictions.Merge(BindingRestrictions.GetTypeRestriction(exp, mi.ReturnType));
                return(new DynamicMetaObject(exp, restrictions));
            }
            return(null);
        }
Пример #39
0
 public override DynamicMetaObject/*!*/ BindGetIndex(GetIndexBinder/*!*/ binder, DynamicMetaObject/*!*/[]/*!*/ indexes) {
     return PythonProtocol.Index(binder, PythonIndexType.GetItem, ArrayUtils.Insert(this, indexes));
 }
Пример #40
0
 public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes)
 {
     return(IsOverridden("TryGetIndex")
    ? CallMethodWithResult("TryGetIndex", binder, GetArgArray(indexes), e => binder.FallbackGetIndex(this, indexes, e))
    : base.BindGetIndex(binder, indexes));
 }
Пример #41
0
 public override DynamicMetaObject/*!*/ BindGetIndex(GetIndexBinder/*!*/ binder, DynamicMetaObject/*!*/[]/*!*/ indexes) {
     PerfTrack.NoteEvent(PerfTrack.Categories.Binding, "OldClass GetIndex" + indexes.Length);
     PerfTrack.NoteEvent(PerfTrack.Categories.BindingTarget, "OldClass GetIndex");
     return PythonProtocol.Index(binder, PythonIndexType.GetItem, ArrayUtils.Insert(this, indexes));
 }
Пример #42
0
        public override DynamicMetaObject BindGetIndex(GetIndexBinder binder, DynamicMetaObject[] indexes) {
            ContractUtils.RequiresNotNull(binder, "binder");

            ComMethodDesc getItem;
            if (_self.TryGetGetItem(out getItem)) {

                bool[] isByRef = ComBinderHelpers.ProcessArgumentsForCom(ref indexes);
                return BindComInvoke(indexes, getItem, binder.CallInfo , isByRef);
            }

            return base.BindGetIndex(binder, indexes);
        }