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

Raise TypeError when calling __new__ unsafely #4455

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

garychia
Copy link
Contributor

Related to #3692
This implementation is based on the following code from CPython.
https://github.com/python/cpython/blob/206f05a46b426eb374f724f8e7cd42f2f9643bb8/Objects/typeobject.c#L7685-L7700
image

Copy link
Member

@youknowone youknowone left a comment

Choose a reason for hiding this comment

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

CI Failure came from successful test.

test_subclass (test.test_bool.BoolTest) ... unexpected success

Because you fixed the bug, you can remove @unittest.expectedFailure decorator from the test.

Thank you!

@garychia
Copy link
Contributor Author

I found the following issue in test_ast.py.

image

But I'm sure if it is related to my code. It seems that typ in call_slot_new is set to object instead of Constant for some reason.

}
}
if let Some(ref basetype) = staticbase {
if !PyType::subclasscheck(basetype.to_owned(), typ.to_owned()) {
Copy link
Member

Choose a reason for hiding this comment

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

PyType_IsSubtype in CPython is same to fast_issubclass in RustPython

@DimitrisJim
Copy link
Member

Hey @garychia do you still have time/want to work on this?

@garychia
Copy link
Contributor Author

Hi, @DimitrisJim! I was struggling to solve the problem that happens when running the test_ast test as I mentioned before. Based on my observation, RustPython tried to construct an N object by using object.__new__, which is not safe. But I have no idea why it behaved this way and whether it relates to my code.
This piece of code triggered the problem:

class N(ast.Num):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.z = 'spam'
class N2(ast.Num):
pass
n = N(42)

@youknowone youknowone added C-bug Something isn't working A-vm Area: virtual machine labels Mar 28, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-vm Area: virtual machine C-bug Something isn't working
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants