summaryrefslogtreecommitdiffstats
path: root/Modules/_testcapi
diff options
context:
space:
mode:
Diffstat (limited to 'Modules/_testcapi')
-rw-r--r--Modules/_testcapi/object.c133
-rw-r--r--Modules/_testcapi/parts.h1
2 files changed, 134 insertions, 0 deletions
diff --git a/Modules/_testcapi/object.c b/Modules/_testcapi/object.c
new file mode 100644
index 0000000..ce5b574
--- /dev/null
+++ b/Modules/_testcapi/object.c
@@ -0,0 +1,133 @@
+#include "parts.h"
+#include "util.h"
+
+static PyObject *
+call_pyobject_print(PyObject *self, PyObject * args)
+{
+ PyObject *object;
+ PyObject *filename;
+ PyObject *print_raw;
+ FILE *fp;
+ int flags = 0;
+
+ if (!PyArg_UnpackTuple(args, "call_pyobject_print", 3, 3,
+ &object, &filename, &print_raw)) {
+ return NULL;
+ }
+
+ fp = _Py_fopen_obj(filename, "w+");
+
+ if (Py_IsTrue(print_raw)) {
+ flags = Py_PRINT_RAW;
+ }
+
+ if (PyObject_Print(object, fp, flags) < 0) {
+ fclose(fp);
+ return NULL;
+ }
+
+ fclose(fp);
+
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+pyobject_print_null(PyObject *self, PyObject *args)
+{
+ PyObject *filename;
+ FILE *fp;
+
+ if (!PyArg_UnpackTuple(args, "call_pyobject_print", 1, 1, &filename)) {
+ return NULL;
+ }
+
+ fp = _Py_fopen_obj(filename, "w+");
+
+ if (PyObject_Print(NULL, fp, 0) < 0) {
+ fclose(fp);
+ return NULL;
+ }
+
+ fclose(fp);
+
+ Py_RETURN_NONE;
+}
+
+static PyObject *
+pyobject_print_noref_object(PyObject *self, PyObject *args)
+{
+ PyObject *test_string;
+ PyObject *filename;
+ FILE *fp;
+ char correct_string[100];
+
+ test_string = PyUnicode_FromString("Spam spam spam");
+
+ Py_SET_REFCNT(test_string, 0);
+
+ PyOS_snprintf(correct_string, 100, "<refcnt %zd at %p>",
+ Py_REFCNT(test_string), (void *)test_string);
+
+ if (!PyArg_UnpackTuple(args, "call_pyobject_print", 1, 1, &filename)) {
+ return NULL;
+ }
+
+ fp = _Py_fopen_obj(filename, "w+");
+
+ if (PyObject_Print(test_string, fp, 0) < 0){
+ fclose(fp);
+ return NULL;
+ }
+
+ fclose(fp);
+
+ Py_SET_REFCNT(test_string, 1);
+ Py_DECREF(test_string);
+
+ return PyUnicode_FromString(correct_string);
+}
+
+static PyObject *
+pyobject_print_os_error(PyObject *self, PyObject *args)
+{
+ PyObject *test_string;
+ PyObject *filename;
+ FILE *fp;
+
+ test_string = PyUnicode_FromString("Spam spam spam");
+
+ if (!PyArg_UnpackTuple(args, "call_pyobject_print", 1, 1, &filename)) {
+ return NULL;
+ }
+
+ // open file in read mode to induce OSError
+ fp = _Py_fopen_obj(filename, "r");
+
+ if (PyObject_Print(test_string, fp, 0) < 0) {
+ fclose(fp);
+ return NULL;
+ }
+
+ fclose(fp);
+
+ Py_RETURN_NONE;
+}
+
+static PyMethodDef test_methods[] = {
+ {"call_pyobject_print", call_pyobject_print, METH_VARARGS},
+ {"pyobject_print_null", pyobject_print_null, METH_VARARGS},
+ {"pyobject_print_noref_object", pyobject_print_noref_object, METH_VARARGS},
+ {"pyobject_print_os_error", pyobject_print_os_error, METH_VARARGS},
+
+ {NULL},
+};
+
+int
+_PyTestCapi_Init_Object(PyObject *m)
+{
+ if (PyModule_AddFunctions(m, test_methods) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/Modules/_testcapi/parts.h b/Modules/_testcapi/parts.h
index e7c868f..2336cc0 100644
--- a/Modules/_testcapi/parts.h
+++ b/Modules/_testcapi/parts.h
@@ -57,5 +57,6 @@ int _PyTestCapi_Init_Immortal(PyObject *module);
int _PyTestCapi_Init_GC(PyObject *module);
int _PyTestCapi_Init_Hash(PyObject *module);
int _PyTestCapi_Init_Time(PyObject *module);
+int _PyTestCapi_Init_Object(PyObject *module);
#endif // Py_TESTCAPI_PARTS_H