示例#1
0
        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());
            });
        }