Skip to content

Commit

Permalink
Merge pull request #48 from Komnomnomnom/pandas-changes
Browse files Browse the repository at this point in the history
Fixes and enhancements from the pandas project
  • Loading branch information
Jonas Tärnström committed Jun 25, 2012
2 parents fd13812 + fd3e969 commit 640f6da
Show file tree
Hide file tree
Showing 9 changed files with 3,895 additions and 3,752 deletions.
593 changes: 295 additions & 298 deletions lib/ultrajson.h

Large diffs are not rendered by default.

1,662 changes: 835 additions & 827 deletions lib/ultrajsondec.c

Large diffs are not rendered by default.

1,747 changes: 890 additions & 857 deletions lib/ultrajsonenc.c

Large diffs are not rendered by default.

364 changes: 182 additions & 182 deletions python/JSONtoObj.c
Original file line number Diff line number Diff line change
@@ -1,182 +1,182 @@
#include <Python.h>
#include <ultrajson.h>




void Object_objectAddKey(JSOBJ obj, JSOBJ name, JSOBJ value)
{
PyDict_SetItem (obj, name, value);
Py_DECREF( (PyObject *) name);
Py_DECREF( (PyObject *) value);
return;
}

void Object_arrayAddItem(JSOBJ obj, JSOBJ value)
{
PyList_Append(obj, value);
Py_DECREF( (PyObject *) value);
return;
}

JSOBJ Object_newString(wchar_t *start, wchar_t *end)
{
return PyUnicode_FromWideChar (start, (end - start));
}

JSOBJ Object_newTrue(void)
{
Py_RETURN_TRUE;
}

JSOBJ Object_newFalse(void)
{
Py_RETURN_FALSE;
}

JSOBJ Object_newNull(void)
{
Py_RETURN_NONE;
}

JSOBJ Object_newObject(void)
{
return PyDict_New();
}

JSOBJ Object_newArray(void)
{
return PyList_New(0);
}

JSOBJ Object_newInteger(JSINT32 value)
{
return PyInt_FromLong( (long) value);
}

JSOBJ Object_newLong(JSINT64 value)
{
return PyLong_FromLongLong (value);
}

JSOBJ Object_newDouble(double value)
{
return PyFloat_FromDouble(value);
}

static void Object_releaseObject(JSOBJ obj)
{
Py_DECREF( ((PyObject *)obj));
}



PyObject* JSONToObj(PyObject* self, PyObject *arg)
{
PyObject *ret;
PyObject *sarg;
JSONObjectDecoder decoder =
{
Object_newString,
Object_objectAddKey,
Object_arrayAddItem,
Object_newTrue,
Object_newFalse,
Object_newNull,
Object_newObject,
Object_newArray,
Object_newInteger,
Object_newLong,
Object_newDouble,
Object_releaseObject,
PyObject_Malloc,
PyObject_Free,
PyObject_Realloc
};

if (PyString_Check(arg))
{
sarg = arg;
}
else
if (PyUnicode_Check(arg))
{
sarg = PyUnicode_AsUTF8String(arg);
if (sarg == NULL)
{
//Exception raised above us by codec according to docs
return NULL;
}
}
else
{
PyErr_Format(PyExc_TypeError, "Expected String or Unicode");
return NULL;
}

decoder.errorStr = NULL;
decoder.errorOffset = NULL;
ret = JSON_DecodeObject(&decoder, PyString_AS_STRING(sarg), PyString_GET_SIZE(sarg));

if (sarg != arg)
{
Py_DECREF(sarg);
}

if (decoder.errorStr)
{
/*
FIXME: It's possible to give a much nicer error message here with actual failing element in input etc*/
PyErr_Format (PyExc_ValueError, "%s", decoder.errorStr);
if (ret)
{
Py_DECREF( (PyObject *) ret);
}
return NULL;
}
return ret;
}

