From e70f4b05c8b661c0930eb2ea3a079ea3dcbaae87 Mon Sep 17 00:00:00 2001 From: Bob Ippolito Date: Mon, 23 Aug 2021 21:04:33 -0700 Subject: Implement _asdict() check for pure python path as well --- simplejson/encoder.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/simplejson/encoder.py b/simplejson/encoder.py index 7ea172e..2f81cab 100644 --- a/simplejson/encoder.py +++ b/simplejson/encoder.py @@ -520,7 +520,10 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, else: _asdict = _namedtuple_as_object and getattr(value, '_asdict', None) if _asdict and callable(_asdict): - chunks = _iterencode_dict(_asdict(), + dct = _asdict() + if not isinstance(dct, dict): + raise TypeError("_asdict() must return a dict, not %s" % (type(dct).__name__,)) + chunks = _iterencode_dict(dct, _current_indent_level) elif _tuple_as_array and isinstance(value, tuple): chunks = _iterencode_list(value, _current_indent_level) @@ -641,7 +644,10 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, else: _asdict = _namedtuple_as_object and getattr(value, '_asdict', None) if _asdict and callable(_asdict): - chunks = _iterencode_dict(_asdict(), + dct = _asdict() + if not isinstance(dct, dict): + raise TypeError("_asdict() must return a dict, not %s" % (type(dct).__name__,)) + chunks = _iterencode_dict(dct, _current_indent_level) elif _tuple_as_array and isinstance(value, tuple): chunks = _iterencode_list(value, _current_indent_level) @@ -686,8 +692,10 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, else: _asdict = _namedtuple_as_object and getattr(o, '_asdict', None) if _asdict and callable(_asdict): - for chunk in _iterencode_dict(_asdict(), - _current_indent_level): + dct = _asdict() + if not isinstance(dct, dict): + raise TypeError("_asdict() must return a dict, not %s" % (type(dct).__name__,)) + for chunk in _iterencode_dict(dct, _current_indent_level): yield chunk elif (_tuple_as_array and isinstance(o, tuple)): for chunk in _iterencode_list(o, _current_indent_level): -- cgit v1.2.1