Issue1004669
This issue tracker has been migrated to GitHub,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2004-08-06 15:08 by bhandley, last changed 2022-04-11 14:56 by admin. This issue is now closed.
Messages (5) | |||
---|---|---|---|
msg21969 - (view) | Author: ben handley (bhandley) | Date: 2004-08-06 15:08 | |
When passing a mapping object as the locals to eval, it doesn't check that the return value of .keys() is a tuple early enough, resulting in a SystemError: >>> class C: ... def __getitem__(self, item): ... raise KeyError, item ... def keys(self): ... return 'a' ... >>> c=C() >>> print eval('dir()', globals(), c) Traceback (most recent call last): File "<stdin>", line 1, in ? File "<string>", line 0, in ? SystemError: Objects/listobject.c:2110: bad argument to internal function |
|||
msg21970 - (view) | Author: Ilya Sandler (isandler) | Date: 2004-08-06 18:49 | |
Logged In: YES user_id=971153 Why do you think the existing behaviour is wrong? All Python type checking is done at run time E.g. >>> 12+"123" Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: unsupported operand types for +: 'int' and 'str' How is your example different? I would suggest to close the bug |
|||
msg21971 - (view) | Author: ben handley (bhandley) | Date: 2004-08-06 23:05 | |
Logged In: YES user_id=765626 If it raised a TypeError rather than SystemError I would think it fine. I didn't think that python code should be able to cause correct C code to generate `bad argument to internal function'. To me, that sounds like `some C function called some other C function badly', rather than just a bad type from python. In fact I believe that that is exactly what is happening. Here are the final two lines from the backtrace: #0 PyList_Sort (v=0x4029bc20) at Objects/listobject.c:2110 #1 0x0807b659 in PyObject_Dir (arg=0x0) at Objects/object.c:1705 PyList_Sort seems to assume that it will always be passed a list, hence it calls PyErr_BadInternalCall() if it's not. Assuming this is true, either PyObject_Dir or PyMapping_Keys should do the type checking and raise TypeError if it's not a list. Doesn't PyErr_BadInternalCall() mean that someone violated the C API of an internal function, therefore the bug is in C code rather than python? |
|||
msg21972 - (view) | Author: Raymond Hettinger (rhettinger) * | Date: 2004-08-06 23:43 | |
Logged In: YES user_id=80475 It's a bug. Will fix. |
|||
msg21973 - (view) | Author: Raymond Hettinger (rhettinger) * | Date: 2004-08-07 04:55 | |
Logged In: YES user_id=80475 Fixed. See: Objects/object.c 2.220 Lib/ test/test_builtin.py 1.33 Thanks for the clear bug report and diagnosis. |
History | |||
---|---|---|---|
Date | User | Action | Args |
2022-04-11 14:56:06 | admin | set | github: 40701 |
2004-08-06 15:08:08 | bhandley | create |