예제 #1
0
파일: nodes.py 프로젝트: zarutian/typhon
def wrapNameList(names):
    # unroll_safe justified by inputs always being immutable. ~ C.
    # XXX monteMap()
    d = monteMap()
    for name in names:
        d[StrObject(name)] = None
    return d
예제 #2
0
 def buildMap(self, index):
     # XXX monteMap()
     d = monteMap()
     for i in range(index):
         # Yikes, the order of operations here is dangerous.
         d[self.pop()] = self.pop()
     self.push(ConstMap(d))
예제 #3
0
 def buildMap(self, index):
     # XXX monteMap()
     d = monteMap()
     for i in range(index):
         # Yikes, the order of operations here is dangerous.
         d[self.pop()] = self.pop()
     self.push(ConstMap(d))
예제 #4
0
def packLocalNamedRefs(namedArgs, targetVat, originVat):
    from typhon.objects.collections.maps import ConstMap, monteMap
    # XXX monteMap()
    namedRefs = monteMap()
    for k, v in namedArgs.iteritems():
        namedRefs[packLocalRef(k, targetVat, originVat)] = packLocalRef(v, targetVat, originVat)
    return ConstMap(namedRefs)
예제 #5
0
파일: nodes.py 프로젝트: dckc/typhon
def wrapNameList(names):
    # unroll_safe justified by inputs always being immutable. ~ C.
    # XXX monteMap()
    d = monteMap()
    for name in names:
        d[StrObject(name)] = None
    return d
예제 #6
0
 def testSurprisingMapCorruption(self):
     d = monteMap()
     d[IntObject(1)] = IntObject(2)
     m = ConstMap(d)
     f = m.call(u"diverge", [])
     f.call(u"removeKey", [IntObject(1)])
     result = m.call(u"get", [IntObject(1)])
     self.assertEqual(result.getInt(), 2)
예제 #7
0
 def testSurprisingMapCorruption(self):
     d = monteMap()
     d[IntObject(1)] = IntObject(2)
     m = ConstMap(d)
     f = m.call(u"diverge", [])
     f.call(u"removeKey", [IntObject(1)])
     result = m.call(u"get", [IntObject(1)])
     self.assertEqual(result.getInt(), 2)
예제 #8
0
 def getEnvironment(self):
     # XXX monteMap()
     d = monteMap()
     for key, value in os.environ.items():
         k = BytesObject(key)
         v = BytesObject(value)
         d[k] = v
     return d
예제 #9
0
def packLocalNamedRefs(namedArgs, targetVat, originVat):
    from typhon.objects.collections.maps import ConstMap, monteMap
    # XXX monteMap()
    namedRefs = monteMap()
    for k, v in namedArgs.objectMap.items():
        namedRefs[packLocalRef(k, targetVat, originVat)] = packLocalRef(
            v, targetVat, originVat)
    return ConstMap(namedRefs)
예제 #10
0
파일: processes.py 프로젝트: dckc/typhon
 def getEnvironment(self):
     # XXX monteMap()
     d = monteMap()
     for key, value in os.environ.items():
         k = BytesObject(key)
         v = BytesObject(value)
         d[k] = v
     return d
예제 #11
0
def makeMirandaArgs():
    from typhon.objects.collections.maps import monteMap
    from typhon.objects.data import StrObject
    from typhon.objects.ejectors import theThrower

    # XXX monteMap()
    mirandaArgs = monteMap()
    mirandaArgs[StrObject(u"FAIL")] = theThrower
    return mirandaArgs
예제 #12
0
def makeMirandaArgs():
    from typhon.objects.collections.maps import monteMap
    from typhon.objects.data import StrObject
    from typhon.objects.ejectors import theThrower

    # XXX monteMap()
    mirandaArgs = monteMap()
    mirandaArgs[StrObject(u"FAIL")] = theThrower
    return mirandaArgs
예제 #13
0
def makeCurrentProcess(config):
    argv = [StrObject(arg.decode("utf-8")) for arg in config.argv]

    # Pull envp via os.environ and pack it into a map. Also, destroy each key
    # after pulling it, which will cause RPython to either setenv(key, NULL)
    # or unsetenv(key), whichever is available. ~ C.
    # XXX monteMap()
    env = monteMap()
    for key, value in os.environ.items():
        k = BytesObject(key)
        v = BytesObject(value)
        env[k] = v
        del os.environ[key]

    return CurrentProcess(os.getpid(), argv, env)
