Ejemplo n.º 1
0
        protected override void TraverseNode(Node node)
        {
            if (Stack.Count() == 1)
            {
                _retlabel = _ptx.def_label("ret");
                base.TraverseNode(node);
                _ptx.label(_retlabel);
                _ptx.emit(new exit{});
                _ptx._stk.AssertEmpty();
            }
            else
            {
                var stmt = !(node is Expression);
                var top_level_expr = node is Expression && !(node.Parent is Expression);
                top_level_expr &= (node.Parent != null); // rule out synthetic expressions (e.g. see TraverseOperator for AndAlso)
                if (stmt || top_level_expr)
                {
                    // note. we comment only top-level expressions
                    // since there's a discrepancy in visit time and emit time
                    // so that typically all comments for intermediate expressions
                    // get emitted much earlier than instructions they refer to

                    _ptx.comment(Environment.NewLine);
                    var i_indent = node.Parents().Count() - 1;
                    var s_indent = i_indent.Times("    ");
                    _ptx.comment(s_indent + node.ToDebugString_WithoutParentInfo());
                }

                base.TraverseNode(node);
            }
        }
Ejemplo n.º 2
0
        protected override void TraverseNode(Node node)
        {
            if (Stack.Count() == 1)
            {
                _retlabel = _ptx.def_label("ret");
                base.TraverseNode(node);
                _ptx.label(_retlabel);
                _ptx.emit(new exit {
                });
                _ptx._stk.AssertEmpty();
            }
            else
            {
                var stmt           = !(node is Expression);
                var top_level_expr = node is Expression && !(node.Parent is Expression);
                top_level_expr &= (node.Parent != null); // rule out synthetic expressions (e.g. see TraverseOperator for AndAlso)
                if (stmt || top_level_expr)
                {
                    // note. we comment only top-level expressions
                    // since there's a discrepancy in visit time and emit time
                    // so that typically all comments for intermediate expressions
                    // get emitted much earlier than instructions they refer to

                    _ptx.comment(Environment.NewLine);
                    var i_indent = node.Parents().Count() - 1;
                    var s_indent = i_indent.Times("    ");
                    _ptx.comment(s_indent + node.ToDebugString_WithoutParentInfo());
                }

                base.TraverseNode(node);
            }
        }