private void DoPrimaryDecompilation()
        {
            var             loopholes     = new List <Loophole>();
            Func <Loophole> emit_loophole = () =>
            {
                var loophole = new Loophole();
                loopholes.Add(loophole);
                return(loophole);
            };

            _stack = new Stack <Expression>();
            foreach (var op in _cil)
            {
                _currentOp = op;
                _args      = op.OpSpec.Pops.Times(_ =>
                                                  _stack.PopOrDefault() ?? emit_loophole()
                                                  ).Reverse().ToReadOnly();

                Dispatch(op);

                if (_stack.IsEmpty() && _qualified.IsNotEmpty())
                {
                    var fixt = FixupEvaluationOrder(_qualified.ToReadOnly());
                    fixt.ForEach(q => _block.BalancedCode.Add(q));
                    _qualified.Clear();
                }
            }

            var pending = _qualified.Concat(_stack.Reverse().Cast <Node>()).ToReadOnly();

            if (pending.IsNotEmpty())
            {
                var p_fixt = FixupEvaluationOrder(pending);
                Func <Node, int> stackBalance = n =>
                                                !(n is Expression) ? 0 :
                                                n is Assign ? 0 :
                                                n is Eval ? (n.InvokedMethod().Ret() == typeof(void) ? 0 : 1) :
                                                /* otherwise */ 1;;
                var delim = 0.UpTo(p_fixt.Count() - 1).Single(i =>
                                                              p_fixt.Take(i).All(n => stackBalance(n) == 0) &&
                                                              p_fixt.Skip(i).All(n => stackBalance(n) == 1));
                p_fixt.Take(delim).ForEach(p => _block.BalancedCode.Add(p));
                p_fixt.Skip(delim).ForEach(p => _block.Residue.Add(p.AssertCast <Expression>()));
                _qualified.Clear();
            }

            loopholes.Reverse();
            loopholes.ForEach((l, i) => l.Tag = i);
        }
        private void DoPrimaryDecompilation()
        {
            var loopholes = new List<Loophole>();
            Func<Loophole> emit_loophole = () =>
            {
                var loophole = new Loophole();
                loopholes.Add(loophole);
                return loophole;
            };

            _stack = new Stack<Expression>();
            foreach (var op in _cil)
            {
                _currentOp = op;
                _args = op.OpSpec.Pops.Times(_ =>
                    _stack.PopOrDefault() ?? emit_loophole()
                ).Reverse().ToReadOnly();

                Dispatch(op);

                if (_stack.IsEmpty() && _qualified.IsNotEmpty())
                {
                    var fixt = FixupEvaluationOrder(_qualified.ToReadOnly());
                    fixt.ForEach(q => _block.BalancedCode.Add(q));
                    _qualified.Clear();
                }
            }

            var pending = _qualified.Concat(_stack.Reverse().Cast<Node>()).ToReadOnly();
            if (pending.IsNotEmpty())
            {
                var p_fixt = FixupEvaluationOrder(pending);
                Func<Node, int> stackBalance = n => 
                    !(n is Expression) ? 0 :
                    n is Assign ? 0 :
                    n is Eval ? (n.InvokedMethod().Ret() == typeof(void) ? 0 : 1) :
                    /* otherwise */ 1;;
                var delim = 0.UpTo(p_fixt.Count() - 1).Single(i =>
                    p_fixt.Take(i).All(n => stackBalance(n) == 0) &&
                    p_fixt.Skip(i).All(n => stackBalance(n) == 1));
                p_fixt.Take(delim).ForEach(p => _block.BalancedCode.Add(p));
                p_fixt.Skip(delim).ForEach(p => _block.Residue.Add(p.AssertCast<Expression>()));
                _qualified.Clear();
            }

            loopholes.Reverse();
            loopholes.ForEach((l, i) => l.Tag = i);
        }
Esempio n. 3
0
 protected internal override void TraverseLoophole(Loophole loophole)
 {
     _writer.Write("<");
     _writer.Write(loophole.Tag ?? loophole.Id.ToString());
     _writer.Write(">");
 }
Esempio n. 4
0
 protected internal virtual Node TransformLoophole(Loophole loophole)
 {
     return(loophole.AcceptTransformer(this, true));
 }
 protected internal virtual void TraverseLoophole(Loophole loophole) { loophole.Unsupported(); }
 protected internal override void TraverseLoophole(Loophole loophole)
 {
     Types.Add(loophole, null);
 }
 protected internal override void TraverseLoophole(Loophole loophole)
 {
     Dispatch(loophole);
 }
Esempio n. 8
0
 protected internal override Node TransformLoophole(Loophole loophole)
 {
     return(Dispatch(loophole));
 }
Esempio n. 9
0
 protected internal override T ReduceLoophole(Loophole loophole)
 {
     return(Dispatch(loophole));
 }
 protected internal override Node TransformLoophole(Loophole loophole)
 {
     return Dispatch(loophole);
 }
 protected internal override void TraverseLoophole(Loophole loophole)
 {
     Types.Add(loophole, null);
 }
 protected internal override void TraverseLoophole(Loophole loophole)
 {
     Dispatch(loophole);
 }
 protected internal override void TraverseLoophole(Loophole loophole)
 {
     _writer.Write("<");
     _writer.Write(loophole.Tag ?? loophole.Id.ToString());
     _writer.Write(">");
 }
 protected internal virtual void TraverseLoophole(Loophole loophole)
 {
     loophole.Unsupported();
 }
 protected internal virtual Node TransformLoophole(Loophole loophole) { return loophole.AcceptTransformer(this, true); }