예제 #14
0
파일: runtime.py 프로젝트: washort/typhon
    def recv(self, atom, args):
        if atom is GETBUCKETS_0:
            d = monteMap()
            for name, count in self.buckets.items():
                size = self.sizes.get(name, -1)
                d[StrObject(name)] = ConstList(
                    [IntObject(size), IntObject(count)])
            return ConstMap(d)

        if atom is GETMEMORYUSAGE_0:
            return IntObject(self.memoryUsage)

        if atom is GETOBJECTCOUNT_0:
            return IntObject(self.objectCount)

        raise Refused(self, atom, args)
예제 #15
0
    def recv(self, atom, args):
        if atom is GETBUCKETS_0:
            d = monteMap()
            for name, count in self.buckets.items():
                size = self.sizes.get(name, -1)
                d[StrObject(name)] = ConstList([IntObject(size),
                                                IntObject(count)])
            return ConstMap(d)

        if atom is GETMEMORYUSAGE_0:
            return IntObject(self.memoryUsage)

        if atom is GETOBJECTCOUNT_0:
            return IntObject(self.objectCount)

        raise Refused(self, atom, args)
예제 #16
0
    def recv(self, atom, args):
        if atom is GETARGUMENTS_0:
            return ConstList(
                [StrObject(arg.decode("utf-8")) for arg in self.config.argv])

        if atom is GETENVIRONMENT_0:
            # XXX monteMap()
            d = monteMap()
            for key, value in os.environ.items():
                k = StrObject(key.decode("utf-8"))
                v = StrObject(value.decode("utf-8"))
                d[k] = v
            return ConstMap(d)

        if atom is GETPID_0:
            return IntObject(os.getpid())

        if atom is INTERRUPT_0:
            os.kill(os.getpid(), signal.SIGINT)
            return NullObject

        raise Refused(self, atom, args)
예제 #17
0
    def recv(self, atom, args):
        if atom is GETARGUMENTS_0:
            return ConstList([StrObject(arg.decode("utf-8"))
                              for arg in self.config.argv])

        if atom is GETENVIRONMENT_0:
            # XXX monteMap()
            d = monteMap()
            for key, value in os.environ.items():
                k = StrObject(key.decode("utf-8"))
                v = StrObject(value.decode("utf-8"))
                d[k] = v
            return ConstMap(d)

        if atom is GETPID_0:
            return IntObject(os.getpid())

        if atom is INTERRUPT_0:
            os.kill(os.getpid(), signal.SIGINT)
            return NullObject

        raise Refused(self, atom, args)
예제 #18
0
def evalToPair(code, topLocals, envMap, bindingNames=False):
    environment = {}
    if bindingNames:
        for k, v in unwrapMap(envMap).items():
            s = unwrapStr(k)
            if not s.startswith("&&"):
                raise userError(u"evalMonteFile scope map must be of the "
                                "form '[\"&&name\" => binding]'")
            environment[s[2:]] = v
    else:
        for k, v in unwrapMap(envMap).items():
            environment[unwrapStr(k)] = v
    # Don't catch user exceptions; on traceback, we'll have a trail
    # auto-added that indicates that the exception came through
    # eval() or whatnot.
    result, newEnv = evaluateRaise([code], environment)
    if newEnv is not None:
        # XXX monteMap()
        d = monteMap()
        for k, vi in topLocals.items():
            d[StrObject(k)] = newEnv.local[vi]
        addendum = ConstMap(d)
        envMap = addendum._or(envMap)
    return result, envMap
예제 #19
0
    def recv(self, atom, args):
        if atom is GETARGUMENTS_0:
            return ConstList([BytesObject(arg) for arg in self.argv])

        if atom is GETENVIRONMENT_0:
            # XXX monteMap()
            d = monteMap()
            for key, value in self.env.items():
                k = BytesObject(key)
                v = BytesObject(value)
                d[k] = v
            return ConstMap(d)

        if atom is GETPID_0:
            return IntObject(self.pid)

        if atom is INTERRUPT_0:
            os.kill(self.pid, signal.SIGINT)
            return NullObject

        if atom is WAIT_0:
            return self.makeWaiter()

        raise Refused(self, atom, args)
