From 3e78b1fdd92ee891ba4f6f249ce399f37eca0b87 Mon Sep 17 00:00:00 2001 From: Damien George Date: Fri, 4 Mar 2022 10:40:15 +1100 Subject: [PATCH] py/qstr: Add qstr_from_strn_static. Signed-off-by: Damien George --- py/qstr.c | 20 ++++++++++++++++++-- py/qstr.h | 1 + 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/py/qstr.c b/py/qstr.c index 3720932250..f5c1b113df 100644 --- a/py/qstr.c +++ b/py/qstr.c @@ -309,7 +309,7 @@ qstr qstr_from_str(const char *str) { return qstr_from_strn(str, strlen(str)); } -qstr qstr_from_strn(const char *str, size_t len) { +static qstr qstr_from_strn_helper(const char *str, size_t len, bool is_static) { QSTR_ENTER(); qstr q = qstr_find_strn(str, len); if (q == 0) { @@ -321,6 +321,11 @@ qstr qstr_from_strn(const char *str, size_t len) { mp_raise_msg(&mp_type_RuntimeError, MP_ERROR_TEXT("name too long")); } + if (is_static) { + assert(str[len] == '\0'); + goto add; + } + // compute number of bytes needed to intern this string size_t n_bytes = len + 1; @@ -364,12 +369,23 @@ qstr qstr_from_strn(const char *str, size_t len) { // store the interned strings' data memcpy(q_ptr, str, len); q_ptr[len] = '\0'; - q = qstr_add(len, q_ptr); + str = q_ptr; + + add: + q = qstr_add(len, str); } QSTR_EXIT(); return q; } +qstr qstr_from_strn(const char *str, size_t len) { + return qstr_from_strn_helper(str, len, false); +} + +qstr qstr_from_strn_static(const char *str, size_t len) { + return qstr_from_strn_helper(str, len, true); +} + mp_uint_t qstr_hash(qstr q) { const qstr_pool_t *pool = find_qstr(&q); #if MICROPY_QSTR_BYTES_IN_HASH diff --git a/py/qstr.h b/py/qstr.h index 58ce285fd2..69d52e85fe 100644 --- a/py/qstr.h +++ b/py/qstr.h @@ -101,6 +101,7 @@ qstr qstr_find_strn(const char *str, size_t str_len); // returns MP_QSTRnull if qstr qstr_from_str(const char *str); qstr qstr_from_strn(const char *str, size_t len); +qstr qstr_from_strn_static(const char *str, size_t len); mp_uint_t qstr_hash(qstr q); const char *qstr_str(qstr q);