From 4906b5da9e7408a00bf388f42e40d0353c1297d4 Mon Sep 17 00:00:00 2001 From: Anthony Geay Date: Thu, 4 May 2017 14:25:02 +0200 Subject: [PATCH] DataArrayFloat pickelized --- src/MEDCoupling_Swig/MEDCouplingCommon.i | 30 +---------- .../MEDCouplingDataArrayTypemaps.i | 53 +++++++++++++++++-- src/MEDCoupling_Swig/MEDCouplingFinalize.i | 2 +- src/MEDCoupling_Swig/MEDCouplingPickleTest.py | 11 ++++ 4 files changed, 61 insertions(+), 35 deletions(-) diff --git a/src/MEDCoupling_Swig/MEDCouplingCommon.i b/src/MEDCoupling_Swig/MEDCouplingCommon.i index 7d31929f3..a19239b5d 100644 --- a/src/MEDCoupling_Swig/MEDCouplingCommon.i +++ b/src/MEDCoupling_Swig/MEDCouplingCommon.i @@ -5040,35 +5040,7 @@ namespace MEDCoupling static PyObject *___new___(PyObject *cls, PyObject *args) throw(INTERP_KERNEL::Exception) { - static const char MSG[]="MEDCouplingFieldDouble.__new__ : the args in input is expected to be a tuple !"; - if(!PyTuple_Check(args)) - throw INTERP_KERNEL::Exception(MSG); - PyObject *builtinsd(PyEval_GetBuiltins());//borrowed - PyObject *obj(PyDict_GetItemString(builtinsd,"object"));//borrowed - PyObject *selfMeth(PyObject_GetAttrString(obj,"__new__")); - // - PyObject *tmp0(PyTuple_New(1)); - PyTuple_SetItem(tmp0,0,cls); Py_XINCREF(cls); - PyObject *instance(PyObject_CallObject(selfMeth,tmp0)); - Py_DECREF(tmp0); - Py_DECREF(selfMeth); - if(PyTuple_Size(args)==2 && PyDict_Check(PyTuple_GetItem(args,1)) && PyDict_Size(PyTuple_GetItem(args,1))==1 ) - {// NOT general case. only true if in unpickeling context ! call __init__. Because for all other cases, __init__ is called right after __new__ ! - PyObject *initMeth(PyObject_GetAttrString(instance,"__init__")); - //// - PyObject *a(PyInt_FromLong(0)); - PyObject *uniqueElt(PyDict_GetItem(PyTuple_GetItem(args,1),a)); - Py_DECREF(a); - if(!uniqueElt) - throw INTERP_KERNEL::Exception(MSG); - if(!PyTuple_Check(uniqueElt) || PyTuple_Size(uniqueElt)!=2) - throw INTERP_KERNEL::Exception(MSG); - PyObject *tmp2(PyObject_CallObject(initMeth,uniqueElt)); - Py_XDECREF(tmp2); - //// - Py_DECREF(initMeth); - } - return instance; + return NewMethWrapCallInitOnlyIfDictWithSingleEltInInputGeneral(cls,args,"MEDCouplingFieldDouble"); } PyObject *__getnewargs__() throw(INTERP_KERNEL::Exception) diff --git a/src/MEDCoupling_Swig/MEDCouplingDataArrayTypemaps.i b/src/MEDCoupling_Swig/MEDCouplingDataArrayTypemaps.i index cc56b4775..564c3a5e4 100644 --- a/src/MEDCoupling_Swig/MEDCouplingDataArrayTypemaps.i +++ b/src/MEDCoupling_Swig/MEDCouplingDataArrayTypemaps.i @@ -2396,7 +2396,8 @@ static PyObject *NewMethWrapCallInitOnlyIfEmptyDictInInput(PyObject *cls, PyObje return instance; } -static PyObject *NewMethWrapCallInitOnlyIfDictWithSingleEltInInput(PyObject *cls, PyObject *args, const char *clsName) +template +static PyObject *NewMethWrapCallInitOnlyIfDictWithSingleEltInInputGeneral(PyObject *cls, PyObject *args, const char *clsName) { if(!PyTuple_Check(args)) { @@ -2421,11 +2422,27 @@ static PyObject *NewMethWrapCallInitOnlyIfDictWithSingleEltInInput(PyObject *cls zeNumpyRepr=PyDict_GetItem(PyTuple_GetItem(args,1),tmp1);//borrowed Py_DECREF(tmp1); } + if(!zeNumpyRepr) + { + std::ostringstream oss; oss << clsName << ".__new__ : the args in input is expected to be a tuple !"; + throw INTERP_KERNEL::Exception(oss.str().c_str()); + } + T tt; { - PyObject *tmp3(PyTuple_New(1)); - PyTuple_SetItem(tmp3,0,zeNumpyRepr); Py_XINCREF(zeNumpyRepr); - PyObject *tmp2(PyObject_CallObject(initMeth,tmp3)); - Py_XDECREF(tmp2); + PyObject *tmp3(0); + try + { + tmp3=tt(zeNumpyRepr); + } + catch(INTERP_KERNEL::Exception& e) + { + std::ostringstream oss; oss << clsName << ".__new__ : Invalid type in input " << " : " << e.what(); + throw INTERP_KERNEL::Exception(oss.str()); + } + { + PyObject *tmp2(PyObject_CallObject(initMeth,tmp3)); + Py_XDECREF(tmp2); + } Py_DECREF(tmp3); } Py_DECREF(initMeth); @@ -2433,6 +2450,32 @@ static PyObject *NewMethWrapCallInitOnlyIfDictWithSingleEltInInput(PyObject *cls return instance; } +struct SinglePyObjToBePutInATuple +{ + PyObject *operator()(PyObject *zeNumpyRepr) + { + PyObject *tmp3(PyTuple_New(1)); + PyTuple_SetItem(tmp3,0,zeNumpyRepr); Py_XINCREF(zeNumpyRepr); + return tmp3; + } +}; + +struct SinglePyObjExpectToBeAListOfSz2 +{ + PyObject *operator()(PyObject *uniqueElt) + { + if(!PyTuple_Check(uniqueElt) || PyTuple_Size(uniqueElt)!=2) + throw INTERP_KERNEL::Exception("Not a tuple of size 2 !"); + Py_XINCREF(uniqueElt); + return uniqueElt; + } +}; + +static PyObject *NewMethWrapCallInitOnlyIfDictWithSingleEltInInput(PyObject *cls, PyObject *args, const char *clsName) +{ + return NewMethWrapCallInitOnlyIfDictWithSingleEltInInputGeneral(cls,args,clsName); +} + static PyObject *convertPartDefinition(MEDCoupling::PartDefinition *pd, int owner) throw(INTERP_KERNEL::Exception) { PyObject *ret=0; diff --git a/src/MEDCoupling_Swig/MEDCouplingFinalize.i b/src/MEDCoupling_Swig/MEDCouplingFinalize.i index 384c448e1..a297355d2 100644 --- a/src/MEDCoupling_Swig/MEDCouplingFinalize.i +++ b/src/MEDCoupling_Swig/MEDCouplingFinalize.i @@ -36,7 +36,7 @@ DataArrayInt.__ipow__=MEDCouplingDataArrayIntIpow DataArrayByte.__new__=classmethod(MEDCouplingDataArrayBytenew) -DataArrayFloat.__new__=MEDCouplingDataArrayFloatnew +DataArrayFloat.__new__=classmethod(MEDCouplingDataArrayFloatnew) DataArrayFloat.__iadd__=MEDCouplingDataArrayFloatIadd DataArrayFloat.__isub__=MEDCouplingDataArrayFloatIsub DataArrayFloat.__imul__=MEDCouplingDataArrayFloatImul diff --git a/src/MEDCoupling_Swig/MEDCouplingPickleTest.py b/src/MEDCoupling_Swig/MEDCouplingPickleTest.py index a34420d8a..bbb2a64cb 100644 --- a/src/MEDCoupling_Swig/MEDCouplingPickleTest.py +++ b/src/MEDCoupling_Swig/MEDCouplingPickleTest.py @@ -306,6 +306,17 @@ class MEDCouplingPickleTest(unittest.TestCase): self.assertTrue(x2.isEqual(x)) pass + @unittest.skipUnless(MEDCouplingHasNumPyBindings(),"requires numpy") + def test15(self): + """Pickelization of DataArrayFloat""" + x=DataArrayFloat(256) ; x.iota() + x.rearrange(2) ; x.setInfoOnComponents(["aa","bbb"]) + x.setName("toto") + st=cPickle.dumps(x,cPickle.HIGHEST_PROTOCOL) + x2=cPickle.loads(st) + self.assertTrue(x2.isEqual(x,1e-7)) + pass + def setUp(self): pass pass -- 2.39.2