예제 #20
0
    def recv(self, atom, args):
        if atom is GETARGUMENTS_0:
            return ConstList([BytesObject(arg) for arg in self.argv])

        if atom is GETENVIRONMENT_0:
            # XXX monteMap()
            d = monteMap()
            for key, value in self.env.items():
                k = BytesObject(key)
                v = BytesObject(value)
                d[k] = v
            return ConstMap(d)

        if atom is GETPID_0:
            return IntObject(self.pid)

        if atom is INTERRUPT_0:
            os.kill(self.pid, signal.SIGINT)
            return NullObject

        if atom is WAIT_0:
            return self.makeWaiter()

        raise Refused(self, atom, args)
예제 #21
0
def evalToPair(code, topLocals, envMap, bindingNames=False):
    environment = {}
    if bindingNames:
        for k, v in unwrapMap(envMap).items():
            s = unwrapStr(k)
            if not s.startswith("&&"):
                raise userError(u"evalMonteFile scope map must be of the "
                                "form '[\"&&name\" => binding]'")
            environment[s[2:]] = v
    else:
        for k, v in unwrapMap(envMap).items():
            environment[unwrapStr(k)] = v
    # Don't catch user exceptions; on traceback, we'll have a trail
    # auto-added that indicates that the exception came through
    # eval() or whatnot.
    result, newEnv = evaluateRaise([code], environment)
    if newEnv is not None:
        # XXX monteMap()
        d = monteMap()
        for k, vi in topLocals.items():
            d[StrObject(k)] = newEnv.local[vi]
        addendum = ConstMap(d)
        envMap = addendum._or(envMap)
    return result, envMap
예제 #22
0
def runTyphon(argv):
    # Start metrics.
    recorder = globalRecorder()
    recorder.start()

    # Initialize libsodium.
    if rsodium.init() < 0:
        print "Couldn't initialize libsodium!"
        return 1

    config = Configuration(argv)

    if config.verbose:
        enableDebugPrint()

    config.enableLogging()

    if len(config.argv) < 2:
        print "No file provided?"
        return 1

    # Pass user configuration to the JIT.
    set_user_param(None, config.jit)

    # Intialize our loop.
    uv_loop = ruv.alloc_loop()

    # Usurp SIGPIPE, as libuv does not handle it.
    rsignal.pypysig_ignore(rsignal.SIGPIPE)

    # Initialize our first vat. It shall be immortal.
    vatManager = VatManager()
    vat = Vat(vatManager, uv_loop, checkpoints=-1)
    vatManager.vats.append(vat)

    # Update loop timing information. Until the loop really gets going, we
    # have to do this ourselves in order to get the timing correct for early
    # timers.
    ruv.update_time(uv_loop)
    try:
        with scopedVat(vat) as vat:
            prelude = loadPrelude(config, recorder, vat)
    except LoadFailed as lf:
        print lf
        return 1
    except CompilerFailed as cf:
        debug_print("Caught exception while importing prelude:",
                cf.formatError())
        return 1
    except UserException as ue:
        debug_print("Caught exception while importing prelude:",
                ue.formatError())
        return 1

    registerGlobals(prelude)

    scope = safeScope()
    scope.update(prelude)
    ss = scope.copy()
    reflectedSS = monteMap()
    for k, b in ss.iteritems():
        reflectedSS[StrObject(u"&&" + k)] = b
    ss[u"safeScope"] = finalBinding(ConstMap(reflectedSS), deepFrozenGuard)
    reflectedSS[StrObject(u"&&safeScope")] = ss[u"safeScope"]
    scope[u"safeScope"] = ss[u"safeScope"]
    scope.update(unsafeScope(config))
    # The initial vat is included as `currentVat` to the first level of
    # loading and such.
    scope[u"currentVat"] = finalBinding(vat, anyGuard)
    reflectedUnsafeScope = monteMap()
    unsafeScopeDict = {}
    for k, b in scope.iteritems():
        reflectedUnsafeScope[StrObject(u"&&" + k)] = b
        unsafeScopeDict[k] = b
    rus = finalBinding(ConstMap(reflectedUnsafeScope), anyGuard)
    reflectedUnsafeScope[StrObject(u"&&unsafeScope")] = rus
    unsafeScopeDict[u"unsafeScope"] = rus
    try:
        module = obtainModule([""], recorder, config.argv[1])
    except LoadFailed as lf:
        print lf
        return 1

    if config.loadOnly:
        # We are finished.
        return 0

    if not config.benchmark:
        benchmarkSettings.disable()

    with profiling("vmprof.log", config.profile):
        # Update loop timing information.
        ruv.update_time(uv_loop)
        debug_print("Taking initial turn in script...")
        result = NullObject
        try:
            with recorder.context("Time spent in vats"):
                with scopedVat(vat):
                    result = module.eval(unsafeScopeDict)[0]
            if result is None:
                return 1
        except UserException as ue:
            debug_print("Caught exception while taking initial turn:",
                    ue.formatError())
            return 1

        # Exit status code.
        exitStatus = 0
        # Update loop timing information.
        ruv.update_time(uv_loop)
        try:
            runUntilDone(vatManager, uv_loop, recorder)
            rv = resolution(result) if result is not None else NullObject
            if isinstance(rv, IntObject):
                exitStatus = rv.getInt()
        except SystemExit:
            pass
            # Huh, apparently this doesn't work. Wonder why/why not.
            # exitStatus = se.code
        finally:
            recorder.stop()
            recorder.printResults()

    # Clean up and exit.
    cleanUpEverything()
    return exitStatus
