Author: Alex Gaynor <[email protected]>
Branch:
Changeset: r67346:d7d87d2a64ba
Date: 2013-10-13 16:41 +0200
http://bitbucket.org/pypy/pypy/changeset/d7d87d2a64ba/
Log: merged from upstream
diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -90,7 +90,8 @@
.. branch: no-release-gil
.. branch: safe-win-mmap
.. branch: boolean-indexing-cleanup
-.. branch: cpyyest-best_base
+.. branch: cpyext-best_base
+.. branch: fileops2
.. branch: nobold-backtrace
Work on improving UnionError messages and stack trace displays.
diff --git a/pypy/module/cpyext/include/numpy/npy_3kcompat.h
b/pypy/module/cpyext/include/numpy/npy_3kcompat.h
--- a/pypy/module/cpyext/include/numpy/npy_3kcompat.h
+++ b/pypy/module/cpyext/include/numpy/npy_3kcompat.h
@@ -0,0 +1,39 @@
+/*
+ * In numpy this is a convenience header file providing compatibility utilities
+ * for supporting Python 2 and Python 3 in the same code base.
+ *
+ * PyPy uses it as a convenient place to add compatability declarations
+ */
+
+#ifndef _NPY_3KCOMPAT_H_
+#define _NPY_3KCOMPAT_H_
+
+#include <numpy/npy_common.h>
+
+#define npy_PyFile_Dup(file, mode) (NULL)
+#define npy_PyFile_DupClose(file, handle) (0)
+
+static NPY_INLINE PyObject*
+npy_PyFile_OpenFile(PyObject *filename, const char *mode)
+{
+ PyObject *open;
+ open = PyDict_GetItemString(PyEval_GetBuiltins(), "open");
+ if (open == NULL) {
+ return NULL;
+ }
+ return PyObject_CallFunction(open, "Os", filename, mode);
+}
+
+static NPY_INLINE int
+npy_PyFile_CloseFile(PyObject *file)
+{
+ PyObject *ret;
+
+ ret = PyObject_CallMethod(file, "close", NULL);
+ if (ret == NULL) {
+ return -1;
+ }
+ Py_DECREF(ret);
+ return 0;
+}
+
diff --git a/pypy/module/cpyext/ndarrayobject.py
b/pypy/module/cpyext/ndarrayobject.py
--- a/pypy/module/cpyext/ndarrayobject.py
+++ b/pypy/module/cpyext/ndarrayobject.py
@@ -171,6 +171,15 @@
w_array.implementation.shape = []
return w_array
+@cpython_api([Py_ssize_t], PyObject)
+def _PyArray_DescrFromType(space, typenum):
+ try:
+ dtype = get_dtype_cache(space).dtypes_by_num[typenum]
+ return dtype
+ except KeyError:
+ raise OperationError(space.w_ValueError, space.wrap(
+ '_PyArray_DescrFromType called with invalid dtype %d' % typenum))
+
@cpython_api([PyObject, Py_ssize_t, Py_ssize_t, Py_ssize_t], PyObject)
def _PyArray_FromObject(space, w_obj, typenum, min_depth, max_depth):
try:
diff --git a/pypy/module/cpyext/test/test_ndarrayobject.py
b/pypy/module/cpyext/test/test_ndarrayobject.py
--- a/pypy/module/cpyext/test/test_ndarrayobject.py
+++ b/pypy/module/cpyext/test/test_ndarrayobject.py
@@ -265,6 +265,12 @@
return obj2;
'''
),
+ ("test_DescrFromType", "METH_O",
+ """
+ Signed typenum = PyInt_AsLong(args);
+ return _PyArray_DescrFromType(typenum);
+ """
+ ),
], prologue='#include <numpy/arrayobject.h>')
arr = mod.test_simplenew()
assert arr.shape == (2, 3)
@@ -278,3 +284,5 @@
#Make sure these work without errors
arr = mod.test_FromAny()
arr = mod.test_FromObject()
+ dt = mod.test_DescrFromType(11)
+ assert dt.num == 11
diff --git a/pypy/module/mmap/interp_mmap.py b/pypy/module/mmap/interp_mmap.py
--- a/pypy/module/mmap/interp_mmap.py
+++ b/pypy/module/mmap/interp_mmap.py
@@ -290,9 +290,6 @@
self.space = space
self.mmap = mmap
- def get_raw_address(self):
- return self.mmap.data
-
def getlength(self):
return self.mmap.size
diff --git a/rpython/memory/gc/minimark.py b/rpython/memory/gc/minimark.py
--- a/rpython/memory/gc/minimark.py
+++ b/rpython/memory/gc/minimark.py
@@ -1201,7 +1201,6 @@
# ^^^ a fast path of write-barrier
#
if source_hdr.tid & GCFLAG_HAS_CARDS != 0:
- assert self.card_page_indices > 0
#
if source_hdr.tid & GCFLAG_TRACK_YOUNG_PTRS == 0:
# The source object may have random young pointers.
@@ -1236,6 +1235,7 @@
def manually_copy_card_bits(self, source_addr, dest_addr, length):
# manually copy the individual card marks from source to dest
+ assert self.card_page_indices > 0
bytes = self.card_marking_bytes_for_length(length)
#
anybyte = 0
diff --git a/rpython/rlib/rdtoa.py b/rpython/rlib/rdtoa.py
--- a/rpython/rlib/rdtoa.py
+++ b/rpython/rlib/rdtoa.py
@@ -217,13 +217,13 @@
if exp >= 0:
exp_str = str(exp)
- if len(exp_str) < 2:
+ if len(exp_str) < 2 and not (flags & rfloat.DTSF_CUT_EXP_0):
s += e + '+0' + exp_str
else:
s += e + '+' + exp_str
else:
exp_str = str(-exp)
- if len(exp_str) < 2:
+ if len(exp_str) < 2 and not (flags & rfloat.DTSF_CUT_EXP_0):
s += e + '-0' + exp_str
else:
s += e + '-' + exp_str
diff --git a/rpython/rlib/rfloat.py b/rpython/rlib/rfloat.py
--- a/rpython/rlib/rfloat.py
+++ b/rpython/rlib/rfloat.py
@@ -69,6 +69,7 @@
DTSF_SIGN = 0x1
DTSF_ADD_DOT_0 = 0x2
DTSF_ALT = 0x4
+DTSF_CUT_EXP_0 = 0x8
DIST_FINITE = 1
DIST_NAN = 2
diff --git a/rpython/rlib/test/test_rdtoa.py b/rpython/rlib/test/test_rdtoa.py
--- a/rpython/rlib/test/test_rdtoa.py
+++ b/rpython/rlib/test/test_rdtoa.py
@@ -29,3 +29,7 @@
def test_dtoa_precision():
assert dtoa(1.1, code='f', precision=2) == "1.10"
assert dtoa(1e12, code='g', precision=12) == "1e+12"
+
+def test_flag_cut_exp_0():
+ assert dtoa(1.1e9, code="g", precision=2, flags=rfloat.DTSF_CUT_EXP_0) ==
"1.1e+9"
+ assert dtoa(1.1e-9, code="g", precision=2, flags=rfloat.DTSF_CUT_EXP_0) ==
"1.1e-9"
diff --git a/rpython/rtyper/lltypesystem/rdict.py
b/rpython/rtyper/lltypesystem/rdict.py
--- a/rpython/rtyper/lltypesystem/rdict.py
+++ b/rpython/rtyper/lltypesystem/rdict.py
@@ -162,6 +162,9 @@
fasthashfn = None
else:
fasthashfn = self.key_repr.get_ll_fasthash_function()
+ if getattr(self.key_repr.get_ll_eq_function(),
+ 'no_direct_compare', False):
+ entrymeths['no_direct_compare'] = True
if fasthashfn is None:
entryfields.append(("f_hash", lltype.Signed))
entrymeths['hash'] = ll_hash_from_cache
diff --git a/rpython/rtyper/lltypesystem/rstr.py
b/rpython/rtyper/lltypesystem/rstr.py
--- a/rpython/rtyper/lltypesystem/rstr.py
+++ b/rpython/rtyper/lltypesystem/rstr.py
@@ -577,9 +577,7 @@
return -1
m = len(s2.chars)
- if m == 0:
- return start
- elif m == 1:
+ if m == 1:
return cls.ll_find_char(s1, s2.chars[0], start, end)
return cls.ll_search(s1, s2, start, end, FAST_FIND)
@@ -594,9 +592,7 @@
return -1
m = len(s2.chars)
- if m == 0:
- return end
- elif m == 1:
+ if m == 1:
return cls.ll_rfind_char(s1, s2.chars[0], start, end)
return cls.ll_search(s1, s2, start, end, FAST_RFIND)
@@ -611,9 +607,7 @@
return 0
m = len(s2.chars)
- if m == 0:
- return end - start + 1
- elif m == 1:
+ if m == 1:
return cls.ll_count_char(s1, s2.chars[0], start, end)
res = cls.ll_search(s1, s2, start, end, FAST_COUNT)
@@ -629,6 +623,14 @@
n = end - start
m = len(s2.chars)
+ if m == 0:
+ if mode == FAST_COUNT:
+ return end - start + 1
+ elif mode == FAST_RFIND:
+ return end
+ else:
+ return start
+
w = n - m
if w < 0:
diff --git a/rpython/rtyper/rint.py b/rpython/rtyper/rint.py
--- a/rpython/rtyper/rint.py
+++ b/rpython/rtyper/rint.py
@@ -251,14 +251,15 @@
raise TyperError("not an integer: %r" % (value,))
def get_ll_eq_function(self):
+ if getattr(self, '_opprefix', '?') is None:
+ return ll_eq_shortint
return None
- get_ll_gt_function = get_ll_eq_function
- get_ll_lt_function = get_ll_eq_function
- get_ll_ge_function = get_ll_eq_function
- get_ll_le_function = get_ll_eq_function
def get_ll_ge_function(self):
return None
+ get_ll_gt_function = get_ll_ge_function
+ get_ll_lt_function = get_ll_ge_function
+ get_ll_le_function = get_ll_ge_function
def get_ll_hash_function(self):
if (sys.maxint == 2147483647 and
@@ -390,6 +391,10 @@
def ll_hash_long_long(n):
return intmask(intmask(n) + 9 * intmask(n >> 32))
+def ll_eq_shortint(n, m):
+ return intmask(n) == intmask(m)
+ll_eq_shortint.no_direct_compare = True
+
def ll_check_chr(n):
if 0 <= n <= 255:
return
diff --git a/rpython/rtyper/test/test_rdict.py
b/rpython/rtyper/test/test_rdict.py
--- a/rpython/rtyper/test/test_rdict.py
+++ b/rpython/rtyper/test/test_rdict.py
@@ -999,6 +999,26 @@
res = f()
assert res == 1
+ def test_dict_with_SHORT_keys(self):
+ def func(x):
+ d = {}
+ d[rffi.cast(rffi.SHORT, 42)] = 123
+ d[rffi.cast(rffi.SHORT, -43)] = 321
+ return d[rffi.cast(rffi.SHORT, x)]
+
+ assert self.interpret(func, [42]) == 123
+ assert self.interpret(func, [2**16 - 43]) == 321
+
+ def test_dict_with_bool_keys(self):
+ def func(x):
+ d = {}
+ d[False] = 123
+ d[True] = 321
+ return d[x == 42]
+
+ assert self.interpret(func, [5]) == 123
+ assert self.interpret(func, [42]) == 321
+
def test_nonnull_hint(self):
def eq(a, b):
return a == b
diff --git a/rpython/rtyper/test/test_rstr.py b/rpython/rtyper/test/test_rstr.py
--- a/rpython/rtyper/test/test_rstr.py
+++ b/rpython/rtyper/test/test_rstr.py
@@ -3,6 +3,7 @@
import py
from rpython.flowspace.model import summary
+from rpython.annotator.model import AnnotatorError
from rpython.rtyper.lltypesystem.lltype import typeOf, Signed, malloc
from rpython.rtyper.lltypesystem.rstr import LLHelpers, STR
from rpython.rtyper.rstr import AbstractLLHelpers
@@ -361,16 +362,16 @@
res = self.interpret(fn, [i, j])
assert res == fn(i, j)
- def test_find_TyperError(self):
+ def test_find_AnnotatorError(self):
const = self.const
def f():
s = const('abc')
s.find(s, 0, -10)
- py.test.raises(TyperError, self.interpret, f, ())
+ py.test.raises(AnnotatorError, self.interpret, f, ())
def f():
s = const('abc')
s.find(s, -10)
- py.test.raises(TyperError, self.interpret, f, ())
+ py.test.raises(AnnotatorError, self.interpret, f, ())
def test_find_empty_string(self):
const = self.const
@@ -420,9 +421,8 @@
const = self.const
def f(i):
return const("abc").rfind(const(''), i)
- e = py.test.raises(TyperError, self.interpret, f, [-5])
- assert str(e.value).startswith(
- 'str.rfind() start must be proven non-negative')
+ e = py.test.raises(AnnotatorError, self.interpret, f, [-5])
+ assert "rfind: not proven to have non-negative start" in str(e.value)
def test_find_char(self):
const = self.const
@@ -900,16 +900,16 @@
res = self.interpret(fn, [])
assert res == 1
- def test_count_TyperError(self):
+ def test_count_AnnotatorError(self):
const = self.const
def f():
s = const('abc')
s.count(s, 0, -10)
- py.test.raises(TyperError, self.interpret, f, ())
+ py.test.raises(AnnotatorError, self.interpret, f, ())
def f():
s = const('abc')
s.count(s, -10)
- py.test.raises(TyperError, self.interpret, f, ())
+ py.test.raises(AnnotatorError, self.interpret, f, ())
def test_getitem_exc(self):
const = self.const
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit