@@ -1570,17 +1570,18 @@ dummy_func(
15701570
15711571 family (load_super_attr , INLINE_CACHE_ENTRIES_LOAD_SUPER_ATTR ) = {
15721572 LOAD_SUPER_ATTR ,
1573+ LOAD_SUPER_ATTR_ATTR ,
15731574 LOAD_SUPER_ATTR_METHOD ,
15741575 };
15751576
1576- inst (LOAD_SUPER_ATTR , (unused /9 , global_super , class , self -- res2 if (oparg & 1 ), res )) {
1577+ inst (LOAD_SUPER_ATTR , (unused /1 , global_super , class , self -- res2 if (oparg & 1 ), res )) {
15771578 PyObject * name = GETITEM (frame -> f_code -> co_names , oparg >> 2 );
15781579 int load_method = oparg & 1 ;
15791580 #if ENABLE_SPECIALIZATION
15801581 _PySuperAttrCache * cache = (_PySuperAttrCache * )next_instr ;
15811582 if (ADAPTIVE_COUNTER_IS_ZERO (cache -> counter )) {
15821583 next_instr -- ;
1583- _Py_Specialize_LoadSuperAttr (global_super , class , self , next_instr , name , load_method );
1584+ _Py_Specialize_LoadSuperAttr (global_super , class , next_instr , load_method );
15841585 DISPATCH_SAME_OPARG ();
15851586 }
15861587 STAT_INC (LOAD_SUPER_ATTR , deferred );
@@ -1622,17 +1623,38 @@ dummy_func(
16221623 ERROR_IF (res == NULL , error );
16231624 }
16241625
1625- inst (LOAD_SUPER_ATTR_METHOD , (unused /1 , class_version /2 , self_type_version /2 , method /4 , global_super , class , self -- res2 , res )) {
1626+ inst (LOAD_SUPER_ATTR_ATTR , (unused /1 , global_super , class , self -- res2 if (oparg & 1 ), res )) {
1627+ assert (!(oparg & 1 ));
16261628 DEOPT_IF (global_super != (PyObject * )& PySuper_Type , LOAD_SUPER_ATTR );
16271629 DEOPT_IF (!PyType_Check (class ), LOAD_SUPER_ATTR );
1628- DEOPT_IF (((PyTypeObject * )class )-> tp_version_tag != class_version , LOAD_SUPER_ATTR );
1629- PyTypeObject * self_type = Py_TYPE (self );
1630- DEOPT_IF (self_type -> tp_version_tag != self_type_version , LOAD_SUPER_ATTR );
1631- res2 = method ;
1632- res = self ; // transfer ownership
1633- Py_INCREF (res2 );
1630+ STAT_INC (LOAD_SUPER_ATTR , hit );
1631+ PyObject * name = GETITEM (frame -> f_code -> co_names , oparg >> 2 );
1632+ res = _PySuper_Lookup ((PyTypeObject * )class , self , name , NULL );
1633+ ERROR_IF (res == NULL , error );
1634+ DECREF_INPUTS ();
1635+ }
1636+
1637+ inst (LOAD_SUPER_ATTR_METHOD , (unused /1 , global_super , class , self -- res2 , res )) {
1638+ assert (oparg & 1 );
1639+ DEOPT_IF (global_super != (PyObject * )& PySuper_Type , LOAD_SUPER_ATTR );
1640+ DEOPT_IF (!PyType_Check (class ), LOAD_SUPER_ATTR );
1641+ STAT_INC (LOAD_SUPER_ATTR , hit );
1642+ PyObject * name = GETITEM (frame -> f_code -> co_names , oparg >> 2 );
1643+ int method_found = 0 ;
1644+ res2 = _PySuper_Lookup ((PyTypeObject * )class , self , name , & method_found );
16341645 Py_DECREF (global_super );
16351646 Py_DECREF (class );
1647+ if (res2 == NULL ) {
1648+ Py_DECREF (self );
1649+ ERROR_IF (true, error );
1650+ }
1651+ if (method_found ) {
1652+ res = self ; // transfer ownership
1653+ } else {
1654+ Py_DECREF (self );
1655+ res = res2 ;
1656+ res2 = NULL ;
1657+ }
16361658 }
16371659
16381660 family (load_attr , INLINE_CACHE_ENTRIES_LOAD_ATTR ) = {
0 commit comments