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);
                            }
Ejemplo n.º 3
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());
            });
        }