diff --git a/python/google/protobuf/pyext/descriptor.cc b/python/google/protobuf/pyext/descriptor.cc index a4a323adfa0a..91fe832b95e6 100644 --- a/python/google/protobuf/pyext/descriptor.cc +++ b/python/google/protobuf/pyext/descriptor.cc @@ -81,8 +81,8 @@ namespace python { // All descriptors are stored here. std::unordered_map* interned_descriptors; -PyObject* PyString_FromCppString(const std::string& str) { - return PyUnicode_FromStringAndSize(str.c_str(), str.size()); +PyObject* PyString_FromCppString(absl::string_view str) { + return PyUnicode_FromStringAndSize(str.data(), str.size()); } // Check that the calling Python code is the global scope of a _pb2.py module. @@ -266,7 +266,7 @@ static PyObject* GetOrBuildMessageInDefaultPool( message_factory::GetOrCreateMessageClass(message_factory, message_type); if (message_class == nullptr) { PyErr_Format(PyExc_TypeError, "Could not retrieve class for: %s", - message_type->full_name().c_str()); + std::string(message_type->full_name()).c_str()); return nullptr; } ScopedPyObjectPtr args(PyTuple_New(0)); @@ -278,7 +278,7 @@ static PyObject* GetOrBuildMessageInDefaultPool( } if (!PyObject_TypeCheck(value.get(), CMessage_Type)) { PyErr_Format(PyExc_TypeError, "Invalid class for %s: %s", - message_type->full_name().c_str(), + std::string(message_type->full_name()).c_str(), Py_TYPE(value.get())->tp_name); return nullptr; } @@ -339,7 +339,7 @@ static PyObject* CopyToPythonProto(const DescriptorClass *descriptor, if (!PyObject_TypeCheck(target, CMessage_Type) || message->message->GetDescriptor() != self_descriptor) { PyErr_Format(PyExc_TypeError, "Not a %s message", - self_descriptor->full_name().c_str()); + std::string(self_descriptor->full_name()).c_str()); return nullptr; } cmessage::AssureWritable(message); @@ -902,8 +902,8 @@ static PyObject* GetDefaultValue(PyBaseDescriptor *self, void *closure) { break; } case FieldDescriptor::CPPTYPE_STRING: { - const std::string& value = _GetDescriptor(self)->default_value_string(); - result = ToStringObject(_GetDescriptor(self), value); + result = ToStringObject(_GetDescriptor(self), + _GetDescriptor(self)->default_value_string()); break; } case FieldDescriptor::CPPTYPE_ENUM: { @@ -918,7 +918,7 @@ static PyObject* GetDefaultValue(PyBaseDescriptor *self, void *closure) { } default: PyErr_Format(PyExc_NotImplementedError, "default value for %s", - _GetDescriptor(self)->full_name().c_str()); + std::string(_GetDescriptor(self)->full_name()).c_str()); return nullptr; } return result; @@ -2052,8 +2052,8 @@ static bool AddEnumValues(PyTypeObject *type, if (obj == nullptr) { return false; } - if (PyDict_SetItemString(type->tp_dict, value->name().c_str(), obj.get()) < - 0) { + if (PyDict_SetItemString(type->tp_dict, std::string(value->name()).c_str(), + obj.get()) < 0) { return false; } } diff --git a/python/google/protobuf/pyext/descriptor_containers.cc b/python/google/protobuf/pyext/descriptor_containers.cc index 44d139fabda1..d28e228d203d 100644 --- a/python/google/protobuf/pyext/descriptor_containers.cc +++ b/python/google/protobuf/pyext/descriptor_containers.cc @@ -64,9 +64,8 @@ typedef const void* (*GetByCamelcaseNameMethod)(PyContainer* self, absl::string_view name); typedef const void* (*GetByNumberMethod)(PyContainer* self, int index); typedef PyObject* (*NewObjectFromItemMethod)(const void* descriptor); -typedef const std::string& (*GetItemNameMethod)(const void* descriptor); -typedef const std::string& (*GetItemCamelcaseNameMethod)( - const void* descriptor); +typedef absl::string_view (*GetItemNameMethod)(const void* descriptor); +typedef absl::string_view (*GetItemCamelcaseNameMethod)(const void* descriptor); typedef int (*GetItemNumberMethod)(const void* descriptor); typedef int (*GetItemIndexMethod)(const void* descriptor); @@ -205,13 +204,13 @@ static PyObject* _NewKey_ByIndex(PyContainer* self, Py_ssize_t index) { const void* item = self->container_def->get_by_index_fn(self, index); switch (self->kind) { case PyContainer::KIND_BYNAME: { - const std::string& name(self->container_def->get_item_name_fn(item)); - return PyUnicode_FromStringAndSize(name.c_str(), name.size()); + absl::string_view name = self->container_def->get_item_name_fn(item); + return PyUnicode_FromStringAndSize(name.data(), name.size()); } case PyContainer::KIND_BYCAMELCASENAME: { - const std::string& name( - self->container_def->get_item_camelcase_name_fn(item)); - return PyUnicode_FromStringAndSize(name.c_str(), name.size()); + absl::string_view name = + self->container_def->get_item_camelcase_name_fn(item); + return PyUnicode_FromStringAndSize(name.data(), name.size()); } case PyContainer::KIND_BYNUMBER: { int value = self->container_def->get_item_number_fn(item); @@ -963,11 +962,11 @@ static PyObject* NewObjectFromItem(const void* item) { return PyFieldDescriptor_FromDescriptor(static_cast(item)); } -static const std::string& GetItemName(const void* item) { +static absl::string_view GetItemName(const void* item) { return static_cast(item)->name(); } -static const std::string& GetItemCamelcaseName(const void* item) { +static absl::string_view GetItemCamelcaseName(const void* item) { return static_cast(item)->camelcase_name(); } @@ -1024,7 +1023,7 @@ static PyObject* NewObjectFromItem(const void* item) { return PyMessageDescriptor_FromDescriptor(static_cast(item)); } -static const std::string& GetItemName(const void* item) { +static absl::string_view GetItemName(const void* item) { return static_cast(item)->name(); } @@ -1076,7 +1075,7 @@ static PyObject* NewObjectFromItem(const void* item) { return PyEnumDescriptor_FromDescriptor(static_cast(item)); } -static const std::string& GetItemName(const void* item) { +static absl::string_view GetItemName(const void* item) { return static_cast(item)->name(); } @@ -1155,7 +1154,7 @@ static PyObject* NewObjectFromItem(const void* item) { static_cast(item)); } -static const std::string& GetItemName(const void* item) { +static absl::string_view GetItemName(const void* item) { return static_cast(item)->name(); } @@ -1190,7 +1189,7 @@ static PyObject* NewObjectFromItem(const void* item) { return PyFieldDescriptor_FromDescriptor(static_cast(item)); } -static const std::string& GetItemName(const void* item) { +static absl::string_view GetItemName(const void* item) { return static_cast(item)->name(); } @@ -1242,7 +1241,7 @@ static PyObject* NewObjectFromItem(const void* item) { return PyOneofDescriptor_FromDescriptor(static_cast(item)); } -static const std::string& GetItemName(const void* item) { +static absl::string_view GetItemName(const void* item) { return static_cast(item)->name(); } @@ -1301,7 +1300,7 @@ static PyObject* NewObjectFromItem(const void* item) { static_cast(item)); } -static const std::string& GetItemName(const void* item) { +static absl::string_view GetItemName(const void* item) { return static_cast(item)->name(); } @@ -1404,7 +1403,7 @@ static PyObject* NewObjectFromItem(const void* item) { return PyMethodDescriptor_FromDescriptor(static_cast(item)); } -static const std::string& GetItemName(const void* item) { +static absl::string_view GetItemName(const void* item) { return static_cast(item)->name(); } @@ -1458,7 +1457,7 @@ static PyObject* NewObjectFromItem(const void* item) { return PyMessageDescriptor_FromDescriptor(static_cast(item)); } -static const std::string& GetItemName(const void* item) { +static absl::string_view GetItemName(const void* item) { return static_cast(item)->name(); } @@ -1498,7 +1497,7 @@ static PyObject* NewObjectFromItem(const void* item) { return PyEnumDescriptor_FromDescriptor(static_cast(item)); } -static const std::string& GetItemName(const void* item) { +static absl::string_view GetItemName(const void* item) { return static_cast(item)->name(); } @@ -1538,7 +1537,7 @@ static PyObject* NewObjectFromItem(const void* item) { return PyFieldDescriptor_FromDescriptor(static_cast(item)); } -static const std::string& GetItemName(const void* item) { +static absl::string_view GetItemName(const void* item) { return static_cast(item)->name(); } @@ -1578,7 +1577,7 @@ static PyObject* NewObjectFromItem(const void* item) { return PyServiceDescriptor_FromDescriptor(static_cast(item)); } -static const std::string& GetItemName(const void* item) { +static absl::string_view GetItemName(const void* item) { return static_cast(item)->name(); } diff --git a/python/google/protobuf/pyext/descriptor_pool.cc b/python/google/protobuf/pyext/descriptor_pool.cc index b70a95c74bcb..b2e561584045 100644 --- a/python/google/protobuf/pyext/descriptor_pool.cc +++ b/python/google/protobuf/pyext/descriptor_pool.cc @@ -569,10 +569,11 @@ static PyObject* SetFeatureSetDefaults(PyObject* pself, PyObject* pdefaults) { CMessage* defaults = reinterpret_cast(pdefaults); if (defaults->message->GetDescriptor() != FeatureSetDefaults::GetDescriptor()) { - PyErr_Format(PyExc_TypeError, - "SetFeatureSetDefaults called with invalid type: " - " got %s.", - defaults->message->GetDescriptor()->full_name().c_str()); + PyErr_Format( + PyExc_TypeError, + "SetFeatureSetDefaults called with invalid type: " + " got %s.", + std::string(defaults->message->GetDescriptor()->full_name()).c_str()); return nullptr; } diff --git a/python/google/protobuf/pyext/extension_dict.cc b/python/google/protobuf/pyext/extension_dict.cc index 0d3907629af8..3f0d72237030 100644 --- a/python/google/protobuf/pyext/extension_dict.cc +++ b/python/google/protobuf/pyext/extension_dict.cc @@ -264,7 +264,7 @@ static int Contains(PyObject* _self, PyObject* key) { if (!field_descriptor->is_extension()) { PyErr_Format(PyExc_KeyError, "%s is not an extension", - field_descriptor->full_name().c_str()); + std::string(field_descriptor->full_name()).c_str()); return -1; } diff --git a/python/google/protobuf/pyext/field.cc b/python/google/protobuf/pyext/field.cc index 5c93b56312d2..0892d54b31c1 100644 --- a/python/google/protobuf/pyext/field.cc +++ b/python/google/protobuf/pyext/field.cc @@ -18,8 +18,9 @@ namespace python { namespace field { static PyObject* Repr(PyMessageFieldProperty* self) { - return PyUnicode_FromFormat("", - self->field_descriptor->full_name().c_str()); + return PyUnicode_FromFormat( + "", + std::string(self->field_descriptor->full_name()).c_str()); } static PyObject* DescrGet(PyMessageFieldProperty* self, PyObject* obj, @@ -47,8 +48,8 @@ static PyObject* GetDescriptor(PyMessageFieldProperty* self, void* closure) { } static PyObject* GetDoc(PyMessageFieldProperty* self, void* closure) { - return PyUnicode_FromFormat("Field %s", - self->field_descriptor->full_name().c_str()); + return PyUnicode_FromFormat( + "Field %s", std::string(self->field_descriptor->full_name()).c_str()); } static PyGetSetDef Getters[] = { diff --git a/python/google/protobuf/pyext/message.cc b/python/google/protobuf/pyext/message.cc index 5f0eea133de0..650195f573be 100644 --- a/python/google/protobuf/pyext/message.cc +++ b/python/google/protobuf/pyext/message.cc @@ -124,7 +124,8 @@ static int AddDescriptors(PyObject* cls, const Descriptor* descriptor) { if (property == nullptr) { return -1; } - if (PyObject_SetAttrString(cls, field_descriptor->name().c_str(), + if (PyObject_SetAttrString(cls, + std::string(field_descriptor->name()).c_str(), property.get()) < 0) { return -1; } @@ -144,7 +145,8 @@ static int AddDescriptors(PyObject* cls, const Descriptor* descriptor) { if (wrapped == nullptr) { return -1; } - if (PyObject_SetAttrString(cls, enum_descriptor->name().c_str(), + if (PyObject_SetAttrString(cls, + std::string(enum_descriptor->name()).c_str(), wrapped.get()) == -1) { return -1; } @@ -158,8 +160,9 @@ static int AddDescriptors(PyObject* cls, const Descriptor* descriptor) { if (value_number == nullptr) { return -1; } - if (PyObject_SetAttrString(cls, enum_value_descriptor->name().c_str(), - value_number.get()) == -1) { + if (PyObject_SetAttrString( + cls, std::string(enum_value_descriptor->name()).c_str(), + value_number.get()) == -1) { return -1; } } @@ -178,7 +181,7 @@ static int AddDescriptors(PyObject* cls, const Descriptor* descriptor) { } // Add the extension field to the message class. - if (PyObject_SetAttrString(cls, field->name().c_str(), + if (PyObject_SetAttrString(cls, std::string(field->name()).c_str(), extension_field.get()) == -1) { return -1; } @@ -245,7 +248,7 @@ static PyObject* New(PyTypeObject* type, PyObject* args, PyObject* kwargs) { } PyObject* well_known_class = PyDict_GetItemString( - WKT_classes, message_descriptor->full_name().c_str()); + WKT_classes, std::string(message_descriptor->full_name()).c_str()); if (well_known_class == nullptr) { new_args.reset(Py_BuildValue("s(OO)O", name, CMessage_Type, PythonMessage_class, dict)); @@ -676,20 +679,20 @@ bool CheckAndSetString(PyObject* arg, Message* message, } PyObject* ToStringObject(const FieldDescriptor* descriptor, - const std::string& value) { + const absl::string_view value) { if (descriptor->type() != FieldDescriptor::TYPE_STRING) { - return PyBytes_FromStringAndSize(value.c_str(), value.length()); + return PyBytes_FromStringAndSize(value.data(), value.length()); } PyObject* result = - PyUnicode_DecodeUTF8(value.c_str(), value.length(), nullptr); + PyUnicode_DecodeUTF8(value.data(), value.length(), nullptr); // If the string can't be decoded in UTF-8, just return a string object that // contains the raw bytes. This can't happen if the value was assigned using // the members of the Python message object, but can happen if the values were // parsed from the wire (binary). if (result == nullptr) { PyErr_Clear(); - result = PyBytes_FromStringAndSize(value.c_str(), value.length()); + result = PyBytes_FromStringAndSize(value.data(), value.length()); } return result; } @@ -700,8 +703,8 @@ bool CheckFieldBelongsToMessage(const FieldDescriptor* field_descriptor, return true; } PyErr_Format(PyExc_KeyError, "Field '%s' does not belong to message '%s'", - field_descriptor->full_name().c_str(), - message->GetDescriptor()->full_name().c_str()); + std::string(field_descriptor->full_name()).c_str(), + std::string(message->GetDescriptor()->full_name()).c_str()); return false; } @@ -969,7 +972,7 @@ int InitAttributes(CMessage* self, PyObject* args, PyObject* kwargs) { if (property == nullptr || !PyObject_TypeCheck(property.get(), CFieldProperty_Type)) { PyErr_Format(PyExc_ValueError, "Protocol message %s has no \"%s\" field.", - self->message->GetDescriptor()->name().c_str(), + std::string(self->message->GetDescriptor()->name()).c_str(), PyString_AsString(name)); return -1; } @@ -1023,7 +1026,7 @@ int InitAttributes(CMessage* self, PyObject* args, PyObject* kwargs) { ScopedPyObjectPtr iter(PyObject_GetIter(value)); if (iter == nullptr) { PyErr_Format(PyExc_TypeError, "Value of field '%s' must be iterable", - descriptor->name().c_str()); + std::string(descriptor->name()).c_str()); return -1; } ScopedPyObjectPtr next; @@ -1053,7 +1056,7 @@ int InitAttributes(CMessage* self, PyObject* args, PyObject* kwargs) { ScopedPyObjectPtr iter(PyObject_GetIter(value)); if (iter == nullptr) { PyErr_Format(PyExc_TypeError, "Value of field '%s' must be iterable", - descriptor->name().c_str()); + std::string(descriptor->name()).c_str()); return -1; } ScopedPyObjectPtr next; @@ -1130,7 +1133,7 @@ int InitAttributes(CMessage* self, PyObject* args, PyObject* kwargs) { PyErr_Format(PyExc_TypeError, "Parameter to initialize message field must be " "dict or instance of same class: expected %s got %s.", - descriptor->full_name().c_str(), + std::string(descriptor->full_name()).c_str(), Py_TYPE(value)->tp_name); return -1; } @@ -1190,7 +1193,8 @@ static CMessage* NewCMessage(CMessageClass* type) { type->py_message_factory->message_factory->GetPrototype( message_descriptor); if (prototype == nullptr) { - PyErr_SetString(PyExc_TypeError, message_descriptor->full_name().c_str()); + PyErr_SetString(PyExc_TypeError, + std::string(message_descriptor->full_name()).c_str()); return nullptr; } @@ -1315,11 +1319,11 @@ const FieldDescriptor* FindFieldWithOneofs(const Message* message, } bool CheckHasPresence(const FieldDescriptor* field_descriptor, bool in_oneof) { - auto message_name = field_descriptor->containing_type()->name(); + auto message_name = std::string(field_descriptor->containing_type()->name()); if (field_descriptor->label() == FieldDescriptor::LABEL_REPEATED) { - PyErr_Format(PyExc_ValueError, - "Protocol message %s has no singular \"%s\" field.", - message_name.c_str(), field_descriptor->name().c_str()); + PyErr_Format( + PyExc_ValueError, "Protocol message %s has no singular \"%s\" field.", + message_name.c_str(), std::string(field_descriptor->name()).c_str()); return false; } @@ -1327,7 +1331,8 @@ bool CheckHasPresence(const FieldDescriptor* field_descriptor, bool in_oneof) { PyErr_Format(PyExc_ValueError, "Can't test non-optional, non-submessage field \"%s.%s\" for " "presence in proto3.", - message_name.c_str(), field_descriptor->name().c_str()); + message_name.c_str(), + std::string(field_descriptor->name()).c_str()); return false; } @@ -1344,7 +1349,7 @@ PyObject* HasField(CMessage* self, PyObject* arg) { PyErr_Format(PyExc_ValueError, "The field name passed to message %s" " is not a str.", - message->GetDescriptor()->name().c_str()); + std::string(message->GetDescriptor()->name()).c_str()); return nullptr; } @@ -1354,7 +1359,8 @@ PyObject* HasField(CMessage* self, PyObject* arg) { if (field_descriptor == nullptr) { if (!is_in_oneof) { PyErr_Format(PyExc_ValueError, "Protocol message %s has no field %s.", - message->GetDescriptor()->name().c_str(), field_name); + std::string(message->GetDescriptor()->name()).c_str(), + field_name); return nullptr; } else { Py_RETURN_FALSE; @@ -1578,9 +1584,9 @@ PyObject* Clear(CMessage* self) { static std::string GetMessageName(CMessage* self) { if (self->parent_field_descriptor != nullptr) { - return self->parent_field_descriptor->full_name(); + return std::string(self->parent_field_descriptor->full_name()); } else { - return self->message->GetDescriptor()->full_name(); + return std::string(self->message->GetDescriptor()->full_name()); } } @@ -1751,22 +1757,25 @@ static PyObject* ToStr(CMessage* self) { PyObject* MergeFrom(CMessage* self, PyObject* arg) { CMessage* other_message; if (!PyObject_TypeCheck(arg, CMessage_Type)) { - PyErr_Format(PyExc_TypeError, - "Parameter to MergeFrom() must be instance of same class: " - "expected %s got %s.", - self->message->GetDescriptor()->full_name().c_str(), - Py_TYPE(arg)->tp_name); + PyErr_Format( + PyExc_TypeError, + "Parameter to MergeFrom() must be instance of same class: " + "expected %s got %s.", + std::string(self->message->GetDescriptor()->full_name()).c_str(), + Py_TYPE(arg)->tp_name); return nullptr; } other_message = reinterpret_cast(arg); if (other_message->message->GetDescriptor() != self->message->GetDescriptor()) { - PyErr_Format(PyExc_TypeError, - "Parameter to MergeFrom() must be instance of same class: " - "expected %s got %s.", - self->message->GetDescriptor()->full_name().c_str(), - other_message->message->GetDescriptor()->full_name().c_str()); + PyErr_Format( + PyExc_TypeError, + "Parameter to MergeFrom() must be instance of same class: " + "expected %s got %s.", + std::string(self->message->GetDescriptor()->full_name()).c_str(), + std::string(other_message->message->GetDescriptor()->full_name()) + .c_str()); return nullptr; } AssureWritable(self); @@ -1784,11 +1793,12 @@ PyObject* MergeFrom(CMessage* self, PyObject* arg) { static PyObject* CopyFrom(CMessage* self, PyObject* arg) { CMessage* other_message; if (!PyObject_TypeCheck(arg, CMessage_Type)) { - PyErr_Format(PyExc_TypeError, - "Parameter to CopyFrom() must be instance of same class: " - "expected %s got %s.", - self->message->GetDescriptor()->full_name().c_str(), - Py_TYPE(arg)->tp_name); + PyErr_Format( + PyExc_TypeError, + "Parameter to CopyFrom() must be instance of same class: " + "expected %s got %s.", + std::string(self->message->GetDescriptor()->full_name()).c_str(), + Py_TYPE(arg)->tp_name); return nullptr; } @@ -1800,11 +1810,13 @@ static PyObject* CopyFrom(CMessage* self, PyObject* arg) { if (other_message->message->GetDescriptor() != self->message->GetDescriptor()) { - PyErr_Format(PyExc_TypeError, - "Parameter to CopyFrom() must be instance of same class: " - "expected %s got %s.", - self->message->GetDescriptor()->full_name().c_str(), - other_message->message->GetDescriptor()->full_name().c_str()); + PyErr_Format( + PyExc_TypeError, + "Parameter to CopyFrom() must be instance of same class: " + "expected %s got %s.", + std::string(self->message->GetDescriptor()->full_name()).c_str(), + std::string(other_message->message->GetDescriptor()->full_name()) + .c_str()); return nullptr; } @@ -1870,7 +1882,8 @@ static PyObject* MergeFromString(CMessage* self, PyObject* arg) { // Parse error. PyErr_Format( DecodeError_class, "Error parsing message with type '%s'", - self->GetMessageClass()->message_descriptor->full_name().c_str()); + std::string(self->GetMessageClass()->message_descriptor->full_name()) + .c_str()); return nullptr; } if (ctx.BytesUntilLimit(ptr) < 0) { @@ -1879,7 +1892,8 @@ static PyObject* MergeFromString(CMessage* self, PyObject* arg) { DecodeError_class, "Error parsing message as the message exceeded the protobuf limit " "with type '%s'", - self->GetMessageClass()->message_descriptor->full_name().c_str()); + std::string(self->GetMessageClass()->message_descriptor->full_name()) + .c_str()); return nullptr; } @@ -1928,8 +1942,8 @@ static PyObject* WhichOneof(CMessage* self, PyObject* arg) { if (field_in_oneof == nullptr) { Py_RETURN_NONE; } else { - const std::string& name = field_in_oneof->name(); - return PyUnicode_FromStringAndSize(name.c_str(), name.size()); + const absl::string_view name = field_in_oneof->name(); + return PyUnicode_FromStringAndSize(name.data(), name.size()); } } @@ -1995,7 +2009,8 @@ static PyObject* ListFields(CMessage* self) { PyObject* field_value = GetFieldValue(self, fields[i]); if (field_value == nullptr) { - PyErr_SetString(PyExc_ValueError, fields[i]->name().c_str()); + PyErr_SetString(PyExc_ValueError, + std::string(fields[i]->name()).c_str()); return nullptr; } PyTuple_SET_ITEM(t.get(), 0, field_descriptor.release()); @@ -2532,7 +2547,8 @@ PyObject* GetFieldValue(CMessage* self, if (self->message->GetDescriptor() != field_descriptor->containing_type()) { PyErr_Format(PyExc_TypeError, "descriptor to field '%s' doesn't apply to '%s' object", - field_descriptor->full_name().c_str(), Py_TYPE(self)->tp_name); + std::string(field_descriptor->full_name()).c_str(), + Py_TYPE(self)->tp_name); return nullptr; } @@ -2590,13 +2606,14 @@ int SetFieldValue(CMessage* self, const FieldDescriptor* field_descriptor, if (self->message->GetDescriptor() != field_descriptor->containing_type()) { PyErr_Format(PyExc_TypeError, "descriptor to field '%s' doesn't apply to '%s' object", - field_descriptor->full_name().c_str(), Py_TYPE(self)->tp_name); + std::string(field_descriptor->full_name()).c_str(), + Py_TYPE(self)->tp_name); return -1; } else if (field_descriptor->label() == FieldDescriptor::LABEL_REPEATED) { PyErr_Format(PyExc_AttributeError, "Assignment not allowed to repeated " "field \"%s\" in protocol message object.", - field_descriptor->name().c_str()); + std::string(field_descriptor->name()).c_str()); return -1; } else if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { if (field_descriptor->message_type()->well_known_type() != @@ -2615,7 +2632,7 @@ int SetFieldValue(CMessage* self, const FieldDescriptor* field_descriptor, PyErr_Format(PyExc_AttributeError, "Assignment not allowed to " "field \"%s\" in protocol message object.", - field_descriptor->name().c_str()); + std::string(field_descriptor->name()).c_str()); return -1; } else { AssureWritable(self); diff --git a/python/google/protobuf/pyext/message.h b/python/google/protobuf/pyext/message.h index b3ca3dd8dbf0..e5ce28c70b1e 100644 --- a/python/google/protobuf/pyext/message.h +++ b/python/google/protobuf/pyext/message.h @@ -19,6 +19,8 @@ #include #include +#include "absl/strings/string_view.h" + namespace google { namespace protobuf { @@ -313,7 +315,7 @@ bool CheckAndSetString( bool append, int index); PyObject* ToStringObject(const FieldDescriptor* descriptor, - const std::string& value); + absl::string_view value); // Check if the passed field descriptor belongs to the given message. // If not, return false and set a Python exception (a KeyError) diff --git a/python/google/protobuf/pyext/message_factory.cc b/python/google/protobuf/pyext/message_factory.cc index 27e878b91d1b..872ce1836f32 100644 --- a/python/google/protobuf/pyext/message_factory.cc +++ b/python/google/protobuf/pyext/message_factory.cc @@ -146,10 +146,8 @@ CMessageClass* GetOrCreateMessageClass(PyMessageFactory* self, } // Create a new message class. ScopedPyObjectPtr args(Py_BuildValue( - "s(){sOsOsO}", descriptor->name().c_str(), - "DESCRIPTOR", py_descriptor.get(), - "__module__", Py_None, - "message_factory", self)); + "s(){sOsOsO}", std::string(descriptor->name()).c_str(), "DESCRIPTOR", + py_descriptor.get(), "__module__", Py_None, "message_factory", self)); if (args == nullptr) { return nullptr; } @@ -197,7 +195,7 @@ CMessageClass* GetMessageClass(PyMessageFactory* self, iterator ret = self->classes_by_descriptor->find(message_descriptor); if (ret == self->classes_by_descriptor->end()) { PyErr_Format(PyExc_TypeError, "No message class registered for '%s'", - message_descriptor->full_name().c_str()); + std::string(message_descriptor->full_name()).c_str()); return nullptr; } else { return ret->second;