Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Remove check for float subclasses with nb_float == NULL in PyNumber_Float() ? #112636

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

Closed
skirpichev opened this issue Dec 3, 2023 · 5 comments
Closed
Labels
type-bug An unexpected behavior, bug, or error

Comments

@skirpichev
Copy link
Contributor

skirpichev commented Dec 3, 2023

Similar check for int subclasses without nb_int was removed in 31a6554 from PyNumber_Long().

// transformed to a separate issue per @serhiy-storchaka suggestion in #112145

Linked PRs

@skirpichev skirpichev added the type-bug An unexpected behavior, bug, or error label Dec 3, 2023
skirpichev added a commit to skirpichev/cpython that referenced this issue Dec 3, 2023
@serhiy-storchaka
Copy link
Member

I still not sure what is more correct. Should we remove the check for float subclasses without nb_float? Did I make a mistake when I deleted the check for int subclasses without nb_int? Both cases are pretty hypothetical now, but we can't change the code without reason, and I don't remember my reasoning.

cc @mdickinson

@skirpichev
Copy link
Contributor Author

Simple question: when it could be NULL? Clearly, this won't work for simple static types with tp_base set to PyFloat_Type (or it's subtype). Multiple inheritance?

@serhiy-storchaka
Copy link
Member

You can create a float subclass in C and explicitly set nb_float to NULL.

@skirpichev
Copy link
Contributor Author

skirpichev commented May 14, 2024

You can create a float subclass in C and explicitly set nb_float to NULL

@serhiy-storchaka, I think in this way we could break anything:)

Here is a minimal example, when nb_float == NULL condition could be triggered. (Let me know if you had in mind something simpler.) Should we support such scenario? I doubt.

Subclass code:

static PyNumberMethods xxx_as_number = {
    .nb_float = NULL,  /* nb_float will be inherited anyway */
};

static PyObject*
fun(PyObject *o, PyObject *Py_UNUSED(ignored))
{
    PyNumberMethods *m = Py_TYPE(o)->tp_as_number;
    m->nb_float = NULL;
    Py_RETURN_NONE;
}

static PyMethodDef xxx_methods[] = {
    {"break_it", (PyCFunction) fun, METH_NOARGS, NULL},
    {NULL},
};

PyTypeObject XXX_Type = {
    PyVarObject_HEAD_INIT(NULL, 0)
    .tp_name = "xxx",
    .tp_basicsize = sizeof(PyFloatObject),
    .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
    .tp_base = &PyFloat_Type,
    .tp_as_number = &xxx_as_number,
    .tp_methods = xxx_methods,
};

Session example:

>>> a = xxx(3.14)
>>> float(a)  # nb_float == NULL is not triggered, due to inheritance
3.14
>>> a.break_it()
>>> float(a)  # and only NOW this branch will work...
XXX
3.14

Edit: pr description was updated with this example.

@skirpichev
Copy link
Contributor Author

@serhiy-storchaka, I'm closing issue as well. Let me know if we should add a test for this.

PS: As noted in the pr #112637 (comment), the integer workaround shouldn't be restored.

@skirpichev skirpichev closed this as not planned Won't fix, can't repro, duplicate, stale Nov 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

No branches or pull requests

2 participants