int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *result) { PyObject *pyctx = (PyObject *)CTX_py_dict_get(C); PyObject *item = PyDict_GetItemString(pyctx, member); PointerRNA *ptr = NULL; int done = 0; if (item == NULL) { /* pass */ } else if (item == Py_None) { /* pass */ } else if (BPy_StructRNA_Check(item)) { ptr = &(((BPy_StructRNA *)item)->ptr); //result->ptr = ((BPy_StructRNA *)item)->ptr; CTX_data_pointer_set(result, ptr->id.data, ptr->type, ptr->data); done = 1; } else if (PySequence_Check(item)) { PyObject *seq_fast = PySequence_Fast(item, "bpy_context_get sequence conversion"); if (seq_fast == NULL) { PyErr_Print(); PyErr_Clear(); } else { int len = PySequence_Fast_GET_SIZE(seq_fast); int i; for (i = 0; i < len; i++) { PyObject *list_item = PySequence_Fast_GET_ITEM(seq_fast, i); if (BPy_StructRNA_Check(list_item)) { #if 0 CollectionPointerLink *link = MEM_callocN(sizeof(CollectionPointerLink), "bpy_context_get"); link->ptr = ((BPy_StructRNA *)item)->ptr; BLI_addtail(&result->list, link); #endif ptr = &(((BPy_StructRNA *)list_item)->ptr); CTX_data_list_add(result, ptr->id.data, ptr->type, ptr->data); } else { printf("List item not a valid type\n"); } } Py_DECREF(seq_fast); done = 1; } } if (done == 0) { if (item) printf("PyContext '%s' not a valid type\n", member); else printf("PyContext '%s' not found\n", member); } else { if (G.debug & G_DEBUG_PYTHON) { printf("PyContext '%s' found\n", member); } } return done; }
int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *result) { PyGILState_STATE gilstate; bool use_gil = !PyC_IsInterpreterActive(); PyObject *pyctx; PyObject *item; PointerRNA *ptr = NULL; bool done = false; if (use_gil) gilstate = PyGILState_Ensure(); pyctx = (PyObject *)CTX_py_dict_get(C); item = PyDict_GetItemString(pyctx, member); if (item == NULL) { /* pass */ } else if (item == Py_None) { done = true; } else if (BPy_StructRNA_Check(item)) { ptr = &(((BPy_StructRNA *)item)->ptr); //result->ptr = ((BPy_StructRNA *)item)->ptr; CTX_data_pointer_set(result, ptr->id.data, ptr->type, ptr->data); CTX_data_type_set(result, CTX_DATA_TYPE_POINTER); done = true; } else if (PySequence_Check(item)) { PyObject *seq_fast = PySequence_Fast(item, "bpy_context_get sequence conversion"); if (seq_fast == NULL) { PyErr_Print(); PyErr_Clear(); } else { int len = PySequence_Fast_GET_SIZE(seq_fast); PyObject **seq_fast_items = PySequence_Fast_ITEMS(seq_fast); int i; for (i = 0; i < len; i++) { PyObject *list_item = seq_fast_items[i]; if (BPy_StructRNA_Check(list_item)) { #if 0 CollectionPointerLink *link = MEM_callocN(sizeof(CollectionPointerLink), "bpy_context_get"); link->ptr = ((BPy_StructRNA *)item)->ptr; BLI_addtail(&result->list, link); #endif ptr = &(((BPy_StructRNA *)list_item)->ptr); CTX_data_list_add(result, ptr->id.data, ptr->type, ptr->data); } else { printf("PyContext: '%s' list item not a valid type in sequece type '%s'\n", member, Py_TYPE(item)->tp_name); } } Py_DECREF(seq_fast); CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION); done = true; } } if (done == false) { if (item) { printf("PyContext '%s' not a valid type\n", member); } else { printf("PyContext '%s' not found\n", member); } } else { if (G.debug & G_DEBUG_PYTHON) { printf("PyContext '%s' found\n", member); } } if (use_gil) PyGILState_Release(gilstate); return done; }