aboutsummaryrefslogtreecommitdiffstats
path: root/testing/py3-ujson
diff options
context:
space:
mode:
Diffstat (limited to 'testing/py3-ujson')
-rw-r--r--testing/py3-ujson/APKBUILD56
-rw-r--r--testing/py3-ujson/added-static-to-C-functions-where-possible.patch596
-rw-r--r--testing/py3-ujson/lower-stack-usage.patch19
3 files changed, 671 insertions, 0 deletions
diff --git a/testing/py3-ujson/APKBUILD b/testing/py3-ujson/APKBUILD
new file mode 100644
index 00000000000..2c248c5d522
--- /dev/null
+++ b/testing/py3-ujson/APKBUILD
@@ -0,0 +1,56 @@
+# Contributor: Fabian Affolter <fabian@affolter-engineering.ch>
+# Maintainer: Fabian Affolter <fabian@affolter-engineering.ch>
+pkgname=py-ujson
+_pkgname=ujson
+pkgver=1.35
+pkgrel=3
+pkgdesc="A fast Python JSON encoder and decoder"
+url="http://github.com/esnme/ultrajson"
+arch="all"
+license="BSD"
+makedepends="python2-dev py-setuptools python3-dev"
+checkdepends="py3-tz py3-six"
+subpackages="py3-${pkgname/py-/}:_py3 py2-${pkgname/py-/}:_py2"
+source="$_pkgname-$pkgver.tar.gz::https://github.com/esnme/ultrajson/archive/v$pkgver.tar.gz
+ added-static-to-C-functions-where-possible.patch
+ lower-stack-usage.patch
+ "
+builddir="$srcdir"/ultrajson-$pkgver
+
+build() {
+ cd "$builddir"
+ python2 setup.py build
+ python3 setup.py build
+}
+
+package() {
+ mkdir -p "$pkgdir"
+}
+
+_py2() {
+ replaces="$pkgname"
+ _py python2
+}
+
+_py3() {
+ _py python3
+}
+
+_py() {
+ local python="$1"
+ pkgdesc="$pkgdesc (for $python)"
+ install_if="$pkgname=$pkgver-r$pkgrel $python"
+
+ cd "$builddir"
+ $python setup.py install --prefix=/usr --root="$subpkgdir"
+}
+
+check() {
+ cd "$builddir"
+ ln -s ./build/lib.*/ujson.*.so ujson.so
+ PYTHONPATH=. python3 tests/tests.py
+}
+
+sha512sums="cd5dc8d08e072cf703aec7d689070713f7073c22f13167d7e10a89219179248d6668894c1d742ca658672bb82e1dccbf72e3fd69e036d8cb2ee0ee799d10db11 ujson-1.35.tar.gz
+55d958c833f62eb5e50829aced94bf23ebda50b4e88970b7cc6d476e4a911d8738472c9d414c095186867f3cfd2731e211d04adb3d7053eac7d8d7cf208c1eeb added-static-to-C-functions-where-possible.patch
+e3755dea5845d735afc32c3fc6ee569f1a36d51203812409446c3cb62d207c1fea934935adaf1787b5ac549765e2dfdd18790f2eb0c15b28c5fec61a45874738 lower-stack-usage.patch"
diff --git a/testing/py3-ujson/added-static-to-C-functions-where-possible.patch b/testing/py3-ujson/added-static-to-C-functions-where-possible.patch
new file mode 100644
index 00000000000..bac46d19c4d
--- /dev/null
+++ b/testing/py3-ujson/added-static-to-C-functions-where-possible.patch
@@ -0,0 +1,596 @@
+From 6cf6c7ff25c883349e8e9e5468e61498358e2e91 Mon Sep 17 00:00:00 2001
+From: WGH <wgh@torlan.ru>
+Date: Sat, 27 Aug 2016 17:34:22 +0300
+Subject: [PATCH] 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.
+---
+ lib/ultrajsondec.c | 24 ++++++++--------
+ lib/ultrajsonenc.c | 24 ++++++++--------
+ python/JSONtoObj.c | 24 ++++++++--------
+ python/objToJSON.c | 72 +++++++++++++++++++++++-----------------------
+ 4 files changed, 72 insertions(+), 72 deletions(-)
+
+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 @@ FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_numeric (struct DecoderState *ds)
+ 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 @@ FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_true ( struct DecoderState *ds)
+ 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 @@ FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_false ( struct DecoderState *ds)
+ 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 @@ FASTCALL_ATTR JSOBJ FASTCALL_MSVC decode_null ( struct DecoderState *ds)
+ 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 @@ Numeric decoder derived from from TCL library
+ //#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 @@ int SortedDict_iterNext(JSOBJ obj, JSONTypeContext *tc)
+ 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 @@ void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObjectEncoder
+ 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/testing/py3-ujson/lower-stack-usage.patch b/testing/py3-ujson/lower-stack-usage.patch
new file mode 100644
index 00000000000..de3258cfdeb
--- /dev/null
+++ b/testing/py3-ujson/lower-stack-usage.patch
@@ -0,0 +1,19 @@
+From: Shiz <hi@shiz.me>
+Bug-Report: https://github.com/esnme/ultrajson/issues/254
+
+musl default thread size is 80 kiB, so using 128 kiB by default will
+overflow the stack and cause segmentation faults.
+
+Allocating 128 kiB on the stack is a rather bad idea anyway, so we'll
+lower it to 8 kiB.
+--- ultrajson-1.35/lib/ultrajson.h
++++ ultrajson-1.35-patched/lib/ultrajson.h
+@@ -77,7 +77,7 @@
+ /*
+ Dictates and limits how much stack space for buffers UltraJSON will use before resorting to provided heap functions */
+ #ifndef JSON_MAX_STACK_BUFFER_SIZE
+-#define JSON_MAX_STACK_BUFFER_SIZE 131072
++#define JSON_MAX_STACK_BUFFER_SIZE 8192
+ #endif
+
+ #ifdef _WIN32