PyObject* JSONFileToObj(PyObject* self, PyObject *file)
{
PyObject *read;
PyObject *string;
PyObject *result;

if (!PyObject_HasAttrString (file, "read"))
{
PyErr_Format (PyExc_TypeError, "expected file");
return NULL;
}

read = PyObject_GetAttrString (file, "read");

if (!PyCallable_Check (read)) {
Py_XDECREF(read);
PyErr_Format (PyExc_TypeError, "expected file");
return NULL;
}

string = PyObject_CallObject (read, NULL);
Py_XDECREF(read);

if (string == NULL)
{
return NULL;
}

result = JSONToObj (self, string);
Py_XDECREF(string);

if (result == NULL) {
return NULL;
}

return result;
}
#include "py_defines.h"
#include <ultrajson.h>




void Object_objectAddKey(JSOBJ obj, JSOBJ name, JSOBJ value)
{
PyDict_SetItem (obj, name, value);
Py_DECREF( (PyObject *) name);
Py_DECREF( (PyObject *) value);
return;
}

void Object_arrayAddItem(JSOBJ obj, JSOBJ value)
{
PyList_Append(obj, value);
Py_DECREF( (PyObject *) value);
return;
}

JSOBJ Object_newString(wchar_t *start, wchar_t *end)
{
return PyUnicode_FromWideChar (start, (end - start));
}

JSOBJ Object_newTrue(void)
{
Py_RETURN_TRUE;
}

JSOBJ Object_newFalse(void)
{
Py_RETURN_FALSE;
}

JSOBJ Object_newNull(void)
{
Py_RETURN_NONE;
}

JSOBJ Object_newObject(void)
{
return PyDict_New();
}

JSOBJ Object_newArray(void)
{
return PyList_New(0);
}

JSOBJ Object_newInteger(JSINT32 value)
{
return PyInt_FromLong( (long) value);
}

JSOBJ Object_newLong(JSINT64 value)
{
return PyLong_FromLongLong (value);
}

JSOBJ Object_newDouble(double value)
{
return PyFloat_FromDouble(value);
}

static void Object_releaseObject(JSOBJ obj)
{
Py_DECREF( ((PyObject *)obj));
}



PyObject* JSONToObj(PyObject* self, PyObject *arg)
{
PyObject *ret;
PyObject *sarg;
JSONObjectDecoder decoder =
{
Object_newString,
Object_objectAddKey,
Object_arrayAddItem,
Object_newTrue,
Object_newFalse,
Object_newNull,
Object_newObject,
Object_newArray,
Object_newInteger,
Object_newLong,
Object_newDouble,
Object_releaseObject,
PyObject_Malloc,
PyObject_Free,
PyObject_Realloc
};

if (PyString_Check(arg))
{
sarg = arg;
}
else
if (PyUnicode_Check(arg))
{
sarg = PyUnicode_AsUTF8String(arg);
if (sarg == NULL)
{
//Exception raised above us by codec according to docs
return NULL;
}
}
else
{
PyErr_Format(PyExc_TypeError, "Expected String or Unicode");
return NULL;
}

decoder.errorStr = NULL;
decoder.errorOffset = NULL;
ret = JSON_DecodeObject(&decoder, PyString_AS_STRING(sarg), PyString_GET_SIZE(sarg));

if (sarg != arg)
{
Py_DECREF(sarg);
}

if (decoder.errorStr)
{
/*
FIXME: It's possible to give a much nicer error message here with actual failing element in input etc*/
PyErr_Format (PyExc_ValueError, "%s", decoder.errorStr);
if (ret)
{
Py_DECREF( (PyObject *) ret);
}
return NULL;
}
return ret;
}

PyObject* JSONFileToObj(PyObject* self, PyObject *file)
{
PyObject *read;
PyObject *string;
PyObject *result;

if (!PyObject_HasAttrString (file, "read"))
{
PyErr_Format (PyExc_TypeError, "expected file");
return NULL;
}

read = PyObject_GetAttrString (file, "read");

if (!PyCallable_Check (read)) {
Py_XDECREF(read);
PyErr_Format (PyExc_TypeError, "expected file");
return NULL;
}

string = PyObject_CallObject (read, NULL);
Py_XDECREF(read);

if (string == NULL)
{
return NULL;
}

result = JSONToObj (self, string);
Py_XDECREF(string);

if (result == NULL) {
return NULL;
}

return result;
}

Loading

0 comments on commit 640f6da

Please sign in to comment.