예제 #1
0
class Proxy(Promise):
    committed = False

    def __init__(self, vat, handler, resolutionBox):
        if not handler.isSettled():
            raise userError(u"Proxy handler not settled: " +
                            handler.toString())
        self.vat = vat
        self.handler = handler
        self.resolutionBox = resolutionBox

    def commit(self):
        if self.committed:
            raise userError(u"already commited")
        self.committed = True
        if isinstance(self.resolutionBox, FinalSlot):
            res = self.resolutionBox.get()
        else:
            res = UnconnectedRef(self.vat, StrObject(
                u"Resolution promise of a proxy handled by " +
                self.handler.toString() +
                u" didn't resolve to a FinalSlot, but " +
                self.resolutionBox.toString() +
                u" instead."))
            self.resolutionBox = FinalSlot(res, anyGuard)
        self.handler = None
        return res

    def checkSlot(self):
        if self.committed:
            return True
        self.resolutionBox = resolution(self.resolutionBox)
        if isResolved(self.resolutionBox):
            self.commit()
            return True
        return False

    def eq(self, other):
        if not isinstance(other, Proxy):
            return False
        if self.checkSlot() or other.checkSlot():
            raise userError(u"equals comparison of resolved proxy is"
                            u" impossible")
        return optSame(self.handler, other.handler) is EQUAL

    def state(self):
        if self.checkSlot():
            o = self.resolutionBox.get()
            if isinstance(o, Promise):
                return o.state()
            else:
                return NEAR
        else:
            return EVENTUAL

    def optProblem(self):
        if self.checkSlot():
            ref = self.resolutionBox.get()
            if isinstance(ref, Promise):
                return ref.optProblem()
        return NullObject

    def resolutionRef(self):
        if self.checkSlot():
            ref = self.resolutionBox.get()
            if isinstance(ref, Promise):
                return ref.resolutionRef()
            return ref
        return self

    def callAll(self, atom, args, namedArgs):
        if self.checkSlot():
            return self.resolutionBox.get().callAtom(atom, args, namedArgs)
        else:
            raise userError(u"not synchronously callable (%s)" %
                            atom.repr.decode("utf-8"))

    def sendAll(self, atom, args, namedArgs):
        if self.checkSlot():
            ref = self.resolutionBox.get()
            return send(ref, atom, args, namedArgs)
        else:
            return send(self.handler, HANDLESEND_3, [StrObject(atom.verb),
                                                     wrapList(args),
                                                     namedArgs], EMPTY_MAP)

    def sendAllOnly(self, atom, args, namedArgs):
        if self.checkSlot():
            ref = self.resolutionBox.get()
            sendOnly(ref, atom, args, namedArgs)
        else:
            sendOnly(self.handler, HANDLESENDONLY_3, [StrObject(atom.verb),
                                                      wrapList(args),
                                                      namedArgs], EMPTY_MAP)
        return NullObject

    def toString(self):
        if self.checkSlot():
            return self.resolutionBox.get().toString()
        else:
            return self._proxyToString()
예제 #2
0
class Proxy(Promise):
    def __init__(self, handler, resolutionBox):
        if not isSettled(handler):
            raise userError(u"Proxy handler not settled: " +
                            handler.toString())
        self.handler = handler
        self.resolutionBox = resolutionBox
        self.committed = False

    def commit(self):
        if self.committed:
            raise userError(u"already commited")
        self.committed = True
        if isinstance(self.resolutionBox, FinalSlot):
            res = self.resolutionBox.get()
        else:
            res = UnconnectedRef(
                StrObject(u"Resolution promise of a proxy handled by " +
                          self.handler.toString() +
                          u" didn't resolve to a FinalSlot, but " +
                          self.resolutionBox.toString() + u" instead."))
            self.resolutionBox = FinalSlot(res, anyGuard)
        self.handler = None
        return res

    def checkSlot(self):
        if self.committed:
            return True
        self.resolutionBox = resolution(self.resolutionBox)
        if isResolved(self.resolutionBox):
            self.commit()
            return True
        return False

    def eq(self, other):
        if not isinstance(other, Proxy):
            return False
        if self.checkSlot() or other.checkSlot():
            raise userError(u"equals comparison of resolved proxy is"
                            u" impossible")
        return optSame(self.handler, other.handler) is EQUAL

    def state(self):
        if self.checkSlot():
            o = self.resolutionBox.get()
            if isinstance(o, Promise):
                return o.state()
            else:
                return NEAR
        else:
            return EVENTUAL

    def optProblem(self):
        if self.checkSlot():
            ref = self.resolutionBox.get()
            if isinstance(ref, Promise):
                return ref.optProblem()
        return NullObject

    def resolutionRef(self):
        if self.checkSlot():
            ref = self.resolutionBox.get()
            if isinstance(ref, Promise):
                return ref.resolutionRef()
            return ref
        return self

    def callAll(self, atom, args, namedArgs):
        if self.checkSlot():
            return self.resolutionBox.get().recvNamed(atom, args, namedArgs)
        else:
            raise userError(u"not synchronously callable (%s)" %
                            atom.repr.decode("utf-8"))

    def sendAll(self, atom, args, namedArgs):
        if self.checkSlot():
            ref = self.resolutionBox.get()
            return send(ref, atom, args, namedArgs)
        else:
            return send(self.handler, HANDLESEND_3,
                        [StrObject(atom.verb),
                         ConstList(args), namedArgs], EMPTY_MAP)

    def sendAllOnly(self, atom, args, namedArgs):
        if self.checkSlot():
            ref = self.resolutionBox.get()
            sendOnly(ref, atom, args, namedArgs)
        else:
            sendOnly(self.handler, HANDLESENDONLY_3,
                     [StrObject(atom.verb),
                      ConstList(args), namedArgs], EMPTY_MAP)
        return NullObject

    def toString(self):
        if self.checkSlot():
            return self.resolutionBox.get().toString()
        else:
            return self._proxyToString()