diff --git a/Makefile b/Makefile index c59461b..eef2c2a 100644 --- a/bundles/pyml/pyml-current/Makefile +++ b/bundles/pyml/pyml-current/Makefile @@ -207,13 +207,13 @@ test : test.bytecode $(TESTOPT) .PHONY : test.bytecode test.bytecode : pyml_tests.bytecode numpy_tests.bytecode - ./pyml_tests.bytecode - ./numpy_tests.bytecode + ./pyml_tests.bytecode $(TEST_OPTIONS) + ./numpy_tests.bytecode $(TEST_OPTIONS) .PHONY : test.native test.native : pyml_tests.native numpy_tests.native - ./pyml_tests.native - ./numpy_tests.native + ./pyml_tests.native $(TEST_OPTIONS) + ./numpy_tests.native $(TEST_OPTIONS) .PHONY : install install : $(INSTALL_FILES) diff --git a/pyml_stubs.c b/pyml_stubs.c index 149695c..40e3481 100644 --- a/bundles/pyml/pyml-current/pyml_stubs.c +++ b/bundles/pyml/pyml-current/pyml_stubs.c @@ -136,8 +136,6 @@ file_of_file_descr(value file_descr, const char *mode) } #endif -static void *Python27__PyObject_NextNotImplemented; - /* Global variables for the library */ /* version_major != 0 iff the library is initialized */ @@ -743,15 +741,18 @@ guess_debug_build() PyObject *debug_build_py; char *py_debug_str = "Py_DEBUG"; if (version_major >= 3) { - py_debug = Python3_PyUnicode_FromStringAndSize(py_debug_str, 8); + py_debug = Python3_PyUnicode_FromStringAndSize(py_debug_str, strlen(py_debug_str)); } else { - py_debug = Python2_PyString_FromStringAndSize(py_debug_str, 8); + py_debug = Python2_PyString_FromStringAndSize(py_debug_str, strlen(py_debug_str)); } assert(py_debug); args = singleton(py_debug); debug_build_py = Python_PyObject_Call(get_config_var, args, NULL); - assert(debug_build_py); + if (!debug_build_py) { + Python_PyErr_Print(); + caml_failwith("Cannot check for debug build"); + } if (debug_build_py == Python__Py_NoneStruct) { debug_build = 0; } @@ -797,8 +798,6 @@ py_load_library(value filename_ocaml, value debug_build_ocaml) Python27_PyCapsule_New = resolve("PyCapsule_New"); Python27_PyCapsule_GetPointer = resolve("PyCapsule_GetPointer"); Python27_PyCapsule_IsValid = resolve("PyCapsule_IsValid"); - Python27__PyObject_NextNotImplemented = - resolve("_PyObject_NextNotImplemented"); } Python_PyObject_CallFunctionObjArgs = resolve("PyObject_CallFunctionObjArgs"); @@ -970,6 +969,17 @@ enum pytype_labels { Set }; +static bool is_iterable(PyObject *obj) { + PyObject *iter = Python_PyObject_GetIter(obj); + if (iter) { + Py_DECREF(iter); + return true; + } else { + Python_PyErr_Clear(); + return false; + } +} + CAMLprim value pytype(value object_ocaml) { @@ -1035,8 +1045,7 @@ pytype(value object_ocaml) else if (ob_type == Python_PySet_Type) { result = Set; } - else if (typeobj->tp_iternext != NULL && - typeobj->tp_iternext != &Python27__PyObject_NextNotImplemented) { + else if (is_iterable(object)) { result = Iter; } else {