Example #1
0
        private bool BindInLoopControlStatement(LoopControlStatementNode loopControlStatement)
        {
            ushort level = loopControlStatement.Level;

            Node?parent = loopControlStatement;

            while (level > 0)
            {
                parent = parent.ParentNode;

                switch (parent)
                {
                case null:
                    ErrorProvider.ReportError(ErrorCode.LoopControlStatementNotThatDeep,
                                              Compilation,
                                              loopControlStatement);
                    return(false);

                case ILoopStatementNode:
                    level--;
                    break;
                }
            }

            ILoopStatementNode?loop = parent as ILoopStatementNode;

            Debug.Assert(loop != null);

            loopControlStatement.SetControlledLoop(loop);

            return(true);
        }
        private void EmitLoopControlStatement(LoopControlStatementNode loopControlStatement)
        {
            switch (loopControlStatement.Kind)
            {
            case LoopControlStatementKind.Continue:
                output.Append("continue");
                break;

            case LoopControlStatementKind.Leave:
                output.Append("break");
                break;
            }

            if (loopControlStatement.Level > 1)
            {
                Node?parent = loopControlStatement;

                int level = loopControlStatement.Level;

                while (true)
                {
                    parent = parent.ParentNode;

                    Debug.Assert(parent is StatementCollectionNode);

                    parent = parent.ParentNode;

                    if (parent is ILoopStatementNode loop)
                    {
                        if (level == 1)
                        {
                            int loopId = associatedLoopIds[loop];
                            output.Append(" $loop_");
                            output.Append(loopId);
                            output.Append(';');
                            return;
                        }

                        level--;
                    }

                    Debug.Assert(parent != null);
                }
            }

            output.Append(';');
        }