207
207
"Clears and sets the values of a repeated scalar field."),
208
208
CMETHOD(ByteSize, METH_NOARGS,
209
209
"Returns the size of the message in bytes."),
210
CMETHOD(Clear, METH_NOARGS,
210
CMETHOD(Clear, METH_O,
211
211
"Clears a protocol message."),
212
CMETHOD(ClearField, METH_O,
212
CMETHOD(ClearField, METH_VARARGS,
213
213
"Clears a protocol message field by name."),
214
214
CMETHOD(ClearFieldByDescriptor, METH_O,
215
215
"Clears a protocol message field by descriptor."),
274
274
PyTypeObject CMessage_Type = {
275
275
PyObject_HEAD_INIT(&PyType_Type)
277
C("google3.net.google.protobuf.python.internal."
277
C("google.protobuf.internal."
278
278
"_net_proto2___python."
279
279
"CMessage"), // tp_name
280
280
sizeof(CMessage), // tp_basicsize
319
319
// ------ Helper Functions:
321
321
static void FormatTypeError(PyObject* arg, char* expected_types) {
322
PyObject* s = PyObject_Str(PyObject_Type(arg));
323
PyObject* repr = PyObject_Repr(PyObject_Type(arg));
322
PyObject* repr = PyObject_Repr(arg);
324
323
PyErr_Format(PyExc_TypeError,
325
324
"%.100s has type %.100s, but expected one of: %s",
326
325
PyString_AS_STRING(repr),
327
PyString_AS_STRING(s),
326
arg->ob_type->tp_name,
398
396
return global_message_factory->GetPrototype(descriptor);
399
static void ReleaseSubMessage(google::protobuf::Message* message,
400
const google::protobuf::FieldDescriptor* field_descriptor,
401
CMessage* child_cmessage) {
402
Message* released_message = message->GetReflection()->ReleaseMessage(
403
message, field_descriptor, global_message_factory);
404
GOOGLE_DCHECK(child_cmessage->message != NULL);
405
// ReleaseMessage will return NULL which differs from
406
// child_cmessage->message, if the field does not exist. In this case,
407
// the latter points to the default instance via a const_cast<>, so we
408
// have to reset it to a new mutable object since we are taking ownership.
409
if (released_message == NULL) {
410
const Message* prototype = global_message_factory->GetPrototype(
411
child_cmessage->message->GetDescriptor());
412
GOOGLE_DCHECK(prototype != NULL);
413
child_cmessage->message = prototype->New();
415
child_cmessage->parent = NULL;
416
child_cmessage->parent_field = NULL;
417
child_cmessage->free_message = true;
418
child_cmessage->read_only = false;
401
421
static bool CheckAndSetString(
402
422
PyObject* arg, google::protobuf::Message* message,
403
423
const google::protobuf::FieldDescriptor* descriptor,
504
524
self->message = reflection->MutableMessage(
505
525
message, self->parent_field->descriptor, global_message_factory);
506
526
self->read_only = false;
508
self->parent_field = NULL;
511
529
static PyObject* InternalGetScalar(
956
974
// ------ Methods:
958
static PyObject* CMessage_Clear(CMessage* self, PyObject* args) {
976
static PyObject* CMessage_Clear(CMessage* self, PyObject* arg) {
959
977
AssureWritable(self);
960
self->message->Clear();
978
google::protobuf::Message* message = self->message;
980
// This block of code is equivalent to the following:
981
// for cfield_descriptor, child_cmessage in arg:
982
// ReleaseSubMessage(cfield_descriptor, child_cmessage)
983
if (!PyList_Check(arg)) {
984
PyErr_SetString(PyExc_TypeError, "Must be a list");
987
PyObject* messages_to_clear = arg;
988
Py_ssize_t num_messages_to_clear = PyList_GET_SIZE(messages_to_clear);
989
for(int i = 0; i < num_messages_to_clear; ++i) {
990
PyObject* message_tuple = PyList_GET_ITEM(messages_to_clear, i);
991
if (!PyTuple_Check(message_tuple) || PyTuple_GET_SIZE(message_tuple) != 2) {
992
PyErr_SetString(PyExc_TypeError, "Must be a tuple of size 2");
996
PyObject* py_cfield_descriptor = PyTuple_GET_ITEM(message_tuple, 0);
997
PyObject* py_child_cmessage = PyTuple_GET_ITEM(message_tuple, 1);
998
if (!PyObject_TypeCheck(py_cfield_descriptor, &CFieldDescriptor_Type) ||
999
!PyObject_TypeCheck(py_child_cmessage, &CMessage_Type)) {
1000
PyErr_SetString(PyExc_ValueError, "Invalid Tuple");
1004
CFieldDescriptor* cfield_descriptor = reinterpret_cast<CFieldDescriptor *>(
1005
py_cfield_descriptor);
1006
CMessage* child_cmessage = reinterpret_cast<CMessage *>(py_child_cmessage);
1007
ReleaseSubMessage(message, cfield_descriptor->descriptor, child_cmessage);
1039
1089
Py_RETURN_NONE;
1042
static PyObject* CMessage_ClearField(CMessage* self, PyObject* arg) {
1092
static PyObject* CMessage_ClearField(CMessage* self, PyObject* args) {
1043
1093
char* field_name;
1044
if (PyString_AsStringAndSize(arg, &field_name, NULL) < 0) {
1094
CMessage* child_cmessage = NULL;
1095
if (!PyArg_ParseTuple(args, C("s|O!:ClearField"), &field_name,
1096
&CMessage_Type, &child_cmessage)) {
1057
message->GetReflection()->ClearField(message, field_descriptor);
1109
if (child_cmessage != NULL && !FIELD_IS_REPEATED(field_descriptor)) {
1110
ReleaseSubMessage(message, field_descriptor, child_cmessage);
1112
message->GetReflection()->ClearField(message, field_descriptor);
1058
1114
Py_RETURN_NONE;
1099
1155
PyObject* next;
1100
1156
while ((next = PyIter_Next(iter)) != NULL) {
1101
1157
if (InternalAddRepeatedScalar(
1102
message, cfield_descriptor->descriptor, next) == NULL) {
1158
message, cfield_descriptor->descriptor, next) == NULL) {
1103
1160
Py_DECREF(iter);
1107
1165
Py_DECREF(iter);
1108
1166
Py_RETURN_NONE;
1311
1369
AssureWritable(self);
1312
1370
google::protobuf::io::CodedInputStream input(
1313
1371
reinterpret_cast<const uint8*>(data), data_length);
1372
input.SetExtensionRegistry(GetDescriptorPool(), global_message_factory);
1314
1373
bool success = self->message->MergePartialFromCodedStream(&input);
1316
1375
return PyInt_FromLong(self->message->ByteSize());