예제 #23
0
def mkMirandaArgs():
    # XXX monteMap()
    _d = monteMap()
    _d[StrObject(u"FAIL")] = theThrower
    return ConstMap(_d)
예제 #24
0
 def asSet(self):
     from typhon.objects.collections.maps import monteMap
     d = monteMap()
     for o in self._l:
         d[o] = None
     return d
예제 #25
0
파일: runtime.py 프로젝트: dckc/typhon
 def getBuckets(self):
     d = monteMap()
     for name, count in self.buckets.items():
         size = self.sizes.get(name, -1)
         d[StrObject(name)] = wrapList([IntObject(size), IntObject(count)])
     return d
예제 #26
0
def runTyphon(argv):
    recorder = Recorder()
    recorder.start()

    # Initialize libsodium.
    if rsodium.init() < 0:
        print "Couldn't initialize libsodium!"
        return 1

    config = Configuration(argv)

    if config.verbose:
        enableDebugPrint()

    config.enableLogging()

    if len(config.argv) < 2:
        print "No file provided?"
        return 1

    # Pass user configuration to the JIT.
    set_user_param(None, config.jit)

    # Intialize our loop.
    uv_loop = ruv.alloc_loop()

    # Usurp SIGPIPE, as libuv does not handle it.
    rsignal.pypysig_ignore(rsignal.SIGPIPE)

    # Initialize our first vat. It shall be immortal.
    vatManager = VatManager()
    vat = Vat(vatManager, uv_loop, checkpoints=-1)
    vatManager.vats.append(vat)

    # Update loop timing information. Until the loop really gets going, we
    # have to do this ourselves in order to get the timing correct for early
    # timers.
    ruv.update_time(uv_loop)
    try:
        with scopedVat(vat) as vat:
            prelude = loadPrelude(config, recorder, vat)
    except LoadFailed as lf:
        print lf
        return 1

    registerGlobals(prelude)

    scope = safeScope()
    scope.update(prelude)
    ss = scope.copy()
    reflectedSS = monteMap()
    for k, b in ss.iteritems():
        reflectedSS[StrObject(u"&&" + k)] = b
    ss[u"safeScope"] = finalBinding(ConstMap(reflectedSS), deepFrozenGuard)
    reflectedSS[StrObject(u"&&safeScope")] = ss[u"safeScope"]
    scope[u"safeScope"] = ss[u"safeScope"]
    scope.update(unsafeScope(config))
    reflectedUnsafeScope = monteMap()
    unsafeScopeDict = {}
    for k, b in scope.iteritems():
        reflectedUnsafeScope[StrObject(u"&&" + k)] = b
        unsafeScopeDict[k] = b
    rus = finalBinding(ConstMap(reflectedUnsafeScope), anyGuard)
    reflectedUnsafeScope[StrObject(u"&&unsafeScope")] = rus
    unsafeScopeDict[u"unsafeScope"] = rus
    try:
        code = obtainModule([""], config.argv[1], recorder)
    except LoadFailed as lf:
        print lf
        return 1

    if config.loadOnly:
        # We are finished.
        return 0

    if not config.benchmark:
        benchmarkSettings.disable()

    with profiling("vmprof.log", config.profile):
        # Update loop timing information.
        ruv.update_time(uv_loop)
        debug_print("Taking initial turn in script...")
        result = NullObject
        with recorder.context("Time spent in vats"):
            with scopedVat(vat):
                result = evaluateTerms([code], unsafeScopeDict)
        if result is None:
            return 1

        # Exit status code.
        exitStatus = 0
        # Update loop timing information.
        ruv.update_time(uv_loop)
        try:
            runUntilDone(vatManager, uv_loop, recorder)
            rv = resolution(result) if result is not None else NullObject
            if isinstance(rv, IntObject):
                exitStatus = rv.getInt()
        except SystemExit:
            pass
            # Huh, apparently this doesn't work. Wonder why/why not.
            # exitStatus = se.code
        finally:
            recorder.stop()
            recorder.printResults()

    # Clean up and exit.
    cleanUpEverything()
    return exitStatus
