Browse Source

py: Check that second argument to hasattr is actually a string.

Fixes issue #1623.
pull/1633/head
Damien George 9 years ago
parent
commit
0e3f29cc99
  1. 4
      py/modbuiltins.c
  2. 10
      tests/basics/hasattr1.py

4
py/modbuiltins.c

@ -529,14 +529,14 @@ STATIC mp_obj_t mp_builtin_setattr(mp_obj_t base, mp_obj_t attr, mp_obj_t value)
MP_DEFINE_CONST_FUN_OBJ_3(mp_builtin_setattr_obj, mp_builtin_setattr);
STATIC mp_obj_t mp_builtin_hasattr(mp_obj_t object_in, mp_obj_t attr_in) {
assert(MP_OBJ_IS_QSTR(attr_in));
qstr attr = mp_obj_str_get_qstr(attr_in);
mp_obj_t dest[2];
// TODO: https://docs.python.org/3/library/functions.html?highlight=hasattr#hasattr
// explicitly says "This is implemented by calling getattr(object, name) and seeing
// whether it raises an AttributeError or not.", so we should explicitly wrap this
// in nlr_push and handle exception.
mp_load_method_maybe(object_in, MP_OBJ_QSTR_VALUE(attr_in), dest);
mp_load_method_maybe(object_in, attr, dest);
return mp_obj_new_bool(dest[0] != MP_OBJ_NULL);
}

10
tests/basics/hasattr1.py

@ -27,3 +27,13 @@ c = C()
print(hasattr(c, "exists"))
# TODO
#print(hasattr(c, "doesnt_exist"))
try:
hasattr(1, b'123')
except TypeError:
print('TypeError')
try:
hasattr(1, 123)
except TypeError:
print('TypeError')

Loading…
Cancel
Save