@@ -309,7 +309,7 @@ qstr qstr_from_str(const char *str) {
309
309
return qstr_from_strn (str , strlen (str ));
310
310
}
311
311
312
- qstr qstr_from_strn (const char * str , size_t len ) {
312
+ static qstr qstr_from_strn_helper (const char * str , size_t len , bool data_is_static ) {
313
313
QSTR_ENTER ();
314
314
qstr q = qstr_find_strn (str , len );
315
315
if (q == 0 ) {
@@ -321,6 +321,12 @@ qstr qstr_from_strn(const char *str, size_t len) {
321
321
mp_raise_msg (& mp_type_RuntimeError , MP_ERROR_TEXT ("name too long" ));
322
322
}
323
323
324
+ if (data_is_static ) {
325
+ // Given string data will be forever available so use it directly.
326
+ assert (str [len ] == '\0' );
327
+ goto add ;
328
+ }
329
+
324
330
// compute number of bytes needed to intern this string
325
331
size_t n_bytes = len + 1 ;
326
332
@@ -364,12 +370,26 @@ qstr qstr_from_strn(const char *str, size_t len) {
364
370
// store the interned strings' data
365
371
memcpy (q_ptr , str , len );
366
372
q_ptr [len ] = '\0' ;
367
- q = qstr_add (len , q_ptr );
373
+ str = q_ptr ;
374
+
375
+ add :
376
+ q = qstr_add (len , str );
368
377
}
369
378
QSTR_EXIT ();
370
379
return q ;
371
380
}
372
381
382
+ qstr qstr_from_strn (const char * str , size_t len ) {
383
+ return qstr_from_strn_helper (str , len , false);
384
+ }
385
+
386
+ #if MICROPY_VFS_ROM
387
+ // Create a new qstr that can forever reference the given string data.
388
+ qstr qstr_from_strn_static (const char * str , size_t len ) {
389
+ return qstr_from_strn_helper (str , len , true);
390
+ }
391
+ #endif
392
+
373
393
mp_uint_t qstr_hash (qstr q ) {
374
394
const qstr_pool_t * pool = find_qstr (& q );
375
395
#if MICROPY_QSTR_BYTES_IN_HASH
0 commit comments