@@ -201,7 +201,7 @@ qstr qstr_from_str(const char *str) {
201
201
return qstr_from_strn (str , strlen (str ));
202
202
}
203
203
204
- qstr qstr_from_strn (const char * str , size_t len ) {
204
+ STATIC qstr qstr_from_strn_helper (const char * str , size_t len , bool is_static ) {
205
205
QSTR_ENTER ();
206
206
qstr q = qstr_find_strn (str , len );
207
207
if (q == 0 ) {
@@ -213,56 +213,69 @@ qstr qstr_from_strn(const char *str, size_t len) {
213
213
mp_raise_msg (& mp_type_RuntimeError , MP_ERROR_TEXT ("name too long" ));
214
214
}
215
215
216
- // compute number of bytes needed to intern this string
217
- size_t n_bytes = len + 1 ;
218
-
219
- if (MP_STATE_VM (qstr_last_chunk ) != NULL && MP_STATE_VM (qstr_last_used ) + n_bytes > MP_STATE_VM (qstr_last_alloc )) {
220
- // not enough room at end of previously interned string so try to grow
221
- char * new_p = m_renew_maybe (char , MP_STATE_VM (qstr_last_chunk ), MP_STATE_VM (qstr_last_alloc ), MP_STATE_VM (qstr_last_alloc ) + n_bytes , false);
222
- if (new_p == NULL ) {
223
- // could not grow existing memory; shrink it to fit previous
224
- (void )m_renew_maybe (char , MP_STATE_VM (qstr_last_chunk ), MP_STATE_VM (qstr_last_alloc ), MP_STATE_VM (qstr_last_used ), false);
225
- MP_STATE_VM (qstr_last_chunk ) = NULL ;
226
- } else {
227
- // could grow existing memory
228
- MP_STATE_VM (qstr_last_alloc ) += n_bytes ;
216
+ if (is_static ) {
217
+ assert (str [len ] == '\0' );
218
+ } else {
219
+ // compute number of bytes needed to intern this string
220
+ size_t n_bytes = len + 1 ;
221
+
222
+ if (MP_STATE_VM (qstr_last_chunk ) != NULL && MP_STATE_VM (qstr_last_used ) + n_bytes > MP_STATE_VM (qstr_last_alloc )) {
223
+ // not enough room at end of previously interned string so try to grow
224
+ char * new_p = m_renew_maybe (char , MP_STATE_VM (qstr_last_chunk ), MP_STATE_VM (qstr_last_alloc ), MP_STATE_VM (qstr_last_alloc ) + n_bytes , false);
225
+ if (new_p == NULL ) {
226
+ // could not grow existing memory; shrink it to fit previous
227
+ (void )m_renew_maybe (char , MP_STATE_VM (qstr_last_chunk ), MP_STATE_VM (qstr_last_alloc ), MP_STATE_VM (qstr_last_used ), false);
228
+ MP_STATE_VM (qstr_last_chunk ) = NULL ;
229
+ } else {
230
+ // could grow existing memory
231
+ MP_STATE_VM (qstr_last_alloc ) += n_bytes ;
232
+ }
229
233
}
230
- }
231
234
232
- if (MP_STATE_VM (qstr_last_chunk ) == NULL ) {
233
- // no existing memory for the interned string so allocate a new chunk
234
- size_t al = n_bytes ;
235
- if (al < MICROPY_ALLOC_QSTR_CHUNK_INIT ) {
236
- al = MICROPY_ALLOC_QSTR_CHUNK_INIT ;
237
- }
238
- MP_STATE_VM (qstr_last_chunk ) = m_new_maybe (char , al );
239
235
if (MP_STATE_VM (qstr_last_chunk ) == NULL ) {
240
- // failed to allocate a large chunk so try with exact size
241
- MP_STATE_VM (qstr_last_chunk ) = m_new_maybe (char , n_bytes );
236
+ // no existing memory for the interned string so allocate a new chunk
237
+ size_t al = n_bytes ;
238
+ if (al < MICROPY_ALLOC_QSTR_CHUNK_INIT ) {
239
+ al = MICROPY_ALLOC_QSTR_CHUNK_INIT ;
240
+ }
241
+ MP_STATE_VM (qstr_last_chunk ) = m_new_maybe (char , al );
242
242
if (MP_STATE_VM (qstr_last_chunk ) == NULL ) {
243
- QSTR_EXIT ();
244
- m_malloc_fail (n_bytes );
243
+ // failed to allocate a large chunk so try with exact size
244
+ MP_STATE_VM (qstr_last_chunk ) = m_new_maybe (char , n_bytes );
245
+ if (MP_STATE_VM (qstr_last_chunk ) == NULL ) {
246
+ QSTR_EXIT ();
247
+ m_malloc_fail (n_bytes );
248
+ }
249
+ al = n_bytes ;
245
250
}
246
- al = n_bytes ;
251
+ MP_STATE_VM (qstr_last_alloc ) = al ;
252
+ MP_STATE_VM (qstr_last_used ) = 0 ;
247
253
}
248
- MP_STATE_VM (qstr_last_alloc ) = al ;
249
- MP_STATE_VM (qstr_last_used ) = 0 ;
250
- }
251
254
252
- // allocate memory from the chunk for this new interned string's data
253
- char * q_ptr = MP_STATE_VM (qstr_last_chunk ) + MP_STATE_VM (qstr_last_used );
254
- MP_STATE_VM (qstr_last_used ) += n_bytes ;
255
+ // allocate memory from the chunk for this new interned string's data
256
+ char * q_ptr = MP_STATE_VM (qstr_last_chunk ) + MP_STATE_VM (qstr_last_used );
257
+ MP_STATE_VM (qstr_last_used ) += n_bytes ;
258
+
259
+ memcpy (q_ptr , str , len );
260
+ q_ptr [len ] = '\0' ;
261
+ str = q_ptr ;
262
+ }
255
263
256
264
// store the interned strings' data
257
265
mp_uint_t hash = qstr_compute_hash ((const byte * )str , len );
258
- memcpy (q_ptr , str , len );
259
- q_ptr [len ] = '\0' ;
260
- q = qstr_add (hash , len , q_ptr );
266
+ q = qstr_add (hash , len , str );
261
267
}
262
268
QSTR_EXIT ();
263
269
return q ;
264
270
}
265
271
272
+ qstr qstr_from_strn (const char * str , size_t len ) {
273
+ return qstr_from_strn_helper (str , len , false);
274
+ }
275
+ qstr qstr_from_strn_static (const char * str , size_t len ) {
276
+ return qstr_from_strn_helper (str , len , true);
277
+ }
278
+
266
279
mp_uint_t qstr_hash (qstr q ) {
267
280
const qstr_pool_t * pool = find_qstr (& q );
268
281
return pool -> hashes [q ];
0 commit comments