/// <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)); }
/// <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); }