[pypy-commit] pypy py3.5: Cache the wrapped code.co_filename: space.newfilename() is expensive
rlamy
pypy.commits at gmail.com
Wed Dec 20 11:56:52 EST 2017
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: py3.5
Changeset: r93522:74f1be327b1d
Date: 2017-12-20 16:56 +0000
http://bitbucket.org/pypy/pypy/changeset/74f1be327b1d/
Log: Cache the wrapped code.co_filename: space.newfilename() is expensive
diff --git a/pypy/interpreter/pycode.py b/pypy/interpreter/pycode.py
--- a/pypy/interpreter/pycode.py
+++ b/pypy/interpreter/pycode.py
@@ -4,7 +4,7 @@
The bytecode interpreter itself is implemented by the PyFrame class.
"""
-import imp, struct, types, new, sys, os
+import imp, struct, types, sys, os
from pypy.interpreter import eval
from pypy.interpreter.signature import Signature
@@ -80,7 +80,7 @@
class PyCode(eval.Code):
"CPython-style code objects."
_immutable_fields_ = ["_signature", "co_argcount", "co_kwonlyargcount", "co_cellvars[*]",
- "co_code", "co_consts_w[*]", "co_filename",
+ "co_code", "co_consts_w[*]", "co_filename", "w_filename",
"co_firstlineno", "co_flags", "co_freevars[*]",
"co_lnotab", "co_names_w[*]", "co_nlocals",
"co_stacksize", "co_varnames[*]",
@@ -111,6 +111,7 @@
assert isinstance(filename, str)
rstring.check_str0(filename)
self.co_filename = filename
+ self.w_filename = space.newfilename(filename)
self.co_name = name
self.co_firstlineno = firstlineno
self.co_lnotab = lnotab
@@ -203,6 +204,7 @@
if lastdirname:
basename = '%s/%s' % (lastdirname, basename)
self.co_filename = '<builtin>/%s' % (basename,)
+ self.w_filename = space.newfilename(self.co_filename)
co_names = property(lambda self: [self.space.str_w(w_name) for w_name in self.co_names_w]) # for trace
@@ -427,7 +429,7 @@
space.newtuple(self.co_consts_w),
space.newtuple(self.co_names_w),
space.newtuple([space.newtext(v) for v in self.co_varnames]),
- space.newtext(self.co_filename),
+ self.w_filename,
space.newtext(self.co_name),
space.newint(self.co_firstlineno),
space.newbytes(self.co_lnotab),
@@ -451,7 +453,7 @@
space = self.space
# co_name should be an identifier
name = self.co_name.decode('utf-8')
- fn = space.fsdecode_w(space.newbytes(self.co_filename))
+ fn = space.unicode_w(self.w_filename)
return space.newunicode(u'<code object %s at 0x%s, file "%s", line %d>' % (
name, unicode(self.getaddrstring(space)), fn,
-1 if self.co_firstlineno == 0 else self.co_firstlineno))
diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py
--- a/pypy/interpreter/typedef.py
+++ b/pypy/interpreter/typedef.py
@@ -625,7 +625,7 @@
co_varnames = GetSetProperty(PyCode.fget_co_varnames),
co_freevars = GetSetProperty(PyCode.fget_co_freevars),
co_cellvars = GetSetProperty(PyCode.fget_co_cellvars),
- co_filename = interp_attrproperty('co_filename', cls=PyCode, wrapfn="newfilename"),
+ co_filename = interp_attrproperty_w('w_filename', cls=PyCode),
co_name = interp_attrproperty('co_name', cls=PyCode, wrapfn="newtext"),
co_firstlineno = interp_attrproperty('co_firstlineno', cls=PyCode, wrapfn="newint"),
co_lnotab = interp_attrproperty('co_lnotab', cls=PyCode, wrapfn="newbytes"),
diff --git a/pypy/module/cpyext/funcobject.py b/pypy/module/cpyext/funcobject.py
--- a/pypy/module/cpyext/funcobject.py
+++ b/pypy/module/cpyext/funcobject.py
@@ -70,7 +70,7 @@
py_code = rffi.cast(PyCodeObject, py_obj)
assert isinstance(w_obj, PyCode)
py_code.c_co_name = make_ref(space, space.newtext(w_obj.co_name))
- py_code.c_co_filename = make_ref(space, space.newtext(w_obj.co_filename))
+ py_code.c_co_filename = make_ref(space, w_obj.w_filename)
co_flags = 0
for name, value in ALL_CODE_FLAGS:
if w_obj.co_flags & getattr(pycode, name):
diff --git a/pypy/module/imp/importing.py b/pypy/module/imp/importing.py
--- a/pypy/module/imp/importing.py
+++ b/pypy/module/imp/importing.py
@@ -259,7 +259,7 @@
if pathname is not None:
w_pathname = get_sourcefile(space, pathname)
else:
- w_pathname = space.newfilename(code_w.co_filename)
+ w_pathname = code_w.w_filename
if cpathname is not None:
w_cpathname = space.newfilename(cpathname)
else:
@@ -353,6 +353,7 @@
return
code_w.co_filename = pathname
+ code_w.w_filename = space.newfilename(pathname)
constants = code_w.co_consts_w
for const in constants:
if const is not None and isinstance(const, PyCode):
More information about the pypy-commit
mailing list