//------------------------------------------------------------------------------------- int FixedDict::mp_ass_subscript(PyObject* self, PyObject* key, PyObject* value) { wchar_t* PyUnicode_AsWideCharStringRet0 = PyUnicode_AsWideCharString(key, NULL); char* dictKeyName = strutil::wchar2char(PyUnicode_AsWideCharStringRet0); PyMem_Free(PyUnicode_AsWideCharStringRet0); FixedDict* fixedDict = static_cast<FixedDict*>(self); if (value == NULL) { if(!fixedDict->checkDataChanged(dictKeyName, value, true)) { free(dictKeyName); return 0; } return PyDict_DelItem(fixedDict->pyDict_, key); } if(!fixedDict->checkDataChanged(dictKeyName, value)) { free(dictKeyName); return 0; } PyObject* val1 = static_cast<FixedDictType*>(fixedDict->getDataType())->createNewItemFromObj(dictKeyName, value); int ret = PyDict_SetItem(fixedDict->pyDict_, key, val1); // 由于PyDict_SetItem会增加引用因此需要减 Py_DECREF(val1); free(dictKeyName); return ret; }
//------------------------------------------------------------------------------------- int FixedDict::mp_ass_subscript(PyObject* self, PyObject* key, PyObject* value) { wchar_t* PyUnicode_AsWideCharStringRet0 = PyUnicode_AsWideCharString(key, NULL); if (PyUnicode_AsWideCharStringRet0 == NULL) { char err[255]; kbe_snprintf(err, 255, "FixedDict::mp_ass_subscript: key not is string!\n"); PyErr_SetString(PyExc_TypeError, err); PyErr_PrintEx(0); return 0; } char* dictKeyName = strutil::wchar2char(PyUnicode_AsWideCharStringRet0); PyMem_Free(PyUnicode_AsWideCharStringRet0); FixedDict* fixedDict = static_cast<FixedDict*>(self); if (value == NULL) { if(!fixedDict->checkDataChanged(dictKeyName, value, true)) { free(dictKeyName); return 0; } free(dictKeyName); return PyDict_DelItem(fixedDict->pyDict_, key); } if(!fixedDict->checkDataChanged(dictKeyName, value)) { free(dictKeyName); return 0; } PyObject* val1 = static_cast<FixedDictType*>(fixedDict->getDataType())->createNewItemFromObj(dictKeyName, value); int ret = PyDict_SetItem(fixedDict->pyDict_, key, val1); // 由于PyDict_SetItem会增加引用因此需要减 Py_DECREF(val1); free(dictKeyName); return ret; }
//------------------------------------------------------------------------------------- PyObject* FixedDict::__py_reduce_ex__(PyObject* self, PyObject* protocol) { FixedDict* fixedDict = static_cast<FixedDict*>(self); PyObject* args = PyTuple_New(2); PyObject* unpickleMethod = script::Pickler::getUnpickleFunc("FixedDict"); PyTuple_SET_ITEM(args, 0, unpickleMethod); PyObject* args1 = PyTuple_New(2); PyTuple_SET_ITEM(args1, 0, PyLong_FromLongLong(fixedDict->getDataType()->id())); PyTuple_SET_ITEM(args1, 1, PyDict_Copy(fixedDict->getDictObject())); PyTuple_SET_ITEM(args, 1, args1); if(unpickleMethod == NULL){ Py_DECREF(args); return NULL; } return args; }
//------------------------------------------------------------------------------------- PyObject* FixedDict::__unpickle__(PyObject* self, PyObject* args) { Py_ssize_t size = PyTuple_Size(args); if(size != 2) { ERROR_MSG("FixedDict::__unpickle__: args is wrong! (size != 2)"); S_Return; } PyObject* pyDatatypeUID = PyTuple_GET_ITEM(args, 0); DATATYPE_UID uid = (DATATYPE_UID)PyLong_AsUnsignedLong(pyDatatypeUID); PyObject* dict = PyTuple_GET_ITEM(args, 1); if(dict == NULL) { ERROR_MSG("FixedDict::__unpickle__: args is wrong!"); S_Return; } FixedDict* pFixedDict = new FixedDict(DataTypes::getDataType(uid)); pFixedDict->initialize(dict); return pFixedDict; }