Skip to content

Commit

Permalink
Merge pull request #1527 from haberman/24-cherrypick
Browse files Browse the repository at this point in the history
On demand create message meta class for upb python
  • Loading branch information
haberman authored Oct 17, 2023
2 parents 52a1dda + 6d64040 commit e31cb02
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 1 deletion.
21 changes: 20 additions & 1 deletion python/descriptor.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,25 @@ PyObject* PyUpb_Descriptor_Get(const upb_MessageDef* m) {

PyObject* PyUpb_Descriptor_GetClass(const upb_MessageDef* m) {
PyObject* ret = PyUpb_ObjCache_Get(upb_MessageDef_MiniTable(m));
if (ret) return ret;

// On demand create the clss if not exist. However, if users repeatedly
// create and destroy a class, it could trigger a loop. This is not an
// issue now, but if we see CPU waste for repeatedly create and destroy
// in the future, we could make PyUpb_Descriptor_Get() append the descriptor
// to an internal list in DescriptorPool, let the pool keep descriptors alive.
PyObject* py_descriptor = PyUpb_Descriptor_Get(m);
if (py_descriptor == NULL) return NULL;
const char* name = upb_MessageDef_Name(m);
PyObject* dict = PyDict_New();
if (dict == NULL) goto err;
int status = PyDict_SetItemString(dict, "DESCRIPTOR", py_descriptor);
if (status < 0) goto err;
ret = PyUpb_MessageMeta_DoCreateClass(py_descriptor, name, dict);

err:
Py_XDECREF(py_descriptor);
Py_XDECREF(dict);
return ret;
}

Expand Down Expand Up @@ -477,7 +496,7 @@ static PyObject* PyUpb_Descriptor_GetFullName(PyObject* self, void* closure) {
static PyObject* PyUpb_Descriptor_GetConcreteClass(PyObject* self,
void* closure) {
const upb_MessageDef* msgdef = PyUpb_Descriptor_GetDef(self);
return PyUpb_Descriptor_GetClass(msgdef);
return PyUpb_ObjCache_Get(upb_MessageDef_MiniTable(msgdef));
}

static PyObject* PyUpb_Descriptor_GetFile(PyObject* self, void* closure) {
Expand Down
4 changes: 4 additions & 0 deletions python/message.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@ PyObject* PyUpb_Message_GetFieldValue(PyObject* _self,
int PyUpb_Message_SetFieldValue(PyObject* _self, const upb_FieldDef* field,
PyObject* value, PyObject* exc);

// Creates message meta class.
PyObject* PyUpb_MessageMeta_DoCreateClass(PyObject* py_descriptor,
const char* name, PyObject* dict);

// Returns the version associated with this message. The version will be
// incremented when the message changes.
int PyUpb_Message_GetVersion(PyObject* _self);
Expand Down

0 comments on commit e31cb02

Please sign in to comment.