예제 #27
0
파일: lists.py 프로젝트: dckc/typhon
 def asSet(self):
     from typhon.objects.collections.maps import monteMap
     d = monteMap()
     for o in self.strategy.fetch_all(self):
         d[o] = None
     return d
예제 #28
0
파일: lists.py 프로젝트: dckc/typhon
 def asMap(self):
     from typhon.objects.collections.maps import monteMap
     d = monteMap()
     for i, o in enumerate(self.objs):
         d[IntObject(i)] = o
     return d
예제 #29
0
 def testContains(self):
     d = monteMap()
     d[IntObject(42)] = IntObject(5)
     m = ConstMap(d)
     self.assertTrue(m.contains(IntObject(42)))
     self.assertFalse(m.contains(IntObject(7)))
예제 #30
0
 def asSet(self):
     from typhon.objects.collections.maps import monteMap
     d = monteMap()
     for o in self.strategy.fetch_all(self):
         d[o] = None
     return d
예제 #31
0
def mkMirandaArgs():
    # XXX monteMap()
    _d = monteMap()
    _d[StrObject(u"FAIL")] = theThrower
    return ConstMap(_d)
예제 #32
0
 def asMap(self):
     from typhon.objects.collections.maps import monteMap
     d = monteMap()
     for i, o in enumerate(self.strategy.fetch_all(self)):
         d[IntObject(i)] = o
     return d
예제 #33
0
파일: vats.py 프로젝트: washort/typhon
    def takeTurn(self):
        from typhon.objects.refs import Promise, resolution

        with self._pendingLock:
            resolver, target, atom, args, namedArgs = self._pending.pop(0)

        # If the target is a promise, then we should send to it instead of
        # calling. Try to resolve it as much as possible first, though.
        target = resolution(target)

        self.log(u"Taking turn: %s<-%s(%s) (resolver: %s)" %
                 (target.toQuote(), atom.verb,
                  u", ".join([arg.toQuote() for arg in args]),
                  u"yes" if resolver is not None else u"no"))
        if resolver is None:
            try:
                # callOnly/sendOnly.
                if isinstance(target, Promise):
                    target.sendOnly(atom, args, namedArgs)
                else:
                    # Oh, that's right; we don't do callOnly since it's silly.
                    target.callAtom(atom, args, namedArgs)
            except UserException as ue:
                self.log(u"Uncaught user exception while taking turn"
                         u" (and no resolver): %s" %
                         ue.formatError().decode("utf-8"),
                         tags=["serious"])
            except VatCheckpointed:
                self.log(u"Ran out of checkpoints while taking turn",
                         tags=["serious"])
            except Ejecting:
                self.log(u"Ejector tried to escape vat turn boundary",
                         tags=["serious"])

        else:
            from typhon.objects.collections.maps import ConstMap, monteMap
            from typhon.objects.exceptions import sealException
            from typhon.objects.refs import Smash
            # XXX monteMap()
            _d = monteMap()
            _d[StrObject(u"FAIL")] = Smash(resolver)
            MIRANDA_ARGS = ConstMap(_d)
            namedArgs = namedArgs._or(MIRANDA_ARGS)
            try:
                # call/send.
                if isinstance(target, Promise):
                    result = target.send(atom, args, namedArgs)
                else:
                    result = target.callAtom(atom, args, namedArgs)
                # Resolver may be invoked from the code in this turn, so
                # strict=False to skip this if already resolved.
                resolver.resolve(result, strict=False)
            except UserException as ue:
                resolver.smash(sealException(ue))
            except VatCheckpointed:
                self.log(u"Ran out of checkpoints while taking turn; breaking resolver",
                         tags=["serious"])
                resolver.smash(sealException(userError(u"Vat ran out of checkpoints")))
            except Ejecting:
                self.log(u"Ejector tried to escape vat turn boundary",
                         tags=["serious"])
                resolver.smash(sealException(userError(u"Ejector tried to escape from vat")))
