Author: Armin Rigo <[email protected]>
Branch:
Changeset: r57323:b28fefeb3799
Date: 2012-09-13 18:10 +0200
http://bitbucket.org/pypy/pypy/changeset/b28fefeb3799/
Log: cffi: improve the type check against floats
diff --git a/pypy/module/_cffi_backend/misc.py
b/pypy/module/_cffi_backend/misc.py
--- a/pypy/module/_cffi_backend/misc.py
+++ b/pypy/module/_cffi_backend/misc.py
@@ -121,6 +121,14 @@
# ____________________________________________________________
+def _is_a_float(space, w_ob):
+ from pypy.module._cffi_backend.cdataobj import W_CData
+ from pypy.module._cffi_backend.ctypeprim import W_CTypePrimitiveFloat
+ ob = space.interpclass_w(w_ob)
+ if isinstance(ob, W_CData):
+ return isinstance(ob.ctype, W_CTypePrimitiveFloat)
+ return space.isinstance_w(w_ob, space.w_float)
+
def as_long_long(space, w_ob):
# (possibly) convert and cast a Python object to a long long.
# This version accepts a Python int too, and does convertions from
@@ -132,7 +140,7 @@
except OperationError, e:
if not e.match(space, space.w_TypeError):
raise
- if space.isinstance_w(w_ob, space.w_float):
+ if _is_a_float(space, w_ob):
raise
bigint = space.bigint_w(space.int(w_ob))
try:
@@ -155,7 +163,7 @@
except OperationError, e:
if not e.match(space, space.w_TypeError):
raise
- if strict and space.isinstance_w(w_ob, space.w_float):
+ if strict and _is_a_float(space, w_ob):
raise
bigint = space.bigint_w(space.int(w_ob))
if strict:
diff --git a/pypy/module/_cffi_backend/test/_backend_test_c.py
b/pypy/module/_cffi_backend/test/_backend_test_c.py
--- a/pypy/module/_cffi_backend/test/_backend_test_c.py
+++ b/pypy/module/_cffi_backend/test/_backend_test_c.py
@@ -2076,3 +2076,12 @@
assert not isinstance(nullchr, CType)
assert not isinstance(chrref, CType)
assert isinstance(BChar, CType)
+
+def test_no_cdata_float():
+ BInt = new_primitive_type("int")
+ BIntP = new_pointer_type(BInt)
+ BUInt = new_primitive_type("unsigned int")
+ BUIntP = new_pointer_type(BUInt)
+ BFloat = new_primitive_type("float")
+ py.test.raises(TypeError, newp, BIntP, cast(BFloat, 0.0))
+ py.test.raises(TypeError, newp, BUIntP, cast(BFloat, 0.0))
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit