New submission from Oren Milman: the following code causes a SystemError:
import json.encoder class BadDict(dict): def items(self): return () encoder = json.encoder.c_make_encoder(None, None, None, None, 'foo', 'bar', True, None, None) encoder(obj=BadDict({'spam': 42}), _current_indent_level=4) this is because encoder_call() (in Modules/_json.c) passes the 'obj' argument so that eventually encoder_listencode_dict() calls PyMapping_Items() on it. encoder_listencode_dict() assumes that PyMapping_Items() returned a list, and passes it to PyList_Sort(). ISTM that subclassing dict and implementing items() so that it returns a tuple is not unrealistic. maybe we should silently convert the tuple that PyMapping_Items() returned to a list? ---------- components: Extension Modules messages: 302278 nosy: Oren Milman priority: normal severity: normal status: open title: calling a _json.Encoder object raises a SystemError in case obj.items() returned a tuple type: behavior versions: Python 3.7 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue31486> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com