예제 #34
0
 def testContains(self):
     d = monteMap()
     d[IntObject(42)] = IntObject(5)
     m = ConstMap(d)
     self.assertTrue(m.contains(IntObject(42)))
     self.assertFalse(m.contains(IntObject(7)))
예제 #35
0
    def takeTurn(self):
        from typhon.objects.refs import Promise, resolution

        with self._pendingLock:
            resolver, target, atom, args, namedArgs = self._pending.pop(0)

        # If the target is a promise, then we should send to it instead of
        # calling. Try to resolve it as much as possible first, though.
        target = resolution(target)

        self.log(
            u"Taking turn: %s<-%s(%s) (resolver: %s)" %
            (target.toQuote(), atom.verb, u", ".join(
                [arg.toQuote()
                 for arg in args]), u"yes" if resolver is not None else u"no"))
        if resolver is None:
            try:
                # callOnly/sendOnly.
                if isinstance(target, Promise):
                    target.sendOnly(atom, args, namedArgs)
                else:
                    # Oh, that's right; we don't do callOnly since it's silly.
                    target.callAtom(atom, args, namedArgs)
            except UserException as ue:
                self.log(u"Uncaught user exception while taking turn"
                         u" (and no resolver): %s" %
                         ue.formatError().decode("utf-8"),
                         tags=["serious"])
            except VatCheckpointed:
                self.log(u"Ran out of checkpoints while taking turn",
                         tags=["serious"])
            except Ejecting:
                self.log(u"Ejector tried to escape vat turn boundary",
                         tags=["serious"])

        else:
            from typhon.objects.collections.maps import ConstMap, monteMap
            from typhon.objects.exceptions import sealException
            from typhon.objects.refs import Smash
            # XXX monteMap()
            _d = monteMap()
            _d[StrObject(u"FAIL")] = Smash(resolver)
            MIRANDA_ARGS = ConstMap(_d)
            namedArgs = namedArgs._or(MIRANDA_ARGS)
            try:
                # call/send.
                if isinstance(target, Promise):
                    result = target.send(atom, args, namedArgs)
                else:
                    result = target.callAtom(atom, args, namedArgs)
                # Resolver may be invoked from the code in this turn, so
                # strict=False to skip this if already resolved.
                resolver.resolve(result, strict=False)
            except UserException as ue:
                resolver.smash(sealException(ue))
            except VatCheckpointed:
                self.log(
                    u"Ran out of checkpoints while taking turn; breaking resolver",
                    tags=["serious"])
                resolver.smash(
                    sealException(userError(u"Vat ran out of checkpoints")))
            except Ejecting:
                self.log(u"Ejector tried to escape vat turn boundary",
                         tags=["serious"])
                resolver.smash(
                    sealException(
                        userError(u"Ejector tried to escape from vat")))
예제 #36
0
 def testToString(self):
     d = monteMap()
     self.assertEqual(ConstMap(d).toString(), u"[].asMap()")
예제 #37
0
파일: runtime.py 프로젝트: zarutian/typhon
 def getBuckets(self):
     d = monteMap()
     for name, count in self.buckets.items():
         size = self.sizes.get(name, -1)
         d[StrObject(name)] = wrapList([IntObject(size), IntObject(count)])
     return d
예제 #38
0
 def testToString(self):
     d = monteMap()
     self.assertEqual(ConstMap(d).toString(), u"[].asMap()")