import sys, os, StringIO, psyco, psyco.logger LOGFILE = 'log-regrtest-psyco' #NO_SYS_GETFRAME = """using sys._getframe() fails with Psyco""" #NO_THREAD = """XXX not reliable, check if Psyco is generally # unreliable with threads or if there is another problem""" #NO_PICKLE = """pickles function objects that Psyco rebinds""" #NO_SYS_EXC = """XXX Psyco does not set sys.exc_xxx upon exception""" SKIP = {'test_gc': "test_gc.test_frame() does not create a cycle with Psyco's limited frames", # 'test_thread': NO_THREAD, # 'test_asynchat': NO_THREAD, # 'test_extcall': 'prints to stdout a function object that Psyco rebinds', 'test_descr': 'seems that it mutates user-defined types and Psyco does not like it at all', # 'test_pickle': NO_PICKLE, # 'test_cpickle': NO_PICKLE, # 'test_re': NO_PICKLE, # 'test_sre': NO_SYS_EXC, # 'test_string': NO_SYS_EXC, # 'test_unicode': NO_SYS_EXC, # 'test_inspect': 'gets confused with Psyco rebinding functions', 'test_profilehooks': 'profiling does not see all functions run by Psyco', 'test_profile': 'profiling does not see all functions run by Psyco', 'test_repr': 'self-nested tuples and lists not supported', 'test_builtin': 'vars() and locals() not supported', 'test_inspect': 'does not run even in Python (when called the way classicregrtest.py calls it) and leaves buggy temp files around', 'test_trace': 'no line tracing with Psyco', 'test_threaded_import': 'Python hang-ups', 'test_hotshot': "PyEval_SetProfile(NULL,NULL) doesn't allow Psyco to take control back", 'test_coercion': 'uses eval() with locals', 'test_weakref': 'incompatible with early unused variable deletion', } if sys.version_info[:2] < (2,2): SKIP['test_scope'] = 'The jit() uses the profiler, which is buggy with cell and free vars (PyFrame_LocalsToFast() bug)' # SKIP['test_operator'] = NO_SYS_EXC # SKIP['test_strop'] = NO_SYS_EXC if sys.version_info[:2] >= (2,3): SKIP['test_threadedtempfile'] = 'Python bug: Python test just hangs up' if hasattr(psyco._psyco, 'VERBOSE_LEVEL'): SKIP['test_popen2'] = 'gets confused by Psyco debugging output to stderr' GROUP_TESTS = 5 # number of tests to run per Python process if '' in sys.path: sys.path.remove('') # don't import the test.py in this directory! from test import regrtest, test_support repeat_counter = 4 def alltests(): import random # randomize the list of tests, but try to ensure that we start with # not-already-seen tests and only after go on with the rest try: os.unlink(LOGFILE) except OSError: pass filename = "tmp_tests_passed" try: f = open(filename) tests_passed = eval(f.read()) f.close() except IOError: tests_passed = {} testlist = regrtest.findtests() testlist = [test for test in testlist if not tests_passed.has_key(test)] random.shuffle(testlist) testlist1 = tests_passed.keys() random.shuffle(testlist1) print '\t'.join(['Scheduled tests:']+testlist) if testlist1: print '%d more tests were already passed and are scheduled to run thereafter.' % len(testlist1) testlist += testlist1 while testlist: print '='*40 tests1 = testlist[:GROUP_TESTS] del testlist[:GROUP_TESTS] err = os.system('"%s" %s %s' % (sys.executable, sys.argv[0], ' '.join(tests1))) if err: print '*** exited with error code', err return err for test in tests1: tests_passed[test] = 1 f = open(filename, 'w') f.write(repr(tests_passed)) f.close() print "="*60 print print "Classic Regression Tests with Psyco successfully completed." print "All tests that succeeded twice in the same Python process" print "also succeeded %d more times with Psyco activated." % repeat_counter print try: os.unlink(filename) except: pass print "Psyco compilation flags:", d = psyco._psyco.__dict__ if not d.has_key('ALL_CHECKS'): print "Release mode", for key in d.keys(): if key == key.upper() and type(d[key]) == type(0): print "%s=%s" % (key, hex(d[key])), print def python_check(test): if SKIP.has_key(test): print '%s skipped -- %s' % (test, SKIP[test]) return 0 for i in range(min(repeat_counter, 2)): print '%s, Python iteration %d' % (test, i+1) ok = regrtest.runtest(test, 0, 0, 0) special_cleanup() if ok <= 0: return 0 # skipped or failed -- don't test with Psyco return 1 def main(testlist, verbose=0, use_resources=None): if use_resources is None: use_resources = [] test_support.verbose = verbose # Tell tests to be moderately quiet test_support.use_resources = use_resources if type(testlist) == type(""): testlist = [testlist] if not verbose: testlist = filter(python_check, testlist) # Psyco selective compilation is only activated here psyco.log(LOGFILE, 'a') for test in testlist: psyco.logger.write('with test ' + test, 1) psyco.full() #print "sleeping, time for a Ctrl-C !..." #import time; time.sleep(1.5) for test in testlist: for i in range(repeat_counter): print '%s, Psyco iteration %d' % (test, i+1) ok = regrtest.runtest(test, 0, verbose, 0) special_cleanup() if ok == 0: return 0 elif ok < 0: break return 1 def special_cleanup(): try: dircache = sys.modules['dircache'] except KeyError: pass else: for key in dircache.cache.keys(): del dircache.cache[key] if __name__ == '__main__': if len(sys.argv) <= 1: sys.exit(alltests() or 0) else: try: err = not main(sys.argv[1:]) finally: # Write psyco.dump psyco.dumpcodebuf() if err: sys.exit(2)