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 run(self, guard, specimen, ej): if guard != NullObject: val = guard.call(u"coerce", [specimen, ej]) g = guard else: val = specimen g = anyGuard return FinalSlot(val, g)
def recv(self, atom, args): if atom is RUN_3: guard, specimen, ej = args[0], args[1], args[2] if guard != NullObject: val = guard.coerce(specimen, ej) g = guard else: val = specimen g = anyGuard return FinalSlot(val, g) if atom is ASTYPE_0: return theFinalSlotGuardMaker raise Refused(self, atom, args)
def commit(self): # A FarRef can only stop proxying if it becomes disconnected, when it # resolves to a DisconnectedRef. handler = self.handler resolution = Proxy.commit(self) if not isinstance(resolution, UnconnectedRef): problem = StrObject(u"Attempt to resolve a far ref handled by " + handler.toString() + u"to a different identity (" + resolution.toString() + u")") else: problem = resolution._problem resolution = DisconnectedRef(handler, self.resolutionIdentity, problem) self.resolutionBox = FinalSlot(resolution, anyGuard) self.resolutionIdentity = None
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
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()
def testFinalImmutabilityLocal(self): env = Environment([], [], 1, 0, 0) env.createSlotLocal(0, FinalSlot(NullObject, NullObject), theFinalSlotGuardMaker) self.assertRaises(UserException, env.putValueLocal, 0, NullObject)
def testFinalImmutabilityFrame(self): env = Environment([ Binding(FinalSlot(NullObject, NullObject), theFinalSlotGuardMaker) ], [], 0, 0, 0) self.assertRaises(UserException, env.putValueFrame, 0, NullObject)