[pypy-svn] r10139 - pypy/dist/pypy/translator
tismer at codespeak.net
tismer at codespeak.net
Sun Mar 27 22:28:22 CEST 2005
Author: tismer
Date: Sun Mar 27 22:28:22 2005
New Revision: 10139
Modified:
pypy/dist/pypy/translator/geninterplevel.py
Log:
special handling for __builtins__. The names there are treated like
global names. Certain things like __import__ are not further
flow-analysed, because we want to have late importing by default.
Modified: pypy/dist/pypy/translator/geninterplevel.py
==============================================================================
--- pypy/dist/pypy/translator/geninterplevel.py (original)
+++ pypy/dist/pypy/translator/geninterplevel.py Sun Mar 27 22:28:22 2005
@@ -31,7 +31,6 @@
from pypy.objspace.std.restricted_int import r_int, r_uint
from pypy.translator.translator import Translator
-from pypy.objspace.std import StdObjSpace
from pypy.objspace.flow import FlowObjSpace
from pypy.interpreter.gateway import app2interp, interp2app
@@ -99,6 +98,21 @@
for name in "newtuple newlist newdict newstring".split():
self.has_listarg[name] = name
+ # catching all builtins inj advance, to avoid problems
+ # with modified builtins
+ import __builtin__
+
+ class bltinstub:
+ def __init__(self, name):
+ self.__name__ = name
+ def __repr__(self):
+ return '<%s>' % self.__name__
+
+ self.builtin_ids = dict( [
+ (id(value), bltinstub(key))
+ for key, value in __builtins__.items()
+ if callable(value) and type(value) not in [type(Exception), type] ] )
+
self.space = FlowObjSpace() # for introspection
self.use_fast_call = True
@@ -250,20 +264,25 @@
# assume it's a user defined thingy
name = self.nameof_instance(obj)
else:
- for cls in type(obj).__mro__:
- meth = getattr(self,
- 'nameof_' + cls.__name__.replace(' ', ''),
- None)
- if meth:
- break
+ # shortcutting references to __builtin__
+ if id(obj) in self.builtin_ids:
+ func = self.builtin_ids[id(obj)]
+ name = "(space.builtin.get(space.str_w(%s)))" % self.nameof(func.__name__)
else:
- raise Exception, "nameof(%r)" % (obj,)
-
- code = meth.im_func.func_code
- if namehint and 'namehint' in code.co_varnames[:code.co_argcount]:
- name = meth(obj, namehint=namehint)
- else:
- name = meth(obj)
+ for cls in type(obj).__mro__:
+ meth = getattr(self,
+ 'nameof_' + cls.__name__.replace(' ', ''),
+ None)
+ if meth:
+ break
+ else:
+ raise Exception, "nameof(%r)" % (obj,)
+
+ code = meth.im_func.func_code
+ if namehint and 'namehint' in code.co_varnames[:code.co_argcount]:
+ name = meth(obj, namehint=namehint)
+ else:
+ name = meth(obj)
self.debugstack, x = self.debugstack
assert x is stackentry
self.rpynames[key] = name
@@ -473,10 +492,9 @@
return self._space_arities
def try_space_shortcut_for_builtin(self, v, nargs):
- if isinstance(v, Constant) and type(v.value) is type(len):
- func = v.value
- name = func.__name__
- if func.__self__ is None and hasattr(self.space, name):
+ if isinstance(v, Constant) and id(v.value) in self.builtin_ids:
+ name = self.builtin_ids[id(v.value)].__name__
+ if hasattr(self.space, name):
if self.space_arities().get(name, -1) == nargs:
return "space.%s" % name
return None
@@ -484,6 +502,9 @@
def nameof_builtin_function_or_method(self, func):
if func.__self__ is None:
# builtin function
+ if id(func) in self.builtin_ids:
+ func = self.builtin_ids[id(func)]
+ return "(space.builtin.get(space.str_w(%s)))" % self.nameof(func.__name__)
# where does it come from? Python2.2 doesn't have func.__module__
for modname, module in sys.modules.items():
if hasattr(module, '__file__'):
@@ -496,8 +517,6 @@
else:
raise Exception, '%r not found in any built-in module' % (func,)
if modname == '__builtin__':
- #self.initcode.append1('%s = space.getattr(space.w_builtin, %s)'% (
- # name, self.nameof(func.__name__)))
# be lazy
return "(space.builtin.get(space.str_w(%s)))" % self.nameof(func.__name__)
elif modname == 'sys':
More information about the Pypy-commit
mailing list