Author: Ronan Lamy <ronan.l...@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): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit