public IoObject localsPerformOn(IoObject target, IoObject locals) { if (async) { IoContext ctx = new IoContext(); ctx.target = target; ctx.locals = locals; ctx.message = this; IoState state = target.state; IoObject future = IoObject.createObject(state); IEnumerator <IoObject> e = IoMessage.asyncCall(ctx, future); state.contextList.Add(e); return(future); } IoObject result = target; IoObject cachedTarget = target; IoMessage msg = this; do { if (msg.messageName.Equals(msg.state.semicolonSymbol)) { target = cachedTarget; } else { result = msg.cachedResult; if (result == null) { //if (target.tag.performFunc == null) result = target.perform(target, locals, msg); //else // result = target.tag.performFunc(target, locals, msg); } if (result == null) { Console.WriteLine("Message chains intermediate mustn't be null"); } target = result; } } while ((msg = msg.next) != null); return(result); }
public static IoObject slotAsyncCall(IoObject target, IoObject locals, IoObject message) { IoMessage msg = message as IoMessage; IoMessage aMessage = msg.rawArgAt(0); IoObject context = target; if (msg.args.Count >= 2) { context = msg.localsValueArgAt(locals, 1); } IoBlock o = target.rawGetSlot(aMessage.messageName) as IoBlock; if (o != null) { IoMessage mmm = o.containedMessage; mmm.async = true; IoContext ctx = new IoContext(); ctx.target = context; ctx.locals = target; ctx.message = mmm; mmm.async = true; IoState state = target.state; IoObject future = IoObject.createObject(state); IEnumerator <IoObject> e = IoMessage.asyncCall(ctx, future); state.contextList.Add(e); return(future); } else { IoCFunction cf = target.rawGetSlot(aMessage.messageName) as IoCFunction; if (cf != null) { cf.async = true; return(cf.activate(target, locals, aMessage, null)); } } return(aMessage.localsPerformOn(target, locals)); }
public static IEnumerator asyncCall(IoContext ctx, IoObject future) { IoObject target = ctx.target; IoObject locals = ctx.locals; IoObject result = target; IoObject cachedTarget = target; IoMessage msg = ctx.message; IoObject savedPrevResultAsYieldResult = null; do { if (msg.messageName.Equals(msg.state.semicolonSymbol)) { target = cachedTarget; } else { result = msg.cachedResult; if (result == null) { if (msg.messageName.value.Equals("yield")) { yield return result; } else { result = target.perform(target, locals, msg); } } if (result == null) { result = savedPrevResultAsYieldResult; } target = result; savedPrevResultAsYieldResult = result; } } while ((msg = msg.next) != null); future.slots["future"] = result; yield return null; //yield return result; }
public static IEnumerator <IoObject> asyncCall(IoContext ctx, IoObject future) { IoObject target = ctx.target; IoObject locals = ctx.locals; IoObject result = target; IoObject cachedTarget = target; IoMessage msg = ctx.message; IoObject savedPrevResultAsYieldResult = null; do { if (msg.messageName.Equals(msg.state.semicolonSymbol)) { target = cachedTarget; } else { result = msg.cachedResult; if (result == null) { if (msg.messageName.value.Equals("yield")) { yield return(result); } else { result = target.perform(target, locals, msg); } } if (result == null) { result = savedPrevResultAsYieldResult; } target = result; savedPrevResultAsYieldResult = result; } } while ((msg = msg.next) != null); future.slots["future"] = result; yield return(null); //yield return result; }
public static IoObject slotAsyncCall(IoObject target, IoObject locals, IoObject message) { IoMessage msg = message as IoMessage; IoMessage aMessage = msg.rawArgAt(0); IoObject context = target; if (msg.args.Count >= 2) { context = msg.localsValueArgAt(locals, 1); } IoBlock o = target.rawGetSlot(aMessage.messageName) as IoBlock; if (o != null) { IoMessage mmm = o.containedMessage; mmm.async = true; IoContext ctx = new IoContext(); ctx.target = context; ctx.locals = target; ctx.message = mmm; mmm.async = true; IoState state = target.state; IoObject future = IoObject.createObject(state); IEnumerator e = IoMessage.asyncCall(ctx, future); state.contextList.Add(e); return future; } else { IoCFunction cf = target.rawGetSlot(aMessage.messageName) as IoCFunction; if (cf != null) { cf.async = true; return cf.activate(target, locals, aMessage, null); } } return aMessage.localsPerformOn(target, locals); }
public IoObject localsPerformOn(IoObject target, IoObject locals) { if (async) { IoContext ctx = new IoContext(); ctx.target = target; ctx.locals = locals; ctx.message = this; IoState state = target.state; IoObject future = IoObject.createObject(state); IEnumerator e = IoMessage.asyncCall(ctx, future); state.contextList.Add(e); return future; } IoObject result = target; IoObject cachedTarget = target; IoMessage msg = this; do { if (msg.messageName.Equals(msg.state.semicolonSymbol)) { target = cachedTarget; } else { result = msg.cachedResult; if (result == null) { //if (target.tag.performFunc == null) result = target.perform(target, locals, msg); //else // result = target.tag.performFunc(target, locals, msg); } if (result == null) { Console.WriteLine("Message chains intermediate mustn't be null"); } target = result; } } while ((msg = msg.next) != null); return result; }