Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(640)

Unified Diff: psyco_win32/psyco/core.py

Issue 6777021: Adding Win32 installation of Psyco. This will be used to speed up GYP, adding (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/
Patch Set: Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « psyco_win32/psyco/classes.py ('k') | psyco_win32/psyco/kdictproxy.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: psyco_win32/psyco/core.py
===================================================================
--- psyco_win32/psyco/core.py (revision 0)
+++ psyco_win32/psyco/core.py (revision 0)
@@ -0,0 +1,231 @@
+###########################################################################
+#
+# Psyco main functions.
+# Copyright (C) 2001-2002 Armin Rigo et.al.
+
+"""Psyco main functions.
+
+Here are the routines that you can use from your applications.
+These are mostly interfaces to the C core, but they depend on
+the Python version.
+
+You can use these functions from the 'psyco' module instead of
+'psyco.core', e.g.
+
+ import psyco
+ psyco.log('/tmp/psyco.log')
+ psyco.profile()
+"""
+###########################################################################
+
+import _psyco
+import types
+from support import *
+
+newfunction = types.FunctionType
+newinstancemethod = types.MethodType
+
+
+# Default charge profiler values
+default_watermark = 0.09 # between 0.0 (0%) and 1.0 (100%)
+default_halflife = 0.5 # seconds
+default_pollfreq_profile = 20 # Hz
+default_pollfreq_background = 100 # Hz -- a maximum for sleep's resolution
+default_parentframe = 0.25 # should not be more than 0.5 (50%)
+
+
+def full(memory=None, time=None, memorymax=None, timemax=None):
+ """Compile as much as possible.
+
+Typical use is for small scripts performing intensive computations
+or string handling."""
+ import profiler
+ p = profiler.FullCompiler()
+ p.run(memory, time, memorymax, timemax)
+
+
+def profile(watermark = default_watermark,
+ halflife = default_halflife,
+ pollfreq = default_pollfreq_profile,
+ parentframe = default_parentframe,
+ memory=None, time=None, memorymax=None, timemax=None):
+ """Turn on profiling.
+
+The 'watermark' parameter controls how easily running functions will
+be compiled. The smaller the value, the more functions are compiled."""
+ import profiler
+ p = profiler.ActivePassiveProfiler(watermark, halflife,
+ pollfreq, parentframe)
+ p.run(memory, time, memorymax, timemax)
+
+
+def background(watermark = default_watermark,
+ halflife = default_halflife,
+ pollfreq = default_pollfreq_background,
+ parentframe = default_parentframe,
+ memory=None, time=None, memorymax=None, timemax=None):
+ """Turn on passive profiling.
+
+This is a very lightweight mode in which only intensively computing
+functions can be detected. The smaller the 'watermark', the more functions
+are compiled."""
+ import profiler
+ p = profiler.PassiveProfiler(watermark, halflife, pollfreq, parentframe)
+ p.run(memory, time, memorymax, timemax)
+
+
+def runonly(memory=None, time=None, memorymax=None, timemax=None):
+ """Nonprofiler.
+
+XXX check if this is useful and document."""
+ import profiler
+ p = profiler.RunOnly()
+ p.run(memory, time, memorymax, timemax)
+
+
+def stop():
+ """Turn off all automatic compilation. bind() calls remain in effect."""
+ import profiler
+ profiler.go([])
+
+
+def log(logfile='', mode='w', top=10):
+ """Enable logging to the given file.
+
+If the file name is unspecified, a default name is built by appending
+a 'log-psyco' extension to the main script name.
+
+Mode is 'a' to append to a possibly existing file or 'w' to overwrite
+an existing file. Note that the log file may grow quickly in 'a' mode."""
+ import profiler, logger
+ if not logfile:
+ import os
+ logfile, dummy = os.path.splitext(sys.argv[0])
+ if os.path.basename(logfile):
+ logfile += '.'
+ logfile += 'log-psyco'
+ if hasattr(_psyco, 'VERBOSE_LEVEL'):
+ print >> sys.stderr, 'psyco: logging to', logfile
+ # logger.current should be a real file object; subtle problems
+ # will show up if its write() and flush() methods are written
+ # in Python, as Psyco will invoke them while compiling.
+ logger.current = open(logfile, mode)
+ logger.print_charges = top
+ profiler.logger = logger
+ logger.writedate('Logging started')
+ cannotcompile(logger.psycowrite)
+ _psyco.statwrite(logger=logger.psycowrite)
+
+
+def bind(x, rec=None):
+ """Enable compilation of the given function, method, or class object.
+
+If C is a class (or anything with a '__dict__' attribute), bind(C) will
+rebind all functions and methods found in C.__dict__ (which means, for
+classes, all methods defined in the class but not in its parents).
+
+The optional second argument specifies the number of recursive
+compilation levels: all functions called by func are compiled
+up to the given depth of indirection."""
+ if isinstance(x, types.MethodType):
+ x = x.im_func
+ if isinstance(x, types.FunctionType):
+ if rec is None:
+ x.func_code = _psyco.proxycode(x)
+ else:
+ x.func_code = _psyco.proxycode(x, rec)
+ return
+ if hasattr(x, '__dict__'):
+ funcs = [o for o in x.__dict__.values()
+ if isinstance(o, types.MethodType)
+ or isinstance(o, types.FunctionType)]
+ if not funcs:
+ raise error, ("nothing bindable found in %s object" %
+ type(x).__name__)
+ for o in funcs:
+ bind(o, rec)
+ return
+ raise TypeError, "cannot bind %s objects" % type(x).__name__
+
+
+def unbind(x):
+ """Reverse of bind()."""
+ if isinstance(x, types.MethodType):
+ x = x.im_func
+ if isinstance(x, types.FunctionType):
+ try:
+ f = _psyco.unproxycode(x.func_code)
+ except error:
+ pass
+ else:
+ x.func_code = f.func_code
+ return
+ if hasattr(x, '__dict__'):
+ for o in x.__dict__.values():
+ if (isinstance(o, types.MethodType)
+ or isinstance(o, types.FunctionType)):
+ unbind(o)
+ return
+ raise TypeError, "cannot unbind %s objects" % type(x).__name__
+
+
+def proxy(x, rec=None):
+ """Return a Psyco-enabled copy of the function.
+
+The original function is still available for non-compiled calls.
+The optional second argument specifies the number of recursive
+compilation levels: all functions called by func are compiled
+up to the given depth of indirection."""
+ if isinstance(x, types.FunctionType):
+ if rec is None:
+ code = _psyco.proxycode(x)
+ else:
+ code = _psyco.proxycode(x, rec)
+ return newfunction(code, x.func_globals, x.func_name)
+ if isinstance(x, types.MethodType):
+ p = proxy(x.im_func, rec)
+ return newinstancemethod(p, x.im_self, x.im_class)
+ raise TypeError, "cannot proxy %s objects" % type(x).__name__
+
+
+def unproxy(proxy):
+ """Return a new copy of the original function of method behind a proxy.
+The result behaves like the original function in that calling it
+does not trigger compilation nor execution of any compiled code."""
+ if isinstance(proxy, types.FunctionType):
+ return _psyco.unproxycode(proxy.func_code)
+ if isinstance(proxy, types.MethodType):
+ f = unproxy(proxy.im_func)
+ return newinstancemethod(f, proxy.im_self, proxy.im_class)
+ raise TypeError, "%s objects cannot be proxies" % type(proxy).__name__
+
+
+def cannotcompile(x):
+ """Instruct Psyco never to compile the given function, method
+or code object."""
+ if isinstance(x, types.MethodType):
+ x = x.im_func
+ if isinstance(x, types.FunctionType):
+ x = x.func_code
+ if isinstance(x, types.CodeType):
+ _psyco.cannotcompile(x)
+ else:
+ raise TypeError, "unexpected %s object" % type(x).__name__
+
+
+def dumpcodebuf():
+ """Write in file psyco.dump a copy of the emitted machine code,
+provided Psyco was compiled with a non-zero CODE_DUMP.
+See py-utils/httpxam.py to examine psyco.dump."""
+ if hasattr(_psyco, 'dumpcodebuf'):
+ _psyco.dumpcodebuf()
+
+
+###########################################################################
+# Psyco variables
+# error * the error raised by Psyco
+# warning * the warning raised by Psyco
+# __in_psyco__ * a new built-in variable which is always zero, but which
+# Psyco special-cases by returning 1 instead. So
+# __in_psyco__ can be used in a function to know if
+# that function is being executed by Psyco or not.
Property changes on: psyco_win32\psyco\core.py
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « psyco_win32/psyco/classes.py ('k') | psyco_win32/psyco/kdictproxy.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698