Author: Armin Rigo <[email protected]>
Branch: py3.5
Changeset: r87050:a8137a62856a
Date: 2016-09-12 18:14 +0200
http://bitbucket.org/pypy/pypy/changeset/a8137a62856a/
Log: Fix for argument clinic's use of the "bool" specifier, which now
maps to "unwrap_spec(...=bool)".
diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py
--- a/pypy/interpreter/baseobjspace.py
+++ b/pypy/interpreter/baseobjspace.py
@@ -1232,7 +1232,7 @@
if e.match(self, self.w_AttributeError):
return False
raise
- return self.bool_w(self.nonzero(w_result))
+ return self.is_true(self.nonzero(w_result))
# CPython rules allows subclasses of BaseExceptions to be exceptions.
# This is slightly less general than the case above, so we prefix
@@ -1683,7 +1683,9 @@
def bool_w(self, w_obj):
# Unwraps a bool, also accepting an int for compatibility.
- # This is here mostly just for gateway.int_unwrapping_space_method().
+ # For cases where you need to accept bools and ints and nothing
+ # else. Note that saying 'bool' in unwrap_spec() doesn't call
+ # this, but the general is_true(), accepting any object.
return bool(self.int_w(w_obj))
def ord(self, w_obj):
diff --git a/pypy/interpreter/gateway.py b/pypy/interpreter/gateway.py
--- a/pypy/interpreter/gateway.py
+++ b/pypy/interpreter/gateway.py
@@ -520,8 +520,17 @@
assert typ in (int, str, float, unicode, r_longlong, r_uint, r_ulonglong,
bool)
if typ is r_int is r_longlong:
return 'gateway_r_longlong_w'
- elif typ in (str, unicode, bool):
+ elif typ in (str, unicode):
return typ.__name__ + '_w'
+ elif typ is bool:
+ # For argument clinic's "bool" specifier: accept any object, and
+ # convert it to a boolean value. If you don't want this
+ # behavior, you need to say "int" in the unwrap_spec(). Please
+ # use only to emulate "bool" in argument clinic or the 'p'
+ # letter in PyArg_ParseTuple(). Accepting *anything* when a
+ # boolean flag is expected feels like it comes straight from
+ # JavaScript: it is a sure way to hide bugs imho <arigo>.
+ return 'is_true'
else:
return 'gateway_' + typ.__name__ + '_w'
diff --git a/pypy/module/_io/interp_io.py b/pypy/module/_io/interp_io.py
--- a/pypy/module/_io/interp_io.py
+++ b/pypy/module/_io/interp_io.py
@@ -21,7 +21,7 @@
@unwrap_spec(mode=str, buffering=int,
encoding="str_or_None", errors="str_or_None",
- newline="str_or_None", closefd=bool)
+ newline="str_or_None", closefd=int)
def open(space, w_file, mode="r", buffering=-1, encoding=None, errors=None,
newline=None, closefd=True, w_opener=None):
from pypy.module._io.interp_bufferedio import (W_BufferedRandom,
@@ -88,7 +88,7 @@
"binary mode doesn't take a newline argument")
w_raw = space.call_function(
space.gettypefor(W_FileIO), w_file, space.wrap(rawmode),
- space.wrap(closefd), w_opener)
+ space.wrap(bool(closefd)), w_opener)
isatty = space.is_true(space.call_method(w_raw, "isatty"))
line_buffering = buffering == 1 or (buffering < 0 and isatty)
diff --git a/pypy/module/_lsprof/interp_lsprof.py
b/pypy/module/_lsprof/interp_lsprof.py
--- a/pypy/module/_lsprof/interp_lsprof.py
+++ b/pypy/module/_lsprof/interp_lsprof.py
@@ -434,11 +434,11 @@
return stats(space, self.data.values() + self.builtin_data.values(),
factor)
-@unwrap_spec(time_unit=float, subcalls=bool, builtins=bool)
+@unwrap_spec(time_unit=float, subcalls=int, builtins=int)
def descr_new_profile(space, w_type, w_callable=None, time_unit=0.0,
- subcalls=True, builtins=True):
+ subcalls=1, builtins=1):
p = space.allocate_instance(W_Profiler, w_type)
- p.__init__(space, w_callable, time_unit, subcalls, builtins)
+ p.__init__(space, w_callable, time_unit, bool(subcalls), bool(builtins))
return space.wrap(p)
W_Profiler.typedef = TypeDef(
diff --git a/pypy/module/_multibytecodec/interp_incremental.py
b/pypy/module/_multibytecodec/interp_incremental.py
--- a/pypy/module/_multibytecodec/interp_incremental.py
+++ b/pypy/module/_multibytecodec/interp_incremental.py
@@ -48,8 +48,9 @@
c_codecs.pypy_cjk_dec_free(self.decodebuf)
self.decodebuf = lltype.nullptr(c_codecs.DECODEBUF_P.TO)
- @unwrap_spec(object='bufferstr', final=bool)
- def decode_w(self, object, final=False):
+ @unwrap_spec(object='bufferstr', final=int)
+ def decode_w(self, object, final=0):
+ final = bool(final)
space = self.space
state = space.fromcache(CodecState)
if len(self.pending) > 0:
@@ -96,8 +97,9 @@
c_codecs.pypy_cjk_enc_free(self.encodebuf)
self.encodebuf = lltype.nullptr(c_codecs.ENCODEBUF_P.TO)
- @unwrap_spec(object=unicode, final=bool)
- def encode_w(self, object, final=False):
+ @unwrap_spec(object=unicode, final=int)
+ def encode_w(self, object, final=0):
+ final = bool(final)
space = self.space
state = space.fromcache(CodecState)
if len(self.pending) > 0:
diff --git a/pypy/module/_rawffi/array.py b/pypy/module/_rawffi/array.py
--- a/pypy/module/_rawffi/array.py
+++ b/pypy/module/_rawffi/array.py
@@ -36,9 +36,9 @@
def get_basic_ffi_type(self):
return self.basicffitype
- @unwrap_spec(length=int, autofree=bool)
+ @unwrap_spec(length=int, autofree=int)
def descr_call(self, space, length, w_items=None, autofree=False):
- result = self.allocate(space, length, autofree)
+ result = self.allocate(space, length, bool(autofree))
if not space.is_none(w_items):
items_w = space.unpackiterable(w_items)
iterlength = len(items_w)
diff --git a/pypy/module/_rawffi/structure.py b/pypy/module/_rawffi/structure.py
--- a/pypy/module/_rawffi/structure.py
+++ b/pypy/module/_rawffi/structure.py
@@ -189,9 +189,9 @@
raise oefmt(space.w_AttributeError,
"C Structure has no attribute %s", attr)
- @unwrap_spec(autofree=bool)
+ @unwrap_spec(autofree=int)
def descr_call(self, space, autofree=False):
- return space.wrap(self.allocate(space, 1, autofree))
+ return space.wrap(self.allocate(space, 1, bool(autofree)))
def descr_repr(self, space):
fieldnames = ' '.join(["'%s'" % name for name, _, _ in self.fields])
@@ -248,8 +248,9 @@
lltype.free(self.ffi_struct, flavor='raw')
-@unwrap_spec(union=bool, pack=int)
-def descr_new_structure(space, w_type, w_shapeinfo, union=False, pack=0):
+@unwrap_spec(union=int, pack=int)
+def descr_new_structure(space, w_type, w_shapeinfo, union=0, pack=0):
+ union = bool(union)
if pack < 0:
raise oefmt(space.w_ValueError,
"_pack_ must be a non-negative integer")
diff --git a/pypy/module/_socket/interp_socket.py
b/pypy/module/_socket/interp_socket.py
--- a/pypy/module/_socket/interp_socket.py
+++ b/pypy/module/_socket/interp_socket.py
@@ -453,7 +453,7 @@
raise converted_error(space, e)
return space.wrap(count)
- @unwrap_spec(flag=bool)
+ @unwrap_spec(flag=int)
def setblocking_w(self, flag):
"""setblocking(flag)
@@ -461,7 +461,7 @@
setblocking(True) is equivalent to settimeout(None);
setblocking(False) is equivalent to settimeout(0.0).
"""
- self.sock.setblocking(flag)
+ self.sock.setblocking(bool(flag))
@unwrap_spec(level=int, optname=int)
def setsockopt_w(self, space, level, optname, w_optval):
diff --git a/pypy/module/posix/interp_scandir.py
b/pypy/module/posix/interp_scandir.py
--- a/pypy/module/posix/interp_scandir.py
+++ b/pypy/module/posix/interp_scandir.py
@@ -267,13 +267,13 @@
return known_type == rposix_scandir.DT_LNK
return self.check_mode(follow_symlinks=False) == stat.S_IFLNK
- @unwrap_spec(follow_symlinks=int)
- def descr_is_dir(self, space, __kwonly__, follow_symlinks=1):
+ @unwrap_spec(follow_symlinks=bool)
+ def descr_is_dir(self, space, __kwonly__, follow_symlinks=True):
"""return True if the entry is a directory; cached per entry"""
return space.wrap(self.is_dir(follow_symlinks))
- @unwrap_spec(follow_symlinks=int)
- def descr_is_file(self, space, __kwonly__, follow_symlinks=1):
+ @unwrap_spec(follow_symlinks=bool)
+ def descr_is_file(self, space, __kwonly__, follow_symlinks=True):
"""return True if the entry is a file; cached per entry"""
return space.wrap(self.is_file(follow_symlinks))
@@ -281,8 +281,8 @@
"""return True if the entry is a symbolic link; cached per entry"""
return space.wrap(self.is_symlink())
- @unwrap_spec(follow_symlinks=int)
- def descr_stat(self, space, __kwonly__, follow_symlinks=1):
+ @unwrap_spec(follow_symlinks=bool)
+ def descr_stat(self, space, __kwonly__, follow_symlinks=True):
"""return stat_result object for the entry; cached per entry"""
st = self.get_stat_or_lstat(follow_symlinks)
return build_stat_result(self.space, st)
diff --git a/pypy/module/pyexpat/interp_pyexpat.py
b/pypy/module/pyexpat/interp_pyexpat.py
--- a/pypy/module/pyexpat/interp_pyexpat.py
+++ b/pypy/module/pyexpat/interp_pyexpat.py
@@ -634,7 +634,7 @@
# Parse methods
- @unwrap_spec(isfinal=bool)
+ @unwrap_spec(isfinal=int)
def Parse(self, space, w_data, isfinal=False):
"""Parse(data[, isfinal])
Parse XML data. `isfinal' should be true at end of input."""
@@ -645,6 +645,7 @@
XML_SetEncoding(self.itself, "utf-8")
else:
data = space.bufferstr_w(w_data)
+ isfinal = bool(isfinal)
res = XML_Parse(self.itself, data, len(data), isfinal)
if self._exc_info:
e = self._exc_info
diff --git a/pypy/module/pypyjit/interp_jit.py
b/pypy/module/pypyjit/interp_jit.py
--- a/pypy/module/pypyjit/interp_jit.py
+++ b/pypy/module/pypyjit/interp_jit.py
@@ -210,27 +210,27 @@
)
W_NotFromAssembler.typedef.acceptable_as_base_class = False
-@unwrap_spec(next_instr=int, is_being_profiled=bool, w_pycode=PyCode)
+@unwrap_spec(next_instr=int, is_being_profiled=int, w_pycode=PyCode)
@dont_look_inside
def get_jitcell_at_key(space, next_instr, is_being_profiled, w_pycode):
ll_pycode = cast_instance_to_gcref(w_pycode)
return space.wrap(bool(jit_hooks.get_jitcell_at_key(
- 'pypyjit', r_uint(next_instr), int(is_being_profiled), ll_pycode)))
+ 'pypyjit', r_uint(next_instr), int(bool(is_being_profiled)),
ll_pycode)))
-@unwrap_spec(next_instr=int, is_being_profiled=bool, w_pycode=PyCode)
+@unwrap_spec(next_instr=int, is_being_profiled=int, w_pycode=PyCode)
@dont_look_inside
def dont_trace_here(space, next_instr, is_being_profiled, w_pycode):
ll_pycode = cast_instance_to_gcref(w_pycode)
jit_hooks.dont_trace_here(
- 'pypyjit', r_uint(next_instr), int(is_being_profiled), ll_pycode)
+ 'pypyjit', r_uint(next_instr), int(bool(is_being_profiled)), ll_pycode)
return space.w_None
-@unwrap_spec(next_instr=int, is_being_profiled=bool, w_pycode=PyCode)
+@unwrap_spec(next_instr=int, is_being_profiled=int, w_pycode=PyCode)
@dont_look_inside
def trace_next_iteration(space, next_instr, is_being_profiled, w_pycode):
ll_pycode = cast_instance_to_gcref(w_pycode)
jit_hooks.trace_next_iteration(
- 'pypyjit', r_uint(next_instr), int(is_being_profiled), ll_pycode)
+ 'pypyjit', r_uint(next_instr), int(bool(is_being_profiled)), ll_pycode)
return space.w_None
@unwrap_spec(hash=r_uint)
diff --git a/pypy/module/pypyjit/interp_resop.py
b/pypy/module/pypyjit/interp_resop.py
--- a/pypy/module/pypyjit/interp_resop.py
+++ b/pypy/module/pypyjit/interp_resop.py
@@ -44,8 +44,8 @@
else:
return space.wrap(greenkey_repr)
-@unwrap_spec(operations=bool)
-def set_compile_hook(space, w_hook, operations=True):
+@unwrap_spec(operations=int)
+def set_compile_hook(space, w_hook, operations=1):
""" set_compile_hook(hook, operations=True)
Set a compiling hook that will be called each time a loop is compiled.
@@ -60,7 +60,7 @@
cache = space.fromcache(Cache)
assert w_hook is not None
cache.w_compile_hook = w_hook
- cache.compile_hook_with_ops = operations
+ cache.compile_hook_with_ops = bool(operations)
cache.in_recursion = NonConstant(False)
def set_abort_hook(space, w_hook):
diff --git a/pypy/module/thread/os_lock.py b/pypy/module/thread/os_lock.py
--- a/pypy/module/thread/os_lock.py
+++ b/pypy/module/thread/os_lock.py
@@ -169,7 +169,7 @@
return space.wrap(u"<%s owner=%d count=%d>" % (
typename, self.rlock_owner, self.rlock_count))
- @unwrap_spec(blocking=bool, timeout=float)
+ @unwrap_spec(blocking=int, timeout=float)
def acquire_w(self, space, blocking=True, timeout=-1.0):
"""Lock the lock. `blocking` indicates whether we should wait
for the lock to be available or not. If `blocking` is False
diff --git a/pypy/objspace/std/listobject.py b/pypy/objspace/std/listobject.py
--- a/pypy/objspace/std/listobject.py
+++ b/pypy/objspace/std/listobject.py
@@ -677,7 +677,7 @@
raise oefmt(space.w_ValueError, "%R is not in list", w_value)
return space.wrap(i)
- @unwrap_spec(reverse=bool)
+ @unwrap_spec(reverse=int)
def descr_sort(self, space, w_key=None, reverse=False):
""" L.sort(key=None, reverse=False) -- stable
sort *IN PLACE*"""
diff --git a/pypy/objspace/std/stringmethods.py
b/pypy/objspace/std/stringmethods.py
--- a/pypy/objspace/std/stringmethods.py
+++ b/pypy/objspace/std/stringmethods.py
@@ -564,7 +564,7 @@
return self._newlist_unwrapped(space, res)
- @unwrap_spec(keepends=bool)
+ @unwrap_spec(keepends=int)
def descr_splitlines(self, space, keepends=False):
value = self._val(space)
length = len(value)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit