public bool Step() { //Console.Write("stack-" + currentCoro.uniqueId + "("); //foreach (IoCoroutine cor in stackCoroFrame) // Console.Write(cor.GetHashCode() + ","); //Console.WriteLine(")"); if (currentRoutine.MoveNext()) { IoCoroutine subRoutine = currentRoutine.Current as IoCoroutine; if (subRoutine != null) { stackFrame.Push(this.currentRoutine); stackCoroFrame.Push(this.currentCoro); //currentRoutine = subRoutine.fiber.currentRoutine; currentCoro = subRoutine; } } else if (stackFrame.Count > 0) { currentRoutine = stackFrame.Pop(); currentCoro = stackCoroFrame.Pop(); } else { OnFiberTerminated(new FiberTerminatedEventArgs(currentRoutine.Current)); return false; } return true; }
public override IoObject proto(IoState state) { IoCoroutine pro = new IoCoroutine(); //~//pro.tag.state = state; pro.state = state; // pro.tag.cloneFunc = new IoTagCloneFunc(this.clone); pro.createSlots(); pro.createProtos(); state.registerProtoWithFunc(name, new IoStateProto(name, pro, new IoStateProtoFunc(this.proto))); pro.protos.Add(state.protoWithInitFunc("Object")); IoCFunction[] methodTable = new IoCFunction[] { new IoCFunction("run", new IoMethodFunc(IoCoroutine.slotRun)), new IoCFunction("main", new IoMethodFunc(IoCoroutine.slotMain)), new IoCFunction("resume", new IoMethodFunc(IoCoroutine.slotResume)), new IoCFunction("isCurrent", new IoMethodFunc(IoCoroutine.slotIsCurrent)), new IoCFunction("currentCoroutine", new IoMethodFunc(IoCoroutine.slotCurrentCoroutine)), new IoCFunction("implementation", new IoMethodFunc(IoCoroutine.slotImplementation)), new IoCFunction("setMessageDebugging", new IoMethodFunc(IoCoroutine.slotSetMessageDebugging)), }; pro.addTaglessMethodTable(state, methodTable); return(pro); }
private static IEnumerator Recurse2(IoCoroutine f) { //yield return null; // just create and quit // 1 //f.fiber.Yield(f); IoCoroutine ccc = IoCoroutine.createObject(IoCLI.state); ccc.fiber = new Fiber(); ccc.fiber.currentCoro = ccc; //yield return ccc.fiber.currentRoutine = new FiberProc(IoCLI.Recurse3 /*(ccc)*/); if (coro.fiber.State == 4) { Console.WriteLine("Creation Error. Fiber Exceeds on Recurse 2 " + f.uniqueId); IoCLI.yieldingCoros.Remove(f); return(null); } ccc.rawSetResult(IoNumber.newWithDouble(IoCLI.state, 42)); ccc.rawSetRunLocals(IoCLI.state.core); ccc.rawSetRunMessage(IoCLI.state.nilMessage); ccc.rawSetRunTarget(ccc); IoCLI.yieldingCoros.Add(ccc); //Console.WriteLine("Coro2 " + f.uniqueId + " creates Coro3 + " + ccc.uniqueId); IoCLI.yieldingCoros.Remove(f); //yield return null; // 2 return(null); }
public static IoObject slotCurrentCoroutine(IoObject target, IoObject locals, IoObject message) { //~//return target.tag.state.currentCoroutine; IoCoroutine self = target as IoCoroutine; return(self); }
private static IEnumerator Recurse2(IoCoroutine f) { //yield return null; // just create and quit // 1 //f.fiber.Yield(f); IoCoroutine ccc = IoCoroutine.createObject(IoCLI.state); ccc.fiber = new Fiber(); ccc.fiber.currentCoro = ccc; //yield return ccc.fiber.currentRoutine = new FiberProc(IoCLI.Recurse3/*(ccc)*/); if (coro.fiber.State == 4) { Console.WriteLine("Creation Error. Fiber Exceeds on Recurse 2 " + f.uniqueId); IoCLI.yieldingCoros.Remove(f); return null; } ccc.rawSetResult(IoNumber.newWithDouble(IoCLI.state, 42)); ccc.rawSetRunLocals(IoCLI.state.core); ccc.rawSetRunMessage(IoCLI.state.nilMessage); ccc.rawSetRunTarget(ccc); IoCLI.yieldingCoros.Add(ccc); //Console.WriteLine("Coro2 " + f.uniqueId + " creates Coro3 + " + ccc.uniqueId); IoCLI.yieldingCoros.Remove(f); //yield return null; // 2 return null; }
static void Main() { // Test Fibers IoCoroutine[] coros = new IoCoroutine[1]; for (int i = 0; i < coros.Length; i++) { coros[i] = IoCoroutine.createObject(IoCLI.state); coros[i].fiber = new Fiber(); coros[i].fiber.currentCoro = coros[i]; coros[i].fiber.uniqueId = i; coros[i].fiber.currentRoutine = IoCLI.Recurse2(coros[i]); IoCLI.yieldingCoros.Add(coros[i]); } for (int j = 0; j < 5; j++) foreach (IoCoroutine f in coros) { IoCoroutine.slotResume(f, null, null); } IoCLI.state.prompt(IoCLI.state); }
public bool Step() { //Console.Write("stack-" + currentCoro.uniqueId + "("); //foreach (IoCoroutine cor in stackCoroFrame) // Console.Write(cor.GetHashCode() + ","); //Console.WriteLine(")"); if (currentRoutine.MoveNext()) { IoCoroutine subRoutine = currentRoutine.Current as IoCoroutine; if (subRoutine != null) { stackFrame.Push(this.currentRoutine); stackCoroFrame.Push(this.currentCoro); //currentRoutine = subRoutine.fiber.currentRoutine; currentCoro = subRoutine; } } else if (stackFrame.Count > 0) { currentRoutine = stackFrame.Pop(); currentCoro = stackCoroFrame.Pop(); } else { OnFiberTerminated(new FiberTerminatedEventArgs(currentRoutine.Current)); return(false); } return(true); }
static void Main() { // Test Fibers IoCoroutine[] coros = new IoCoroutine[1]; for (int i = 0; i < coros.Length; i++) { coros[i] = IoCoroutine.createObject(IoCLI.state); coros[i].fiber = new Fiber(); coros[i].fiber.currentCoro = coros[i]; coros[i].fiber.uniqueId = i; coros[i].fiber.currentRoutine = IoCLI.Recurse2(coros[i]); IoCLI.yieldingCoros.Add(coros[i]); } for (int j = 0; j < 5; j++) { foreach (IoCoroutine f in coros) { IoCoroutine.slotResume(f, null, null); } } IoCLI.state.prompt(IoCLI.state); }
private static IEnumerator Recurse4(IoCoroutine f) { int i = 0; while (i < 10) { Console.WriteLine("Recurse4+" + i++); yield return null; } }
private static IEnumerator Recurse4(IoCoroutine f) { int i = 0; while (i < 10) { Console.WriteLine("Recurse4+" + i++); yield return(null); } }
public IEnumerator coroStart(IoCoroutine coro) { //IoCoroutine self = coro; //IoObject result = null; //self.tag.state.currentCoroutine = self; //if (self.tag.state.mainMessage != null) // result = self.tag.state.mainMessage.localsPerformOn(self, self); //self.rawSetResult(result); //self.rawReturnToParent(); yield return(null); }
public static IoObject slotMain(IoObject target, IoObject locals, IoObject message) { IoCoroutine self = target as IoCoroutine; //IoObject runTarget = self.rawRunTarget(); //IoObject runLocals = self.rawRunLocals(); //IoMessage runMessage = self.rawRunMessage() as IoMessage; //if (runLocals != null && runMessage != null && runTarget != null) // runMessage.localsPerformOn(runTarget, runLocals); //else // Console.WriteLine("Coroutine 'main' missed needed parameters"); return(self.tag.state.ioNil); }
public override IoObject clone(IoState state) { IoCoroutine proto = state.protoWithInitFunc(name) as IoCoroutine; IoCoroutine result = new IoCoroutine(); uniqueIdCounter++; result.uniqueId = uniqueIdCounter; result.tag = proto.tag; result.createProtos(); result.createSlots(); result.protos.Add(proto); return(result); }
static void Main() { // Test Fibers for (int i = 0; i < 400; i++) { IoCoroutine coro = IoCoroutine.createObject(IoCLI.state); coro.fiber = new Fiber(); coro.fiber.currentCoro = coro; coro.fiber.uniqueId = coro.uniqueId; coro.fiber.currentRoutine = new FiberProc(IoCLI.Recurse2 /*(coro)*/); if (coro.fiber.State == 4) { Console.WriteLine("Creation Error. Fiber Exceeds on " + i); break; } IoCLI.yieldingCoros.Add(coro); if (IoCLI.coro == null) { IoCLI.coro = coro; } } while (true) { ArrayList al = new ArrayList(); foreach (IoCoroutine coro in IoCLI.yieldingCoros) { if (coro != null) { al.Add(coro); } } if (al.Count == 0) { break; } foreach (IoCoroutine coro in al) { if (coro != null) { IoCoroutine.slotResume(coro, null, null); } } } IoCLI.state.prompt(IoCLI.state); }
public void rawReturnToParent() { IoCoroutine parentCoro = rawParentCoroutine() as IoCoroutine; if (parentCoro != null && parentCoro.name.Equals("Coroutine")) { IoCoroutine.slotResume(parentCoro, null, null); } else { if (this == this.tag.state.mainCoroutine) { Console.WriteLine("IoCoroutine error: attempt to return from main coro"); } } }
private static IEnumerator Recurse3(IoCoroutine f) { IoCoroutine ccc = IoCoroutine.createObject(IoCLI.state); ccc.fiber = new Fiber(); ccc.fiber.currentCoro = ccc; ccc.fiber.currentRoutine = IoCLI.Recurse4(ccc); ccc.rawSetResult(IoNumber.newWithDouble(IoCLI.state, 42)); ccc.rawSetRunLocals(IoCLI.state.core); ccc.rawSetRunMessage(IoCLI.state.nilMessage); ccc.rawSetRunTarget(ccc); IoCLI.yieldingCoros.Add(ccc); Console.WriteLine("Recurse3+" + i++); yield return ccc; }
private static IEnumerator Recurse2(IoCoroutine f) { yield return null; // just create and quit IoCoroutine ccc = IoCoroutine.createObject(IoCLI.state); ccc.fiber = new Fiber(); ccc.fiber.currentCoro = ccc; ccc.fiber.currentRoutine = IoCLI.Recurse3(ccc); ccc.rawSetResult(IoNumber.newWithDouble(IoCLI.state, 42)); ccc.rawSetRunLocals(IoCLI.state.core); ccc.rawSetRunMessage(IoCLI.state.nilMessage); ccc.rawSetRunTarget(ccc); IoCLI.yieldingCoros.Add(ccc); yield return ccc; }
private static IEnumerator Recurse3(IoCoroutine f) { IoCoroutine ccc = IoCoroutine.createObject(IoCLI.state); ccc.fiber = new Fiber(); ccc.fiber.currentCoro = ccc; ccc.fiber.currentRoutine = IoCLI.Recurse4(ccc); ccc.rawSetResult(IoNumber.newWithDouble(IoCLI.state, 42)); ccc.rawSetRunLocals(IoCLI.state.core); ccc.rawSetRunMessage(IoCLI.state.nilMessage); ccc.rawSetRunTarget(ccc); IoCLI.yieldingCoros.Add(ccc); Console.WriteLine("Recurse3+" + i++); yield return(ccc); }
private static IEnumerator Recurse2(IoCoroutine f) { yield return(null); // just create and quit IoCoroutine ccc = IoCoroutine.createObject(IoCLI.state); ccc.fiber = new Fiber(); ccc.fiber.currentCoro = ccc; ccc.fiber.currentRoutine = IoCLI.Recurse3(ccc); ccc.rawSetResult(IoNumber.newWithDouble(IoCLI.state, 42)); ccc.rawSetRunLocals(IoCLI.state.core); ccc.rawSetRunMessage(IoCLI.state.nilMessage); ccc.rawSetRunTarget(ccc); IoCLI.yieldingCoros.Add(ccc); yield return(ccc); }
// Coroutine clone run public static IoObject slotRun(IoObject target, IoObject locals, IoObject message) { IoCoroutine self = target as IoCoroutine; //Fiber coro = self.fiber; //if (coro == null) // self.fiber = new Fiber(); //{ // // actually we don't need get current Corotine cos we hasn't do SwithFromTo // // just switch // // IoCoroutine current = target.tag.state.currentCoroutine; // self.fiber.currentRoutine = new FiberProc(self.coroStart/*(self)*/); // self.fiber.Run(); //} return(self.rawResult()); }
private static IEnumerator Recurse4(IoCoroutine f) { int i = 0; while (i < 4) { //Console.WriteLine("Recurse4 Fiber: " + f.uniqueId + " Iteration: " + i++); Console.WriteLine("[" + f.uniqueId + ":" + Convert.ToString(i++) + "]"); f.fiber.Yield(f); //yield return null; } IoCLI.yieldingCoros.Remove(f); IoCLI.coro = null; return(null); //yield return null; }
static void Main() { // Test Fibers for (int i = 0; i <400; i++) { IoCoroutine coro = IoCoroutine.createObject(IoCLI.state); coro.fiber = new Fiber(); coro.fiber.currentCoro = coro; coro.fiber.uniqueId = coro.uniqueId; coro.fiber.currentRoutine = new FiberProc(IoCLI.Recurse2/*(coro)*/); if (coro.fiber.State == 4) { Console.WriteLine("Creation Error. Fiber Exceeds on " + i); break; } IoCLI.yieldingCoros.Add(coro); if (IoCLI.coro == null) IoCLI.coro = coro; } while (true) { ArrayList al = new ArrayList(); foreach (IoCoroutine coro in IoCLI.yieldingCoros) { if (coro != null) al.Add(coro); } if (al.Count == 0) break; foreach (IoCoroutine coro in al) { if (coro != null) IoCoroutine.slotResume(coro, null, null); } } IoCLI.state.prompt(IoCLI.state); }
private static IEnumerator Recurse3(IoCoroutine f) { int i = 0; IoCoroutine ccc = IoCoroutine.createObject(IoCLI.state); ccc.fiber = new Fiber(); ccc.fiber.currentCoro = ccc; //yield return ccc.fiber.currentRoutine = new FiberProc(IoCLI.Recurse4 /*(ccc)*/); if (coro.fiber.State == 4) { Console.WriteLine("Creation Error. Fiber Exceeds on Recurse 3 " + f.uniqueId); IoCLI.yieldingCoros.Remove(f); return(null); } ccc.rawSetResult(IoNumber.newWithDouble(IoCLI.state, 42)); ccc.rawSetRunLocals(IoCLI.state.core); ccc.rawSetRunMessage(IoCLI.state.nilMessage); ccc.rawSetRunTarget(ccc); IoCLI.yieldingCoros.Add(ccc); IoCLI.yieldingCorosCount++; //Console.WriteLine("Coro3 " + f.uniqueId + " creates Coro4 + " + ccc.uniqueId); while (i < 2) { // f.fiber.Yield(f); //Console.WriteLine("Recurse3 Fiber: " + f.uniqueId + " Iteration: " + i++); //yield return null; i++; } IoCLI.yieldingCoros.Remove(f); return(null); }
//public object Yield() //{ // yield return null; //} public static IoObject slotResume(IoObject target, IoObject locals, IoObject message) { IoCoroutine self = target as IoCoroutine; //object ret = null; //if (self.fiber != null) //{ // IoCoroutine current = target.tag.state.currentCoroutine; // target.tag.state.currentCoroutine = self; // ret = self.fiber.Resume(); // //if (ret == null) // //{ // // Console.WriteLine("Fiber Exceeds on " + self.fiber.uniqueId); // // throw new Exception("Can't resume Fiber"); // //} //} //else //{ // IoCoroutine.slotRun(self, null, null); //} return(self); }
public override IoObject proto(IoState state) { IoCoroutine pro = new IoCoroutine(); pro.tag.state = state; // pro.tag.cloneFunc = new IoTagCloneFunc(this.clone); pro.createSlots(); pro.createProtos(); state.registerProtoWithFunc(name, new IoStateProto(name, pro, new IoStateProtoFunc(this.proto))); pro.protos.Add(state.protoWithInitFunc("Object")); IoCFunction[] methodTable = new IoCFunction[] { new IoCFunction("run", new IoMethodFunc(IoCoroutine.slotRun)), new IoCFunction("main", new IoMethodFunc(IoCoroutine.slotMain)), new IoCFunction("resume", new IoMethodFunc(IoCoroutine.slotResume)), new IoCFunction("isCurrent", new IoMethodFunc(IoCoroutine.slotIsCurrent)), new IoCFunction("currentCoroutine", new IoMethodFunc(IoCoroutine.slotCurrentCoroutine)), new IoCFunction("implementation", new IoMethodFunc(IoCoroutine.slotImplementation)), new IoCFunction("setMessageDebugging", new IoMethodFunc(IoCoroutine.slotSetMessageDebugging)), }; pro.addTaglessMethodTable(state, methodTable); return pro; }
public CSharpFiber(IoCoroutine coro) { this.currentCoro = coro; }
public new static IoCoroutine createObject(IoState state) { IoCoroutine s = new IoCoroutine(); return(s.clone(state) as IoCoroutine); }
public new static IoCoroutine createProto(IoState state) { IoCoroutine s = new IoCoroutine(); return(s.proto(state) as IoCoroutine); }
private static IEnumerator Recurse4(IoCoroutine f) { int i = 0; while (i < 4) { //Console.WriteLine("Recurse4 Fiber: " + f.uniqueId + " Iteration: " + i++); Console.WriteLine("[" + f.uniqueId + ":" + Convert.ToString(i++) + "]"); f.fiber.Yield(f); //yield return null; } IoCLI.yieldingCoros.Remove(f); IoCLI.coro = null; return null; //yield return null; }
public override IoObject clone(IoState state) { IoCoroutine proto = state.protoWithInitFunc(name) as IoCoroutine; IoCoroutine result = new IoCoroutine(); uniqueIdCounter++; result.uniqueId = uniqueIdCounter; result.tag = proto.tag; result.createProtos(); result.createSlots(); result.protos.Add(proto); return result; }
public IEnumerator coroStart(IoCoroutine coro) { //IoCoroutine self = coro; //IoObject result = null; //self.tag.state.currentCoroutine = self; //if (self.tag.state.mainMessage != null) // result = self.tag.state.mainMessage.localsPerformOn(self, self); //self.rawSetResult(result); //self.rawReturnToParent(); yield return null; }
public static new IoCoroutine createObject(IoState state) { IoCoroutine s = new IoCoroutine(); return s.clone(state) as IoCoroutine; }
public static new IoCoroutine createProto(IoState state) { IoCoroutine s = new IoCoroutine(); return s.proto(state) as IoCoroutine; }
private static IEnumerator Recurse3(IoCoroutine f) { int i = 0; IoCoroutine ccc = IoCoroutine.createObject(IoCLI.state); ccc.fiber = new Fiber(); ccc.fiber.currentCoro = ccc; //yield return ccc.fiber.currentRoutine = new FiberProc(IoCLI.Recurse4/*(ccc)*/); if (coro.fiber.State == 4) { Console.WriteLine("Creation Error. Fiber Exceeds on Recurse 3 " + f.uniqueId); IoCLI.yieldingCoros.Remove(f); return null; } ccc.rawSetResult(IoNumber.newWithDouble(IoCLI.state, 42)); ccc.rawSetRunLocals(IoCLI.state.core); ccc.rawSetRunMessage(IoCLI.state.nilMessage); ccc.rawSetRunTarget(ccc); IoCLI.yieldingCoros.Add(ccc); IoCLI.yieldingCorosCount++; //Console.WriteLine("Coro3 " + f.uniqueId + " creates Coro4 + " + ccc.uniqueId); while (i < 2) { // f.fiber.Yield(f); //Console.WriteLine("Recurse3 Fiber: " + f.uniqueId + " Iteration: " + i++); //yield return null; i++; } IoCLI.yieldingCoros.Remove(f); return null; }
public CSharpFiber(IoCoroutine coro) { this.currentCoro = coro; }