static PyObject *PyUpb_FieldDef_getattro(PyObject *obj, PyObject *attr_name) { upb_fielddef *f = Check_FieldDef(obj, NULL); if (!upb_fielddef_ismutable(f)) { PyErr_SetString(PyExc_TypeError, "fielddef is not mutable."); return NULL; } const char *name = PyString_AsString(attr_name); if (streql(name, "name")) { const char *name = upb_fielddef_name(f); return name == NULL ? Py_None : PyString_FromString(name); } else if (streql(name, "number")) { uint32_t num = upb_fielddef_number(f); return num == 0 ? Py_None : PyInt_FromLong(num); } else if (streql(name, "type")) { uint8_t type = upb_fielddef_type(f); return type == 0 ? Py_None : PyInt_FromLong(type); } else if (streql(name, "label")) { return PyInt_FromLong(upb_fielddef_label(f)); } else if (streql(name, "type_name")) { const char *name = upb_fielddef_typename(f); return name == NULL ? Py_None : PyString_FromString(name); } else if (streql(name, "subdef")) { // NYI; return NULL; } else if (streql(name, "msgdef")) { // NYI; return NULL; } else { return PyUpb_Error("Invalid fielddef member."); } }
static int PyUpb_FieldDef_setattro(PyObject *o, PyObject *key, PyObject *val) { upb_fielddef *f = Check_FieldDef(o, -1); const char *field = PyString_AsString(key); if (!upb_fielddef_ismutable(f)) return PyUpb_ErrorInt("fielddef is not mutable."); if (streql(field, "name")) { const char *name = PyString_AsString(val); if (!name || !upb_fielddef_setname(f, name)) return PyUpb_ErrorInt("Invalid name"); } else if (streql(field, "number")) { // TODO: should check truncation. Non-security issue. // Non-int will return -1, which is already invalid as a field number. if (!upb_fielddef_setnumber(f, PyInt_AsLong(val))) return PyUpb_ErrorInt("Invalid number"); } else if (streql(field, "type")) { // TODO: should check truncation. Non-security issue. if (!upb_fielddef_settype(f, PyInt_AsLong(val))) return PyUpb_ErrorInt("Invalid type"); } else if (streql(field, "label")) { // TODO: should check truncation. Non-security issue. if (!upb_fielddef_setlabel(f, PyInt_AsLong(val))) return PyUpb_ErrorInt("Invalid label"); } else if (streql(field, "type_name")) { const char *name = PyString_AsString(val); if (!name || !upb_fielddef_settypename(f, name)) return PyUpb_ErrorInt("Invalid type_name"); } else if (streql(field, "default_value")) { // NYI return -1; } else { return PyUpb_ErrorInt("Invalid fielddef member."); } return 0; }
upb_def *upb_fielddef_subdef(const upb_fielddef *f) { if (upb_hassubdef(f) && !upb_fielddef_ismutable(f)) return f->def; else return NULL; }