@@ -527,6 +527,78 @@ char* get_ob_sval(PyObject* op) {
527
527
return ((PyBytesObject * )(op ))-> ob_sval ;
528
528
}
529
529
530
+ int64_t get_methods_flags (PyTypeObject * cls ) {
531
+ if (cls == NULL ) {
532
+ return 0 ;
533
+ }
534
+
535
+ int64_t flags = 0 ;
536
+ PyNumberMethods * number = cls -> tp_as_number ;
537
+ if (number != NULL ) {
538
+ #define COMPUTE_FLAGS (NAME , BIT_IDX ) flags |= ((number->NAME != NULL) * BIT_IDX);
539
+ COMPUTE_FLAGS (nb_add , NB_ADD )
540
+ COMPUTE_FLAGS (nb_subtract , NB_SUBTRACT )
541
+ COMPUTE_FLAGS (nb_multiply , NB_MULTIPLY )
542
+ COMPUTE_FLAGS (nb_remainder , NB_REMAINDER )
543
+ COMPUTE_FLAGS (nb_divmod , NB_DIVMOD )
544
+ COMPUTE_FLAGS (nb_power , NB_POWER )
545
+ COMPUTE_FLAGS (nb_negative , NB_NEGATIVE )
546
+ COMPUTE_FLAGS (nb_positive , NB_POSITIVE )
547
+ COMPUTE_FLAGS (nb_absolute , NB_ABSOLUTE )
548
+ COMPUTE_FLAGS (nb_bool , NB_BOOL )
549
+ COMPUTE_FLAGS (nb_invert , NB_INVERT )
550
+ COMPUTE_FLAGS (nb_lshift , NB_LSHIFT )
551
+ COMPUTE_FLAGS (nb_rshift , NB_RSHIFT )
552
+ COMPUTE_FLAGS (nb_and , NB_AND )
553
+ COMPUTE_FLAGS (nb_xor , NB_XOR )
554
+ COMPUTE_FLAGS (nb_or , NB_OR )
555
+ COMPUTE_FLAGS (nb_int , NB_INT )
556
+ COMPUTE_FLAGS (nb_float , NB_FLOAT )
557
+ COMPUTE_FLAGS (nb_inplace_add , NB_INPLACE_ADD )
558
+ COMPUTE_FLAGS (nb_inplace_subtract , NB_INPLACE_SUBTRACT )
559
+ COMPUTE_FLAGS (nb_inplace_multiply , NB_INPLACE_MULTIPLY )
560
+ COMPUTE_FLAGS (nb_inplace_remainder , NB_INPLACE_REMAINDER )
561
+ COMPUTE_FLAGS (nb_inplace_power , NB_INPLACE_POWER )
562
+ COMPUTE_FLAGS (nb_inplace_lshift , NB_INPLACE_LSHIFT )
563
+ COMPUTE_FLAGS (nb_inplace_rshift , NB_INPLACE_RSHIFT )
564
+ COMPUTE_FLAGS (nb_inplace_and , NB_INPLACE_AND )
565
+ COMPUTE_FLAGS (nb_inplace_xor , NB_INPLACE_XOR )
566
+ COMPUTE_FLAGS (nb_inplace_or , NB_INPLACE_OR )
567
+ COMPUTE_FLAGS (nb_floor_divide , NB_FLOOR_DIVIDE )
568
+ COMPUTE_FLAGS (nb_true_divide , NB_TRUE_DIVIDE )
569
+ COMPUTE_FLAGS (nb_inplace_floor_divide , NB_INPLACE_FLOOR_DIVIDE )
570
+ COMPUTE_FLAGS (nb_inplace_true_divide , NB_INPLACE_TRUE_DIVIDE )
571
+ COMPUTE_FLAGS (nb_index , NB_INDEX )
572
+ COMPUTE_FLAGS (nb_matrix_multiply , NB_MATRIX_MULTIPLY )
573
+ COMPUTE_FLAGS (nb_inplace_matrix_multiply , NB_INPLACE_MATRIX_MULTIPLY )
574
+ #undef COMPUTE_FLAGS
575
+ }
576
+
577
+ PySequenceMethods * sequence = cls -> tp_as_sequence ;
578
+ if (sequence != NULL ) {
579
+ #define COMPUTE_FLAGS (NAME , BIT_IDX ) flags |= ((sequence->NAME != NULL) * BIT_IDX);
580
+ COMPUTE_FLAGS (sq_length , SQ_LENGTH )
581
+ COMPUTE_FLAGS (sq_concat , SQ_CONCAT )
582
+ COMPUTE_FLAGS (sq_repeat , SQ_REPEAT )
583
+ COMPUTE_FLAGS (sq_item , SQ_ITEM )
584
+ COMPUTE_FLAGS (sq_ass_item , SQ_ASS_ITEM )
585
+ COMPUTE_FLAGS (sq_contains , SQ_CONTAINS )
586
+ COMPUTE_FLAGS (sq_inplace_concat , SQ_INPLACE_CONCAT )
587
+ COMPUTE_FLAGS (sq_inplace_repeat , SQ_INPLACE_REPEAT )
588
+ #undef COMPUTE_FLAGS
589
+ }
590
+
591
+ PyMappingMethods * mapping = cls -> tp_as_mapping ;
592
+ if (mapping != NULL ) {
593
+ #define COMPUTE_FLAGS (NAME , BIT_IDX ) flags |= ((mapping->NAME != NULL) * BIT_IDX);
594
+ COMPUTE_FLAGS (mp_length , MP_LENGTH )
595
+ COMPUTE_FLAGS (mp_subscript , MP_SUBSCRIPT )
596
+ COMPUTE_FLAGS (mp_ass_subscript , MP_ASS_SUBSCRIPT )
597
+ #undef COMPUTE_FLAGS
598
+ }
599
+ return flags ;
600
+ }
601
+
530
602
// not quite as in CPython, this assumes that x is already a double. The rest of
531
603
// the implementation is in the Float constructor in Java
532
604
PyObject * float_subtype_new (PyTypeObject * type , double x ) {
0 commit comments