コード例 #1
0
ファイル: proxy.py プロジェクト: markrwilliams/typhon
 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
コード例 #2
0
ファイル: safe.py プロジェクト: zarutian/typhon
 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)
コード例 #3
0
ファイル: safe.py プロジェクト: markrwilliams/typhon
 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)
コード例 #4
0
ファイル: proxy.py プロジェクト: markrwilliams/typhon
 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
コード例 #5
0
ファイル: proxy.py プロジェクト: monte-language/typhon
 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
コード例 #6
0
ファイル: proxy.py プロジェクト: monte-language/typhon
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()
コード例 #7
0
ファイル: proxy.py プロジェクト: markrwilliams/typhon
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()
コード例 #8
0
 def testFinalImmutabilityLocal(self):
     env = Environment([], [], 1, 0, 0)
     env.createSlotLocal(0, FinalSlot(NullObject, NullObject),
                         theFinalSlotGuardMaker)
     self.assertRaises(UserException, env.putValueLocal, 0, NullObject)
コード例 #9
0
 def testFinalImmutabilityFrame(self):
     env = Environment([
         Binding(FinalSlot(NullObject, NullObject), theFinalSlotGuardMaker)
     ], [], 0, 0, 0)
     self.assertRaises(UserException, env.putValueFrame, 0, NullObject)