public static MemberAccessPath Deserialize(PromisedAnswer.READER promisedAnswer) { var ops = new MemberAccess[promisedAnswer.Transform.Count]; int i = 0; foreach (var op in promisedAnswer.Transform) { ops[i++] = MemberAccess.Deserialize(op); } return(new MemberAccessPath(ops)); }
public void Chain(PromisedAnswer.READER rd, Action <Task <Proxy> > func) { Chain(t => { async Task <Proxy> EvaluateProxy() { var aorcq = await t; if (aorcq.Answer != null) { DeserializerState cur = aorcq.Answer; foreach (var op in rd.Transform) { switch (op.which) { case PromisedAnswer.Op.WHICH.GetPointerField: try { cur = cur.StructReadPointer(op.GetPointerField); } catch (System.Exception) { throw new ArgumentOutOfRangeException("Illegal pointer field in transformation operation"); } break; case PromisedAnswer.Op.WHICH.Noop: break; default: throw new ArgumentOutOfRangeException("Unknown transformation operation"); } } Proxy proxy; switch (cur.Kind) { case ObjectKind.Capability: try { var cap = aorcq.Answer.Caps ![(int)cur.CapabilityIndex]; proxy = new Proxy(cap ?? LazyCapability.Null); }
public void Chain(bool strictSync, PromisedAnswer.READER rd, Func <Task <Proxy>, Task> func) { Chain(strictSync, async t => { async Task <Proxy> EvaluateProxy() { var aorcq = await t; if (aorcq.Answer != null) { DeserializerState cur = aorcq.Answer; foreach (var op in rd.Transform) { switch (op.which) { case PromisedAnswer.Op.WHICH.GetPointerField: try { cur = cur.StructReadPointer(op.GetPointerField); } catch (System.Exception) { throw new ArgumentOutOfRangeException("Illegal pointer field in transformation operation"); } break; case PromisedAnswer.Op.WHICH.Noop: break; default: throw new ArgumentOutOfRangeException("Unknown transformation operation"); } } Proxy proxy; switch (cur.Kind) { case ObjectKind.Capability: try { var cap = aorcq.Answer.Caps[(int)cur.CapabilityIndex]; proxy = new Proxy(cap ?? LazyCapability.Null); } catch (ArgumentOutOfRangeException) { throw new ArgumentOutOfRangeException("Bad capability table in internal answer - internal error?"); } return(proxy); default: throw new ArgumentOutOfRangeException("Transformation did not result in a capability"); } } else { var path = MemberAccessPath.Deserialize(rd); var cap = new RemoteAnswerCapability(aorcq.Counterquestion, path); return(new Proxy(cap)); } } await func(EvaluateProxy()); }); }