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()
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()