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
This commit is contained in:
Patrick McLean
2017-04-14 18:17:12 -07:00
parent 9519acb6ae
commit c3a74efba9
8 changed files with 992 additions and 0 deletions

View File

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

View File

@@ -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;

View File

@@ -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.

View File

@@ -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();
}

View File

@@ -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);

View File

@@ -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}

View File

@@ -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);
}

View File

@@ -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
}