Fix dbus.Byte JSON encoding

dbus.Byte is not encoded by the JSON library in Python2.7
correctly.  There was a hack added to dbus-python to
work around this.

Backport the JSON library fix from Python 3.x back to
Python2.7, so we can drop the hack from dbus-python.

Tested: verified encoding of dbus.Byte unchanged
Change-Id: Ifc8e0d22a25f4dd52da5a136809df25771684438
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/common/recipes-devtools/python/python/0001-json-Use-int-long.__str__-to-convert-subclasses.patch b/common/recipes-devtools/python/python/0001-json-Use-int-long.__str__-to-convert-subclasses.patch
new file mode 100644
index 0000000..26669d8
--- /dev/null
+++ b/common/recipes-devtools/python/python/0001-json-Use-int-long.__str__-to-convert-subclasses.patch
@@ -0,0 +1,128 @@
+From b002fd4b884b5f8cd3f429ea2002dd19e91d1d91 Mon Sep 17 00:00:00 2001
+From: Brad Bishop <bradleyb@fuzziesquirrel.com>
+Date: Thu, 7 Jun 2018 09:18:01 -0400
+Subject: [PATCH] json: Use int/long.__str__ to convert subclasses
+
+Based on changes that went into 3.x:
+
+e0805cf10ea84b44a13ad5649267edba7cb83ee9
+a4998a70416c27730e75c0a4225ee2c3552b1618
+---
+ Lib/json/encoder.py | 26 ++++++++++++++++++--------
+ Modules/_json.c     | 21 +++++++++++++++++----
+ 2 files changed, 35 insertions(+), 12 deletions(-)
+
+diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py
+index 97ffe8e8a2..3156682fdd 100644
+--- a/Lib/json/encoder.py
++++ b/Lib/json/encoder.py
+@@ -283,6 +283,8 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
+         long=long,
+         str=str,
+         tuple=tuple,
++        _intstr=int.__str__,
++        _longstr=long.__str__,
+     ):
+ 
+     def _iterencode_list(lst, _current_indent_level):
+@@ -317,8 +319,10 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
+                 yield buf + 'true'
+             elif value is False:
+                 yield buf + 'false'
+-            elif isinstance(value, (int, long)):
+-                yield buf + str(value)
++            elif isinstance(value, int):
++                yield buf + _intstr(value)
++            elif isinstance(value, long):
++                yield buf + _longstr(value)
+             elif isinstance(value, float):
+                 yield buf + _floatstr(value)
+             else:
+@@ -374,8 +378,10 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
+                 key = 'false'
+             elif key is None:
+                 key = 'null'
+-            elif isinstance(key, (int, long)):
+-                key = str(key)
++            elif isinstance(key, int):
++                key = _intstr(key)
++            elif isinstance(key, long):
++                key = _longstr(key)
+             elif _skipkeys:
+                 continue
+             else:
+@@ -394,8 +400,10 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
+                 yield 'true'
+             elif value is False:
+                 yield 'false'
+-            elif isinstance(value, (int, long)):
+-                yield str(value)
++            elif isinstance(value, int):
++                yield _intstr(value)
++            elif isinstance(value, long):
++                yield _longstr(value)
+             elif isinstance(value, float):
+                 yield _floatstr(value)
+             else:
+@@ -423,8 +431,10 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr,
+             yield 'true'
+         elif o is False:
+             yield 'false'
+-        elif isinstance(o, (int, long)):
+-            yield str(o)
++        elif isinstance(o, long):
++            yield _longstr(o)
++        elif isinstance(o, int):
++            yield _intstr(o)
+         elif isinstance(o, float):
+             yield _floatstr(o)
+         elif isinstance(o, (list, tuple)):
+diff --git a/Modules/_json.c b/Modules/_json.c
+index 39ec467b09..f429738145 100644
+--- a/Modules/_json.c
++++ b/Modules/_json.c
+@@ -1981,12 +1981,19 @@ encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssi
+             return -1;
+         return _steal_list_append(rval, encoded);
+     }
+-    else if (PyInt_Check(obj) || PyLong_Check(obj)) {
+-        PyObject *encoded = PyObject_Str(obj);
++    else if (PyLong_Check(obj)) {
++        PyObject *encoded = PyLong_Type.tp_str(obj);
+         if (encoded == NULL)
+             return -1;
+         return _steal_list_append(rval, encoded);
+     }
++    else if (PyInt_Check(obj)) {
++        PyObject *encoded = PyInt_Type.tp_str(obj);
++        if (encoded == NULL)
++            return -1;
++        return _steal_list_append(rval, encoded);
++    }
++
+     else if (PyFloat_Check(obj)) {
+         PyObject *encoded = encoder_encode_float(s, obj);
+         if (encoded == NULL)
+@@ -2131,11 +2138,17 @@ encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ss
+             if (kstr == NULL)
+                 goto bail;
+         }
+-        else if (PyInt_Check(key) || PyLong_Check(key)) {
+-            kstr = PyObject_Str(key);
++        else if (PyLong_Check(key)) {
++            kstr = PyLong_Type.tp_str(key);
+             if (kstr == NULL)
+                 goto bail;
+         }
++        else if (PyInt_Check(key)) {
++            kstr = PyInt_Type.tp_str(key);
++            if (kstr == NULL)
++                goto bail;
++        }
++
+         else if (key == Py_True || key == Py_False || key == Py_None) {
+             kstr = _encoded_const(key);
+             if (kstr == NULL)
+-- 
+2.14.3
+
diff --git a/common/recipes-devtools/python/python_2.%.bbappend b/common/recipes-devtools/python/python_2.%.bbappend
index 569e753..e591a95 100644
--- a/common/recipes-devtools/python/python_2.%.bbappend
+++ b/common/recipes-devtools/python/python_2.%.bbappend
@@ -1,5 +1,6 @@
 FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
 SRC_URI += "file://__init__.email_min.py"
+SRC_URI += "file://0001-json-Use-int-long.__str__-to-convert-subclasses.patch"
 
 do_install_append_class-target() {
 	dir=${libdir}/python${PYTHON_MAJMIN}/email