@@ -356,13 +356,13 @@ fn del_wrapper(zelf: &PyObject, vm: &VirtualMachine) -> PyResult<()> {
356356}
357357
358358impl PyType {
359- pub ( crate ) fn update_slot ( & self , name : & ' static PyStrInterned , add : bool ) {
359+ pub ( crate ) fn update_slot < const ADD : bool > ( & self , name : & ' static PyStrInterned , ctx : & Context ) {
360360 debug_assert ! ( name. as_str( ) . starts_with( "__" ) ) ;
361361 debug_assert ! ( name. as_str( ) . ends_with( "__" ) ) ;
362362
363363 macro_rules! toggle_slot {
364364 ( $name: ident, $func: expr) => { {
365- self . slots. $name. store( if add { Some ( $func) } else { None } ) ;
365+ self . slots. $name. store( if ADD { Some ( $func) } else { None } ) ;
366366 } } ;
367367 }
368368
@@ -382,95 +382,88 @@ impl PyType {
382382
383383 macro_rules! toggle_ext_func {
384384 ( $n1: ident, $n2: ident, $func: expr) => { {
385- self . heaptype_ext. as_ref( ) . unwrap( ) . $n1. $n2. store( if add {
385+ self . heaptype_ext. as_ref( ) . unwrap( ) . $n1. $n2. store( if ADD {
386386 Some ( $func)
387387 } else {
388388 None
389389 } ) ;
390390 } } ;
391391 }
392392
393- match name. as_str ( ) {
394- " __len__" => {
393+ match name {
394+ _ if name == identifier ! ( ctx , __len__) => {
395395 update_slot ! ( as_mapping, slot_as_mapping) ;
396396 toggle_ext_func ! ( sequence_methods, length, |seq, vm| len_wrapper( seq. obj, vm) ) ;
397397 update_pointer_slot ! ( as_sequence, sequence_methods) ;
398398 }
399- " __getitem__" => {
399+ _ if name == identifier ! ( ctx , __getitem__) => {
400400 update_slot ! ( as_mapping, slot_as_mapping) ;
401401 toggle_ext_func ! ( sequence_methods, item, |seq, i, vm| getitem_wrapper(
402402 seq. obj, i, vm
403403 ) ) ;
404404 update_pointer_slot ! ( as_sequence, sequence_methods) ;
405405 }
406- " __setitem__" | " __delitem__" => {
406+ _ if name == identifier ! ( ctx , __setitem__) || name == identifier ! ( ctx , __delitem__) => {
407407 update_slot ! ( as_mapping, slot_as_mapping) ;
408408 toggle_ext_func ! ( sequence_methods, ass_item, |seq, i, value, vm| {
409409 setitem_wrapper( seq. obj, i, value, vm)
410410 } ) ;
411411 update_pointer_slot ! ( as_sequence, sequence_methods) ;
412412 }
413- " __hash__" => {
413+ _ if name == identifier ! ( ctx , __hash__) => {
414414 toggle_slot ! ( hash, hash_wrapper) ;
415415 }
416- " __call__" => {
416+ _ if name == identifier ! ( ctx , __call__) => {
417417 toggle_slot ! ( call, call_wrapper) ;
418418 }
419- "__getattr__" | "__getattribute__" => {
419+ _ if name == identifier ! ( ctx, __getattr__)
420+ || name == identifier ! ( ctx, __getattribute__) =>
421+ {
420422 update_slot ! ( getattro, getattro_wrapper) ;
421423 }
422- " __setattr__" | " __delattr__" => {
424+ _ if name == identifier ! ( ctx , __setattr__) || name == identifier ! ( ctx , __delattr__) => {
423425 update_slot ! ( setattro, setattro_wrapper) ;
424426 }
425- "__eq__" | "__ne__" | "__le__" | "__lt__" | "__ge__" | "__gt__" => {
427+ _ if name == identifier ! ( ctx, __eq__)
428+ || name == identifier ! ( ctx, __ne__)
429+ || name == identifier ! ( ctx, __le__)
430+ || name == identifier ! ( ctx, __lt__)
431+ || name == identifier ! ( ctx, __ge__)
432+ || name == identifier ! ( ctx, __gt__) =>
433+ {
426434 update_slot ! ( richcompare, richcompare_wrapper) ;
427435 }
428- " __iter__" => {
436+ _ if name == identifier ! ( ctx , __iter__) => {
429437 toggle_slot ! ( iter, iter_wrapper) ;
430438 }
431- " __next__" => {
439+ _ if name == identifier ! ( ctx , __next__) => {
432440 toggle_slot ! ( iternext, iternext_wrapper) ;
433441 }
434- " __get__" => {
442+ _ if name == identifier ! ( ctx , __get__) => {
435443 toggle_slot ! ( descr_get, descr_get_wrapper) ;
436444 }
437- " __set__" | " __delete__" => {
445+ _ if name == identifier ! ( ctx , __set__) || name == identifier ! ( ctx , __delete__) => {
438446 update_slot ! ( descr_set, descr_set_wrapper) ;
439447 }
440- " __init__" => {
448+ _ if name == identifier ! ( ctx , __init__) => {
441449 toggle_slot ! ( init, init_wrapper) ;
442450 }
443- " __new__" => {
451+ _ if name == identifier ! ( ctx , __new__) => {
444452 toggle_slot ! ( new, new_wrapper) ;
445453 }
446- " __del__" => {
454+ _ if name == identifier ! ( ctx , __del__) => {
447455 toggle_slot ! ( del, del_wrapper) ;
448456 }
449- "__int__" => {
450- self . heaptype_ext
451- . as_ref ( )
452- . unwrap ( )
453- . number_methods
454- . int
455- . store ( Some ( int_wrapper) ) ;
457+ _ if name == identifier ! ( ctx, __int__) => {
458+ toggle_ext_func ! ( number_methods, int, int_wrapper) ;
456459 update_pointer_slot ! ( as_number, number_methods) ;
457460 }
458- "__index__" => {
459- self . heaptype_ext
460- . as_ref ( )
461- . unwrap ( )
462- . number_methods
463- . index
464- . store ( Some ( index_wrapper) ) ;
461+ _ if name == identifier ! ( ctx, __index__) => {
462+ toggle_ext_func ! ( number_methods, index, index_wrapper) ;
465463 update_pointer_slot ! ( as_number, number_methods) ;
466464 }
467- "__float__" => {
468- self . heaptype_ext
469- . as_ref ( )
470- . unwrap ( )
471- . number_methods
472- . float
473- . store ( Some ( float_wrapper) ) ;
465+ _ if name == identifier ! ( ctx, __float__) => {
466+ toggle_ext_func ! ( number_methods, float, float_wrapper) ;
474467 update_pointer_slot ! ( as_number, number_methods) ;
475468 }
476469 _ => { }
0 commit comments