Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
e00eeaf4
Commit
e00eeaf4
authored
Nov 12, 2014
by
stijn
Committed by
Damien George
Nov 15, 2014
Browse files
py: Use __hash__ method if a type defines it
parent
d8474d36
Changes
2
Hide whitespace changes
Inline
Side-by-side
py/obj.c
View file @
e00eeaf4
...
...
@@ -172,17 +172,25 @@ mp_int_t mp_obj_hash(mp_obj_t o_in) {
return
mp_obj_tuple_hash
(
o_in
);
}
else
if
(
MP_OBJ_IS_TYPE
(
o_in
,
&
mp_type_type
))
{
return
(
mp_int_t
)
o_in
;
}
else
if
(
MP_OBJ_IS_OBJ
(
o_in
))
{
// if a valid __hash__ method exists, use it
mp_obj_t
hash_method
[
2
];
mp_load_method_maybe
(
o_in
,
MP_QSTR___hash__
,
hash_method
);
if
(
hash_method
[
0
]
!=
MP_OBJ_NULL
)
{
mp_obj_t
hash_val
=
mp_call_method_n_kw
(
0
,
0
,
hash_method
);
if
(
MP_OBJ_IS_INT
(
hash_val
))
{
return
mp_obj_int_get
(
hash_val
);
}
}
}
// TODO hash class and instances
// TODO delegate to __hash__ method if it exists
// TODO hash class and instances - in CPython by default user created classes' __hash__ resolves to their id
if
(
MICROPY_ERROR_REPORTING
==
MICROPY_ERROR_REPORTING_TERSE
)
{
nlr_raise
(
mp_obj_new_exception_msg
(
&
mp_type_TypeError
,
"unhashable type"
));
}
else
{
if
(
MICROPY_ERROR_REPORTING
==
MICROPY_ERROR_REPORTING_TERSE
)
{
nlr_raise
(
mp_obj_new_exception_msg
(
&
mp_type_TypeError
,
"unhashable type"
));
}
else
{
nlr_raise
(
mp_obj_new_exception_msg_varg
(
&
mp_type_TypeError
,
"unhashable type: '%s'"
,
mp_obj_get_type_str
(
o_in
)));
}
nlr_raise
(
mp_obj_new_exception_msg_varg
(
&
mp_type_TypeError
,
"unhashable type: '%s'"
,
mp_obj_get_type_str
(
o_in
)));
}
}
...
...
py/qstrdefs.h
View file @
e00eeaf4
...
...
@@ -39,6 +39,7 @@ Q(__locals__)
Q
(
__main__
)
Q
(
__module__
)
Q
(
__name__
)
Q
(
__hash__
)
Q
(
__next__
)
Q
(
__qualname__
)
Q
(
__path__
)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment