py/qstr: Change qstr hash type from mp_uint_t to size_t.

The hash is either 8 or 16 bits (depending on MICROPY_QSTR_BYTES_IN_HASH)
so will fit in a size_t.

This saves 268 bytes on the unix nanbox build.  Non-nanbox configurations
are unchanged because mp_uint_t is the same size as size_t.

Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
Damien George 2022-08-11 16:34:02 +10:00
parent 94a19f1062
commit 82b3500724
3 changed files with 7 additions and 7 deletions

View File

@ -30,7 +30,7 @@
typedef struct _mp_obj_str_t {
mp_obj_base_t base;
mp_uint_t hash;
size_t hash;
// len == number of bytes used in data, alloc = len + 1 because (at the moment) we also append a null byte
size_t len;
const byte *data;
@ -41,7 +41,7 @@ typedef struct _mp_obj_str_t {
// use this macro to extract the string hash
// warning: the hash can be 0, meaning invalid, and must then be explicitly computed from the data
#define GET_STR_HASH(str_obj_in, str_hash) \
mp_uint_t str_hash; \
size_t str_hash; \
if (mp_obj_is_qstr(str_obj_in)) { \
str_hash = qstr_hash(MP_OBJ_QSTR_VALUE(str_obj_in)); \
} else { \

View File

@ -60,9 +60,9 @@
#define MICROPY_ALLOC_QSTR_ENTRIES_INIT (10)
// this must match the equivalent function in makeqstrdata.py
mp_uint_t qstr_compute_hash(const byte *data, size_t len) {
size_t qstr_compute_hash(const byte *data, size_t len) {
// djb2 algorithm; see http://www.cse.yorku.ca/~oz/hash.html
mp_uint_t hash = 5381;
size_t hash = 5381;
for (const byte *top = data + len; data < top; data++) {
hash = ((hash << 5) + hash) ^ (*data); // hash * 33 ^ data
}
@ -181,7 +181,7 @@ STATIC qstr qstr_add(mp_uint_t hash, mp_uint_t len, const char *q_ptr) {
qstr qstr_find_strn(const char *str, size_t str_len) {
// work out hash of str
mp_uint_t str_hash = qstr_compute_hash((const byte *)str, str_len);
size_t str_hash = qstr_compute_hash((const byte *)str, str_len);
// search pools for the data
for (const qstr_pool_t *pool = MP_STATE_VM(last_pool); pool != NULL; pool = pool->prev) {
@ -254,7 +254,7 @@ qstr qstr_from_strn(const char *str, size_t len) {
MP_STATE_VM(qstr_last_used) += n_bytes;
// store the interned strings' data
mp_uint_t hash = qstr_compute_hash((const byte *)str, len);
size_t hash = qstr_compute_hash((const byte *)str, len);
memcpy(q_ptr, str, len);
q_ptr[len] = '\0';
q = qstr_add(hash, len, q_ptr);

View File

@ -78,7 +78,7 @@ typedef struct _qstr_pool_t {
void qstr_init(void);
mp_uint_t qstr_compute_hash(const byte *data, size_t len);
size_t qstr_compute_hash(const byte *data, size_t len);
qstr qstr_find_strn(const char *str, size_t str_len); // returns MP_QSTRnull if not found
qstr qstr_from_str(const char *str);