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
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))
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)
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)
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
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)
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
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)
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)
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)
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)
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)
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
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)
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
def mkMirandaArgs(): # XXX monteMap() _d = monteMap() _d[StrObject(u"FAIL")] = theThrower return ConstMap(_d)
def asSet(self): from typhon.objects.collections.maps import monteMap d = monteMap() for o in self._l: d[o] = None return d
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
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
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
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
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)))
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
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")))
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")))
def testToString(self): d = monteMap() self.assertEqual(ConstMap(d).toString(), u"[].asMap()")