public InsnMakeClosure( IList<ValueSymbol> paras, ISList<IInsn> insns, SourceInfo info ) { mParams = paras; mInsns = insns; mInfo = info; }
public ValueCont( ISList<IInsn> insns, ISList<IValue> stack, IEnv env, ISList<KeyValuePair<IValue, IValue>> winders ) { Insns = insns; Stack = stack; Env = env; Winders = winders; }
public ValueClosure( IList<ValueSymbol> paras, ISList<IInsn> insns, IEnv env, SourceInfo info ) { mParams = paras; mInsns = insns; mEnv = env; mInfo = info; }
public void SetCont(IValue returnValue, ValueCont cont, SourceInfo info) { var winders = cont.Winders; if (winders == Winders) { Insns = cont.Insns; Stack = cont.Stack; Env = cont.Env; Push(returnValue); } else if (winders.ContainsList(Winders)) { var newWinders = winders.GetPreviousList(Winders); IValue before = newWinders.Head.Key; Stack<IInsn> insnStack = new Stack<IInsn>(); insnStack.Push(new InsnPush(before)); insnStack.Push(new InsnCall(0, info)); insnStack.Push(InsnPop.Instance); insnStack.Push(new InsnSetWinders(newWinders)); insnStack.Push(new InsnPush(cont)); insnStack.Push(new InsnPush(returnValue)); insnStack.Push(new InsnCall(1, info)); Insns = insnStack.ToSList(); Stack = SList.Nil<IValue>(); } else { IValue after = Winders.Head.Value; Winders = Winders.Tail; Stack<IInsn> insnStack = new Stack<IInsn>(); insnStack.Push(new InsnPush(after)); insnStack.Push(new InsnCall(0, info)); insnStack.Push(InsnPop.Instance); insnStack.Push(new InsnPush(cont)); insnStack.Push(new InsnPush(returnValue)); insnStack.Push(new InsnCall(1, info)); Insns = insnStack.ToSList(); Stack = SList.Nil<IValue>(); } }
public void Push(IInsn insn) { mInsns = SList.Cons<IInsn>(insn, mInsns); }
public IInsn Pop() { IInsn insn = Peek(); mInsns = mInsns.Tail; return insn; }
public Compiler() { mInsns = SList.Nil<IInsn>(); }
public InsnSetWinders(ISList<KeyValuePair<IValue, IValue>> winders) { mWinders = winders; }
static DataInfo() { id = IdManager.IdDeliverer.CreateId <IData, T>(); name = typeof(T).Name; dataBlocks = new SteadyList <BlockNode <T> >(); }
private IValue Run(ISList<IInsn> insns) { VM vm = new VM( insns, SList.Nil<IValue>(), mEnv, SList.Nil<KeyValuePair<IValue, IValue>>() ); while (true) { try { return vm.Run(); } catch (RheaException e) { Console.WriteLine("{0}: {1}", e.Info, e.Message); ValueCont cont = new ValueCont( SList.Nil<IInsn>(), SList.Nil<IValue>(), vm.Env, SList.Nil<KeyValuePair<IValue, IValue>>() ); vm.SetCont(null, cont, e.Info); } } }