Esempio n. 1
0
        /// <summary>
        ///     Executes an index opeation.
        /// </summary>
        public SkryptObject ExecuteIndex(IndexNode node, ScopeContext scopeContext)
        {
            var arguments = new List <SkryptObject>();

            foreach (var subNode in node.Arguments)
            {
                var result = ExecuteExpression(subNode, scopeContext);

                arguments.Add(result);
            }

            var Object = ExecuteExpression(node.Getter, scopeContext);

            // Dynamically change type so we can get it's actual operations.
            dynamic left = Convert.ChangeType(Object, Object.GetType());

            Operation opLeft = SkryptObject.GetOperation(Operators.Index, Object.GetType(), arguments[0].GetType(), left.Operations);

            OperationDelegate operation = null;

            if (opLeft != null)
            {
                operation = opLeft.OperationDelegate;
            }
            else
            {
                _engine.ThrowError("No such operation as index " + left.Name + "!", node.Getter.Token);
            }

            var inputArray = new List <SkryptObject>(arguments);

            inputArray.Insert(0, Object);

            return(operation(inputArray.ToArray(), _engine));
        }
Esempio n. 2
0
        /// <summary>
        ///     Evaluates a binary operation.
        /// </summary>
        public SkryptObject Eval(Operator operation, SkryptObject leftObject, SkryptObject rightObject, Node node = null)
        {
            dynamic left  = Convert.ChangeType(leftObject, leftObject.GetType());
            dynamic right = Convert.ChangeType(rightObject, rightObject.GetType());

            Operation opLeft = SkryptObject.GetOperation(
                operation.Type,
                leftObject.GetType(),
                rightObject.GetType(),
                left.Operations
                );

            Operation opRight = SkryptObject.GetOperation(
                operation.Type,
                leftObject.GetType(),
                rightObject.GetType(),
                right.Operations
                );

            OperationDelegate operationDel = null;

            if (opLeft != null)
            {
                operationDel = opLeft.OperationDelegate;
            }

            if (opRight != null)
            {
                operationDel = opRight.OperationDelegate;
            }

            if (operationDel == null)
            {
                ThrowError("No such operation as " + left.Name + " " + operation.Operation + " " + right.Name, node.Token);
            }

            var result = (SkryptType)operationDel(new[] { leftObject, rightObject }, this);

            result.GetPropertiesFrom(Executor.GetType(result.TypeName, GlobalScope));

            return(result);
        }