Ejemplo n.º 1
0
        public Node GetOptimisedNode(Node node)
        {
            var  result  = _engine.Executor.ExecuteExpression(node, _engine.GlobalScope);
            Node newNode = node;

            Type resultType = result.GetType();

            if (resultType == typeof(Library.Native.System.Numeric))
            {
                newNode = new NumericNode {
                    Value = ((Library.Native.System.Numeric)result).Value
                };
            }
            else if (resultType == typeof(Library.Native.System.String))
            {
                newNode = new StringNode {
                    Value = ((Library.Native.System.String)result).Value
                };
            }
            else if (resultType == typeof(Library.Native.System.Boolean))
            {
                newNode = new BooleanNode {
                    Value = ((Library.Native.System.Boolean)result).Value
                };
            }
            else if (resultType == typeof(Library.Native.System.Null))
            {
                newNode = new NullNode();
            }

            newNode.Nodes = node.Nodes;

            return(newNode);
        }
Ejemplo n.º 2
0
        public static Node OptimiseExpressionNode(Node node, SkryptEngine engine)
        {
            if (!node.Nodes.Any())
            {
                return(node);
            }

            var isBinaryExpression = node.Nodes.Count == 2;
            var onlyHasLiterals    = true;
            var token   = node.Token;
            var newNode = node.Copy();

            for (int i = 0; i < node.Nodes.Count; i++)
            {
                newNode.Nodes[i] = OptimiseExpressionNode(node.Nodes[i], engine);
            }

            foreach (var n in newNode.Nodes)
            {
                if ((n.Type & TokenTypes.Literal) == 0)
                {
                    onlyHasLiterals = false;
                    break;
                }
            }

            if (onlyHasLiterals)
            {
                var retVal = engine.Executor.ExecuteExpression(newNode, engine.GlobalScope);

                if (retVal.GetType() == typeof(Skrypt.Library.Native.System.Numeric))
                {
                    newNode = new NumericNode {
                        Value = (Skrypt.Library.Native.System.Numeric)retVal,
                        Token = node.Token
                    };
                }
                else if (retVal.GetType() == typeof(Skrypt.Library.Native.System.String))
                {
                    newNode = new StringNode {
                        Value = (Skrypt.Library.Native.System.String)retVal,
                        Token = node.Token
                    };
                }
                else if (retVal.GetType() == typeof(Skrypt.Library.Native.System.Boolean))
                {
                    newNode = new BooleanNode {
                        Value = (Skrypt.Library.Native.System.Boolean)retVal,
                        Token = node.Token
                    };
                }
                //else if (retVal.GetType() == typeof(Skrypt.Library.Native.System.Array)) {
                //    newNode = new ArrayNode {
                //        Value = (Skrypt.Library.Native.System.Array)retVal,
                //        Token = node.Token
                //    };
                //}
            }

            return(newNode);
        }