Changeset: 87c0d4b31cc1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/87c0d4b31cc1
Modified Files:
        clients/Tests/MAL-signatures-hge.test
        clients/Tests/MAL-signatures.test
        sql/backends/monet5/UDF/pyapi3/conversion3.c
        sql/backends/monet5/UDF/pyapi3/pyapi3.c
        sql/backends/monet5/UDF/pyapi3/pyloader3.c
        sql/backends/monet5/UDF/pyapi3/pytypes3.c
Branch: default
Log Message:

small leak fixes


diffs (204 lines):

diff --git a/clients/Tests/MAL-signatures-hge.test 
b/clients/Tests/MAL-signatures-hge.test
--- a/clients/Tests/MAL-signatures-hge.test
+++ b/clients/Tests/MAL-signatures-hge.test
@@ -48819,6 +48819,11 @@ unsafe pattern profiler.stoptrace():void
 CMDstopTrace;
 Stop collecting trace information
 pyapi3
+epilogue
+command pyapi3.epilogue():void 
+PyAPI3epilogue;
+(empty)
+pyapi3
 eval
 unsafe pattern pyapi3.eval(X_0:ptr, X_1:str):any_1 
 PYAPI3PyAPIevalStd;
@@ -48844,6 +48849,11 @@ unsafe pattern pyapi3.eval_loader(X_0:pt
 PYAPI3PyAPIevalLoader;
 loader functions through Python
 pyapi3
+prelude
+pattern pyapi3.prelude():void 
+PyAPI3prelude;
+(empty)
+pyapi3
 subeval_aggr
 unsafe pattern pyapi3.subeval_aggr(X_0:ptr, X_1:str, X_2:any...):any... 
 PYAPI3PyAPIevalAggr;
diff --git a/clients/Tests/MAL-signatures.test 
b/clients/Tests/MAL-signatures.test
--- a/clients/Tests/MAL-signatures.test
+++ b/clients/Tests/MAL-signatures.test
@@ -37249,6 +37249,11 @@ unsafe pattern profiler.stoptrace():void
 CMDstopTrace;
 Stop collecting trace information
 pyapi3
+epilogue
+command pyapi3.epilogue():void 
+PyAPI3epilogue;
+(empty)
+pyapi3
 eval
 unsafe pattern pyapi3.eval(X_0:ptr, X_1:str):any_1 
 PYAPI3PyAPIevalStd;
@@ -37274,6 +37279,11 @@ unsafe pattern pyapi3.eval_loader(X_0:pt
 PYAPI3PyAPIevalLoader;
 loader functions through Python
 pyapi3
+prelude
+pattern pyapi3.prelude():void 
+PyAPI3prelude;
+(empty)
+pyapi3
 subeval_aggr
 unsafe pattern pyapi3.subeval_aggr(X_0:ptr, X_1:str, X_2:any...):any... 
 PYAPI3PyAPIevalAggr;
diff --git a/sql/backends/monet5/UDF/pyapi3/conversion3.c 
b/sql/backends/monet5/UDF/pyapi3/conversion3.c
--- a/sql/backends/monet5/UDF/pyapi3/conversion3.c
+++ b/sql/backends/monet5/UDF/pyapi3/conversion3.c
@@ -121,9 +121,8 @@ PyMaskedArray_FromBAT(PyInput *inp, size
        char *msg;
        PyObject *vararray = PyArrayObject_FromBAT(inp, t_start, t_end, 
return_message, copy);
 
-       if (vararray == NULL) {
+       if (vararray == NULL)
                return NULL;
-       }
        b = inp->bat;
        // To deal with null values, we use the numpy masked array structure
        // The masked array structure is an object with two arrays of equal 
size, a
@@ -143,6 +142,7 @@ PyMaskedArray_FromBAT(PyInput *inp, size
                Py_DECREF(nme);
 
                if (!nullmask) {
+                       Py_DECREF(vararray);
                        Py_DECREF(mafunc);
                        Py_DECREF(mod);
                        msg = createException(MAL, "pyapi3.eval", "Failed to 
create mask for some reason");
@@ -589,8 +589,7 @@ PyDict_CheckForConversion(PyObject *pRes
        for (i = 0; i < expected_columns; i++) {
                PyObject *object = PyDict_GetItemString(pResult, 
retcol_names[i]);
                if (object == NULL) {
-                       msg =
-                               createException(MAL, "pyapi3.eval",
+                       msg = createException(MAL, "pyapi3.eval",
                                                                SQLSTATE(PY000) 
"Expected a return value with name \"%s\", but "
                                                                "this key was 
not present in the dictionary.",
                                                                
retcol_names[i]);
@@ -722,6 +721,7 @@ PyObject_CheckForConversion(PyObject *pR
                                        SQLSTATE(PY000) "Unsupported result 
object. Expected either a list, "
                                        "dictionary, a numpy array, a numpy 
masked array or a "
                                        "pandas data frame, but received an 
object of type \"%s\"",
+                                       /* leaks */
                                        
PyUnicode_AsUTF8(PyObject_Str(PyObject_Type(data))));
                                goto wrapup;
                        }
diff --git a/sql/backends/monet5/UDF/pyapi3/pyapi3.c 
b/sql/backends/monet5/UDF/pyapi3/pyapi3.c
--- a/sql/backends/monet5/UDF/pyapi3/pyapi3.c
+++ b/sql/backends/monet5/UDF/pyapi3/pyapi3.c
@@ -723,7 +723,7 @@ static str PyAPIeval(Client cntxt, MalBl
                // Now we will add the UDF to the main module
                d = PyModule_GetDict(pModule);
                if (code_object == NULL) {
-                       v = PyRun_StringFlags(pycall, Py_file_input, d, d, 
NULL);
+                       v = PyRun_StringFlags(pycall, Py_file_input, d, NULL, 
NULL);
                        if (v == NULL) {
                                msg = PyError_CreateException("Could not parse 
Python code",
                                                                                
          pycall);
@@ -1757,6 +1757,30 @@ bailout:
        return msg;
 }
 
+static str
+PyAPI3prelude(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+    (void)cntxt; (void)mb; (void)stk; (void)pci;
+       return PYAPI3PyAPIprelude();
+}
+
+static str
+PyAPI3epilogue(void *ret)
+{
+    (void)ret;
+       MT_lock_set(&pyapiLock);
+       if (pyapiInitialized) {
+               PyGILState_STATE gstate;
+               gstate = PyGILState_Ensure();
+
+               /* now exit/cleanup */
+               if (0) Py_FinalizeEx();
+               (void)gstate;
+       }
+       MT_lock_unset(&pyapiLock);
+    return MAL_SUCCEED;
+}
+
 #include "mel.h"
 static mel_func pyapi3_init_funcs[] = {
  pattern("pyapi3", "eval", PYAPI3PyAPIevalStd, true, "Execute a simple Python 
script returning a single value", args(1,3, 
argany("",1),arg("fptr",ptr),arg("expr",str))),
@@ -1778,6 +1802,8 @@ static mel_func pyapi3_init_funcs[] = {
  pattern("batpyapi3map", "eval", PYAPI3PyAPIevalStdMap, false, "Execute a 
simple Python script value", args(1,4, 
varargany("",0),arg("fptr",ptr),arg("expr",str),varargany("arg",0))),
  pattern("batpyapi3map", "subeval_aggr", PYAPI3PyAPIevalAggrMap, false, 
"grouped aggregates through Python", args(1,4, 
varargany("",0),arg("fptr",ptr),arg("expr",str),varargany("arg",0))),
  pattern("batpyapi3map", "eval_aggr", PYAPI3PyAPIevalAggrMap, false, "grouped 
aggregates through Python", args(1,4, 
varargany("",0),arg("fptr",ptr),arg("expr",str),varargany("arg",0))),
+ pattern("pyapi3", "prelude", PyAPI3prelude, false, "", noargs),
+ command("pyapi3", "epilogue", PyAPI3epilogue, false, "", noargs),
  { .imp=NULL }
 };
 #include "mal_import.h"
@@ -1786,4 +1812,4 @@ static mel_func pyapi3_init_funcs[] = {
 #pragma section(".CRT$XCU",read)
 #endif
 LIB_STARTUP_FUNC(init_pyapi3_mal)
-{ mal_module2("pyapi3", NULL, pyapi3_init_funcs, PYAPI3PyAPIprelude, NULL); }
+{ mal_module("pyapi3", NULL, pyapi3_init_funcs); }
diff --git a/sql/backends/monet5/UDF/pyapi3/pyloader3.c 
b/sql/backends/monet5/UDF/pyapi3/pyloader3.c
--- a/sql/backends/monet5/UDF/pyapi3/pyloader3.c
+++ b/sql/backends/monet5/UDF/pyapi3/pyloader3.c
@@ -234,7 +234,7 @@ PYAPI3PyAPIevalLoader(Client cntxt, MalB
                // Now we will add the UDF to the main module
                d = PyModule_GetDict(pModule);
                if (code_object == NULL) {
-                       v = PyRun_StringFlags(pycall, Py_file_input, d, d, 
NULL);
+                       v = PyRun_StringFlags(pycall, Py_file_input, d, NULL, 
NULL);
                        if (v == NULL) {
                                msg = PyError_CreateException("Could not parse 
Python code",
                                                                                
          pycall);
diff --git a/sql/backends/monet5/UDF/pyapi3/pytypes3.c 
b/sql/backends/monet5/UDF/pyapi3/pytypes3.c
--- a/sql/backends/monet5/UDF/pyapi3/pytypes3.c
+++ b/sql/backends/monet5/UDF/pyapi3/pytypes3.c
@@ -228,27 +228,33 @@ int BatType_ToPyType(int type)
 
 bool PyType_IsPandasDataFrame(PyObject *object)
 {
-       PyObject *str = PyObject_Str(PyObject_Type(object));
+       PyObject *type = PyObject_Type(object);
+       PyObject *str = PyObject_Str(type);
        bool ret = strcmp(PyUnicode_AsUTF8(str),
                                          "<class 
'pandas.core.frame.DataFrame'>") == 0;
        Py_DECREF(str);
+       Py_DECREF(type);
        return ret;
 }
 
 bool PyType_IsNumpyMaskedArray(PyObject *object)
 {
-       PyObject *str = PyObject_Str(PyObject_Type(object));
+       PyObject *type = PyObject_Type(object);
+       PyObject *str = PyObject_Str(type);
        bool ret = strcmp(PyUnicode_AsUTF8(str),
                                          "<class 
'numpy.ma.core.MaskedArray'>") == 0;
        Py_DECREF(str);
+       Py_DECREF(type);
        return ret;
 }
 
 bool PyType_IsLazyArray(PyObject *object)
 {
-       PyObject *str = PyObject_Str(PyObject_Type(object));
+       PyObject *type = PyObject_Type(object);
+       PyObject *str = PyObject_Str(type);
        bool ret = strcmp(PyUnicode_AsUTF8(str), "<class 'lazyarray'>") == 0;
        Py_DECREF(str);
+       Py_DECREF(type);
        return ret;
 }
 
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to