[pypy-commit] pypy stdlib-2.7.3: hg merge default
amauryfa
noreply at buildbot.pypy.org
Fri Jun 15 23:55:25 CEST 2012
Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: stdlib-2.7.3
Changeset: r55691:5c1e66bdfce6
Date: 2012-06-15 23:43 +0200
http://bitbucket.org/pypy/pypy/changeset/5c1e66bdfce6/
Log: hg merge default
diff --git a/ctypes_configure/cbuild.py b/ctypes_configure/cbuild.py
--- a/ctypes_configure/cbuild.py
+++ b/ctypes_configure/cbuild.py
@@ -372,7 +372,7 @@
self.library_dirs = list(eci.library_dirs)
self.compiler_exe = compiler_exe
self.profbased = profbased
- if not sys.platform in ('win32', 'darwin'): # xxx
+ if not sys.platform in ('win32', 'darwin', 'cygwin'): # xxx
if 'm' not in self.libraries:
self.libraries.append('m')
if 'pthread' not in self.libraries:
diff --git a/lib-python/stdlib-upgrade.txt b/lib-python/stdlib-upgrade.txt
new file mode 100644
--- /dev/null
+++ b/lib-python/stdlib-upgrade.txt
@@ -0,0 +1,19 @@
+Process for upgrading the stdlib to a new cpython version
+==========================================================
+
+.. note::
+
+ overly detailed
+
+1. check out the branch vendor/stdlib
+2. upgrade the files there
+3. update stdlib-versions.txt with the output of hg -id from the cpython repo
+4. commit
+5. update to default/py3k
+6. create a integration branch for the new stdlib
+ (just hg branch stdlib-$version)
+7. merge vendor/stdlib
+8. commit
+10. fix issues
+11. commit --close-branch
+12. merge to default
diff --git a/lib_pypy/_ctypes/primitive.py b/lib_pypy/_ctypes/primitive.py
--- a/lib_pypy/_ctypes/primitive.py
+++ b/lib_pypy/_ctypes/primitive.py
@@ -249,6 +249,13 @@
self._buffer[0] = value
result.value = property(_getvalue, _setvalue)
+ elif tp == '?': # regular bool
+ def _getvalue(self):
+ return bool(self._buffer[0])
+ def _setvalue(self, value):
+ self._buffer[0] = bool(value)
+ result.value = property(_getvalue, _setvalue)
+
elif tp == 'v': # VARIANT_BOOL type
def _getvalue(self):
return bool(self._buffer[0])
diff --git a/pypy/doc/how-to-release.rst b/pypy/doc/how-to-release.rst
--- a/pypy/doc/how-to-release.rst
+++ b/pypy/doc/how-to-release.rst
@@ -23,7 +23,9 @@
some of the next updates may be done before or after branching; make
sure things are ported back to the trunk and to the branch as
necessary
-* update pypy/doc/contributor.txt (and possibly LICENSE)
+* update pypy/doc/contributor.rst (and possibly LICENSE)
+* rename pypy/doc/whatsnew_head.rst to whatsnew_VERSION.rst
+ and create a fresh whatsnew_head.rst after the release
* update README
* change the tracker to have a new release tag to file bugs against
* go to pypy/tool/release and run:
diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
new file mode 100644
--- /dev/null
+++ b/pypy/doc/whatsnew-head.rst
@@ -0,0 +1,14 @@
+======================
+What's new in PyPy xxx
+======================
+
+.. this is the revision of the last merge from default to release-1.9.x
+.. startrev: 8d567513d04d
+
+.. branch: default
+.. branch: app_main-refactor
+.. branch: win-ordinal
+
+
+.. "uninteresting" branches that we should just ignore for the whatsnew:
+.. branch: slightly-shorter-c
diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -659,10 +659,11 @@
def _check_valid_gc(self):
# we need the hybrid or minimark GC for rgc._make_sure_does_not_move()
- # to work
- if self.gcdescr.config.translation.gc not in ('hybrid', 'minimark'):
+ # to work. Additionally, 'hybrid' is missing some stuff like
+ # jit_remember_young_pointer() for now.
+ if self.gcdescr.config.translation.gc not in ('minimark',):
raise NotImplementedError("--gc=%s not implemented with the JIT" %
- (gcdescr.config.translation.gc,))
+ (self.gcdescr.config.translation.gc,))
def _make_gcrootmap(self):
# to find roots in the assembler, make a GcRootMap
diff --git a/pypy/jit/backend/llsupport/test/test_gc.py b/pypy/jit/backend/llsupport/test/test_gc.py
--- a/pypy/jit/backend/llsupport/test/test_gc.py
+++ b/pypy/jit/backend/llsupport/test/test_gc.py
@@ -296,7 +296,7 @@
class TestFramework(object):
- gc = 'hybrid'
+ gc = 'minimark'
def setup_method(self, meth):
class config_(object):
diff --git a/pypy/jit/backend/llsupport/test/test_rewrite.py b/pypy/jit/backend/llsupport/test/test_rewrite.py
--- a/pypy/jit/backend/llsupport/test/test_rewrite.py
+++ b/pypy/jit/backend/llsupport/test/test_rewrite.py
@@ -205,7 +205,7 @@
def setup_method(self, meth):
class config_(object):
class translation(object):
- gc = 'hybrid'
+ gc = 'minimark'
gcrootfinder = 'asmgcc'
gctransformer = 'framework'
gcremovetypeptr = False
diff --git a/pypy/module/_ffi/test/test_funcptr.py b/pypy/module/_ffi/test/test_funcptr.py
--- a/pypy/module/_ffi/test/test_funcptr.py
+++ b/pypy/module/_ffi/test/test_funcptr.py
@@ -628,14 +628,14 @@
sleep(10)
def test_by_ordinal(self):
- if not self.iswin32:
- skip("windows specific")
"""
int DLLEXPORT AAA_first_ordinal_function()
{
return 42;
}
"""
+ if not self.iswin32:
+ skip("windows specific")
from _ffi import CDLL, types
libfoo = CDLL(self.libfoo_name)
f_name = libfoo.getfunc('AAA_first_ordinal_function', [], types.sint)
diff --git a/pypy/module/cStringIO/interp_stringio.py b/pypy/module/cStringIO/interp_stringio.py
--- a/pypy/module/cStringIO/interp_stringio.py
+++ b/pypy/module/cStringIO/interp_stringio.py
@@ -221,7 +221,8 @@
}
W_InputType.typedef = TypeDef(
- "cStringIO.StringI",
+ "StringI",
+ __module__ = "cStringIO",
__doc__ = "Simple type for treating strings as input file streams",
closed = GetSetProperty(descr_closed, cls=W_InputType),
softspace = GetSetProperty(descr_softspace,
@@ -232,7 +233,8 @@
)
W_OutputType.typedef = TypeDef(
- "cStringIO.StringO",
+ "StringO",
+ __module__ = "cStringIO",
__doc__ = "Simple type for output to strings.",
truncate = interp2app(W_OutputType.descr_truncate),
write = interp2app(W_OutputType.descr_write),
diff --git a/pypy/module/cpyext/src/getargs.c b/pypy/module/cpyext/src/getargs.c
--- a/pypy/module/cpyext/src/getargs.c
+++ b/pypy/module/cpyext/src/getargs.c
@@ -24,14 +24,15 @@
/* Forward */
+typedef struct freelist_s freelist_t;
static int vgetargs1(PyObject *, const char *, va_list *, int);
static void seterror(int, const char *, int *, const char *, const char *);
static char *convertitem(PyObject *, const char **, va_list *, int, int *,
- char *, size_t, PyObject **);
+ char *, size_t, freelist_t **);
static char *converttuple(PyObject *, const char **, va_list *, int,
- int *, char *, size_t, int, PyObject **);
+ int *, char *, size_t, int, freelist_t **);
static char *convertsimple(PyObject *, const char **, va_list *, int, char *,
- size_t, PyObject **);
+ size_t, freelist_t **);
static Py_ssize_t convertbuffer(PyObject *, void **p, char **);
static int getbuffer(PyObject *, Py_buffer *, char**);
@@ -128,72 +129,45 @@
/* Handle cleanup of allocated memory in case of exception */
-#define GETARGS_CAPSULE_NAME_CLEANUP_PTR "getargs.cleanup_ptr"
-#define GETARGS_CAPSULE_NAME_CLEANUP_BUFFER "getargs.cleanup_buffer"
+typedef void (*cleanup_fn)(void *);
-static void
-cleanup_ptr(PyObject *self)
-{
- void *ptr = PyCapsule_GetPointer(self, GETARGS_CAPSULE_NAME_CLEANUP_PTR);
- if (ptr) {
- PyMem_FREE(ptr);
- }
-}
+struct freelist_s {
+ void *ptr;
+ cleanup_fn destr;
+ struct freelist_s *next;
+};
-static void
-cleanup_buffer(PyObject *self)
-{
- Py_buffer *ptr = (Py_buffer *)PyCapsule_GetPointer(self, GETARGS_CAPSULE_NAME_CLEANUP_BUFFER);
- if (ptr) {
- PyBuffer_Release(ptr);
- }
-}
+#define cleanup_ptr ((cleanup_fn)PyMem_FREE)
+#define cleanup_buffer ((cleanup_fn)PyBuffer_Release)
static int
-addcleanup(void *ptr, PyObject **freelist, PyCapsule_Destructor destr)
+addcleanup(void *ptr, freelist_t **freelist, cleanup_fn destr)
{
- PyObject *cobj;
- const char *name;
-
- if (!*freelist) {
- *freelist = PyList_New(0);
- if (!*freelist) {
- destr(ptr);
- return -1;
- }
- }
-
- if (destr == cleanup_ptr) {
- name = GETARGS_CAPSULE_NAME_CLEANUP_PTR;
- } else if (destr == cleanup_buffer) {
- name = GETARGS_CAPSULE_NAME_CLEANUP_BUFFER;
- } else {
- return -1;
- }
- cobj = PyCapsule_New(ptr, name, destr);
- if (!cobj) {
+ freelist_t *node = PyMem_MALLOC(sizeof(freelist_t));
+ if (!node) {
destr(ptr);
return -1;
}
- if (PyList_Append(*freelist, cobj)) {
- Py_DECREF(cobj);
- return -1;
- }
- Py_DECREF(cobj);
+ node->ptr = ptr;
+ node->destr = destr;
+ node->next = *freelist;
+ *freelist = node;
return 0;
}
static int
-cleanreturn(int retval, PyObject *freelist)
+cleanreturn(int retval, freelist_t *freelist)
{
- if (freelist && retval != 0) {
- /* We were successful, reset the destructors so that they
- don't get called. */
- Py_ssize_t len = PyList_GET_SIZE(freelist), i;
- for (i = 0; i < len; i++)
- PyCapsule_SetDestructor(PyList_GET_ITEM(freelist, i), NULL);
+ freelist_t *next;
+ while (freelist != NULL) {
+ if (retval == 0) {
+ /* Leaving with an error */
+ freelist->destr(freelist->ptr);
+ }
+ next = freelist->next;
+ PyMem_FREE(freelist);
+ freelist = next;
}
- Py_XDECREF(freelist);
return retval;
}
@@ -212,7 +186,7 @@
const char *formatsave = format;
Py_ssize_t i, len;
char *msg;
- PyObject *freelist = NULL;
+ freelist_t *freelist = NULL;
int compat = flags & FLAG_COMPAT;
assert(compat || (args != (PyObject*)NULL));
@@ -412,7 +386,7 @@
static char *
converttuple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
int *levels, char *msgbuf, size_t bufsize, int toplevel,
- PyObject **freelist)
+ freelist_t **freelist)
{
int level = 0;
int n = 0;
@@ -488,7 +462,7 @@
static char *
convertitem(PyObject *arg, const char **p_format, va_list *p_va, int flags,
- int *levels, char *msgbuf, size_t bufsize, PyObject **freelist)
+ int *levels, char *msgbuf, size_t bufsize, freelist_t **freelist)
{
char *msg;
const char *format = *p_format;
@@ -569,7 +543,7 @@
static char *
convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
- char *msgbuf, size_t bufsize, PyObject **freelist)
+ char *msgbuf, size_t bufsize, freelist_t **freelist)
{
/* For # codes */
#define FETCH_SIZE int *q=NULL;Py_ssize_t *q2=NULL;\
@@ -1534,7 +1508,8 @@
const char *fname, *msg, *custom_msg, *keyword;
int min = INT_MAX;
int i, len, nargs, nkeywords;
- PyObject *freelist = NULL, *current_arg;
+ freelist_t *freelist = NULL;
+ PyObject *current_arg;
assert(args != NULL && PyTuple_Check(args));
assert(keywords == NULL || PyDict_Check(keywords));
diff --git a/pypy/module/cpyext/test/test_getargs.py b/pypy/module/cpyext/test/test_getargs.py
--- a/pypy/module/cpyext/test/test_getargs.py
+++ b/pypy/module/cpyext/test/test_getargs.py
@@ -144,6 +144,31 @@
assert 'foo\0bar\0baz' == pybuffer(buffer('foo\0bar\0baz'))
+ def test_pyarg_parse_string_fails(self):
+ """
+ Test the failing case of PyArg_ParseTuple(): it must not keep
+ a reference on the PyObject passed in.
+ """
+ pybuffer = self.import_parser(
+ '''
+ Py_buffer buf1, buf2, buf3;
+ PyObject *result;
+ if (!PyArg_ParseTuple(args, "s*s*s*", &buf1, &buf2, &buf3)) {
+ return NULL;
+ }
+ Py_FatalError("should not get there");
+ return NULL;
+ ''')
+ freed = []
+ class freestring(str):
+ def __del__(self):
+ freed.append('x')
+ raises(TypeError, pybuffer,
+ freestring("string"), freestring("other string"), 42)
+ import gc; gc.collect()
+ assert freed == ['x', 'x']
+
+
def test_pyarg_parse_charbuf_and_length(self):
"""
The `t#` format specifier can be used to parse a read-only 8-bit
diff --git a/pypy/module/signal/interp_signal.py b/pypy/module/signal/interp_signal.py
--- a/pypy/module/signal/interp_signal.py
+++ b/pypy/module/signal/interp_signal.py
@@ -143,6 +143,7 @@
else:
self.reissue_signal_action = None
+ @jit.dont_look_inside
def perform(self, executioncontext, frame):
while True:
n = pypysig_poll()
@@ -150,6 +151,7 @@
break
self.perform_signal(executioncontext, n)
+ @jit.dont_look_inside
def perform_signal(self, executioncontext, n):
if self.reissue_signal_action is None:
# no threads: we can report the signal immediately
@@ -165,11 +167,13 @@
self.pending_signals[n] = None
self.reissue_signal_action.fire_after_thread_switch()
+ @jit.dont_look_inside
def set_interrupt(self):
"Simulates the effect of a SIGINT signal arriving"
ec = self.space.getexecutioncontext()
self.perform_signal(ec, cpy_signal.SIGINT)
+ @jit.dont_look_inside
def report_signal(self, n):
try:
w_handler = self.handlers_w[n]
@@ -183,6 +187,7 @@
w_frame = space.wrap(ec.gettopframe_nohidden())
space.call_function(w_handler, space.wrap(n), w_frame)
+ @jit.dont_look_inside
def report_pending_signals(self):
# XXX this logic isn't so complicated but I have no clue how
# to test it :-(
@@ -305,6 +310,7 @@
action.handlers_w[signum] = w_handler
return old_handler
+ at jit.dont_look_inside
@unwrap_spec(fd=int)
def set_wakeup_fd(space, fd):
"""Sets the fd to be written to (with '\0') when a signal
@@ -323,6 +329,7 @@
old_fd = pypysig_set_wakeup_fd(fd)
return space.wrap(intmask(old_fd))
+ at jit.dont_look_inside
@unwrap_spec(signum=int, flag=int)
def siginterrupt(space, signum, flag):
check_signum_exists(space, signum)
diff --git a/pypy/module/signal/test/test_signal.py b/pypy/module/signal/test/test_signal.py
--- a/pypy/module/signal/test/test_signal.py
+++ b/pypy/module/signal/test/test_signal.py
@@ -54,7 +54,7 @@
if not hasattr(os, 'kill') or not hasattr(os, 'getpid'):
skip("requires os.kill() and os.getpid()")
signal = self.signal # the signal module to test
- if not hasattr(cpy_signal, 'SIGUSR1'):
+ if not hasattr(signal, 'SIGUSR1'):
py.test.skip("requires SIGUSR1 in signal")
signum = signal.SIGUSR1
diff --git a/pypy/module/test_lib_pypy/ctypes_tests/test_cast.py b/pypy/module/test_lib_pypy/ctypes_tests/test_cast.py
--- a/pypy/module/test_lib_pypy/ctypes_tests/test_cast.py
+++ b/pypy/module/test_lib_pypy/ctypes_tests/test_cast.py
@@ -94,4 +94,13 @@
def test_cast_argumenterror(self):
param = c_uint(42)
py.test.raises(ArgumentError, "cast(param, c_void_p)")
-
+
+ def test_c_bool(self):
+ x = c_bool(42)
+ assert x.value is True
+ x = c_bool(0.0)
+ assert x.value is False
+ x = c_bool("")
+ assert x.value is False
+ x = c_bool(['yadda'])
+ assert x.value is True
diff --git a/pypy/rlib/parsing/parsing.py b/pypy/rlib/parsing/parsing.py
--- a/pypy/rlib/parsing/parsing.py
+++ b/pypy/rlib/parsing/parsing.py
@@ -110,8 +110,7 @@
lastexpansion = len(rule.expansions) - 1
subsymbol = None
error = None
- for expansionindex in range(len(rule.expansions)):
- expansion = rule.expansions[expansionindex]
+ for expansion in rule.expansions:
curr = i
children = []
for j in range(len(expansion)):
diff --git a/pypy/rlib/rmmap.py b/pypy/rlib/rmmap.py
--- a/pypy/rlib/rmmap.py
+++ b/pypy/rlib/rmmap.py
@@ -14,6 +14,7 @@
_MS_WINDOWS = os.name == "nt"
_LINUX = "linux" in sys.platform
_64BIT = "64bit" in platform.architecture()[0]
+_CYGWIN = "cygwin" == sys.platform
class RValueError(Exception):
def __init__(self, message):
@@ -115,6 +116,10 @@
PTR = rffi.CCHARP
+if _CYGWIN:
+ c_malloc, _ = external('malloc', [size_t], PTR)
+ c_free, _ = external('free', [PTR], lltype.Void)
+
c_memmove, _ = external('memmove', [PTR, PTR, size_t], lltype.Void)
if _POSIX:
@@ -692,6 +697,14 @@
so the memory has the executable bit set and gets allocated
internally in case of a sandboxed process.
"""
+ if _CYGWIN:
+ # XXX: JIT memory should be using mmap MAP_PRIVATE with
+ # PROT_EXEC but Cygwin's fork() fails. mprotect()
+ # cannot be used, but seems to be unnecessary there.
+ res = c_malloc(map_size)
+ if res == rffi.cast(PTR, 0):
+ raise MemoryError
+ return res
flags = MAP_PRIVATE | MAP_ANONYMOUS
prot = PROT_EXEC | PROT_READ | PROT_WRITE
hintp = rffi.cast(PTR, hint.pos)
@@ -708,7 +721,10 @@
return res
alloc._annenforceargs_ = (int,)
- free = c_munmap_safe
+ if _CYGWIN:
+ free = c_free
+ else:
+ free = c_munmap_safe
elif _MS_WINDOWS:
def mmap(fileno, length, tagname="", access=_ACCESS_DEFAULT, offset=0):
diff --git a/pypy/rpython/lltypesystem/ll2ctypes.py b/pypy/rpython/lltypesystem/ll2ctypes.py
--- a/pypy/rpython/lltypesystem/ll2ctypes.py
+++ b/pypy/rpython/lltypesystem/ll2ctypes.py
@@ -1234,6 +1234,8 @@
# upgrade to a more recent ctypes (e.g. 1.0.2) if you get
# an OverflowError on the following line.
cvalue = ctypes.cast(ctypes.c_void_p(cvalue), cresulttype)
+ elif RESTYPE == lltype.Bool:
+ cvalue = bool(cvalue)
else:
try:
cvalue = cresulttype(cvalue).value # mask high bits off if needed
diff --git a/pypy/translator/c/funcgen.py b/pypy/translator/c/funcgen.py
--- a/pypy/translator/c/funcgen.py
+++ b/pypy/translator/c/funcgen.py
@@ -716,12 +716,14 @@
def OP_CAST_PRIMITIVE(self, op):
TYPE = self.lltypemap(op.result)
val = self.expr(op.args[0])
+ result = self.expr(op.result)
+ if TYPE == Bool:
+ return "%(result)s = !!%(val)s;" % locals()
ORIG = self.lltypemap(op.args[0])
if ORIG is Char:
val = "(unsigned char)%s" % val
elif ORIG is UniChar:
val = "(unsigned long)%s" % val
- result = self.expr(op.result)
typename = cdecl(self.db.gettype(TYPE), '')
return "%(result)s = (%(typename)s)(%(val)s);" % locals()
diff --git a/pypy/translator/c/src/thread_pthread.h b/pypy/translator/c/src/thread_pthread.h
--- a/pypy/translator/c/src/thread_pthread.h
+++ b/pypy/translator/c/src/thread_pthread.h
@@ -134,10 +134,15 @@
/* Jump through some hoops for Alpha OSF/1 */
threadid = pthread_self();
+#ifdef __CYGWIN__
+ /* typedef __uint32_t pthread_t; */
+ return (long) threadid;
+#else
if (sizeof(pthread_t) <= sizeof(long))
return (long) threadid;
else
return (long) *(long *) &threadid;
+#endif
}
static long _pypythread_stacksize = 0;
@@ -190,10 +195,15 @@
pthread_detach(th);
+#ifdef __CYGWIN__
+ /* typedef __uint32_t pthread_t; */
+ return (long) th;
+#else
if (sizeof(pthread_t) <= sizeof(long))
return (long) th;
else
return (long) *(long *) &th;
+#endif
}
long RPyThreadGetStackSize(void)
diff --git a/pypy/translator/c/test/test_typed.py b/pypy/translator/c/test/test_typed.py
--- a/pypy/translator/c/test/test_typed.py
+++ b/pypy/translator/c/test/test_typed.py
@@ -895,3 +895,12 @@
f = self.getcompiled(func, [int])
res = f(-2000000000)
assert res == -200000000000000
+
+ def test_bool_2(self):
+ from pypy.rpython.lltypesystem import lltype, rffi
+ def func(n):
+ x = rffi.cast(lltype.Bool, n)
+ return int(x)
+ f = self.getcompiled(func, [int])
+ res = f(2)
+ assert res == 1 # and not 2
diff --git a/pypy/translator/cli/opcodes.py b/pypy/translator/cli/opcodes.py
--- a/pypy/translator/cli/opcodes.py
+++ b/pypy/translator/cli/opcodes.py
@@ -97,6 +97,8 @@
'jit_force_quasi_immutable':Ignore,
'jit_force_virtualizable': Ignore,
'jit_force_virtual': DoNothing,
+ 'jit_force_quasi_immutable':Ignore,
+ 'jit_is_virtual': [PushPrimitive(ootype.Bool, False)],
}
# __________ numeric operations __________
diff --git a/pypy/translator/goal/test2/test_app_main.py b/pypy/translator/goal/test2/test_app_main.py
--- a/pypy/translator/goal/test2/test_app_main.py
+++ b/pypy/translator/goal/test2/test_app_main.py
@@ -23,8 +23,7 @@
def getscript(source):
p = _get_next_path()
p.write(str(py.code.Source(source)))
- # return relative path for testing purposes
- return py.path.local().bestrelpath(p)
+ return str(p)
def getscript_pyc(space, source):
p = _get_next_path()
diff --git a/pypy/translator/platform/distutils_platform.py b/pypy/translator/platform/distutils_platform.py
--- a/pypy/translator/platform/distutils_platform.py
+++ b/pypy/translator/platform/distutils_platform.py
@@ -52,7 +52,7 @@
self.compile_extra = list(eci.compile_extra)
self.link_extra = list(eci.link_extra)
self.frameworks = list(eci.frameworks)
- if not self.name in ('win32', 'darwin'): # xxx
+ if not self.name in ('win32', 'darwin', 'cygwin'): # xxx
if 'm' not in self.libraries:
self.libraries.append('m')
self.compile_extra += CFLAGS + ['-fomit-frame-pointer']
More information about the pypy-commit
mailing list