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); }
protected internal override void TraverseLoophole(Loophole loophole) { _writer.Write("<"); _writer.Write(loophole.Tag ?? loophole.Id.ToString()); _writer.Write(">"); }
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); }
protected internal override Node TransformLoophole(Loophole loophole) { return(Dispatch(loophole)); }
protected internal override T ReduceLoophole(Loophole loophole) { return(Dispatch(loophole)); }
protected internal override Node TransformLoophole(Loophole loophole) { return Dispatch(loophole); }
protected internal virtual Node TransformLoophole(Loophole loophole) { return loophole.AcceptTransformer(this, true); }