Author: Ronan Lamy <[email protected]>
Branch: less-stringly-ops
Changeset: r66228:f8b3a9be2076
Date: 2013-08-19 18:02 +0100
http://bitbucket.org/pypy/pypy/changeset/f8b3a9be2076/
Log: Move special-case registrations next to the relevant definitions
diff --git a/rpython/flowspace/model.py b/rpython/flowspace/model.py
--- a/rpython/flowspace/model.py
+++ b/rpython/flowspace/model.py
@@ -8,7 +8,6 @@
from rpython.tool.uid import uid, Hashable
from rpython.tool.sourcetools import PY_IDENTIFIER, nice_repr_for_func
-from rpython.rlib.rarithmetic import is_valid_int, r_longlong, r_ulonglong,
r_uint
"""
@@ -504,7 +503,8 @@
if not __debug__:
return
try:
-
+ from rpython.rlib.rarithmetic import (is_valid_int, r_longlong,
+ r_ulonglong, r_uint)
vars_previous_blocks = {}
exitblocks = {graph.returnblock: 1, # retval
diff --git a/rpython/flowspace/operation.py b/rpython/flowspace/operation.py
--- a/rpython/flowspace/operation.py
+++ b/rpython/flowspace/operation.py
@@ -7,8 +7,8 @@
import __future__
import operator
from rpython.tool.sourcetools import compile2
-from rpython.rlib.rarithmetic import ovfcheck
from rpython.flowspace.model import Constant, WrapException, const
+from rpython.flowspace.specialcase import register_flow_sc
class _OpHolder(object): pass
op = _OpHolder()
@@ -97,6 +97,7 @@
if pyfunc is None:
oper.pyfunc = operator_func
if ovf:
+ from rpython.rlib.rarithmetic import ovfcheck
ovf_func = lambda *args: ovfcheck(oper.pyfunc(*args))
add_operator(name + '_ovf', arity, symbol, pyfunc=ovf_func)
@@ -288,6 +289,9 @@
if hasattr(__builtin__, 'next'):
func2op[__builtin__.next] = op.next
+for fn, oper in func2op.items():
+ register_flow_sc(fn)(oper.make_sc())
+
op_appendices = {
OverflowError: 'ovf',
diff --git a/rpython/flowspace/specialcase.py b/rpython/flowspace/specialcase.py
--- a/rpython/flowspace/specialcase.py
+++ b/rpython/flowspace/specialcase.py
@@ -1,8 +1,3 @@
-from rpython.flowspace.model import Constant
-from rpython.flowspace.operation import func2op
-from rpython.rlib.rarithmetic import r_uint
-from rpython.rlib.objectmodel import we_are_translated
-
SPECIAL_CASES = {}
def register_flow_sc(func):
@@ -22,6 +17,16 @@
args = [space.unwrap(arg) for arg in args_w]
return space.import_name(*args)
+@register_flow_sc(locals)
+def sc_locals(space, args):
+ raise Exception(
+ "A function calling locals() is not RPython. "
+ "Note that if you're translating code outside the PyPy "
+ "repository, a likely cause is that py.test's --assert=rewrite "
+ "mode is getting in the way. You should copy the file "
+ "pytest.ini from the root of the PyPy repository into your "
+ "own project.")
+
# _________________________________________________________________________
# a simplified version of the basic printing routines, for RPython programs
class StdOutBuffer:
@@ -44,32 +49,3 @@
s = '\n'
import os
os.write(1, s)
-
-# _________________________________________________________________________
-
-@register_flow_sc(r_uint)
-def sc_r_uint(space, args_w):
- # special case to constant-fold r_uint(32-bit-constant)
- # (normally, the 32-bit constant is a long, and is not allowed to
- # show up in the flow graphs at all)
- [w_value] = args_w
- if isinstance(w_value, Constant):
- return Constant(r_uint(w_value.value))
- return space.frame.do_operation('simple_call', space.wrap(r_uint), w_value)
-
-@register_flow_sc(we_are_translated)
-def sc_we_are_translated(space, args_w):
- return Constant(True)
-
-@register_flow_sc(locals)
-def sc_locals(space, args):
- raise Exception(
- "A function calling locals() is not RPython. "
- "Note that if you're translating code outside the PyPy "
- "repository, a likely cause is that py.test's --assert=rewrite "
- "mode is getting in the way. You should copy the file "
- "pytest.ini from the root of the PyPy repository into your "
- "own project.")
-
-for fn, oper in func2op.items():
- register_flow_sc(fn)(oper.make_sc())
diff --git a/rpython/rlib/objectmodel.py b/rpython/rlib/objectmodel.py
--- a/rpython/rlib/objectmodel.py
+++ b/rpython/rlib/objectmodel.py
@@ -10,6 +10,9 @@
import math
import inspect
from rpython.tool.sourcetools import rpython_wrapper
+from rpython.rtyper.extregistry import ExtRegistryEntry
+from rpython.flowspace.specialcase import register_flow_sc
+from rpython.flowspace.model import Constant
# specialize is a decorator factory for attaching _annspecialcase_
# attributes to functions: for example
@@ -23,7 +26,6 @@
# def f(...
#
-from rpython.rtyper.extregistry import ExtRegistryEntry
class _Specialize(object):
def memo(self):
@@ -278,7 +280,11 @@
def we_are_translated():
return False
-# annotation -> True (replaced by the flow objspace)
+
+@register_flow_sc(we_are_translated)
+def sc_we_are_translated(space, args_w):
+ return Constant(True)
+
def keepalive_until_here(*values):
pass
diff --git a/rpython/rlib/rarithmetic.py b/rpython/rlib/rarithmetic.py
--- a/rpython/rlib/rarithmetic.py
+++ b/rpython/rlib/rarithmetic.py
@@ -33,6 +33,8 @@
import sys, struct
from rpython.rtyper import extregistry
from rpython.rlib import objectmodel
+from rpython.flowspace.model import Constant, const
+from rpython.flowspace.specialcase import register_flow_sc
"""
Long-term target:
@@ -513,6 +515,16 @@
r_int = build_int('r_int', True, LONG_BIT)
r_uint = build_int('r_uint', False, LONG_BIT)
+@register_flow_sc(r_uint)
+def sc_r_uint(space, args_w):
+ # (normally, the 32-bit constant is a long, and is not allowed to
+ # show up in the flow graphs at all)
+ [w_value] = args_w
+ if isinstance(w_value, Constant):
+ return Constant(r_uint(w_value.value))
+ return space.frame.do_operation('simple_call', const(r_uint), w_value)
+
+
r_longlong = build_int('r_longlong', True, 64)
r_ulonglong = build_int('r_ulonglong', False, 64)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit