Inheritance: IoObject
Beispiel #1
0
        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;
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        public static IoObject slotCurrentCoroutine(IoObject target, IoObject locals, IoObject message)
        {
            //~//return target.tag.state.currentCoroutine;
            IoCoroutine self = target as IoCoroutine;

            return(self);
        }
Beispiel #5
0
        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;
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }
Beispiel #9
0
 private static IEnumerator Recurse4(IoCoroutine f)
 {
     int i = 0;
     while (i < 10)
     {
         Console.WriteLine("Recurse4+" + i++);
         yield return null;
     }
 }
Beispiel #10
0
        private static IEnumerator Recurse4(IoCoroutine f)
        {
            int i = 0;

            while (i < 10)
            {
                Console.WriteLine("Recurse4+" + i++);
                yield return(null);
            }
        }
Beispiel #11
0
 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);
 }
Beispiel #12
0
        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);
        }
Beispiel #13
0
        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);
        }
Beispiel #14
0
        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);
        }
Beispiel #15
0
        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");
                }
            }
        }
Beispiel #16
0
        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;
        }
Beispiel #17
0
        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;
        }
Beispiel #18
0
        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);
        }
Beispiel #19
0
        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);
        }
Beispiel #20
0
        // 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());
        }
Beispiel #21
0
        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;
        }
Beispiel #22
0
        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);
        }
Beispiel #23
0
        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);
        }
Beispiel #24
0
        //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);
        }
Beispiel #25
0
        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;
        }
Beispiel #26
0
 public CSharpFiber(IoCoroutine coro)
 {
     this.currentCoro = coro;
 }
Beispiel #27
0
        public new static IoCoroutine createObject(IoState state)
        {
            IoCoroutine s = new IoCoroutine();

            return(s.clone(state) as IoCoroutine);
        }
Beispiel #28
0
        public new static IoCoroutine createProto(IoState state)
        {
            IoCoroutine s = new IoCoroutine();

            return(s.proto(state) as IoCoroutine);
        }
Beispiel #29
0
        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;
        }
Beispiel #30
0
 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;
 }
Beispiel #31
0
 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;
 }
Beispiel #32
0
 public static new IoCoroutine createObject(IoState state)
 {
     IoCoroutine s = new IoCoroutine();
     return s.clone(state) as IoCoroutine;
 }
Beispiel #33
0
 public static new IoCoroutine createProto(IoState state)
 {
     IoCoroutine s = new IoCoroutine();
     return s.proto(state) as IoCoroutine;
 }
Beispiel #34
0
        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;
        }
Beispiel #35
0
 public CSharpFiber(IoCoroutine coro)
 {
     this.currentCoro = coro;
 }