@@ -408,14 +408,20 @@ STATIC void emit_bc_load_null(emit_t *emit) {
408408 emit_write_byte_code_byte (emit , MP_BC_LOAD_NULL );
409409};
410410
411- STATIC void emit_bc_load_fast (emit_t * emit , qstr qstr , int local_num ) {
411+ STATIC void emit_bc_load_fast (emit_t * emit , qstr qstr , uint id_flags , int local_num ) {
412412 assert (local_num >= 0 );
413413 emit_bc_pre (emit , 1 );
414- switch (local_num ) {
415- case 0 : emit_write_byte_code_byte (emit , MP_BC_LOAD_FAST_0 ); break ;
416- case 1 : emit_write_byte_code_byte (emit , MP_BC_LOAD_FAST_1 ); break ;
417- case 2 : emit_write_byte_code_byte (emit , MP_BC_LOAD_FAST_2 ); break ;
418- default : emit_write_byte_code_byte_uint (emit , MP_BC_LOAD_FAST_N , local_num ); break ;
414+ if (id_flags & ID_FLAG_IS_DELETED ) {
415+ // This local may be deleted, so need to do a checked load.
416+ emit_write_byte_code_byte_uint (emit , MP_BC_LOAD_FAST_CHECKED , local_num );
417+ } else {
418+ // This local is never deleted, so can do a fast, uncheched load.
419+ switch (local_num ) {
420+ case 0 : emit_write_byte_code_byte (emit , MP_BC_LOAD_FAST_0 ); break ;
421+ case 1 : emit_write_byte_code_byte (emit , MP_BC_LOAD_FAST_1 ); break ;
422+ case 2 : emit_write_byte_code_byte (emit , MP_BC_LOAD_FAST_2 ); break ;
423+ default : emit_write_byte_code_byte_uint (emit , MP_BC_LOAD_FAST_N , local_num ); break ;
424+ }
419425 }
420426}
421427
@@ -491,13 +497,11 @@ STATIC void emit_bc_store_subscr(emit_t *emit) {
491497}
492498
493499STATIC void emit_bc_delete_fast (emit_t * emit , qstr qstr , int local_num ) {
494- emit_bc_load_null (emit );
495- emit_bc_store_fast (emit , qstr , local_num );
500+ emit_write_byte_code_byte_uint (emit , MP_BC_DELETE_FAST , local_num );
496501}
497502
498503STATIC void emit_bc_delete_deref (emit_t * emit , qstr qstr , int local_num ) {
499- emit_bc_load_null (emit );
500- emit_bc_store_deref (emit , qstr , local_num );
504+ emit_write_byte_code_byte_uint (emit , MP_BC_DELETE_DEREF , local_num );
501505}
502506
503507STATIC void emit_bc_delete_name (emit_t * emit , qstr qstr ) {
0 commit comments