Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-106917: fix super classmethod calls to non-classmethods #106977

Merged
merged 4 commits into from
Jul 24, 2023

Conversation

carljm
Copy link
Member

@carljm carljm commented Jul 21, 2023

The fix for #105035 was subtly incomplete. It checked that cls->tp_getattro == PyObject_GetGenericAttr (as a precondition for attempting the load-method optimization), but what we really need to know is that Py_TYPE(self)->tp_getattro == PyObject_GenericGetAttr. In the typical case of super(MyClass, instance)... these are effectively the same thing (instance will be an instance of MyClass), but in a classmethod super() call (super(MyClass, MyClass)...) they are quite different; the type of MyClass is type, which has a different tp_getattro.

For actual classmethods this was fine; the load-method optimization still works correctly for classmethods looked up on types. But it doesn't work for regular methods (plain function objects) looked up on types; those are just regular function calls with no bound method behavior.

It's pretty unusual to use classmethod-style super where the call target is a regular function, not a classmethod. But it can occur, e.g. if using super with __new__ and dynamically-assigned __new__ methods, as in #106917.

* main:
  pythongh-106004: Add PyDict_GetItemRef() function (python#106005)
@carljm carljm self-assigned this Jul 21, 2023
Copy link
Member

@Fidget-Spinner Fidget-Spinner left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. This is quite the subtlety. LGTM in general. I just have a comment about the tests.

carljm added 2 commits July 24, 2023 10:21
* main: (73 commits)
  Thoroughly refactor the cases generator (python#107151)
  Docs: Add missing markup to Argument Clinic docs (python#106876)
  pythongh-107162: Document errcode.h usage in its comment (python#107177)
  pythongh-106320: Remove private _PyDict C API (python#107145)
  Fix PyVectorcall_Function doc versionadded (python#107140)
  Docs: Remove duplicate word in Argument Clinic howto heading (python#107169)
  pythongh-107017: Change Chapter Strings to Texts in the Introduction chapter. (python#107104)
  pythongh-106320: Remove private _PyObject C API (python#107159)
  Docs: fix typo in os.pwrite docstring (python#107087)
  pythongh-105291: Add link to migration guide for distutils (python#107130)
  pythongh-106948: Docs: Disable links for C standard library functions, OS utility functions and system calls (python#107062)
  pythongh-106320: Remove _PyBytes_Join() C API (python#107144)
  pythongh-106320: Remove private _PyObject C API (python#107147)
  pythongh-106320: Remove _PyTuple_MaybeUntrack() C API (python#107143)
  pythongh-106320: Remove _PyIsSelectable_fd() C API (python#107142)
  Remove superflous whitespaces in `layout.html`. (pythonGH-107067)
  pythongh-107122: Update what's news for dbm.*dbm.clear() method (pythongh-107135)
  pythongh-107122: Add clear method to dbm.ndbm module (pythongh-107126)
  pythongh-62519: Make pgettext search plurals when translation is not found (python#107118)
  pythongh-107122: Add clear method to dbm.gdbm.module (pythongh-107127)
  ...
@carljm carljm merged commit e5d5522 into python:main Jul 24, 2023
@miss-islington
Copy link
Contributor

Thanks @carljm for the PR 🌮🎉.. I'm working now to backport this PR to: 3.12.
🐍🍒⛏🤖

@miss-islington
Copy link
Contributor

Sorry, @carljm, I could not cleanly backport this to 3.12 due to a conflict.
Please backport using cherry_picker on command line.
cherry_picker e5d5522612e03af3941db1d270bf6caebf330b8a 3.12

@carljm carljm deleted the superfix branch July 24, 2023 20:15
carljm added a commit to carljm/cpython that referenced this pull request Jul 24, 2023
…ds (pythonGH-106977).

(cherry picked from commit e5d5522)

Co-authored-by: Carl Meyer <carl@oddbird.net>
@bedevere-bot
Copy link

GH-107204 is a backport of this pull request to the 3.12 branch.

@bedevere-bot bedevere-bot removed the needs backport to 3.12 only security fixes label Jul 24, 2023
carljm added a commit that referenced this pull request Jul 24, 2023
facebook-github-bot pushed a commit to facebookincubator/cinder that referenced this pull request Mar 30, 2025
Summary:
Fixes a couple of issues which are causing `test_super` to fail on 3.12:
1) We don't actually respect the global super object at all! We are using the exported Cinder function to implement this on 3.10, but just calling the equivalent of `Ci_Super_Lookup` on 3.12. Because we need to have the `global_super != &PySuper_Type` logic on 3.12 this just brings it over and stops exporting it from Cinder 3.10.
3) We get `no_args_in_super_call` backwards as oparg is effectively the number of arguments.
2) Ports the fix in python/cpython#106977 to the implementation of super in both the JIT and Cinder 3.10.

Reviewed By: alexmalyshev

Differential Revision: D71638145

fbshipit-source-id: 0f5a189d8cea573034e578c921925ce2988c3bb1
facebook-github-bot pushed a commit to facebookincubator/cinderx that referenced this pull request Mar 30, 2025
Summary:
Fixes a couple of issues which are causing `test_super` to fail on 3.12:
1) We don't actually respect the global super object at all! We are using the exported Cinder function to implement this on 3.10, but just calling the equivalent of `Ci_Super_Lookup` on 3.12. Because we need to have the `global_super != &PySuper_Type` logic on 3.12 this just brings it over and stops exporting it from Cinder 3.10.
3) We get `no_args_in_super_call` backwards as oparg is effectively the number of arguments.
2) Ports the fix in python/cpython#106977 to the implementation of super in both the JIT and Cinder 3.10.

Reviewed By: alexmalyshev

Differential Revision: D71638145

fbshipit-source-id: 0f5a189d8cea573034e578c921925ce2988c3bb1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Development

Successfully merging this pull request may close these issues.

None yet

5 participants