@@ -630,20 +630,79 @@ string_item(PyStringObject *a, register int i)
630630 return v ;
631631}
632632
633- static int
634- string_compare (PyStringObject * a , PyStringObject * b )
633+ static PyObject *
634+ string_richcompare (PyStringObject * a , PyStringObject * b , int op )
635635{
636- int len_a = a -> ob_size , len_b = b -> ob_size ;
637- int min_len = (len_a < len_b ) ? len_a : len_b ;
638- int cmp ;
636+ int c ;
637+ int len_a , len_b ;
638+ int min_len ;
639+ PyObject * result ;
640+
641+ /* One of the objects is a string object. Make sure the
642+ other one is one, too. */
643+ if (a -> ob_type != b -> ob_type ) {
644+ result = Py_NotImplemented ;
645+ goto out ;
646+ }
647+ if (a == b ) {
648+ switch (op ) {
649+ case Py_EQ :case Py_LE :case Py_GE :
650+ result = Py_True ;
651+ goto out ;
652+ case Py_NE :case Py_LT :case Py_GT :
653+ result = Py_False ;
654+ goto out ;
655+ }
656+ }
657+ if (op == Py_EQ ) {
658+ /* Supporting Py_NE here as well does not save
659+ much time, since Py_NE is rarely used. */
660+ if (a -> ob_size == b -> ob_size
661+ && (a -> ob_sval [0 ] == b -> ob_sval [0 ]
662+ && memcmp (a -> ob_sval , b -> ob_sval ,
663+ a -> ob_size ) == 0 )) {
664+ result = Py_True ;
665+ } else {
666+ result = Py_False ;
667+ }
668+ goto out ;
669+ }
670+ len_a = a -> ob_size ; len_b = b -> ob_size ;
671+ min_len = (len_a < len_b ) ? len_a : len_b ;
639672 if (min_len > 0 ) {
640- cmp = Py_CHARMASK (* a -> ob_sval ) - Py_CHARMASK (* b -> ob_sval );
641- if (cmp == 0 )
642- cmp = memcmp (a -> ob_sval , b -> ob_sval , min_len );
643- if (cmp != 0 )
644- return cmp ;
673+ c = Py_CHARMASK (* a -> ob_sval ) - Py_CHARMASK (* b -> ob_sval );
674+ if (c == 0 )
675+ c = memcmp (a -> ob_sval , b -> ob_sval , min_len );
676+ }else
677+ c = 0 ;
678+ if (c == 0 )
679+ c = (len_a < len_b ) ? -1 : (len_a > len_b ) ? 1 : 0 ;
680+ switch (op ) {
681+ case Py_LT : c = c < 0 ; break ;
682+ case Py_LE : c = c <= 0 ; break ;
683+ case Py_EQ : assert (0 ); break ; /* unreachable */
684+ case Py_NE : c = c != 0 ; break ;
685+ case Py_GT : c = c > 0 ; break ;
686+ case Py_GE : c = c >= 0 ; break ;
687+ default :
688+ result = Py_NotImplemented ;
689+ goto out ;
645690 }
646- return (len_a < len_b ) ? -1 : (len_a > len_b ) ? 1 : 0 ;
691+ result = c ? Py_True : Py_False ;
692+ out :
693+ Py_INCREF (result );
694+ return result ;
695+ }
696+
697+ int
698+ _PyString_Eq (PyObject * o1 , PyObject * o2 )
699+ {
700+ PyStringObject * a , * b ;
701+ a = (PyStringObject * )o1 ;
702+ b = (PyStringObject * )o2 ;
703+ return a -> ob_size == b -> ob_size
704+ && * a -> ob_sval == * b -> ob_sval
705+ && memcmp (a -> ob_sval , b -> ob_sval , a -> ob_size ) == 0 ;
647706}
648707
649708static long
@@ -2466,7 +2525,7 @@ PyTypeObject PyString_Type = {
24662525 (printfunc )string_print , /*tp_print*/
24672526 (getattrfunc )string_getattr , /*tp_getattr*/
24682527 0 , /*tp_setattr*/
2469- ( cmpfunc ) string_compare , /*tp_compare*/
2528+ 0 , /*tp_compare*/
24702529 (reprfunc )string_repr , /*tp_repr*/
24712530 0 , /*tp_as_number*/
24722531 & string_as_sequence , /*tp_as_sequence*/
@@ -2479,6 +2538,12 @@ PyTypeObject PyString_Type = {
24792538 & string_as_buffer , /*tp_as_buffer*/
24802539 Py_TPFLAGS_DEFAULT , /*tp_flags*/
24812540 0 , /*tp_doc*/
2541+ 0 , /*tp_traverse*/
2542+ 0 , /*tp_clear*/
2543+ (richcmpfunc )string_richcompare , /*tp_richcompare*/
2544+ 0 , /*tp_weaklistoffset*/
2545+ 0 , /*tp_iter*/
2546+ 0 , /*tp_iternext*/
24822547};
24832548
24842549void
0 commit comments