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? |