Skip to content

Commit

Permalink
datatype中的FixedArrayType和FixedDictType def默认值支持
Browse files Browse the repository at this point in the history
  • Loading branch information
jay602 committed Dec 19, 2018
1 parent da9ab91 commit 1c35334
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 26 deletions.
19 changes: 4 additions & 15 deletions kbe/src/lib/entitydef/datatype.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1757,7 +1757,7 @@ bool FixedArrayType::isSameType(PyObject* pyValue)
PyObject* FixedArrayType::parseDefaultStr(std::string defaultVal)
{
FixedArray* pFixedArray = new FixedArray(this);
pFixedArray->initialize("");
pFixedArray->initialize(defaultVal);
return pFixedArray;
}

Expand Down Expand Up @@ -2359,27 +2359,16 @@ bool FixedDictType::isSameType(PyObject* pyValue)
//-------------------------------------------------------------------------------------
PyObject* FixedDictType::parseDefaultStr(std::string defaultVal)
{
PyObject* val = PyDict_New();

FIXEDDICT_KEYTYPE_MAP::iterator iter = keyTypes_.begin();
for(; iter != keyTypes_.end(); ++iter)
{
PyObject* item = iter->second->dataType->parseDefaultStr("");
PyDict_SetItemString(val, iter->first.c_str(), item);
Py_DECREF(item);
}

FixedDict* pydict = new FixedDict(this);
pydict->initialize(val);
Py_DECREF(val);
pydict->initialize(defaultVal);

if(hasImpl())
if (hasImpl())
{
PyObject* pyValue = impl_createObjFromDict(pydict);
Py_DECREF(pydict);
return pyValue;
}

return pydict;
}

Expand Down
45 changes: 45 additions & 0 deletions kbe/src/lib/entitydef/fixedarray.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,51 @@ FixedArray::~FixedArray()
//-------------------------------------------------------------------------------------
void FixedArray::initialize(std::string strInitData)
{
PyObject* pyVal = NULL;

if (strInitData.size() > 0)
{
PyObject* module = PyImport_AddModule("__main__");
if (module == NULL)
{
PyErr_SetString(PyExc_SystemError,
"FixedArrayType::createObject:PyImport_AddModule __main__ error!");

PyErr_PrintEx(0);
goto _StartCreateFixedArray;
}

PyObject* mdict = PyModule_GetDict(module); // Borrowed reference.

pyVal = PyRun_String(const_cast<char*>(strInitData.c_str()),
Py_eval_input, mdict, mdict);

if (pyVal == NULL)
{
SCRIPT_ERROR_CHECK();
ERROR_MSG(fmt::format("FixedArray({}) initialize({}) error!\n",
_dataType->aliasName(), strInitData));
}
else
{
if (!isSameType(pyVal))
{
ERROR_MSG(fmt::format("FixedArray({}) initialize({}) error! is not same type\n",
_dataType->aliasName(), strInitData));
Py_DECREF(pyVal);
pyVal = NULL;
}
}
}

_StartCreateFixedArray:
if (!pyVal)
{
pyVal = PyList_New(0);
}

initialize(pyVal);
Py_DECREF(pyVal);
}

//-------------------------------------------------------------------------------------
Expand Down
63 changes: 52 additions & 11 deletions kbe/src/lib/entitydef/fixeddict.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,24 +103,60 @@ FixedDict::~FixedDict()
//-------------------------------------------------------------------------------------
void FixedDict::initialize(std::string strDictInitData)
{
FixedDictType::FIXEDDICT_KEYTYPE_MAP& keyTypes = _dataType->getKeyTypes();
FixedDictType::FIXEDDICT_KEYTYPE_MAP::iterator iter = keyTypes.begin();
for(; iter != keyTypes.end(); ++iter)
PyObject* pyVal = NULL;

if (strDictInitData.size() > 0)
{
PyObject* pyobj = iter->second->dataType->parseDefaultStr("");
if(pyobj)
PyObject* module = PyImport_AddModule("__main__");
if (module == NULL)
{
PyObject* pykey = PyUnicode_FromString(iter->first.c_str());
PyDict_SetItem(pyDict_, pykey, pyobj);
Py_DECREF(pykey);
Py_DECREF(pyobj);
PyErr_SetString(PyExc_SystemError,
"FixedDictType::createObject:PyImport_AddModule __main__ error!");

PyErr_PrintEx(0);
goto _StartCreateFixedDict;
}

PyObject* mdict = PyModule_GetDict(module); // Borrowed reference.

pyVal = PyRun_String(const_cast<char*>(strDictInitData.c_str()),
Py_eval_input, mdict, mdict);

if (pyVal == NULL)
{
SCRIPT_ERROR_CHECK();
ERROR_MSG(fmt::format("FIXED_DICT({}) initialize({}) error!\n",
_dataType->aliasName(), strDictInitData));
}
else
{
ERROR_MSG(fmt::format("FixedDict::initialize: error! strDictInitData={}.\n",
strDictInitData.c_str()));
if (!isSameType(pyVal))
{
ERROR_MSG(fmt::format("FIXED_DICT({}) initialize({}) error! is not same type, allKeyNames=[{}]\n",
_dataType->aliasName(), strDictInitData, _dataType->debugInfos().c_str()));
Py_DECREF(pyVal);
pyVal = NULL;
}
}
}

_StartCreateFixedDict:
if (!pyVal)
{
pyVal = PyDict_New();

FixedDictType::FIXEDDICT_KEYTYPE_MAP& keyTypes = _dataType->getKeyTypes();
FixedDictType::FIXEDDICT_KEYTYPE_MAP::iterator iter = keyTypes.begin();
for (; iter != keyTypes.end(); ++iter)
{
PyObject* item = iter->second->dataType->parseDefaultStr("");
PyDict_SetItemString(pyVal, iter->first.c_str(), item);
Py_DECREF(item);
}
}

initialize(pyVal);
Py_DECREF(pyVal);
}

//-------------------------------------------------------------------------------------
Expand Down Expand Up @@ -371,6 +407,11 @@ PyObject* FixedDict::tp_str()
return tp_repr();
}

bool FixedDict::isSameType(PyObject* pyValue)
{
return _dataType->isSameType(pyValue);
}

//-------------------------------------------------------------------------------------
PyObject* FixedDict::tp_repr()
{
Expand Down
2 changes: 2 additions & 0 deletions kbe/src/lib/entitydef/fixeddict.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ class FixedDict : public script::Map
PyObject* tp_repr();
PyObject* tp_str();

bool isSameType(PyObject* pyValue);

protected:
FixedDictType* _dataType;
} ;
Expand Down

0 comments on commit 1c35334

Please sign in to comment.