def finalize(scope): rv = {} for key in scope: o = scope[key] if deepFrozenStamp in o.auditorStamps(): g = deepFrozenGuard else: g = anyGuard rv[key] = finalBinding(o, g) return rv
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 patchSelf(self, guard): selfIndex = self.codeScript.selfIndex() if selfIndex != -1: self.closure[selfIndex] = finalBinding(self, guard)
def runInstruction(self, instruction, pc): index = self.code.index(pc) # jit_debug(self.code.disAt(pc)) if instruction.asInt == ops.DUP.asInt: self.push(self.peek()) return pc + 1 elif instruction.asInt == ops.ROT.asInt: z = self.pop() y = self.pop() x = self.pop() self.push(y) self.push(z) self.push(x) return pc + 1 elif instruction.asInt == ops.POP.asInt: self.pop() return pc + 1 elif instruction.asInt == ops.SWAP.asInt: y = self.pop() x = self.pop() self.push(y) self.push(x) return pc + 1 elif instruction.asInt == ops.ASSIGN_GLOBAL.asInt: value = self.pop() self.env.putValueGlobal(index, value) return pc + 1 elif instruction.asInt == ops.ASSIGN_FRAME.asInt: value = self.pop() self.env.putValueFrame(index, value) return pc + 1 elif instruction.asInt == ops.ASSIGN_LOCAL.asInt: value = self.pop() self.env.putValueLocal(index, value) return pc + 1 elif instruction.asInt == ops.BIND.asInt: binding = self.pop() self.env.createBindingLocal(index, binding) return pc + 1 elif instruction.asInt == ops.BINDFINALSLOT.asInt: guard = self.pop() ej = self.pop() specimen = self.pop() val = guard.call(u"coerce", [specimen, ej]) self.env.createBindingLocal(index, finalBinding(val, guard)) return pc + 1 elif instruction.asInt == ops.BINDVARSLOT.asInt: guard = self.pop() ej = self.pop() specimen = self.pop() val = guard.call(u"coerce", [specimen, ej]) self.env.createBindingLocal(index, varBinding(val, guard)) return pc + 1 elif instruction.asInt == ops.SLOT_GLOBAL.asInt: self.push(self.env.getSlotGlobal(index)) return pc + 1 elif instruction.asInt == ops.SLOT_FRAME.asInt: self.push(self.env.getSlotFrame(index)) return pc + 1 elif instruction.asInt == ops.SLOT_LOCAL.asInt: self.push(self.env.getSlotLocal(index)) return pc + 1 elif instruction.asInt == ops.NOUN_GLOBAL.asInt: self.push(self.env.getValueGlobal(index)) return pc + 1 elif instruction.asInt == ops.NOUN_FRAME.asInt: self.push(self.env.getValueFrame(index)) return pc + 1 elif instruction.asInt == ops.NOUN_LOCAL.asInt: self.push(self.env.getValueLocal(index)) return pc + 1 elif instruction.asInt == ops.BINDING_GLOBAL.asInt: self.push(self.env.getBindingGlobal(index)) return pc + 1 elif instruction.asInt == ops.BINDING_FRAME.asInt: self.push(self.env.getBindingFrame(index)) return pc + 1 elif instruction.asInt == ops.BINDING_LOCAL.asInt: self.push(self.env.getBindingLocal(index)) return pc + 1 elif instruction.asInt == ops.LIST_PATT.asInt: self.listPattern(index) return pc + 1 elif instruction.asInt == ops.LITERAL.asInt: self.push(self.code.literal(index)) return pc + 1 elif instruction.asInt == ops.BINDOBJECT.asInt: self.bindObject(index) return pc + 1 elif instruction.asInt == ops.EJECTOR.asInt: # Look carefully at the order of operations. The handler captures # the depth of the stack, so it's important to create it *before* # pushing the ejector onto the stack. Otherwise, the handler # thinks that the stack started off with an extra level of depth. ej = Ejector() handler = Eject(self, ej, index) self.push(ej) self.env.pushHandler(handler) return pc + 1 elif instruction.asInt == ops.TRY.asInt: self.env.pushHandler(Catch(self, index)) return pc + 1 elif instruction.asInt == ops.UNWIND.asInt: self.env.pushHandler(Unwind(self, index)) return pc + 1 elif instruction.asInt == ops.END_HANDLER.asInt: handler = self.env.popHandler() return handler.drop(self, pc, index) elif instruction.asInt == ops.BRANCH.asInt: cond = unwrapBool(self.pop()) if cond: return pc + 1 else: return index elif instruction.asInt == ops.CALL.asInt: self.call(index, withMap=False) return pc + 1 elif instruction.asInt == ops.CALL_MAP.asInt: self.call(index, withMap=True) return pc + 1 elif instruction.asInt == ops.BUILD_MAP.asInt: self.buildMap(index) return pc + 1 elif instruction.asInt == ops.NAMEDARG_EXTRACT.asInt: k = self.pop() d = unwrapMap(self.pop()) if k not in d: raise userError(u"Named arg %s missing in call" % (k.toString(), )) self.push(d[k]) return pc + 1 elif instruction.asInt == ops.NAMEDARG_EXTRACT_OPTIONAL.asInt: k = self.pop() d = unwrapMap(self.pop()) if k not in d: self.push(NullObject) return pc + 1 self.push(d[k]) return index elif instruction.asInt == ops.JUMP.asInt: return index else: raise RuntimeError("Unknown instruction %s" % instruction.repr.encode("utf-8"))
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 runInstruction(self, instruction, pc): index = self.code.index(pc) # jit_debug(self.code.disAt(pc)) if instruction.asInt == ops.DUP.asInt: self.push(self.peek()) return pc + 1 elif instruction.asInt == ops.ROT.asInt: z = self.pop() y = self.pop() x = self.pop() self.push(y) self.push(z) self.push(x) return pc + 1 elif instruction.asInt == ops.POP.asInt: self.pop() return pc + 1 elif instruction.asInt == ops.SWAP.asInt: y = self.pop() x = self.pop() self.push(y) self.push(x) return pc + 1 elif instruction.asInt == ops.ASSIGN_GLOBAL.asInt: value = self.pop() self.env.putValueGlobal(index, value) return pc + 1 elif instruction.asInt == ops.ASSIGN_FRAME.asInt: value = self.pop() self.env.putValueFrame(index, value) return pc + 1 elif instruction.asInt == ops.ASSIGN_LOCAL.asInt: value = self.pop() self.env.putValueLocal(index, value) return pc + 1 elif instruction.asInt == ops.BIND.asInt: binding = self.pop() self.env.createBindingLocal(index, binding) return pc + 1 elif instruction.asInt == ops.BINDFINALSLOT.asInt: guard = self.pop() ej = self.pop() specimen = self.pop() val = guard.call(u"coerce", [specimen, ej]) self.env.createBindingLocal(index, finalBinding(val, guard)) return pc + 1 elif instruction.asInt == ops.BINDVARSLOT.asInt: guard = self.pop() ej = self.pop() specimen = self.pop() val = guard.call(u"coerce", [specimen, ej]) self.env.createBindingLocal(index, varBinding(val, guard)) return pc + 1 elif instruction.asInt == ops.SLOT_GLOBAL.asInt: self.push(self.env.getSlotGlobal(index)) return pc + 1 elif instruction.asInt == ops.SLOT_FRAME.asInt: self.push(self.env.getSlotFrame(index)) return pc + 1 elif instruction.asInt == ops.SLOT_LOCAL.asInt: self.push(self.env.getSlotLocal(index)) return pc + 1 elif instruction.asInt == ops.NOUN_GLOBAL.asInt: self.push(self.env.getValueGlobal(index)) return pc + 1 elif instruction.asInt == ops.NOUN_FRAME.asInt: self.push(self.env.getValueFrame(index)) return pc + 1 elif instruction.asInt == ops.NOUN_LOCAL.asInt: self.push(self.env.getValueLocal(index)) return pc + 1 elif instruction.asInt == ops.BINDING_GLOBAL.asInt: self.push(self.env.getBindingGlobal(index)) return pc + 1 elif instruction.asInt == ops.BINDING_FRAME.asInt: self.push(self.env.getBindingFrame(index)) return pc + 1 elif instruction.asInt == ops.BINDING_LOCAL.asInt: self.push(self.env.getBindingLocal(index)) return pc + 1 elif instruction.asInt == ops.LIST_PATT.asInt: self.listPattern(index) return pc + 1 elif instruction.asInt == ops.LITERAL.asInt: self.push(self.code.literal(index)) return pc + 1 elif instruction.asInt == ops.BINDOBJECT.asInt: self.bindObject(index) return pc + 1 elif instruction.asInt == ops.EJECTOR.asInt: # Look carefully at the order of operations. The handler captures # the depth of the stack, so it's important to create it *before* # pushing the ejector onto the stack. Otherwise, the handler # thinks that the stack started off with an extra level of depth. ej = Ejector() handler = Eject(self, ej, index) self.push(ej) self.env.pushHandler(handler) return pc + 1 elif instruction.asInt == ops.TRY.asInt: self.env.pushHandler(Catch(self, index)) return pc + 1 elif instruction.asInt == ops.UNWIND.asInt: self.env.pushHandler(Unwind(self, index)) return pc + 1 elif instruction.asInt == ops.END_HANDLER.asInt: handler = self.env.popHandler() return handler.drop(self, pc, index) elif instruction.asInt == ops.BRANCH.asInt: cond = unwrapBool(self.pop()) if cond: return pc + 1 else: return index elif instruction.asInt == ops.CALL.asInt: self.call(index, withMap=False) return pc + 1 elif instruction.asInt == ops.CALL_MAP.asInt: self.call(index, withMap=True) return pc + 1 elif instruction.asInt == ops.BUILD_MAP.asInt: self.buildMap(index) return pc + 1 elif instruction.asInt == ops.NAMEDARG_EXTRACT.asInt: k = self.pop() d = unwrapMap(self.pop()) if k not in d: raise userError(u"Named arg %s missing in call" % (k.toString(),)) self.push(d[k]) return pc + 1 elif instruction.asInt == ops.NAMEDARG_EXTRACT_OPTIONAL.asInt: k = self.pop() d = unwrapMap(self.pop()) if k not in d: self.push(NullObject) return pc + 1 self.push(d[k]) return index elif instruction.asInt == ops.JUMP.asInt: return index else: raise RuntimeError("Unknown instruction %s" % instruction.repr.encode("utf-8"))