diff options
author | Patrick McLean <chutzpah@gentoo.org> | 2017-04-14 18:17:12 -0700 |
---|---|---|
committer | Patrick McLean <chutzpah@gentoo.org> | 2017-04-14 18:17:12 -0700 |
commit | c3a74efba946c7428e8984f810fdd5d219f3c16d (patch) | |
tree | bb9877053aad15058cd0f42762447ce0f39d0337 /dev-python | |
parent | sys-kernel/gentoo-sources: Fix for CVE-2016-10229. Unsafe second checksum cal... (diff) | |
download | gentoo-c3a74efba946c7428e8984f810fdd5d219f3c16d.tar.gz gentoo-c3a74efba946c7428e8984f810fdd5d219f3c16d.tar.bz2 gentoo-c3a74efba946c7428e8984f810fdd5d219f3c16d.zip |
dev-python/ujson: Version bump to 1.35
Also pull in a few bugfixes from upstream and fix a DeprecationWarning in the
tests.
Package-Manager: Portage-2.3.5, Repoman-2.3.2
Diffstat (limited to 'dev-python')
8 files changed, 992 insertions, 0 deletions
diff --git a/dev-python/ujson/Manifest b/dev-python/ujson/Manifest index aa37f161ee91..04f6da34d64d 100644 --- a/dev-python/ujson/Manifest +++ b/dev-python/ujson/Manifest @@ -1 +1,2 @@ DIST ujson-1.33.zip 197034 SHA256 68cf825f227c82e1ac61e423cfcad923ff734c27b5bdd7174495d162c42c602b SHA512 0f1f66212fbf94c03e048ba64c3bd817c50443d1a29b87f6a3a38f697a050f38821be4ba36a3b17a96930c69ee92973ac31bdd41851dea071af14cd4bbaf8480 WHIRLPOOL d3080fcf3e979b43deb8fe099427a8311c55e7e54105626bf12b3b6fe9e8567f70501884bd24b7a26d53ddfcd98f535de4aa708801106aa4a1b76e543217835c +DIST ujson-1.35.tar.gz 192027 SHA256 f66073e5506e91d204ab0c614a148d5aa938bdbf104751be66f8ad7a222f5f86 SHA512 931d8f574fc4920c9ded48369774666060e951f40982606ce9f1d9de3420004042af7d797075a54d92a2b25c4f313572a5e1a30f3bc8ce387ef8f3881193eee7 WHIRLPOOL aff7a034304366e95ec51164de78afbee8daa496022abdae1b9928ea90928758e675027f2202ca77790788a3057c978d9ba9348684bc087843aa2e16932a1144 diff --git a/dev-python/ujson/files/ujson-1.35-fix-for-overflowing-long.patch b/dev-python/ujson/files/ujson-1.35-fix-for-overflowing-long.patch new file mode 100644 index 000000000000..98659ce1722b --- /dev/null +++ b/dev-python/ujson/files/ujson-1.35-fix-for-overflowing-long.patch @@ -0,0 +1,84 @@ +commit 409c6d4006fdea27e746ea397124f98c92a41a92 +Author: Joakim Hamren <joakim.hamren@gmail.com> +Date: Sat Feb 4 04:21:05 2017 +0100 + + Fix for overflowing long causing invalid json + + This was caused by checking for "__json__" using PyObject_HasAttrString + which clears the error set by a previous long overflow. Thus this was dependent + on the order of processing of dict items, which explains why it was + seemingly random as the dict items are likely ordered by a hash of + the key. + + This fixes GH224 and GH240. + +diff --git a/python/objToJSON.c b/python/objToJSON.c +index 8133fb5..adea2f6 100644 +--- a/python/objToJSON.c ++++ b/python/objToJSON.c +@@ -226,6 +226,21 @@ static void *PyDateToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, size + return NULL; + } + ++static int PyHasAttrStringPreserveErr(PyObject *obj, const char *attr) ++{ ++ int res; ++ PyObject *excType = NULL, *excValue, *excTraceback; ++ ++ if (!PyErr_Occurred()) ++ return PyObject_HasAttrString(obj, "__json__"); ++ ++ PyErr_Fetch(&excType, &excValue, &excTraceback); ++ res = PyObject_HasAttrString(obj, "__json__"); ++ PyErr_Restore(excType, excValue, excTraceback); ++ ++ return res; ++} ++ + static int Tuple_iterNext(JSOBJ obj, JSONTypeContext *tc) + { + PyObject *item; +@@ -471,21 +486,21 @@ static int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc) + GET_TC(tc)->itemName = PyUnicode_AsUTF8String (GET_TC(tc)->itemName); + } + else +- if (!PyString_Check(GET_TC(tc)->itemName)) +- { +- GET_TC(tc)->itemName = PyObject_Str(GET_TC(tc)->itemName); ++ if (!PyString_Check(GET_TC(tc)->itemName)) ++ { ++ GET_TC(tc)->itemName = PyObject_Str(GET_TC(tc)->itemName); + #if PY_MAJOR_VERSION >= 3 +- itemNameTmp = GET_TC(tc)->itemName; +- GET_TC(tc)->itemName = PyUnicode_AsUTF8String (GET_TC(tc)->itemName); +- Py_DECREF(itemNameTmp); ++ itemNameTmp = GET_TC(tc)->itemName; ++ GET_TC(tc)->itemName = PyUnicode_AsUTF8String (GET_TC(tc)->itemName); ++ Py_DECREF(itemNameTmp); + #endif +- } +- else +- { +- Py_INCREF(GET_TC(tc)->itemName); +- } +- PRINTMARK(); +- return 1; ++ } ++ else ++ { ++ Py_INCREF(GET_TC(tc)->itemName); ++ } ++ PRINTMARK(); ++ return 1; + } + + static void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc) +@@ -728,7 +743,7 @@ static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObject + return; + } + else +- if (PyString_Check(obj) && !PyObject_HasAttrString(obj, "__json__")) ++ if (PyString_Check(obj) && !PyHasAttrStringPreserveErr(obj, "__json__")) + { + PRINTMARK(); + pc->PyTypeToJSON = PyStringToUTF8; tc->type = JT_UTF8; diff --git a/dev-python/ujson/files/ujson-1.35-fix-ordering-of-orderdict.patch b/dev-python/ujson/files/ujson-1.35-fix-ordering-of-orderdict.patch new file mode 100644 index 000000000000..37270d41e3b1 --- /dev/null +++ b/dev-python/ujson/files/ujson-1.35-fix-ordering-of-orderdict.patch @@ -0,0 +1,122 @@ +commit c9f8318bd823ae9d44797b6b881a2b3e22cdbade +Author: Joakim Hamren <joakim.hamren@gmail.com> +Date: Tue Feb 7 02:02:38 2017 +0100 + + Fix for incorrect order when using OrderedDict + +diff --git a/python/objToJSON.c b/python/objToJSON.c +index abe6588..9e6a390 100644 +--- a/python/objToJSON.c ++++ b/python/objToJSON.c +@@ -253,8 +253,13 @@ static int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc) + GET_TC(tc)->itemName = NULL; + } + ++ if (!(GET_TC(tc)->itemName = PyIter_Next(GET_TC(tc)->iterator))) ++ { ++ PRINTMARK(); ++ return 0; ++ } + +- if (!PyDict_Next ( (PyObject *)GET_TC(tc)->dictObj, &GET_TC(tc)->index, &GET_TC(tc)->itemName, &GET_TC(tc)->itemValue)) ++ if (!(GET_TC(tc)->itemValue = PyObject_GetItem(GET_TC(tc)->dictObj, GET_TC(tc)->itemName))) + { + PRINTMARK(); + return 0; +@@ -295,6 +300,7 @@ static void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc) + Py_DECREF(GET_TC(tc)->itemName); + GET_TC(tc)->itemName = NULL; + } ++ Py_CLEAR(GET_TC(tc)->iterator); + Py_DECREF(GET_TC(tc)->dictObj); + PRINTMARK(); + } +@@ -425,20 +431,23 @@ static char *SortedDict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outL + + static void SetupDictIter(PyObject *dictObj, TypeContext *pc, JSONObjectEncoder *enc) + { +- if (enc->sortKeys) { ++ pc->dictObj = dictObj; ++ if (enc->sortKeys) ++ { + pc->iterEnd = SortedDict_iterEnd; + pc->iterNext = SortedDict_iterNext; + pc->iterGetValue = SortedDict_iterGetValue; + pc->iterGetName = SortedDict_iterGetName; ++ pc->index = 0; + } +- else { ++ else ++ { + pc->iterEnd = Dict_iterEnd; + pc->iterNext = Dict_iterNext; + pc->iterGetValue = Dict_iterGetValue; + pc->iterGetName = Dict_iterGetName; ++ pc->iterator = PyObject_GetIter(dictObj); + } +- pc->dictObj = dictObj; +- pc->index = 0; + } + + static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObjectEncoder *enc) +@@ -446,7 +455,8 @@ static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObject + PyObject *obj, *objRepr, *exc; + TypeContext *pc; + PRINTMARK(); +- if (!_obj) { ++ if (!_obj) ++ { + tc->type = JT_INVALID; + return; + } +diff --git a/tests/tests.py b/tests/tests.py +index cd928e6..b7e46af 100644 +--- a/tests/tests.py ++++ b/tests/tests.py +@@ -10,6 +10,8 @@ import json + import math + import time + import pytz ++from collections import OrderedDict ++ + if six.PY2: + import unittest2 as unittest + else: +@@ -383,6 +385,10 @@ class UltraJSONTests(unittest.TestCase): + input = -float('inf') + self.assertRaises(OverflowError, ujson.encode, input) + ++ def test_encodeOrderedDict(self): ++ input = OrderedDict([(1, 1), (0, 0), (8, 8), (2, 2)]) ++ self.assertEqual('{"1":1,"0":0,"8":8,"2":2}', ujson.encode(input)) ++ + def test_decodeJibberish(self): + input = "fdsa sda v9sa fdsa" + self.assertRaises(ValueError, ujson.decode, input) +@@ -668,7 +674,7 @@ class UltraJSONTests(unittest.TestCase): + d = {u'key': JSONTest()} + output = ujson.encode(d) + dec = ujson.decode(output) +- self.assertEquals(dec, {u'key': output_text}) ++ self.assertEqual(dec, {u'key': output_text}) + + def test_object_with_json_unicode(self): + # If __json__ returns a string, then that string +@@ -681,7 +687,7 @@ class UltraJSONTests(unittest.TestCase): + d = {u'key': JSONTest()} + output = ujson.encode(d) + dec = ujson.decode(output) +- self.assertEquals(dec, {u'key': output_text}) ++ self.assertEqual(dec, {u'key': output_text}) + + def test_object_with_complex_json(self): + # If __json__ returns a string, then that string +@@ -694,7 +700,7 @@ class UltraJSONTests(unittest.TestCase): + d = {u'key': JSONTest()} + output = ujson.encode(d) + dec = ujson.decode(output) +- self.assertEquals(dec, {u'key': obj}) ++ self.assertEqual(dec, {u'key': obj}) + + def test_object_with_json_type_error(self): + # __json__ must return a string, otherwise it should raise an error. diff --git a/dev-python/ujson/files/ujson-1.35-sort_keys-segfault.patch b/dev-python/ujson/files/ujson-1.35-sort_keys-segfault.patch new file mode 100644 index 000000000000..7239bca3e238 --- /dev/null +++ b/dev-python/ujson/files/ujson-1.35-sort_keys-segfault.patch @@ -0,0 +1,73 @@ +commit 870ee48fe109c289033cd0b7543b6f5ea4e6f128 +Author: Joakim Hamren <joakim.hamren@gmail.com> +Date: Sat Feb 4 01:07:52 2017 +0100 + + Fixes for sort_keys bug and a typo. + + - Fixed segfault when using sort_keys=True on dict with unorderable keys (GH247) + + - Fixed refcount becoming negative when using sort_keys=True (GH243) + + - Fixed compile error when defining JSON_NO_EXTRA_WHITESPACE + caused by a wrongly named variable. (GH245) + +diff --git a/lib/ultrajsonenc.c b/lib/ultrajsonenc.c +index cb10024..1bfa8f4 100644 +--- a/lib/ultrajsonenc.c ++++ b/lib/ultrajsonenc.c +@@ -717,7 +717,7 @@ static void encode(JSOBJ obj, JSONObjectEncoder *enc, const char *name, size_t c + { + const char *value; + char *objName; +- int count; ++ int count, res; + JSOBJ iterObj; + size_t szlen; + JSONTypeContext tc; +@@ -796,7 +796,7 @@ static void encode(JSOBJ obj, JSONObjectEncoder *enc, const char *name, size_t c + { + Buffer_AppendCharUnchecked (enc, ','); + #ifndef JSON_NO_EXTRA_WHITESPACE +- Buffer_AppendCharUnchecked (buffer, ' '); ++ Buffer_AppendCharUnchecked (enc, ' '); + #endif + Buffer_AppendIndentNewlineUnchecked (enc); + } +@@ -823,8 +823,16 @@ static void encode(JSOBJ obj, JSONObjectEncoder *enc, const char *name, size_t c + Buffer_AppendCharUnchecked (enc, '{'); + Buffer_AppendIndentNewlineUnchecked (enc); + +- while (enc->iterNext(obj, &tc)) ++ while ((res = enc->iterNext(obj, &tc))) + { ++ if(res < 0) ++ { ++ enc->iterEnd(obj, &tc); ++ enc->endTypeContext(obj, &tc); ++ enc->level--; ++ return; ++ } ++ + if (count > 0) + { + Buffer_AppendCharUnchecked (enc, ','); +diff --git a/python/objToJSON.c b/python/objToJSON.c +index 1960d40..8133fb5 100644 +--- a/python/objToJSON.c ++++ b/python/objToJSON.c +@@ -537,6 +537,7 @@ static int SortedDict_iterNext(JSOBJ obj, JSONTypeContext *tc) + // Sort the list. + if (PyList_Sort(items) < 0) + { ++ PyErr_SetString(PyExc_ValueError, "unorderable keys"); + goto error; + } + +@@ -607,7 +608,6 @@ static void SortedDict_iterEnd(JSOBJ obj, JSONTypeContext *tc) + { + GET_TC(tc)->itemName = NULL; + GET_TC(tc)->itemValue = NULL; +- Py_DECREF(GET_TC(tc)->newObj); + Py_DECREF(GET_TC(tc)->dictObj); + PRINTMARK(); + } diff --git a/dev-python/ujson/files/ujson-1.35-standard-handling-of-none.patch b/dev-python/ujson/files/ujson-1.35-standard-handling-of-none.patch new file mode 100644 index 000000000000..e2b7b9103f48 --- /dev/null +++ b/dev-python/ujson/files/ujson-1.35-standard-handling-of-none.patch @@ -0,0 +1,77 @@ +commit ac4637fbc4e72bd59f221d9bba19127820d21023 +Author: Joakim Hamren <joakim.hamren@gmail.com> +Date: Sat Feb 4 16:36:14 2017 +0100 + + Following std json handling of None dict key + + Previously a None dict item key would be outputted in JSON as "None". + To better align with the standard json module this was changed to output + "null". There's no proper representation of null object keys in JSON so + this is implementation specific but it seems more natural to follow + suit when it can be done without a significant performance hit. + + Added and used branch prediction macros (LIKELY/UNLIKELY) as well. + +diff --git a/lib/ultrajson.h b/lib/ultrajson.h +index 6c1dbc1..ca82a29 100644 +--- a/lib/ultrajson.h ++++ b/lib/ultrajson.h +@@ -117,6 +117,14 @@ typedef uint32_t JSUINT32; + + #define INLINE_PREFIX inline + ++#ifdef __GNUC__ ++#define LIKELY(x) __builtin_expect(!!(x), 1) ++#define UNLIKELY(x) __builtin_expect(!!(x), 0) ++#else ++#define LIKELY(x) (x) ++#define UNLIKELY(x) (x) ++#endif ++ + typedef uint8_t JSUINT8; + typedef uint16_t JSUTF16; + typedef uint32_t JSUTF32; +diff --git a/python/objToJSON.c b/python/objToJSON.c +index adea2f6..41d4289 100644 +--- a/python/objToJSON.c ++++ b/python/objToJSON.c +@@ -488,6 +488,12 @@ static int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc) + else + if (!PyString_Check(GET_TC(tc)->itemName)) + { ++ if (UNLIKELY(GET_TC(tc)->itemName == Py_None)) ++ { ++ GET_TC(tc)->itemName = PyString_FromString("null"); ++ return 1; ++ } ++ + GET_TC(tc)->itemName = PyObject_Str(GET_TC(tc)->itemName); + #if PY_MAJOR_VERSION >= 3 + itemNameTmp = GET_TC(tc)->itemName; +@@ -743,7 +749,7 @@ static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObject + return; + } + else +- if (PyString_Check(obj) && !PyHasAttrStringPreserveErr(obj, "__json__")) ++ if (PyString_Check(obj) && LIKELY(!PyHasAttrStringPreserveErr(obj, "__json__"))) + { + PRINTMARK(); + pc->PyTypeToJSON = PyStringToUTF8; tc->type = JT_UTF8; +@@ -837,7 +843,7 @@ ISITERABLE: + } + */ + +- if (PyObject_HasAttrString(obj, "toDict")) ++ if (UNLIKELY(PyObject_HasAttrString(obj, "toDict"))) + { + PyObject* toDictFunc = PyObject_GetAttrString(obj, "toDict"); + PyObject* tuple = PyTuple_New(0); +@@ -863,7 +869,7 @@ ISITERABLE: + return; + } + else +- if (PyObject_HasAttrString(obj, "__json__")) ++ if (UNLIKELY(PyObject_HasAttrString(obj, "__json__"))) + { + PyObject* toJSONFunc = PyObject_GetAttrString(obj, "__json__"); + PyObject* tuple = PyTuple_New(0); diff --git a/dev-python/ujson/files/ujson-1.35-test-depricationwarning.patch b/dev-python/ujson/files/ujson-1.35-test-depricationwarning.patch new file mode 100644 index 000000000000..6ce987581c4f --- /dev/null +++ b/dev-python/ujson/files/ujson-1.35-test-depricationwarning.patch @@ -0,0 +1,11 @@ +--- ujson-1.35.orig/tests/tests.py 2017-04-14 18:14:36.298345782 -0700 ++++ ujson-1.35/tests/tests.py 2017-04-14 18:14:47.899947795 -0700 +@@ -702,7 +702,7 @@ + + output = ujson.encode(ObjectTest()) + dec = ujson.decode(output) +- self.assertEquals(dec, {}) ++ self.assertEqual(dec, {}) + + def test_toDict(self): + d = {"key": 31337} diff --git a/dev-python/ujson/files/ujson-1.35-use-static-where-possible.patch b/dev-python/ujson/files/ujson-1.35-use-static-where-possible.patch new file mode 100644 index 000000000000..7ce5d44e0e7a --- /dev/null +++ b/dev-python/ujson/files/ujson-1.35-use-static-where-possible.patch @@ -0,0 +1,591 @@ +commit 6cf6c7ff25c883349e8e9e5468e61498358e2e91 +Author: WGH <wgh@torlan.ru> +Date: Sat Aug 27 17:34:22 2016 +0300 + + added "static" to C functions, where possible + + 1. It reduces clutter in symbol table. + 2. It fixes issues with C99 inline semantics for functions + marked as inline (#237, #180, #222), which manifests + when compiled with GCC>=5. + +diff --git a/lib/ultrajsondec.c b/lib/ultrajsondec.c +index 21a732e..19efc60 100644 +--- a/lib/ultrajsondec.c ++++ b/lib/ultrajsondec.c +@@ -66,7 +66,7 @@ struct DecoderState + JSONObjectDecoder *dec; + }; + +-JSOBJ FASTCALL_MSVC decode_any( struct DecoderState *ds) FASTCALL_ATTR; ++static JSOBJ FASTCALL_MSVC decode_any( struct DecoderState *ds) FASTCALL_ATTR; + typedef JSOBJ (*PFN_DECODER)( struct DecoderState *ds); + + static JSOBJ SetError( struct DecoderState *ds, int offset, const char *message) +@@ -76,13 +76,13 @@ static JSOBJ SetError( struct DecoderState *ds, int offset, const char *message) + return NULL; + } + +-double createDouble(double intNeg, double intValue, double frcValue, int frcDecimalCount) ++static double createDouble(double intNeg, double intValue, double frcValue, int frcDecimalCount) + { + static const double g_pow10[] = {1.0, 0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001,0.0000001, 0.00000001, 0.000000001, 0.0000000001, 0.00000000001, 0.000000000001, 0.0000000000001, 0.00000000000001, 0.000000000000001}; + return (intValue + (frcValue * g_pow10[frcDecimalCount])) * intNeg; + } + +-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decodePreciseFloat(struct DecoderState *ds) ++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decodePreciseFloat(struct DecoderState *ds) + { + char *end; + double value; +@@ -99,7 +99,7 @@ FASTCALL_ATTR JSOBJ FASTCALL_MSVC decodePreciseFloat(struct DecoderState *ds) + return ds->dec->newDouble(ds->prv, value); + } + +-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_numeric (struct DecoderState *ds) ++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_numeric (struct DecoderState *ds) + { + int intNeg = 1; + int mantSize = 0; +@@ -309,7 +309,7 @@ BREAK_EXP_LOOP: + return ds->dec->newDouble (ds->prv, createDouble( (double) intNeg, (double) intValue , frcValue, decimalCount) * pow(10.0, expValue * expNeg)); + } + +-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_true ( struct DecoderState *ds) ++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_true ( struct DecoderState *ds) + { + char *offset = ds->start; + offset ++; +@@ -329,7 +329,7 @@ SETERROR: + return SetError(ds, -1, "Unexpected character found when decoding 'true'"); + } + +-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_false ( struct DecoderState *ds) ++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_false ( struct DecoderState *ds) + { + char *offset = ds->start; + offset ++; +@@ -351,7 +351,7 @@ SETERROR: + return SetError(ds, -1, "Unexpected character found when decoding 'false'"); + } + +-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_null ( struct DecoderState *ds) ++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_null ( struct DecoderState *ds) + { + char *offset = ds->start; + offset ++; +@@ -371,7 +371,7 @@ SETERROR: + return SetError(ds, -1, "Unexpected character found when decoding 'null'"); + } + +-FASTCALL_ATTR void FASTCALL_MSVC SkipWhitespace(struct DecoderState *ds) ++static FASTCALL_ATTR void FASTCALL_MSVC SkipWhitespace(struct DecoderState *ds) + { + char *offset = ds->start; + +@@ -422,7 +422,7 @@ static const JSUINT8 g_decoderLookup[256] = + /* 0xf0 */ 4, 4, 4, 4, 4, 4, 4, 4, DS_UTFLENERROR, DS_UTFLENERROR, DS_UTFLENERROR, DS_UTFLENERROR, DS_UTFLENERROR, DS_UTFLENERROR, DS_UTFLENERROR, DS_UTFLENERROR, + }; + +-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_string ( struct DecoderState *ds) ++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_string ( struct DecoderState *ds) + { + JSUTF16 sur[2] = { 0 }; + int iSur = 0; +@@ -672,7 +672,7 @@ FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_string ( struct DecoderState *ds) + } + } + +-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_array(struct DecoderState *ds) ++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_array(struct DecoderState *ds) + { + JSOBJ itemValue; + JSOBJ newObj; +@@ -736,7 +736,7 @@ FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_array(struct DecoderState *ds) + } + } + +-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_object( struct DecoderState *ds) ++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_object( struct DecoderState *ds) + { + JSOBJ itemName; + JSOBJ itemValue; +@@ -819,7 +819,7 @@ FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_object( struct DecoderState *ds) + } + } + +-FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_any(struct DecoderState *ds) ++static FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_any(struct DecoderState *ds) + { + for (;;) + { +diff --git a/lib/ultrajsonenc.c b/lib/ultrajsonenc.c +index 6c1b120..f330171 100644 +--- a/lib/ultrajsonenc.c ++++ b/lib/ultrajsonenc.c +@@ -112,7 +112,7 @@ static void SetError (JSOBJ obj, JSONObjectEncoder *enc, const char *message) + /* + FIXME: Keep track of how big these get across several encoder calls and try to make an estimate + That way we won't run our head into the wall each call */ +-void Buffer_Realloc (JSONObjectEncoder *enc, size_t cbNeeded) ++static void Buffer_Realloc (JSONObjectEncoder *enc, size_t cbNeeded) + { + size_t curSize = enc->end - enc->start; + size_t newSize = curSize * 2; +@@ -148,7 +148,7 @@ void Buffer_Realloc (JSONObjectEncoder *enc, size_t cbNeeded) + enc->end = enc->start + newSize; + } + +-FASTCALL_ATTR INLINE_PREFIX void FASTCALL_MSVC Buffer_AppendShortHexUnchecked (char *outputOffset, unsigned short value) ++static FASTCALL_ATTR INLINE_PREFIX void FASTCALL_MSVC Buffer_AppendShortHexUnchecked (char *outputOffset, unsigned short value) + { + *(outputOffset++) = g_hexChars[(value & 0xf000) >> 12]; + *(outputOffset++) = g_hexChars[(value & 0x0f00) >> 8]; +@@ -156,7 +156,7 @@ FASTCALL_ATTR INLINE_PREFIX void FASTCALL_MSVC Buffer_AppendShortHexUnchecked (c + *(outputOffset++) = g_hexChars[(value & 0x000f) >> 0]; + } + +-int Buffer_EscapeStringUnvalidated (JSONObjectEncoder *enc, const char *io, const char *end) ++static int Buffer_EscapeStringUnvalidated (JSONObjectEncoder *enc, const char *io, const char *end) + { + char *of = (char *) enc->offset; + +@@ -260,7 +260,7 @@ int Buffer_EscapeStringUnvalidated (JSONObjectEncoder *enc, const char *io, cons + } + } + +-int Buffer_EscapeStringValidated (JSOBJ obj, JSONObjectEncoder *enc, const char *io, const char *end) ++static int Buffer_EscapeStringValidated (JSOBJ obj, JSONObjectEncoder *enc, const char *io, const char *end) + { + JSUTF32 ucs; + char *of = (char *) enc->offset; +@@ -498,19 +498,19 @@ int Buffer_EscapeStringValidated (JSOBJ obj, JSONObjectEncoder *enc, const char + #define Buffer_AppendCharUnchecked(__enc, __chr) \ + *((__enc)->offset++) = __chr; \ + +-FASTCALL_ATTR INLINE_PREFIX void FASTCALL_MSVC strreverse(char* begin, char* end) ++static FASTCALL_ATTR INLINE_PREFIX void FASTCALL_MSVC strreverse(char* begin, char* end) + { + char aux; + while (end > begin) + aux = *end, *end-- = *begin, *begin++ = aux; + } + +-void Buffer_AppendIndentNewlineUnchecked(JSONObjectEncoder *enc) ++static void Buffer_AppendIndentNewlineUnchecked(JSONObjectEncoder *enc) + { + if (enc->indent > 0) Buffer_AppendCharUnchecked(enc, '\n'); + } + +-void Buffer_AppendIndentUnchecked(JSONObjectEncoder *enc, JSINT32 value) ++static void Buffer_AppendIndentUnchecked(JSONObjectEncoder *enc, JSINT32 value) + { + int i; + if (enc->indent > 0) +@@ -519,7 +519,7 @@ void Buffer_AppendIndentUnchecked(JSONObjectEncoder *enc, JSINT32 value) + Buffer_AppendCharUnchecked(enc, ' '); + } + +-void Buffer_AppendIntUnchecked(JSONObjectEncoder *enc, JSINT32 value) ++static void Buffer_AppendIntUnchecked(JSONObjectEncoder *enc, JSINT32 value) + { + char* wstr; + JSUINT32 uvalue = (value < 0) ? -value : value; +@@ -535,7 +535,7 @@ void Buffer_AppendIntUnchecked(JSONObjectEncoder *enc, JSINT32 value) + enc->offset += (wstr - (enc->offset)); + } + +-void Buffer_AppendLongUnchecked(JSONObjectEncoder *enc, JSINT64 value) ++static void Buffer_AppendLongUnchecked(JSONObjectEncoder *enc, JSINT64 value) + { + char* wstr; + JSUINT64 uvalue = (value < 0) ? -value : value; +@@ -551,7 +551,7 @@ void Buffer_AppendLongUnchecked(JSONObjectEncoder *enc, JSINT64 value) + enc->offset += (wstr - (enc->offset)); + } + +-void Buffer_AppendUnsignedLongUnchecked(JSONObjectEncoder *enc, JSUINT64 value) ++static void Buffer_AppendUnsignedLongUnchecked(JSONObjectEncoder *enc, JSUINT64 value) + { + char* wstr; + JSUINT64 uvalue = value; +@@ -566,7 +566,7 @@ void Buffer_AppendUnsignedLongUnchecked(JSONObjectEncoder *enc, JSUINT64 value) + enc->offset += (wstr - (enc->offset)); + } + +-int Buffer_AppendDoubleUnchecked(JSOBJ obj, JSONObjectEncoder *enc, double value) ++static int Buffer_AppendDoubleUnchecked(JSOBJ obj, JSONObjectEncoder *enc, double value) + { + /* if input is larger than thres_max, revert to exponential */ + const double thres_max = (double) 1e16 - 1; +@@ -714,7 +714,7 @@ Handle integration functions returning NULL here */ + FIXME: + Perhaps implement recursion detection */ + +-void encode(JSOBJ obj, JSONObjectEncoder *enc, const char *name, size_t cbName) ++static void encode(JSOBJ obj, JSONObjectEncoder *enc, const char *name, size_t cbName) + { + const char *value; + char *objName; +diff --git a/python/JSONtoObj.c b/python/JSONtoObj.c +index 79d9f1a..6cef088 100644 +--- a/python/JSONtoObj.c ++++ b/python/JSONtoObj.c +@@ -43,7 +43,7 @@ http://www.opensource.apple.com/source/tcl/tcl-14/tcl/license.terms + //#define PRINTMARK() fprintf(stderr, "%s: MARK(%d)\n", __FILE__, __LINE__) + #define PRINTMARK() + +-void Object_objectAddKey(void *prv, JSOBJ obj, JSOBJ name, JSOBJ value) ++static void Object_objectAddKey(void *prv, JSOBJ obj, JSOBJ name, JSOBJ value) + { + PyDict_SetItem (obj, name, value); + Py_DECREF( (PyObject *) name); +@@ -51,59 +51,59 @@ void Object_objectAddKey(void *prv, JSOBJ obj, JSOBJ name, JSOBJ value) + return; + } + +-void Object_arrayAddItem(void *prv, JSOBJ obj, JSOBJ value) ++static void Object_arrayAddItem(void *prv, JSOBJ obj, JSOBJ value) + { + PyList_Append(obj, value); + Py_DECREF( (PyObject *) value); + return; + } + +-JSOBJ Object_newString(void *prv, wchar_t *start, wchar_t *end) ++static JSOBJ Object_newString(void *prv, wchar_t *start, wchar_t *end) + { + return PyUnicode_FromWideChar (start, (end - start)); + } + +-JSOBJ Object_newTrue(void *prv) ++static JSOBJ Object_newTrue(void *prv) + { + Py_RETURN_TRUE; + } + +-JSOBJ Object_newFalse(void *prv) ++static JSOBJ Object_newFalse(void *prv) + { + Py_RETURN_FALSE; + } + +-JSOBJ Object_newNull(void *prv) ++static JSOBJ Object_newNull(void *prv) + { + Py_RETURN_NONE; + } + +-JSOBJ Object_newObject(void *prv) ++static JSOBJ Object_newObject(void *prv) + { + return PyDict_New(); + } + +-JSOBJ Object_newArray(void *prv) ++static JSOBJ Object_newArray(void *prv) + { + return PyList_New(0); + } + +-JSOBJ Object_newInteger(void *prv, JSINT32 value) ++static JSOBJ Object_newInteger(void *prv, JSINT32 value) + { + return PyInt_FromLong( (long) value); + } + +-JSOBJ Object_newLong(void *prv, JSINT64 value) ++static JSOBJ Object_newLong(void *prv, JSINT64 value) + { + return PyLong_FromLongLong (value); + } + +-JSOBJ Object_newUnsignedLong(void *prv, JSUINT64 value) ++static JSOBJ Object_newUnsignedLong(void *prv, JSUINT64 value) + { + return PyLong_FromUnsignedLongLong (value); + } + +-JSOBJ Object_newDouble(void *prv, double value) ++static JSOBJ Object_newDouble(void *prv, double value) + { + return PyFloat_FromDouble(value); + } +diff --git a/python/objToJSON.c b/python/objToJSON.c +index 04a4575..1960d40 100644 +--- a/python/objToJSON.c ++++ b/python/objToJSON.c +@@ -226,7 +226,7 @@ static void *PyDateToINT64(JSOBJ _obj, JSONTypeContext *tc, void *outValue, size + return NULL; + } + +-int Tuple_iterNext(JSOBJ obj, JSONTypeContext *tc) ++static int Tuple_iterNext(JSOBJ obj, JSONTypeContext *tc) + { + PyObject *item; + +@@ -242,21 +242,21 @@ int Tuple_iterNext(JSOBJ obj, JSONTypeContext *tc) + return 1; + } + +-void Tuple_iterEnd(JSOBJ obj, JSONTypeContext *tc) ++static void Tuple_iterEnd(JSOBJ obj, JSONTypeContext *tc) + { + } + +-JSOBJ Tuple_iterGetValue(JSOBJ obj, JSONTypeContext *tc) ++static JSOBJ Tuple_iterGetValue(JSOBJ obj, JSONTypeContext *tc) + { + return GET_TC(tc)->itemValue; + } + +-char *Tuple_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) ++static char *Tuple_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) + { + return NULL; + } + +-int Iter_iterNext(JSOBJ obj, JSONTypeContext *tc) ++static int Iter_iterNext(JSOBJ obj, JSONTypeContext *tc) + { + PyObject *item; + +@@ -282,7 +282,7 @@ int Iter_iterNext(JSOBJ obj, JSONTypeContext *tc) + return 1; + } + +-void Iter_iterEnd(JSOBJ obj, JSONTypeContext *tc) ++static void Iter_iterEnd(JSOBJ obj, JSONTypeContext *tc) + { + if (GET_TC(tc)->itemValue) + { +@@ -297,17 +297,17 @@ void Iter_iterEnd(JSOBJ obj, JSONTypeContext *tc) + } + } + +-JSOBJ Iter_iterGetValue(JSOBJ obj, JSONTypeContext *tc) ++static JSOBJ Iter_iterGetValue(JSOBJ obj, JSONTypeContext *tc) + { + return GET_TC(tc)->itemValue; + } + +-char *Iter_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) ++static char *Iter_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) + { + return NULL; + } + +-void Dir_iterEnd(JSOBJ obj, JSONTypeContext *tc) ++static void Dir_iterEnd(JSOBJ obj, JSONTypeContext *tc) + { + if (GET_TC(tc)->itemValue) + { +@@ -325,7 +325,7 @@ void Dir_iterEnd(JSOBJ obj, JSONTypeContext *tc) + PRINTMARK(); + } + +-int Dir_iterNext(JSOBJ _obj, JSONTypeContext *tc) ++static int Dir_iterNext(JSOBJ _obj, JSONTypeContext *tc) + { + PyObject *obj = (PyObject *) _obj; + PyObject *itemValue = GET_TC(tc)->itemValue; +@@ -401,20 +401,20 @@ int Dir_iterNext(JSOBJ _obj, JSONTypeContext *tc) + return 1; + } + +-JSOBJ Dir_iterGetValue(JSOBJ obj, JSONTypeContext *tc) ++static JSOBJ Dir_iterGetValue(JSOBJ obj, JSONTypeContext *tc) + { + PRINTMARK(); + return GET_TC(tc)->itemValue; + } + +-char *Dir_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) ++static char *Dir_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) + { + PRINTMARK(); + *outLen = PyString_GET_SIZE(GET_TC(tc)->itemName); + return PyString_AS_STRING(GET_TC(tc)->itemName); + } + +-int List_iterNext(JSOBJ obj, JSONTypeContext *tc) ++static int List_iterNext(JSOBJ obj, JSONTypeContext *tc) + { + if (GET_TC(tc)->index >= GET_TC(tc)->size) + { +@@ -427,16 +427,16 @@ int List_iterNext(JSOBJ obj, JSONTypeContext *tc) + return 1; + } + +-void List_iterEnd(JSOBJ obj, JSONTypeContext *tc) ++static void List_iterEnd(JSOBJ obj, JSONTypeContext *tc) + { + } + +-JSOBJ List_iterGetValue(JSOBJ obj, JSONTypeContext *tc) ++static JSOBJ List_iterGetValue(JSOBJ obj, JSONTypeContext *tc) + { + return GET_TC(tc)->itemValue; + } + +-char *List_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) ++static char *List_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) + { + return NULL; + } +@@ -447,7 +447,7 @@ char *List_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) + // itemValue is borrowed from object (which is dict). No refCounting + //============================================================================= + +-int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc) ++static int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc) + { + #if PY_MAJOR_VERSION >= 3 + PyObject* itemNameTmp; +@@ -488,7 +488,7 @@ int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc) + return 1; + } + +-void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc) ++static void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc) + { + if (GET_TC(tc)->itemName) + { +@@ -499,18 +499,18 @@ void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc) + PRINTMARK(); + } + +-JSOBJ Dict_iterGetValue(JSOBJ obj, JSONTypeContext *tc) ++static JSOBJ Dict_iterGetValue(JSOBJ obj, JSONTypeContext *tc) + { + return GET_TC(tc)->itemValue; + } + +-char *Dict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) ++static char *Dict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) + { + *outLen = PyString_GET_SIZE(GET_TC(tc)->itemName); + return PyString_AS_STRING(GET_TC(tc)->itemName); + } + +-int SortedDict_iterNext(JSOBJ obj, JSONTypeContext *tc) ++static int SortedDict_iterNext(JSOBJ obj, JSONTypeContext *tc) + { + PyObject *items = NULL, *item = NULL, *key = NULL, *value = NULL; + Py_ssize_t i, nitems; +@@ -603,7 +603,7 @@ error: + return -1; + } + +-void SortedDict_iterEnd(JSOBJ obj, JSONTypeContext *tc) ++static void SortedDict_iterEnd(JSOBJ obj, JSONTypeContext *tc) + { + GET_TC(tc)->itemName = NULL; + GET_TC(tc)->itemValue = NULL; +@@ -612,19 +612,19 @@ void SortedDict_iterEnd(JSOBJ obj, JSONTypeContext *tc) + PRINTMARK(); + } + +-JSOBJ SortedDict_iterGetValue(JSOBJ obj, JSONTypeContext *tc) ++static JSOBJ SortedDict_iterGetValue(JSOBJ obj, JSONTypeContext *tc) + { + return GET_TC(tc)->itemValue; + } + +-char *SortedDict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) ++static char *SortedDict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) + { + *outLen = PyString_GET_SIZE(GET_TC(tc)->itemName); + return PyString_AS_STRING(GET_TC(tc)->itemName); + } + + +-void SetupDictIter(PyObject *dictObj, TypeContext *pc, JSONObjectEncoder *enc) ++static void SetupDictIter(PyObject *dictObj, TypeContext *pc, JSONObjectEncoder *enc) + { + if (enc->sortKeys) { + pc->iterEnd = SortedDict_iterEnd; +@@ -642,7 +642,7 @@ void SetupDictIter(PyObject *dictObj, TypeContext *pc, JSONObjectEncoder *enc) + pc->index = 0; + } + +-void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObjectEncoder *enc) ++static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObjectEncoder *enc) + { + PyObject *obj, *exc, *iter; + TypeContext *pc; +@@ -929,7 +929,7 @@ INVALID: + return; + } + +-void Object_endTypeContext(JSOBJ obj, JSONTypeContext *tc) ++static void Object_endTypeContext(JSOBJ obj, JSONTypeContext *tc) + { + Py_XDECREF(GET_TC(tc)->newObj); + +@@ -937,33 +937,33 @@ void Object_endTypeContext(JSOBJ obj, JSONTypeContext *tc) + tc->prv = NULL; + } + +-const char *Object_getStringValue(JSOBJ obj, JSONTypeContext *tc, size_t *_outLen) ++static const char *Object_getStringValue(JSOBJ obj, JSONTypeContext *tc, size_t *_outLen) + { + return GET_TC(tc)->PyTypeToJSON (obj, tc, NULL, _outLen); + } + +-JSINT64 Object_getLongValue(JSOBJ obj, JSONTypeContext *tc) ++static JSINT64 Object_getLongValue(JSOBJ obj, JSONTypeContext *tc) + { + JSINT64 ret; + GET_TC(tc)->PyTypeToJSON (obj, tc, &ret, NULL); + return ret; + } + +-JSUINT64 Object_getUnsignedLongValue(JSOBJ obj, JSONTypeContext *tc) ++static JSUINT64 Object_getUnsignedLongValue(JSOBJ obj, JSONTypeContext *tc) + { + JSUINT64 ret; + GET_TC(tc)->PyTypeToJSON (obj, tc, &ret, NULL); + return ret; + } + +-JSINT32 Object_getIntValue(JSOBJ obj, JSONTypeContext *tc) ++static JSINT32 Object_getIntValue(JSOBJ obj, JSONTypeContext *tc) + { + JSINT32 ret; + GET_TC(tc)->PyTypeToJSON (obj, tc, &ret, NULL); + return ret; + } + +-double Object_getDoubleValue(JSOBJ obj, JSONTypeContext *tc) ++static double Object_getDoubleValue(JSOBJ obj, JSONTypeContext *tc) + { + double ret; + GET_TC(tc)->PyTypeToJSON (obj, tc, &ret, NULL); +@@ -975,22 +975,22 @@ static void Object_releaseObject(JSOBJ _obj) + Py_DECREF( (PyObject *) _obj); + } + +-int Object_iterNext(JSOBJ obj, JSONTypeContext *tc) ++static int Object_iterNext(JSOBJ obj, JSONTypeContext *tc) + { + return GET_TC(tc)->iterNext(obj, tc); + } + +-void Object_iterEnd(JSOBJ obj, JSONTypeContext *tc) ++static void Object_iterEnd(JSOBJ obj, JSONTypeContext *tc) + { + GET_TC(tc)->iterEnd(obj, tc); + } + +-JSOBJ Object_iterGetValue(JSOBJ obj, JSONTypeContext *tc) ++static JSOBJ Object_iterGetValue(JSOBJ obj, JSONTypeContext *tc) + { + return GET_TC(tc)->iterGetValue(obj, tc); + } + +-char *Object_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) ++static char *Object_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outLen) + { + return GET_TC(tc)->iterGetName(obj, tc, outLen); + } diff --git a/dev-python/ujson/ujson-1.35.ebuild b/dev-python/ujson/ujson-1.35.ebuild new file mode 100644 index 000000000000..19d94beed916 --- /dev/null +++ b/dev-python/ujson/ujson-1.35.ebuild @@ -0,0 +1,33 @@ +# Copyright 1999-2017 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +EAPI=6 +PYTHON_COMPAT=( python2_7 python3_{4,5,6} ) + +inherit distutils-r1 + +DESCRIPTION="Ultra fast JSON encoder and decoder for Python" +HOMEPAGE="https://pypi.python.org/pypi/ujson/" +SRC_URI="mirror://pypi/${PN:0:1}/${PN}/${P}.tar.gz" + +LICENSE="BSD" +SLOT="0" +KEYWORDS="~amd64 ~arm ~x86" +IUSE="test" + +DEPEND=" + dev-python/setuptools[${PYTHON_USEDEP}]" +RDEPEND="${DEPEND}" + +PATCHES=( + "${FILESDIR}/${P}-sort_keys-segfault.patch" + "${FILESDIR}/${P}-use-static-where-possible.patch" + "${FILESDIR}/${P}-fix-for-overflowing-long.patch" + "${FILESDIR}/${P}-standard-handling-of-none.patch" + "${FILESDIR}/${P}-fix-ordering-of-orderdict.patch" + "${FILESDIR}/${P}-test-depricationwarning.patch" +) + +python_test() { + "${PYTHON}" tests/tests.py || die +} |