public Object Execute(ICodeNode node)
        {
            ICodeNodeTypeImplementation nodeType = (ICodeNodeTypeImplementation)node.GetType();
            SendSourceLineMessage(node);

            switch (nodeType.ToString())
            {
                case "COMPOUND":
                    {
                        CompoundExecutor compoundExecutor = new CompoundExecutor(this);
                        return compoundExecutor;
                    }

                case "ASSIGN":
                    {
                        AssignmentExecutor assignmentExecutor = new AssignmentExecutor(this);
                        return assignmentExecutor;
                    }

                case "NO_OP": return null;

                default:
                    {
                        errorHandler.flag(node, RuntimeErrorCode.UNIMPLEMENTED_FEATURE, this);
                        return null;
                    }
            }
        }
 public override void Visit(ICodeNode node)
 {
     if (this.searchResult == UsageFinderSearchResult.NotFound)
     {
         base.Visit(node);
     }
 }
 public override void Visit(ICodeNode node)
 {
     if (!found)
     {
         base.Visit(node);
     }
 }
예제 #4
0
        // Parse a statement list.
        protected internal void ParseList(Token token, ICodeNode parentNode, PascalTokenType terminator, PascalErrorCode errorCode)
        {
            // Loop to parse each statement until the END token or the end of the source file.
            while (!(token is EofToken) && (token.type != terminator))
            {
                // Parse a statement.  The parent node adopts the statement node.
                ICodeNode statementNode = Parse(token);
                parentNode.AddChild(statementNode);

                token = CurrentToken();
                TokenType tokenType = token.type;

                // Look for semicolon between statements.
                if (tokenType == PascalTokenType.SEMICOLON)
                    token = NextToken();

                // If at the start of the next assignment statement, then missing a semicolon.
                else if (tokenType == PascalTokenType.IDENTIFIER)
                    errorHandler.flag(token, PascalErrorCode.MISSING_SEMICOLON, this);

                else if (tokenType != terminator)
                {
                    errorHandler.flag(token, PascalErrorCode.UNEXPECTED_TOKEN, this);
                    token = NextToken();
                }
            }

            if (token.type == terminator)
                token = NextToken();
            else
                errorHandler.flag(token, errorCode, this);
        }
        private void SendSourceLineMessage(ICodeNode node)
        {
            Object lineNumber = node.GetAttribute(ICodeKeyImplementation.LINE);

            if (lineNumber != null)
                sendMessage(new Message(MessageType.SOURCE_LINE, lineNumber));
        }
 public override void Visit(ICodeNode node)
 {
     hasSideEffects = HasSideEffects(node);
     if (!hasSideEffects)
     {
         base.Visit(node);
     }
 }
        public Object Execute(ICodeNode node)
        {
            StatementExecutor statementExecutor = new StatementExecutor(this);
            List<ICodeNode> children = node.GetChildren();
            foreach (ICodeNode child in children)
                statementExecutor.Execute(child);

            return null;
        }
        public override ICodeNode Visit(ICodeNode node)
        {
            if (matcherState == MatcherState.Stopped)
            {
                return node;
            }

            return base.Visit(node);
        }
		public virtual void Visit (ICodeNode node)
		{
			if (null == node)
				return;

			switch (node.CodeNodeType) {
<%
	for node in model.GetVisitableNodes():
%>			case CodeNodeType.${node.Name}:
        public override ICodeNode Visit(ICodeNode node)
        {
            if (this.failure)
            {
                return node;
            }

            return base.Visit(node);
        }
			public override void Visit(ICodeNode node)
			{
				if (this.IsAddressUnaryOperatorFound)
				{
					return;
				}

				base.Visit(node);
			}
 public override void Visit(ICodeNode node)
 {
     Expression expression = node as Expression;
     if (expression != null)
     {
         MapBranches(expression);
     }
     else
     {
         base.Visit(node);
     }
 }
예제 #13
0
        public void Emit(ICodeNode node, int si)
        {
            if (node == null)
                return;

            if(node is Expression)
                EmitExpression((Expression)node, si);
            else if(node is Statement)
                EmitStatement((Statement)node, si);
            else
                Helper.Break();
        }
        public override void Visit(ICodeNode node)
		{
			if (node is Expression)
			{
				parentExpressions.Push(node as Expression);
			}
			base.Visit(node);
			if (node is Expression)
			{
				parentExpressions.Pop();
			}
		}
        public override ICodeNode Visit(ICodeNode node)
        {
            if (status == InliningResult.NotFound)
            {
                node = base.Visit(node);
                if (valueHasSideEffects && status == InliningResult.NotFound && SideEffectsFinder.HasSideEffects(node))
                {
                    Abort();
                }
            }

            return node;
        }
        public void flag(ICodeNode node, RuntimeErrorCode errorCode, Backend backend)
        {
            string lineNumber = null;

            while ((node != null) && (node.GetAttribute(ICodeKeyImplementation.LINE) == null))
                node = node.GetParent();

            backend.sendMessage(new Message(MessageType.RUNTIME_ERROR, new Object[] { errorCode.ToString(), (int)node.GetAttribute(ICodeKeyImplementation.LINE) }));

            if (++errorCount > MAX_ERRORS)
            {
                Console.WriteLine("*** ABORTED AFTER TOO MANY RUNTIME ERRORS.");
                Environment.Exit(-1);
            }
        }
	public override void Visit (ICodeNode node)
	{
		var foo_node = node as IFooExpression;
		if (foo_node == null) {
			base.Visit (node);
			return;
		}

		switch (foo_node.FooExpressionType) {
		case FooExpressionType.Foo:
			VisitFoo ((FooExpression) node);
			break;
		case FooExpressionType.Bar:
			VisitBar ((BarExpression) node);
			break;
		}
	}
        public static bool HasSideEffects(ICodeNode node)
        {
            if (node == null)
            {
                return false;
            }

            switch (node.CodeNodeType)
            {
                case CodeNodeType.MethodInvocationExpression:
                case CodeNodeType.TypeOfExpression:
                case CodeNodeType.ArrayCreationExpression:
                case CodeNodeType.ObjectCreationExpression:
                case CodeNodeType.StackAllocExpression:
                case CodeNodeType.EventReferenceExpression:
                case CodeNodeType.DelegateInvokeExpression:
                case CodeNodeType.BaseCtorExpression:
                case CodeNodeType.ThisCtorExpression:
                case CodeNodeType.BoxExpression:
                case CodeNodeType.ArrayLengthExpression:
                case CodeNodeType.DynamicConstructorInvocationExpression:
                case CodeNodeType.DynamicIndexerExpression:
                case CodeNodeType.DynamicMemberReferenceExpression:
                case CodeNodeType.AnonymousObjectCreationExpression:
                case CodeNodeType.AwaitExpression:
                case CodeNodeType.LambdaExpression:
                case CodeNodeType.DelegateCreationExpression:
                    return true;
                case CodeNodeType.PropertyReferenceExpression:
                    return !(node as PropertyReferenceExpression).IsSetter;
                case CodeNodeType.CastExpression:
                    return !(node as CastExpression).IsExplicitInterfaceCast;
                case CodeNodeType.FieldReferenceExpression:
                    return !(node as FieldReferenceExpression).IsSimpleStore;
                case CodeNodeType.ArrayIndexerExpression:
                    return !(node as ArrayIndexerExpression).IsSimpleStore;
                case CodeNodeType.BinaryExpression:
                    BinaryExpression binaryExpression = node as BinaryExpression;
                    return binaryExpression.IsChecked || binaryExpression.Operator == BinaryOperator.Divide || binaryExpression.Operator == BinaryOperator.Modulo;
            }
            return false;
        }
        public override void Visit(ICodeNode node)
        {
            IPdbCodeNode pdbNode = node as IPdbCodeNode;
            if(pdbNode != null)
            {
                foreach (Instruction instruction in pdbNode.UnderlyingSameMethodInstructions)
                {
                    if (instruction.ContainingMethod != pdbNode.UnderlyingInstructionsMember)
                    {
                        throw new Exception("IPdbCodeNode contains instructions from different methods. After: " + previousStep);
                    }
                }
            }

            if (node != null && !visitedNodes.Add(node))
            {
                throw new Exception("Node duplication detected after: " + previousStep);
            }
            base.Visit(node);
        }
        public bool TryInlineVariable(VariableDefinition variableDef, Expression value, ICodeNode target, bool aggressive, out ICodeNode result)
        {
            this.variableDef = variableDef;
            this.value = value;

            if (!aggressive)
            {
                ASTNodeCounter counter = new ASTNodeCounter();
                if (counter.CountNodes(value) + counter.CountNodes(target) - 1 > MaxCount)
                {
                    result = target;
                    return false;
                }
            }

            SideEffectsFinder sideEffectsFinder = new SideEffectsFinder();
            valueHasSideEffects = sideEffectsFinder.HasSideEffectsRecursive(value);

            status = InliningResult.NotFound;
            result = Visit(target);
            return status == InliningResult.Success;
        }
예제 #21
0
        public void ParseList(Token token, ref ICodeNode parent, ILangTokenType terminator, ILangErrorCode error)
        {
            // As long as we are parseing neither endToken or terminating token
            // do this
            while (!(token is EndOfFileToken) && (token.TokenType.ToString() != terminator.ToString()))
            {
                ICodeNode statementNode = Parse(token);
                parent.AddChild(statementNode);

                // token have been moved; get the latest
                token = CurrentToken();

                if (token.TokenType == "semicolon")
                {
                    token = NextToken(); // move beyond the statement separator.
                }
                else if (token.TokenType == "identifier")
                {
                    ErrorHandler.Singleton.Flag(token, "missing_semicolon", this);
                }
                else if (token.TokenType != terminator)
                {
                    ErrorHandler.Singleton.Flag(token, "unexpected_token", this);
                    token = NextToken();
                }
            }

            if (token.TokenType == terminator)
            {
                token = NextToken();
            }
            else
            {
                ErrorHandler.Singleton.Flag(token, error, this);
            }
        }
 public ICodeNode SetRoot(ICodeNode node)
 {
     root = node;
     return root;
 }
        public override ICodeNode VisitBinaryExpression(BinaryExpression node)
        {
            ICodeNode result = base.VisitBinaryExpression(node);

            // a -> 1
            // b -> 2
            // a+b -> 3
            // b+a -> 3
            // a-b -> 4
            // b-a -> 5

            if (!expressionNumbers.ContainsKey(node))
            {
                int value      = -1;
                int valueLeft  = expressionNumbers[node.Left];
                int valueRight = expressionNumbers[node.Right];

                switch (node.Operator)
                {
                case BinaryOperator.Add:
                    foreach (var keypair in expressionNumbers)
                    {
                        if (keypair.Key.CodeNodeType == CodeNodeType.BinaryExpression)
                        {
                            BinaryExpression expr = (BinaryExpression)keypair.Key;
                            if (expr.Operator == BinaryOperator.Add)
                            {
                                int valueLeft1  = expressionNumbers[expr.Left];
                                int valueRight1 = expressionNumbers[expr.Right];
                                if (valueLeft == valueLeft1 && valueRight == valueRight1 ||
                                    valueLeft == valueRight1 && valueRight == valueLeft1)
                                {
                                    value = keypair.Value;
                                    break;
                                }
                            }
                        }
                    }
                    break;

                case BinaryOperator.Multiply:
                    foreach (var node1 in expressionNumbers)
                    {
                        if (node1.Key.CodeNodeType == CodeNodeType.BinaryExpression)
                        {
                            BinaryExpression expr = (BinaryExpression)node1.Key;
                            if (expr.Operator == BinaryOperator.Multiply)
                            {
                                int valueLeft1  = expressionNumbers[expr.Left];
                                int valueRight1 = expressionNumbers[expr.Right];
                                if (valueLeft == valueLeft1 && valueRight == valueRight1 ||
                                    valueLeft == valueRight1 && valueRight == valueLeft1)
                                {
                                    value = node1.Value;
                                    break;
                                }
                            }
                        }
                    }
                    break;
                }

                if (value == -1)
                {
                    value = expressionCnt++;
                }

                expressionNumbers.Add(node, value);
            }

            return(result);
        }
 internal ReferencedGenericParameter(IGenericParameter declaringGenericParameter, ICodeNode owner)
 {
     _declaringGenericParameter = declaringGenericParameter;
     _owner = owner;
 }
예제 #25
0
 public bool FindVariable(ICodeNode node)
 {
     found = false;
     Visit(node);
     return found;
 }
        private List <ICodeNode> children;                    // Children list

        public ICodeNodeImplementation(ICodeNodeType type)
        {
            this.type     = type;
            this.parent   = null;
            this.children = new List <ICodeNode>();
        }
 public bool FindContinue(ICodeNode node)
 {
     found = false;
     Visit(node);
     return(found);
 }
예제 #28
0
 public void ToNodes(ICodeNode parentNode)
 {
     // This blox won't compile to a node.
     // Instead use ToObjectNode for it to be used inside other node context
     // throw new System.NotImplementedException();
 }
 public bool ContainsTransparentIdentifiers(ICodeNode node)
 {
     this.contains = false;
     this.Visit(node);
     return(this.contains);
 }
예제 #30
0
 public ObjectNode(ICodeNode node, HighlightableButton highlightableBlox) : base(highlightableBlox)
 {
     Value = node;
 }
 public override void Visit(ICodeNode node)
 {
     count++;
     base.Visit(node);
 }
예제 #32
0
 public NotConstantException(string message, ICodeNode node) : base(message)
 {
     this.Node = node;
 }
예제 #33
0
 public bool FindContinue(ICodeNode node)
 {
     this.found = false;
     this.Visit(node);
     return(this.found);
 }
 public bool HasSideEffectsRecursive(ICodeNode node)
 {
     hasSideEffects = false;
     Visit(node);
     return(hasSideEffects);
 }
 public bool FindContinue(ICodeNode node)
 {
     found = false;
     Visit(node);
     return found;
 }
 public override void Visit(ICodeNode node)
 {
     if (!this.containsExpressionTree)
     {
         base.Visit(node);
     }
 }
 public int CountNodes(ICodeNode node)
 {
     count = 0;
     Visit(node);
     return(count);
 }
예제 #38
0
        public virtual void Visit(ICodeNode node)
        {
            visitsOnStack++;

            //A good place to watch for StackOverFlowException. That one cannot be effectively caught and results in app crash.
            //We replace it with our own custom exception here before it occurs. The number of allowed stack frames
            //i chosen empirically
            if (visitsOnStack == 600)
            {
                visitsOnStack = 0;
                throw new Exception("Stack overflow while traversing code tree in visit.");
            }

            if (null == node)
            {
                visitsOnStack--;
                return;
            }

            switch (node.CodeNodeType)
            {
            case CodeNodeType.UnsafeBlock:
                VisitUnsafeBlockStatement((UnsafeBlockStatement)node);
                break;

            case CodeNodeType.BlockStatement:
                VisitBlockStatement((BlockStatement)node);
                break;

            case CodeNodeType.ReturnExpression:
                VisitReturnExpression((ReturnExpression)node);
                break;

            case CodeNodeType.GotoStatement:
                VisitGotoStatement((GotoStatement)node);
                break;

            case CodeNodeType.IfStatement:
                VisitIfStatement((IfStatement)node);
                break;

            case CodeNodeType.IfElseIfStatement:
                VisitIfElseIfStatement((IfElseIfStatement)node);
                break;

            case CodeNodeType.ExpressionStatement:
                VisitExpressionStatement((ExpressionStatement)node);
                break;

            case CodeNodeType.ThrowExpression:
                VisitThrowExpression((ThrowExpression)node);
                break;

            case CodeNodeType.WhileStatement:
                VisitWhileStatement((WhileStatement)node);
                break;

            case CodeNodeType.DoWhileStatement:
                VisitDoWhileStatement((DoWhileStatement)node);
                break;

            case CodeNodeType.BreakStatement:
                VisitBreakStatement((BreakStatement)node);
                break;

            case CodeNodeType.ContinueStatement:
                VisitContinueStatement((ContinueStatement)node);
                break;

            case CodeNodeType.ForStatement:
                VisitForStatement((ForStatement)node);
                break;

            case CodeNodeType.ForEachStatement:
                VisitForEachStatement((ForEachStatement)node);
                break;

            case CodeNodeType.ConditionCase:
                VisitConditionCase((ConditionCase)node);
                break;

            case CodeNodeType.DefaultCase:
                VisitDefaultCase((DefaultCase)node);
                break;

            case CodeNodeType.SwitchStatement:
                VisitSwitchStatement((SwitchStatement)node);
                break;

            case CodeNodeType.CatchClause:
                VisitCatchClause((CatchClause)node);
                break;

            case CodeNodeType.TryStatement:
                VisitTryStatement((TryStatement)node);
                break;

            case CodeNodeType.BlockExpression:
                VisitBlockExpression((BlockExpression)node);
                break;

            case CodeNodeType.MethodInvocationExpression:
                VisitMethodInvocationExpression((MethodInvocationExpression)node);
                break;

            case CodeNodeType.MethodReferenceExpression:
                VisitMethodReferenceExpression((MethodReferenceExpression)node);
                break;

            case CodeNodeType.DelegateCreationExpression:
                VisitDelegateCreationExpression((DelegateCreationExpression)node);
                break;

            case CodeNodeType.LiteralExpression:
                VisitLiteralExpression((LiteralExpression)node);
                break;

            case CodeNodeType.UnaryExpression:
                VisitUnaryExpression((UnaryExpression)node);
                break;

            case CodeNodeType.BinaryExpression:
                VisitBinaryExpression((BinaryExpression)node);
                break;

            case CodeNodeType.ArgumentReferenceExpression:
                VisitArgumentReferenceExpression((ArgumentReferenceExpression)node);
                break;

            case CodeNodeType.VariableReferenceExpression:
                VisitVariableReferenceExpression((VariableReferenceExpression)node);
                break;

            case CodeNodeType.VariableDeclarationExpression:
                VisitVariableDeclarationExpression((VariableDeclarationExpression)node);
                break;

            case CodeNodeType.ThisReferenceExpression:
                VisitThisReferenceExpression((ThisReferenceExpression)node);
                break;

            case CodeNodeType.BaseReferenceExpression:
                VisitBaseReferenceExpression((BaseReferenceExpression)node);
                break;

            case CodeNodeType.FieldReferenceExpression:
                VisitFieldReferenceExpression((FieldReferenceExpression)node);
                break;

            case CodeNodeType.CastExpression:
                VisitCastExpression((CastExpression)node);
                break;

            case CodeNodeType.SafeCastExpression:
                VisitSafeCastExpression((SafeCastExpression)node);
                break;

            case CodeNodeType.CanCastExpression:
                VisitCanCastExpression((CanCastExpression)node);
                break;

            case CodeNodeType.TypeOfExpression:
                VisitTypeOfExpression((TypeOfExpression)node);
                break;

            case CodeNodeType.ConditionExpression:
                VisitConditionExpression((ConditionExpression)node);
                break;

            case CodeNodeType.ArrayCreationExpression:
                VisitArrayCreationExpression((ArrayCreationExpression)node);
                break;

            case CodeNodeType.ArrayIndexerExpression:
                VisitArrayIndexerExpression((ArrayIndexerExpression)node);
                break;

            case CodeNodeType.ObjectCreationExpression:
                VisitObjectCreationExpression((ObjectCreationExpression)node);
                break;

            case CodeNodeType.DefaultObjectExpression:
                VisitDefaultObjectExpression((DefaultObjectExpression)node);
                break;

            case CodeNodeType.PropertyReferenceExpression:
                VisitPropertyReferenceExpression((PropertyReferenceExpression)node);
                break;

            case CodeNodeType.TypeReferenceExpression:
                VisitTypeReferenceExpression((TypeReferenceExpression)node);
                break;

            case CodeNodeType.UsingStatement:
                VisitUsingStatement((UsingStatement)node);
                break;

            case CodeNodeType.FixedStatement:
                VisitFixedStatement((FixedStatement)node);
                break;

            case CodeNodeType.StackAllocExpression:
                VisitStackAllocExpression((StackAllocExpression)node);
                break;

            case CodeNodeType.SizeOfExpression:
                VisitSizeOfExpression((SizeOfExpression)node);
                break;

            case CodeNodeType.MakeRefExpression:
                VisitMakeRefExpression((MakeRefExpression)node);
                break;

            case CodeNodeType.EventReferenceExpression:
                VisitEventReferenceExpression((EventReferenceExpression)node);
                break;

            case CodeNodeType.EnumExpression:
                VisitEnumExpression((EnumExpression)node);
                break;

            case CodeNodeType.LambdaExpression:
                VisitLambdaExpression((LambdaExpression)node);
                break;

            case CodeNodeType.DelegateInvokeExpression:
                VisitDelegateInvokeExpression((DelegateInvokeExpression)node);
                break;

            case CodeNodeType.BaseCtorExpression:
                VisitBaseCtorExpression((BaseCtorExpression)node);
                break;

            case CodeNodeType.ThisCtorExpression:
                VisitThisCtorExpression((ThisCtorExpression)node);
                break;

            case CodeNodeType.YieldReturnExpression:
                VisitYieldReturnExpression((YieldReturnExpression)node);
                break;

            case CodeNodeType.YieldBreakExpression:
                VisitYieldBreakExpression((YieldBreakExpression)node);
                break;

            case CodeNodeType.LockStatement:
                VisitLockStatement((LockStatement)node);
                break;

            case CodeNodeType.EmptyStatement:
                VisitEmptyStatement((EmptyStatement)node);
                break;

            case CodeNodeType.DynamicMemberReferenceExpression:
                VisitDynamicMemberReferenceExpression((DynamicMemberReferenceExpression)node);
                break;

            case CodeNodeType.DynamicConstructorInvocationExpression:
                VisitDynamicConstructorInvocationExpression((DynamicConstructorInvocationExpression)node);
                break;

            case CodeNodeType.DynamicIndexerExpression:
                VisitDynamicIndexerExpression((DynamicIndexerExpression)node);
                break;

            case CodeNodeType.BoxExpression:
                VisitBoxExpression((BoxExpression)node);
                break;

            case CodeNodeType.LambdaParameterExpression:
                VisitLambdaParameterExpression((LambdaParameterExpression)node);
                break;

            case CodeNodeType.AwaitExpression:
                VisitAwaitExpression((AwaitExpression)node);
                break;

            case CodeNodeType.ArrayLengthExpression:
                VisitArrayLengthExpression((ArrayLengthExpression)node);
                break;

            case CodeNodeType.ExceptionStatement:
                VisitExceptionStatement((ExceptionStatement)node);
                break;

            case CodeNodeType.BreakSwitchCaseStatement:
                VisitBreakSwitchCaseStatement((BreakSwitchCaseStatement)node);
                break;

            case CodeNodeType.CaseGotoStatement:
                VisitCaseGotoStatement((CaseGotoStatement)node);
                break;

            case CodeNodeType.FinallyClause:
                VisitFinallyClause((FinallyClause)node);
                break;

            case CodeNodeType.ShortFormReturnExpression:
                VisitShortFormReturnExpression((ShortFormReturnExpression)node);
                break;

            case CodeNodeType.AnonymousObjectCreationExpression:
                VisitAnonymousObjectCreationExpression((AnonymousObjectCreationExpression)node);
                break;

            case CodeNodeType.FromClause:
                VisitFromClause((FromClause)node);
                break;

            case CodeNodeType.WhereClause:
                VisitWhereClause((WhereClause)node);
                break;

            case CodeNodeType.SelectClause:
                VisitSelectClause((SelectClause)node);
                break;

            case CodeNodeType.OrderByClause:
                VisitOrderByClause((OrderByClause)node);
                break;

            case CodeNodeType.GroupClause:
                VisitGroupClause((GroupClause)node);
                break;

            case CodeNodeType.JoinClause:
                VisitJoinClause((JoinClause)node);
                break;

            case CodeNodeType.LetClause:
                VisitLetClause((LetClause)node);
                break;

            case CodeNodeType.IntoClause:
                VisitIntoClause((IntoClause)node);
                break;

            case CodeNodeType.LinqQueryExpression:
                VisitLinqQueryExpression((LinqQueryExpression)node);
                break;

            case CodeNodeType.ArrayVariableCreationExpression:
                VisitArrayVariableDeclarationExpression((ArrayVariableDeclarationExpression)node);
                break;

            case CodeNodeType.ArrayAssignmentVariableReferenceExpression:
                VisitArrayAssignmentVariableReferenceExpression((ArrayVariableReferenceExpression)node);
                break;

            case CodeNodeType.ArrayAssignmentFieldReferenceExpression:
                VisitArrayAssignmentFieldReferenceExpression((ArrayAssignmentFieldReferenceExpression)node);
                break;

            case CodeNodeType.AnonymousPropertyInitializerExpression:
                VisitAnonymousPropertyInitializerExpression((AnonymousPropertyInitializerExpression)node);
                break;

            case CodeNodeType.PropertyInitializerExpression:
                VisitPropertyInitializerExpression((PropertyInitializerExpression)node);
                break;

            case CodeNodeType.FieldInitializerExpression:
                VisitFieldInitializerExpression((FieldInitializerExpression)node);
                break;

            case CodeNodeType.ParenthesesExpression:
                VisitParenthesesExpression((ParenthesesExpression)node);
                break;

            case CodeNodeType.InitializerExpression:
                VisitInitializerExpression((InitializerExpression)node);
                break;

            case CodeNodeType.CheckedExpression:
                VisitCheckedExpression((CheckedExpression)node);
                break;

            case CodeNodeType.MemberHandleExpression:
                VisitMemberHandleExpression((MemberHandleExpression)node);
                break;

            case CodeNodeType.AutoPropertyConstructorInitializerExpression:
                VisitAutoPropertyConstructorInitializerExpression((AutoPropertyConstructorInitializerExpression)node);
                break;

            case CodeNodeType.RaiseEventExpression:
                VisitRaiseEventExpression((RaiseEventExpression)node);
                break;

            case CodeNodeType.RefVariableDeclarationExpression:
                VisitRefVariableDeclarationExpression((RefVariableDeclarationExpression)node);
                break;

            case CodeNodeType.RefReturnExpression:
                VisitRefReturnExpression((RefReturnExpression)node);
                break;

            default:
                throw new ArgumentException();
            }

            visitsOnStack--;
        }
        public bool TryInlineVariable(VariableDefinition variableDef, Expression value, ICodeNode target, bool aggressive, out ICodeNode result)
        {
            this.variableDef = variableDef;
            this.value       = value;

            if (!aggressive)
            {
                ASTNodeCounter counter = new ASTNodeCounter();
                if (counter.CountNodes(value) + counter.CountNodes(target) - 1 > MaxCount)
                {
                    result = target;
                    return(false);
                }
            }

            SideEffectsFinder sideEffectsFinder = new SideEffectsFinder();

            valueHasSideEffects = sideEffectsFinder.HasSideEffectsRecursive(value);

            status = InliningResult.NotFound;
            result = Visit(target);
            return(status == InliningResult.Success);
        }
		protected void DoVisit(ICodeNode node)
		{
			base.Visit(node);
		}
 public override void Visit(ICodeNode node)
 {
     if (!this.isUsed)
     {
         base.Visit(node);
     }
 }
        private ICodeNode ParseFactor(Token token)
        {
            TokenType tokenType = token.type;
            ICodeNode rootNode  = null;

            switch (tokenType.ToString())
            {
            case "IDENTIFIER":
            {
                // Look up the identifier in the symbol table stack.
                // Flag the identifier as undefined if it's not found.
                String           name = token.text.ToLower();
                SymbolTableEntry id   = symbolTableStack.Lookup(name);
                if (id == null)
                {
                    errorHandler.flag(token, PascalErrorCode.IDENTIFIER_UNDEFINED, this);
                    id = symbolTableStack.EnterLocal(name);
                }

                rootNode = ICodeFactory.CreateICodeNode(ICodeNodeTypeImplementation.VARIABLE);
                rootNode.SetAttribute(ICodeKeyImplementation.ID, id);
                id.AppendLineNumber(token.lineNumber);

                token = NextToken();      // consume the identifier
                break;
            }

            case "INTEGER":
            {
                // Create an INTEGER_CONSTANT node as the root node.
                rootNode = ICodeFactory.CreateICodeNode(ICodeNodeTypeImplementation.INTEGER_CONSTANT);
                rootNode.SetAttribute(ICodeKeyImplementation.VALUE, token.value);

                token = NextToken();      // consume the number
                break;
            }

            case "REAL":
            {
                // Create an REAL_CONSTANT node as the root node.
                rootNode = ICodeFactory.CreateICodeNode(ICodeNodeTypeImplementation.REAL_CONSTANT);
                rootNode.SetAttribute(ICodeKeyImplementation.VALUE, token.value);

                token = NextToken();      // consume the number
                break;
            }

            case "STRING":
            {
                String value = (String)token.value;

                // Create a STRING_CONSTANT node as the root node.
                rootNode = ICodeFactory.CreateICodeNode(ICodeNodeTypeImplementation.STRING_CONSTANT);
                rootNode.SetAttribute(ICodeKeyImplementation.VALUE, value);

                token = NextToken();      // consume the string
                break;
            }

            case "NOT":
            {
                token = NextToken();      // consume the NOT

                // Create a NOT node as the root node.
                rootNode = ICodeFactory.CreateICodeNode(ICodeNodeTypeImplementation.NOT);

                // Parse the factor.  The NOT node adopts the
                // factor node as its child.
                rootNode.AddChild(ParseFactor(token));

                break;
            }

            case "LEFT_PAREN":
            {
                token = NextToken();          // consume the (

                // Parse an expression and make its node the root node.
                rootNode = ParseExpression(token);

                // Look for the matching ) token.
                token = CurrentToken();
                if (token.type == PascalTokenType.RIGHT_PAREN)
                {
                    token = NextToken();      // consume the )
                }
                else
                {
                    errorHandler.flag(token, PascalErrorCode.MISSING_RIGHT_PAREN, this);
                }
                break;
            }

            default:
            {
                errorHandler.flag(token, PascalErrorCode.UNEXPECTED_TOKEN, this);
                break;
            }
            }

            return(rootNode);
        }
예제 #43
0
            public override void Visit(ICodeNode node)
            {
                if (!isConstant)
                {
                    return;
                }

                switch (node.CodeNodeType)
                {
                case CodeNodeType.UnaryExpression:
                    UnaryExpression unaryNode = node as UnaryExpression;
                    switch (unaryNode.Operator)
                    {
                    case UnaryOperator.Negate:
                    case UnaryOperator.LogicalNot:
                    case UnaryOperator.BitwiseNot:
                    case UnaryOperator.UnaryPlus:
                    case UnaryOperator.None:
                        break;

                    case UnaryOperator.AddressDereference:
                        break;

                    case UnaryOperator.AddressReference:
                    case UnaryOperator.AddressOf:
                        return;

                    default:
                        isConstant = false;
                        return;
                    }
                    break;

                case CodeNodeType.BinaryExpression:
                    BinaryExpression binaryExpression = node as BinaryExpression;
                    isConstant = !binaryExpression.IsChecked && binaryExpression.Operator != BinaryOperator.Divide && binaryExpression.Operator != BinaryOperator.Modulo;
                    if (!isConstant)
                    {
                        return;
                    }
                    break;

                case CodeNodeType.SafeCastExpression:
                case CodeNodeType.TypeOfExpression:
                    break;

                case CodeNodeType.ArgumentReferenceExpression:
                    //TODO: Can be improved
                    isConstant = false;
                    return;

                case CodeNodeType.ThisReferenceExpression:
                    //TODO: Value types
                    return;

                case CodeNodeType.BaseReferenceExpression:
                case CodeNodeType.TypeReferenceExpression:
                case CodeNodeType.MethodReferenceExpression:
                case CodeNodeType.LiteralExpression:
                    return;

                default:
                    isConstant = false;
                    return;
                }

                base.Visit(node);
            }
 public bool ContainsTransparentIdentifiers(ICodeNode node)
 {
     contains = false;
     Visit(node);
     return(contains);
 }
예제 #45
0
 public bool FindVariable(ICodeNode node)
 {
     found = false;
     Visit(node);
     return(found);
 }
예제 #46
0
 public bool ContainsKey(ICodeNode node)
 {
     return(this.nodeToCodeMap.ContainsKey(node));
 }
예제 #47
0
        public virtual void Visit(ICodeNode node)
        {
            this.visitsOnStack = this.visitsOnStack + (long)1;
            if (this.visitsOnStack == (long)0x258)
            {
                this.visitsOnStack = (long)0;
                throw new Exception("Stack overflow while traversing code tree in visit.");
            }
            if (node == null)
            {
                this.visitsOnStack = this.visitsOnStack - (long)1;
                return;
            }
            switch (node.get_CodeNodeType())
            {
            case 0:
            {
                this.VisitBlockStatement((BlockStatement)node);
                break;
            }

            case 1:
            {
                this.VisitUnsafeBlockStatement((UnsafeBlockStatement)node);
                break;
            }

            case 2:
            {
                this.VisitGotoStatement((GotoStatement)node);
                break;
            }

            case 3:
            {
                this.VisitIfStatement((IfStatement)node);
                break;
            }

            case 4:
            {
                this.VisitIfElseIfStatement((IfElseIfStatement)node);
                break;
            }

            case 5:
            {
                this.VisitExpressionStatement((ExpressionStatement)node);
                break;
            }

            case 6:
            {
                this.VisitThrowExpression((ThrowExpression)node);
                break;
            }

            case 7:
            {
                this.VisitWhileStatement((WhileStatement)node);
                break;
            }

            case 8:
            {
                this.VisitDoWhileStatement((DoWhileStatement)node);
                break;
            }

            case 9:
            {
                this.VisitBreakStatement((BreakStatement)node);
                break;
            }

            case 10:
            {
                this.VisitContinueStatement((ContinueStatement)node);
                break;
            }

            case 11:
            {
                this.VisitForStatement((ForStatement)node);
                break;
            }

            case 12:
            {
                this.VisitForEachStatement((ForEachStatement)node);
                break;
            }

            case 13:
            {
                this.VisitConditionCase((ConditionCase)node);
                break;
            }

            case 14:
            {
                this.VisitDefaultCase((DefaultCase)node);
                break;
            }

            case 15:
            {
                this.VisitSwitchStatement((SwitchStatement)node);
                break;
            }

            case 16:
            {
                this.VisitCatchClause((CatchClause)node);
                break;
            }

            case 17:
            {
                this.VisitTryStatement((TryStatement)node);
                break;
            }

            case 18:
            {
                this.VisitBlockExpression((BlockExpression)node);
                break;
            }

            case 19:
            {
                this.VisitMethodInvocationExpression((MethodInvocationExpression)node);
                break;
            }

            case 20:
            {
                this.VisitMethodReferenceExpression((MethodReferenceExpression)node);
                break;
            }

            case 21:
            {
                this.VisitDelegateCreationExpression((DelegateCreationExpression)node);
                break;
            }

            case 22:
            {
                this.VisitLiteralExpression((LiteralExpression)node);
                break;
            }

            case 23:
            {
                this.VisitUnaryExpression((UnaryExpression)node);
                break;
            }

            case 24:
            {
                this.VisitBinaryExpression((BinaryExpression)node);
                break;
            }

            case 25:
            {
                this.VisitArgumentReferenceExpression((ArgumentReferenceExpression)node);
                break;
            }

            case 26:
            {
                this.VisitVariableReferenceExpression((VariableReferenceExpression)node);
                break;
            }

            case 27:
            {
                this.VisitVariableDeclarationExpression((VariableDeclarationExpression)node);
                break;
            }

            case 28:
            {
                this.VisitThisReferenceExpression((ThisReferenceExpression)node);
                break;
            }

            case 29:
            {
                this.VisitBaseReferenceExpression((BaseReferenceExpression)node);
                break;
            }

            case 30:
            {
                this.VisitFieldReferenceExpression((FieldReferenceExpression)node);
                break;
            }

            case 31:
            {
                this.VisitExplicitCastExpression((ExplicitCastExpression)node);
                break;
            }

            case 32:
            {
                this.VisitImplicitCastExpression((ImplicitCastExpression)node);
                break;
            }

            case 33:
            {
                this.VisitSafeCastExpression((SafeCastExpression)node);
                break;
            }

            case 34:
            {
                this.VisitCanCastExpression((CanCastExpression)node);
                break;
            }

            case 35:
            {
                this.VisitTypeOfExpression((TypeOfExpression)node);
                break;
            }

            case 36:
            {
                this.VisitConditionExpression((ConditionExpression)node);
                break;
            }

            case 37:
            {
                this.VisitFixedStatement((FixedStatement)node);
                break;
            }

            case 38:
            {
                this.VisitArrayCreationExpression((ArrayCreationExpression)node);
                break;
            }

            case 39:
            {
                this.VisitArrayIndexerExpression((ArrayIndexerExpression)node);
                break;
            }

            case 40:
            {
                this.VisitObjectCreationExpression((ObjectCreationExpression)node);
                break;
            }

            case 41:
            {
                this.VisitDefaultObjectExpression((DefaultObjectExpression)node);
                break;
            }

            case 42:
            {
                this.VisitPropertyReferenceExpression((PropertyReferenceExpression)node);
                break;
            }

            case 43:
            {
                this.VisitTypeReferenceExpression((TypeReferenceExpression)node);
                break;
            }

            case 44:
            {
                this.VisitUsingStatement((UsingStatement)node);
                break;
            }

            case 45:
            {
                this.VisitStackAllocExpression((StackAllocExpression)node);
                break;
            }

            case 46:
            {
                this.VisitSizeOfExpression((SizeOfExpression)node);
                break;
            }

            case 47:
            {
                this.VisitMakeRefExpression((MakeRefExpression)node);
                break;
            }

            case 48:
            {
                this.VisitEventReferenceExpression((EventReferenceExpression)node);
                break;
            }

            case 49:
            {
                this.VisitEnumExpression((EnumExpression)node);
                break;
            }

            case 50:
            {
                this.VisitLambdaExpression((LambdaExpression)node);
                break;
            }

            case 51:
            {
                this.VisitDelegateInvokeExpression((DelegateInvokeExpression)node);
                break;
            }

            case 52:
            {
                this.VisitBaseCtorExpression((BaseCtorExpression)node);
                break;
            }

            case 53:
            {
                this.VisitThisCtorExpression((ThisCtorExpression)node);
                break;
            }

            case 54:
            {
                this.VisitYieldReturnExpression((YieldReturnExpression)node);
                break;
            }

            case 55:
            {
                this.VisitYieldBreakExpression((YieldBreakExpression)node);
                break;
            }

            case 56:
            {
                this.VisitLockStatement((LockStatement)node);
                break;
            }

            case 57:
            {
                this.VisitReturnExpression((ReturnExpression)node);
                break;
            }

            case 58:
            {
                this.VisitEmptyStatement((EmptyStatement)node);
                break;
            }

            case 59:
            {
                this.VisitDynamicMemberReferenceExpression((DynamicMemberReferenceExpression)node);
                break;
            }

            case 60:
            {
                this.VisitDynamicConstructorInvocationExpression((DynamicConstructorInvocationExpression)node);
                break;
            }

            case 61:
            {
                this.VisitDynamicIndexerExpression((DynamicIndexerExpression)node);
                break;
            }

            case 62:
            {
                this.VisitBoxExpression((BoxExpression)node);
                break;
            }

            case 63:
            {
                this.VisitAnonymousPropertyInitializerExpression((AnonymousPropertyInitializerExpression)node);
                break;
            }

            case 64:
            {
                this.VisitLambdaParameterExpression((LambdaParameterExpression)node);
                break;
            }

            case 65:
            {
                this.VisitAwaitExpression((AwaitExpression)node);
                break;
            }

            case 66:
            {
                this.VisitArrayLengthExpression((ArrayLengthExpression)node);
                break;
            }

            case 67:
            {
                this.VisitExceptionStatement((ExceptionStatement)node);
                break;
            }

            case 68:
            {
                this.VisitBreakSwitchCaseStatement((BreakSwitchCaseStatement)node);
                break;
            }

            case 69:
            {
                this.VisitCaseGotoStatement((CaseGotoStatement)node);
                break;
            }

            case 70:
            {
                this.VisitFinallyClause((FinallyClause)node);
                break;
            }

            case 71:
            {
                this.VisitShortFormReturnExpression((ShortFormReturnExpression)node);
                break;
            }

            case 72:
            {
                this.VisitAnonymousObjectCreationExpression((AnonymousObjectCreationExpression)node);
                break;
            }

            case 73:
            {
                this.VisitFromClause((FromClause)node);
                break;
            }

            case 74:
            {
                this.VisitSelectClause((SelectClause)node);
                break;
            }

            case 75:
            {
                this.VisitWhereClause((WhereClause)node);
                break;
            }

            case 76:
            {
                this.VisitGroupClause((GroupClause)node);
                break;
            }

            case 77:
            {
                this.VisitOrderByClause((OrderByClause)node);
                break;
            }

            case 78:
            {
                this.VisitJoinClause((JoinClause)node);
                break;
            }

            case 79:
            {
                this.VisitLetClause((LetClause)node);
                break;
            }

            case 80:
            {
                this.VisitIntoClause((IntoClause)node);
                break;
            }

            case 81:
            {
                this.VisitLinqQueryExpression((LinqQueryExpression)node);
                break;
            }

            case 82:
            {
                this.VisitArrayVariableDeclarationExpression((ArrayVariableDeclarationExpression)node);
                break;
            }

            case 83:
            {
                this.VisitArrayAssignmentVariableReferenceExpression((ArrayVariableReferenceExpression)node);
                break;
            }

            case 84:
            {
                this.VisitArrayAssignmentFieldReferenceExpression((ArrayAssignmentFieldReferenceExpression)node);
                break;
            }

            case 85:
            {
                this.VisitPropertyInitializerExpression((PropertyInitializerExpression)node);
                break;
            }

            case 86:
            {
                this.VisitFieldInitializerExpression((FieldInitializerExpression)node);
                break;
            }

            case 87:
            {
                this.VisitParenthesesExpression((ParenthesesExpression)node);
                break;
            }

            case 88:
            {
                this.VisitInitializerExpression((InitializerExpression)node);
                break;
            }

            case 89:
            {
                this.VisitCheckedExpression((CheckedExpression)node);
                break;
            }

            case 90:
            {
                this.VisitMemberHandleExpression((MemberHandleExpression)node);
                break;
            }

            case 91:
            {
                this.VisitAutoPropertyConstructorInitializerExpression((AutoPropertyConstructorInitializerExpression)node);
                break;
            }

            case 92:
            {
                this.VisitRaiseEventExpression((RaiseEventExpression)node);
                break;
            }

            case 93:
            {
                this.VisitRefVariableDeclarationExpression((RefVariableDeclarationExpression)node);
                break;
            }

            case 94:
            {
                this.VisitRefReturnExpression((RefReturnExpression)node);
                break;
            }

            default:
            {
                goto Label0;
            }
            }
            this.visitsOnStack = this.visitsOnStack - (long)1;
            return;

Label0:
            throw new ArgumentException();
        }
예제 #48
0
//    public override ICodeNode VisitAssignExpression(AssignExpression node)
//    {
//      CodeNodeCollection<Expression> collection = new CodeNodeCollection<Expression>();
//      collection.Add(node.Expression);
//      collection = (CodeNodeCollection<Expression>) Visit (collection);
//
//      if (collection.Count > 0 && collection[0].Equals(node.Expression)) {
//        return node;
//      }
//
//      node.Expression = collection[collection.Count - 1];
//      collection[collection.Count - 1] = node;
//      return collection;
//    }

        public override ICodeNode VisitExpressionStatement(ExpressionStatement node)
        {
            sideEffects.Clear();
            currentSideEffect = new SideEffectInfo();

            ICodeNode result = (ICodeNode)Visit(node.Expression);
            CodeNodeCollection <Expression> original = result as CodeNodeCollection <Expression>;

            if (original != null)
            {
                var collection = new CodeNodeCollection <Statement>();

                for (int i = 0; i < original.Count; i++)
                {
                    collection.Add(new ExpressionStatement(original[i]));
                }

                return((CodeNodeCollection <Statement>)Visit(collection));
            }
            else
            {
                node.Expression = (Expression)result;

                var assignExp = result as AssignExpression;
                if (assignExp != null)
                {
                    var mInvoke = assignExp.Expression as MethodInvocationExpression;
                    if (mInvoke != null && IsSimpleInlineCase(mInvoke))
                    {
                        return(InlineExpansion(mInvoke, assignExp.Target, source));
                    }
                    else
                    {
                        return(node);
                    }
                }
                else
                {
                    SideEffectInfo             row;
                    MethodInvocationExpression mInvoke;
                    MethodReferenceExpression  mRef;
                    var expansion = new CodeNodeCollection <Statement>();

                    for (int i = 0; i < sideEffects.Count; i++)
                    {
                        row = sideEffects[i];
                        VariableDefinition @var;

                        for (int j = 0; j < row.SideEffectsInNode.Count; j++)
                        {
                            mInvoke = row.SideEffectsInNode[j];
                            mRef    = mInvoke.Method as MethodReferenceExpression;
                            //Mono.Cecil 0.9.3 migration: if (mRef.Method.ReturnType.ReturnType.Name != "Void") {
                            if (mRef.Method.ReturnType.Name != "Void")
                            {
                                expansion.Add(new ExpressionStatement(new AssignExpression(
                                                                          new VariableReferenceExpression(row.SideEffectsInNodeVar[j]), mInvoke)));
                            }
                            else
                            {
                                expansion.Add(new ExpressionStatement(mInvoke));
                            }
                        }
                        mRef = row.mInvokeNode.Method as MethodReferenceExpression;
                        for (int j = 0; j < row.mInvokeNode.Arguments.Count; j++)
                        {
                            ParameterDefinition paramDef = mRef.Method.Parameters[j];

                            //enable constant folding
                            Expression arg = row.mInvokeNode.Arguments[j];
                            if (!(arg is ArgumentReferenceExpression || arg is VariableReferenceExpression ||
                                  arg is LiteralExpression))
                            {
                                @var = RegisterVariable(paramDef.ParameterType, source.Method);

                                expansion.Add(new ExpressionStatement(new AssignExpression(
                                                                          new VariableReferenceExpression(@var), arg)));
                                row.mInvokeNode.Arguments[j] = new VariableReferenceExpression(@var);
                            }
//              @var = RegisterVariable(paramDef.ParameterType, source.Method);

//              expansion.Add(new ExpressionStatement(new AssignExpression(
//                new VariableReferenceExpression(@var), row.mInvokeNode.Arguments[j])));
//              row.mInvokeNode.Arguments[j] = new VariableReferenceExpression(@var);
                        }

                        //TODO: Трябва да се оптимизира в случая когато има странични ефекти, а няма инлайн
                        //или има странични ефекти останали след последния инлайн.
                        for (int j = 0; j < currentSideEffect.SideEffectsInNode.Count; j++)
                        {
                            mInvoke = currentSideEffect.SideEffectsInNode[j];
                            mRef    = mInvoke.Method as MethodReferenceExpression;
                            expansion.Add(new ExpressionStatement(new AssignExpression(
                                                                      new VariableReferenceExpression(currentSideEffect.SideEffectsInNodeVar[j]), mInvoke)));
                        }
                        //endtodo.

                        mRef = row.mInvokeNode.Method as MethodReferenceExpression;

                        //Mono.Cecil 0.9.3 migration: if (mRef.Method.ReturnType.ReturnType.Name != "Void") {
                        if (mRef.Method.ReturnType.Name != "Void")
                        {
                            expansion.Add(new ExpressionStatement(new AssignExpression(
                                                                      new VariableReferenceExpression(row.mInvokeNodeVar), row.mInvokeNode)));
                        }
                        else
                        {
                            expansion.Add(new ExpressionStatement(row.mInvokeNode));
                        }
                    }

                    expansion.Add(node);

                    if (expansion.Count > 1)
                    {
                        return((CodeNodeCollection <Statement>)Visit(expansion));
                    }
                    else
                    {
                        return(node);
                    }
                }
            }
        }
예제 #49
0
        private ICodeNode DoVisit(ICodeNode node)
        {
            if (node == null)
            {
                return(null);
            }

            switch (node.CodeNodeType)
            {
            case CodeNodeType.BlockStatement:
                return(VisitBlockStatement((BlockStatement)node));

            case CodeNodeType.ReturnExpression:
                return(VisitReturnExpression((ReturnExpression)node));

            case CodeNodeType.GotoStatement:
                return(VisitGotoStatement((GotoStatement)node));

            case CodeNodeType.IfStatement:
                return(VisitIfStatement((IfStatement)node));

            case CodeNodeType.IfElseIfStatement:
                return(VisitIfElseIfStatement((IfElseIfStatement)node));

            case CodeNodeType.ExpressionStatement:
                return(VisitExpressionStatement((ExpressionStatement)node));

            case CodeNodeType.ThrowExpression:
                return(VisitThrowExpression((ThrowExpression)node));

            case CodeNodeType.WhileStatement:
                return(VisitWhileStatement((WhileStatement)node));

            case CodeNodeType.DoWhileStatement:
                return(VisitDoWhileStatement((DoWhileStatement)node));

            case CodeNodeType.BreakStatement:
                return(VisitBreakStatement((BreakStatement)node));

            case CodeNodeType.ContinueStatement:
                return(VisitContinueStatement((ContinueStatement)node));

            case CodeNodeType.ForStatement:
                return(VisitForStatement((ForStatement)node));

            case CodeNodeType.ForEachStatement:
                return(VisitForEachStatement((ForEachStatement)node));

            case CodeNodeType.ConditionCase:
                return(VisitConditionCase((ConditionCase)node));

            case CodeNodeType.DefaultCase:
                return(VisitDefaultCase((DefaultCase)node));

            case CodeNodeType.SwitchStatement:
                return(VisitSwitchStatement((SwitchStatement)node));

            case CodeNodeType.CatchClause:
                return(VisitCatchClause((CatchClause)node));

            case CodeNodeType.TryStatement:
                return(VisitTryStatement((TryStatement)node));

            case CodeNodeType.BlockExpression:
                return(VisitBlockExpression((BlockExpression)node));

            case CodeNodeType.MethodInvocationExpression:
                return(VisitMethodInvocationExpression((MethodInvocationExpression)node));

            case CodeNodeType.MethodReferenceExpression:
                return(VisitMethodReferenceExpression((MethodReferenceExpression)node));

            case CodeNodeType.DelegateCreationExpression:
                return(VisitDelegateCreationExpression((DelegateCreationExpression)node));

            case CodeNodeType.LiteralExpression:
                return(VisitLiteralExpression((LiteralExpression)node));

            case CodeNodeType.UnaryExpression:
                return(VisitUnaryExpression((UnaryExpression)node));

            case CodeNodeType.BinaryExpression:
                return(VisitBinaryExpression((BinaryExpression)node));

            case CodeNodeType.ArgumentReferenceExpression:
                return(VisitArgumentReferenceExpression((ArgumentReferenceExpression)node));

            case CodeNodeType.VariableReferenceExpression:
                return(VisitVariableReferenceExpression((VariableReferenceExpression)node));

            case CodeNodeType.VariableDeclarationExpression:
                return(VisitVariableDeclarationExpression((VariableDeclarationExpression)node));

            case CodeNodeType.ThisReferenceExpression:
                return(VisitThisReferenceExpression((ThisReferenceExpression)node));

            case CodeNodeType.BaseReferenceExpression:
                return(VisitBaseReferenceExpression((BaseReferenceExpression)node));

            case CodeNodeType.FieldReferenceExpression:
                return(VisitFieldReferenceExpression((FieldReferenceExpression)node));

            case CodeNodeType.CastExpression:
                return(VisitCastExpression((CastExpression)node));

            case CodeNodeType.SafeCastExpression:
                return(VisitSafeCastExpression((SafeCastExpression)node));

            case CodeNodeType.CanCastExpression:
                return(VisitCanCastExpression((CanCastExpression)node));

            case CodeNodeType.TypeOfExpression:
                return(VisitTypeOfExpression((TypeOfExpression)node));

            case CodeNodeType.ConditionExpression:
                return(VisitConditionExpression((ConditionExpression)node));

            case CodeNodeType.ArrayCreationExpression:
                return(VisitArrayCreationExpression((ArrayCreationExpression)node));

            case CodeNodeType.ArrayIndexerExpression:
                return(VisitArrayIndexerExpression((ArrayIndexerExpression)node));

            case CodeNodeType.ObjectCreationExpression:
                return(VisitObjectCreationExpression((ObjectCreationExpression)node));

            case CodeNodeType.DefaultObjectExpression:
                return(VisitDefaultObjectExpression((DefaultObjectExpression)node));

            case CodeNodeType.PropertyReferenceExpression:
                return(VisitPropertyReferenceExpression((PropertyReferenceExpression)node));

            case CodeNodeType.TypeReferenceExpression:
                return(VisitTypeReferenceExpression((TypeReferenceExpression)node));

            case CodeNodeType.UsingStatement:
                return(VisitUsingStatement((UsingStatement)node));

            case CodeNodeType.FixedStatement:
                return(VisitFixedStatement((FixedStatement)node));

            case CodeNodeType.StackAllocExpression:
                return(VisitStackAllocExpression((StackAllocExpression)node));

            case CodeNodeType.SizeOfExpression:
                return(VisitSizeOfExpression((SizeOfExpression)node));

            case CodeNodeType.MakeRefExpression:
                return(VisitMakeRefExpression((MakeRefExpression)node));

            case CodeNodeType.EnumExpression:
                return(VisitEnumExpression((EnumExpression)node));

            case CodeNodeType.LambdaExpression:
                return(VisitLambdaExpression((LambdaExpression)node));

            case CodeNodeType.DelegateInvokeExpression:
                return(VisitDelegateInvokeExpression((DelegateInvokeExpression)node));

            case CodeNodeType.BaseCtorExpression:
                return(VisitBaseCtorExpression((BaseCtorExpression)node));

            case CodeNodeType.ThisCtorExpression:
                return(VisitThisCtorExpression((ThisCtorExpression)node));

            case CodeNodeType.YieldReturnExpression:
                return(VisitYieldReturnExpression((YieldReturnExpression)node));

            case CodeNodeType.YieldBreakExpression:
                return(VisitYieldBreakExpression((YieldBreakExpression)node));

            case CodeNodeType.LockStatement:
                return(VisitLockStatement((LockStatement)node));

            case CodeNodeType.EmptyStatement:
                return(VisitEmptyStatement((EmptyStatement)node));

            case CodeNodeType.DynamicMemberReferenceExpression:
                return(VisitDynamicMemberReferenceExpression((DynamicMemberReferenceExpression)node));

            case CodeNodeType.DynamicConstructorInvocationExpression:
                return(VisitDynamicConstructorInvocationExpression((DynamicConstructorInvocationExpression)node));

            case CodeNodeType.DynamicIndexerExpression:
                return(VisitDynamicIndexerExpression((DynamicIndexerExpression)node));

            case CodeNodeType.EventReferenceExpression:
                return(VisitEventReferenceExpression((EventReferenceExpression)node));

            case CodeNodeType.BoxExpression:
                return(VisitBoxExpression((BoxExpression)node));

            case CodeNodeType.LambdaParameterExpression:
                return(VisitLambdaParameterExpression((LambdaParameterExpression)node));

            case CodeNodeType.AwaitExpression:
                return(VisitAwaitExpression((AwaitExpression)node));

            case CodeNodeType.ArrayLengthExpression:
                return(VisitArrayLengthExpression((ArrayLengthExpression)node));

            case CodeNodeType.ExceptionStatement:
                return(VisitExceptionStatement((ExceptionStatement)node));

            case CodeNodeType.BreakSwitchCaseStatement:
                return(VisitBreakSwitchCaseStatement((BreakSwitchCaseStatement)node));

            case CodeNodeType.CaseGotoStatement:
                return(VisitCaseGotoStatement((CaseGotoStatement)node));

            case CodeNodeType.FinallyClause:
                return(VisitFinallyClause((FinallyClause)node));

            case CodeNodeType.ShortFormReturnExpression:
                return(VisitShortFormReturnExpression((ShortFormReturnExpression)node));

            case CodeNodeType.AnonymousObjectCreationExpression:
                return(VisitAnonymousObjectCreationExpression((AnonymousObjectCreationExpression)node));

            case CodeNodeType.FromClause:
                return(VisitFromClause((FromClause)node));

            case CodeNodeType.WhereClause:
                return(VisitWhereClause((WhereClause)node));

            case CodeNodeType.SelectClause:
                return(VisitSelectClause((SelectClause)node));

            case CodeNodeType.GroupClause:
                return(VisitGroupClause((GroupClause)node));

            case CodeNodeType.OrderByClause:
                return(VisitOrderByClause((OrderByClause)node));

            case CodeNodeType.JoinClause:
                return(VisitJoinClause((JoinClause)node));

            case CodeNodeType.LetClause:
                return(VisitLetClause((LetClause)node));

            case CodeNodeType.IntoClause:
                return(VisitIntoClause((IntoClause)node));

            case CodeNodeType.LinqQueryExpression:
                return(VisitLinqQueryExpression((LinqQueryExpression)node));

            case CodeNodeType.ArrayVariableCreationExpression:
                return(VisitArrayVariableDeclarationExpression((ArrayVariableDeclarationExpression)node));

            case CodeNodeType.ArrayAssignmentVariableReferenceExpression:
                return(VisitArrayAssignmentVariableReferenceExpression((ArrayVariableReferenceExpression)node));

            case CodeNodeType.ArrayAssignmentFieldReferenceExpression:
                return(VisitArrayAssignmentFieldReferenceExpression((ArrayAssignmentFieldReferenceExpression)node));

            case CodeNodeType.AnonymousPropertyInitializerExpression:
                return(VisitAnonymousPropertyInitializerExpression((AnonymousPropertyInitializerExpression)node));

            case CodeNodeType.PropertyInitializerExpression:
                return(VisitPropertyInitializerExpression((PropertyInitializerExpression)node));

            case CodeNodeType.FieldInitializerExpression:
                return(VisitFieldInitializerExpression((FieldInitializerExpression)node));

            case CodeNodeType.ParenthesesExpression:
                return(VisitParenthesesExpression((ParenthesesExpression)node));

            case CodeNodeType.InitializerExpression:
                return(VisitInitializerExpression((InitializerExpression)node));

            case CodeNodeType.CheckedExpression:
                return(VisitCheckedExpression((CheckedExpression)node));

            case CodeNodeType.MemberHandleExpression:
                return(VisitMemberHandleExpression((MemberHandleExpression)node));

            case CodeNodeType.AutoPropertyConstructorInitializerExpression:
                return(VisitAutoPropertyConstructorInitializerExpression((AutoPropertyConstructorInitializerExpression)node));

            case CodeNodeType.RaiseEventExpression:
                return(VisitRaiseEventExpression((RaiseEventExpression)node));

            default:
                throw new ArgumentException();
            }
        }
 public int CountNodes(ICodeNode node)
 {
     this.count = 0;
     this.Visit(node);
     return(this.count);
 }
 public override void Visit(ICodeNode node)
 {
     this.count = this.count + 1;
     this.Visit(node);
     return;
 }
 public bool TryInlineVariable(VariableDefinition variableDef, Expression value, ICodeNode target, bool aggressive, out ICodeNode result)
 {
     this.variableDef = variableDef;
     this.value       = value;
     if (!aggressive)
     {
         V_1 = new SimpleVariableInliner.ASTNodeCounter();
         if (V_1.CountNodes(value) + V_1.CountNodes(target) - 1 > 10)
         {
             result = target;
             return(false);
         }
     }
     this.valueHasSideEffects = (new SideEffectsFinder()).HasSideEffectsRecursive(value);
     this.status = 0;
     result      = this.Visit(target);
     return(this.status == 1);
 }
예제 #53
0
        private ICodeNode ConvertInvocation(MethodInvocationExpression invocation)
        {
            if (invocation.MethodExpression == null || invocation.MethodExpression.Method == null || invocation.MethodExpression.Method.HasThis ||
                invocation.MethodExpression.Method.DeclaringType == null || invocation.MethodExpression.Method.DeclaringType.FullName != "System.Linq.Expressions.Expression")
            {
                return(null);
            }

            //MethodDefinition methodDef = invocation.MethodExpression.MethodDefinition;
            //if (methodDef == null)
            //{
            //    return null;
            //}

            if (this.conversionDepth == 0 && invocation.MethodExpression.Method.Name != "Lambda")
            {
                return(null);
            }

            ICodeNode result = null;

            switch (invocation.MethodExpression.Method.Name)
            {
            case "Add":
                result = ConvertBinaryOperator(invocation, BinaryOperator.Add, false);
                break;

            case "AddChecked":
                result = ConvertBinaryOperator(invocation, BinaryOperator.Add, true);
                break;

            case "And":
                result = ConvertBinaryOperator(invocation, BinaryOperator.BitwiseAnd);
                break;

            case "AndAlso":
                result = ConvertBinaryOperator(invocation, BinaryOperator.LogicalAnd);
                break;

            case "ArrayAccess":
            case "ArrayIndex":
                result = ConvertArrayIndex(invocation);
                break;

            case "ArrayLength":
                result = ConvertArrayLength(invocation);
                break;

            case "Bind":
                result = ConvertBind(invocation);
                break;

            case "Call":
                result = ConvertCall(invocation);
                break;

            case "Coalesce":
                result = ConvertBinaryOperator(invocation, BinaryOperator.NullCoalesce);
                break;

            case "Condition":
                result = ConvertCondition(invocation);
                break;

            case "Constant":
                result = ConvertConstant(invocation);
                break;

            case "Convert":
                result = ConvertCast(invocation);
                break;

            case "ConvertChecked":
                result = ConvertCastChecked(invocation);
                break;

            case "Divide":
                result = ConvertBinaryOperator(invocation, BinaryOperator.Divide);
                break;

            case "ElementInit":
                result = ConvertElementInit(invocation);
                break;

            case "Equal":
                result = ConvertBinaryOperator(invocation, BinaryOperator.ValueEquality);
                break;

            case "ExclusiveOr":
                result = ConvertBinaryOperator(invocation, BinaryOperator.BitwiseXor);
                break;

            case "Field":
                result = ConvertField(invocation);
                break;

            case "GreaterThan":
                result = ConvertBinaryOperator(invocation, BinaryOperator.GreaterThan);
                break;

            case "GreaterThanOrEqual":
                result = ConvertBinaryOperator(invocation, BinaryOperator.GreaterThanOrEqual);
                break;

            case "Invoke":
                result = ConvertInvoke(invocation);
                break;

            case "Lambda":
                result = ConvertLambda(invocation);
                break;

            case "LeftShift":
                result = ConvertBinaryOperator(invocation, BinaryOperator.LeftShift);
                break;

            case "LessThan":
                result = ConvertBinaryOperator(invocation, BinaryOperator.LessThan);
                break;

            case "LessThanOrEqual":
                result = ConvertBinaryOperator(invocation, BinaryOperator.LessThanOrEqual);
                break;

            case "ListBind":
                result = ConvertListBind(invocation);
                break;

            case "ListInit":
                result = ConvertListInit(invocation);
                break;

            case "MemberInit":
                result = ConvertMemberInit(invocation);
                break;

            case "Modulo":
                result = ConvertBinaryOperator(invocation, BinaryOperator.Modulo);
                break;

            case "Multiply":
                result = ConvertBinaryOperator(invocation, BinaryOperator.Multiply, false);
                break;

            case "MultiplyChecked":
                result = ConvertBinaryOperator(invocation, BinaryOperator.Multiply, true);
                break;

            case "Negate":
                result = ConvertUnaryOperator(invocation, UnaryOperator.Negate);
                break;

            case "NegateChecked":
                result = ConvertUnaryOperatorChecked(invocation, UnaryOperator.Negate);
                break;

            case "New":
                result = ConvertNewObject(invocation);
                break;

            case "NewArrayBounds":
                result = ConvertNewArrayBounds(invocation);
                break;

            case "NewArrayInit":
                result = ConvertNewArrayInit(invocation);
                break;

            case "Not":
                result = ConvertUnaryOperator(invocation, UnaryOperator.LogicalNot);
                break;

            case "NotEqual":
                result = ConvertBinaryOperator(invocation, BinaryOperator.ValueInequality);
                break;

            case "OnesComplement":
                result = ConvertUnaryOperator(invocation, UnaryOperator.BitwiseNot);
                break;

            case "Or":
                result = ConvertBinaryOperator(invocation, BinaryOperator.BitwiseOr);
                break;

            case "OrElse":
                result = ConvertBinaryOperator(invocation, BinaryOperator.LogicalOr);
                break;

            case "Parameter":
                result = ConvertParameter(invocation);
                break;

            case "Property":
                result = ConvertProperty(invocation);
                break;

            case "Quote":
                if (invocation.Arguments.Count == 1)
                {
                    result = Visit(invocation.Arguments[0]);
                }
                break;

            case "RightShift":
                result = ConvertBinaryOperator(invocation, BinaryOperator.RightShift);
                break;

            case "Subtract":
                result = ConvertBinaryOperator(invocation, BinaryOperator.Subtract, false);
                break;

            case "SubtractChecked":
                result = ConvertBinaryOperator(invocation, BinaryOperator.Subtract, true);
                break;

            case "TypeAs":
                result = ConvertTypeAs(invocation);
                break;

            case "TypeIs":
                result = ConvertTypeIs(invocation);
                break;

            default:
                return(null);
            }

            this.failure |= result == null;
            return(result);
        }
예제 #54
0
        public virtual void Visit(ICodeNode node)
        {
            if (null == node)
            {
                return;
            }

            switch (node.CodeNodeType)
            {
            case CodeNodeType.BlockStatement:
                VisitBlockStatement((BlockStatement)node);
                break;

            case CodeNodeType.ReturnStatement:
                VisitReturnStatement((ReturnStatement)node);
                break;

            case CodeNodeType.GotoStatement:
                VisitGotoStatement((GotoStatement)node);
                break;

            case CodeNodeType.LabeledStatement:
                VisitLabeledStatement((LabeledStatement)node);
                break;

            case CodeNodeType.IfStatement:
                VisitIfStatement((IfStatement)node);
                break;

            case CodeNodeType.ExpressionStatement:
                VisitExpressionStatement((ExpressionStatement)node);
                break;

            case CodeNodeType.ThrowStatement:
                VisitThrowStatement((ThrowStatement)node);
                break;

            case CodeNodeType.WhileStatement:
                VisitWhileStatement((WhileStatement)node);
                break;

            case CodeNodeType.DoWhileStatement:
                VisitDoWhileStatement((DoWhileStatement)node);
                break;

            case CodeNodeType.BreakStatement:
                VisitBreakStatement((BreakStatement)node);
                break;

            case CodeNodeType.ContinueStatement:
                VisitContinueStatement((ContinueStatement)node);
                break;

            case CodeNodeType.ForStatement:
                VisitForStatement((ForStatement)node);
                break;

            case CodeNodeType.ForEachStatement:
                VisitForEachStatement((ForEachStatement)node);
                break;

            case CodeNodeType.ConditionCase:
                VisitConditionCase((ConditionCase)node);
                break;

            case CodeNodeType.DefaultCase:
                VisitDefaultCase((DefaultCase)node);
                break;

            case CodeNodeType.SwitchStatement:
                VisitSwitchStatement((SwitchStatement)node);
                break;

            case CodeNodeType.CatchClause:
                VisitCatchClause((CatchClause)node);
                break;

            case CodeNodeType.TryStatement:
                VisitTryStatement((TryStatement)node);
                break;

            case CodeNodeType.BlockExpression:
                VisitBlockExpression((BlockExpression)node);
                break;

            case CodeNodeType.MethodInvocationExpression:
                VisitMethodInvocationExpression((MethodInvocationExpression)node);
                break;

            case CodeNodeType.MethodReferenceExpression:
                VisitMethodReferenceExpression((MethodReferenceExpression)node);
                break;

            case CodeNodeType.DelegateCreationExpression:
                VisitDelegateCreationExpression((DelegateCreationExpression)node);
                break;

            case CodeNodeType.DelegateInvocationExpression:
                VisitDelegateInvocationExpression((DelegateInvocationExpression)node);
                break;

            case CodeNodeType.LiteralExpression:
                VisitLiteralExpression((LiteralExpression)node);
                break;

            case CodeNodeType.UnaryExpression:
                VisitUnaryExpression((UnaryExpression)node);
                break;

            case CodeNodeType.BinaryExpression:
                VisitBinaryExpression((BinaryExpression)node);
                break;

            case CodeNodeType.AssignExpression:
                VisitAssignExpression((AssignExpression)node);
                break;

            case CodeNodeType.ArgumentReferenceExpression:
                VisitArgumentReferenceExpression((ArgumentReferenceExpression)node);
                break;

            case CodeNodeType.VariableReferenceExpression:
                VisitVariableReferenceExpression((VariableReferenceExpression)node);
                break;

            case CodeNodeType.VariableDeclarationExpression:
                VisitVariableDeclarationExpression((VariableDeclarationExpression)node);
                break;

            case CodeNodeType.ThisReferenceExpression:
                VisitThisReferenceExpression((ThisReferenceExpression)node);
                break;

            case CodeNodeType.BaseReferenceExpression:
                VisitBaseReferenceExpression((BaseReferenceExpression)node);
                break;

            case CodeNodeType.FieldReferenceExpression:
                VisitFieldReferenceExpression((FieldReferenceExpression)node);
                break;

            case CodeNodeType.CastExpression:
                VisitCastExpression((CastExpression)node);
                break;

            case CodeNodeType.SafeCastExpression:
                VisitSafeCastExpression((SafeCastExpression)node);
                break;

            case CodeNodeType.CanCastExpression:
                VisitCanCastExpression((CanCastExpression)node);
                break;

            case CodeNodeType.TypeOfExpression:
                VisitTypeOfExpression((TypeOfExpression)node);
                break;

            case CodeNodeType.ConditionExpression:
                VisitConditionExpression((ConditionExpression)node);
                break;

            case CodeNodeType.NullCoalesceExpression:
                VisitNullCoalesceExpression((NullCoalesceExpression)node);
                break;

            case CodeNodeType.AddressDereferenceExpression:
                VisitAddressDereferenceExpression((AddressDereferenceExpression)node);
                break;

            case CodeNodeType.AddressReferenceExpression:
                VisitAddressReferenceExpression((AddressReferenceExpression)node);
                break;

            case CodeNodeType.AddressOfExpression:
                VisitAddressOfExpression((AddressOfExpression)node);
                break;

            case CodeNodeType.ArrayCreationExpression:
                VisitArrayCreationExpression((ArrayCreationExpression)node);
                break;

            case CodeNodeType.ArrayIndexerExpression:
                VisitArrayIndexerExpression((ArrayIndexerExpression)node);
                break;

            case CodeNodeType.ObjectCreationExpression:
                VisitObjectCreationExpression((ObjectCreationExpression)node);
                break;

            case CodeNodeType.PropertyReferenceExpression:
                VisitPropertyReferenceExpression((PropertyReferenceExpression)node);
                break;

            case CodeNodeType.TypeReferenceExpression:
                VisitTypeReferenceExpression((TypeReferenceExpression)node);
                break;

            default:
                throw new ArgumentException();
            }
        }
		public override void Visit(ICodeNode node)
		{
			if (!isStopped)
			{
				WriteCodeNodeLabel(node);

				if (node != null &&
					node.CodeNodeType != CodeNodeType.EmptyStatement)
				{
					int beginStatement = formatter.CurrentPosition;
					base.Visit(node);
					int endStatement = formatter.CurrentPosition - 1;

					if (node != null)
					{
						this.currentWritingInfo.StatementPositions.Add(node, new OffsetSpan(beginStatement, endStatement));
					}
				}
				else
				{
					DoVisit(node);
				}
			}
		}
예제 #56
0
 public ICodeNode SetRoot(ICodeNode node)
 {
     root = node;
     return(root);
 }
		protected void WriteCodeNodeLabel(ICodeNode node)
		{
			if (node is Statement &&
				!(node.CodeNodeType == CodeNodeType.BlockStatement) /*the label goes before the first statement in a block*/)
			{
				Statement statement = node as Statement;
				WriteLabel((statement).Label);

				if (node.CodeNodeType != CodeNodeType.EmptyStatement && statement.Label != "") //Labeled statement. The statement should start on the next line after label
				{
					WriteLine();
				}
			}
		}
예제 #58
0
 public void Add(ICodeNode node, OffsetSpan span)
 {
     this.nodeToCodeMap.Add(node, span);
     return;
 }
		public override void Visit (ICodeNode node)
		{
			if (@continue)
				base.Visit (node);
		}
예제 #60
0
 /* AGPL */
 public void Add(ICodeNode node, T span)
 {
     this.NodeToCodeMap.Add(node, span);
 }