1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are
7 // met:
8 //
9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer.
11 // * Redistributions in binary form must reproduce the above
12 // copyright notice, this list of conditions and the following disclaimer
13 // in the documentation and/or other materials provided with the
14 // distribution.
15 // * Neither the name of Google Inc. nor the names of its
16 // contributors may be used to endorse or promote products derived from
17 // this software without specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31 // Author: anuraag@google.com (Anuraag Agrawal)
32 // Author: tibell@google.com (Johan Tibell)
33
34 #include <google/protobuf/pyext/message.h>
35
36 #include <map>
37 #include <memory>
38 #ifndef _SHARED_PTR_H
39 #include <google/protobuf/stubs/shared_ptr.h>
40 #endif
41 #include <string>
42 #include <vector>
43 #include <structmember.h> // A Python header file.
44
45 #ifndef PyVarObject_HEAD_INIT
46 #define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
47 #endif
48 #ifndef Py_TYPE
49 #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
50 #endif
51 #include <google/protobuf/descriptor.pb.h>
52 #include <google/protobuf/stubs/common.h>
53 #include <google/protobuf/stubs/logging.h>
54 #include <google/protobuf/io/coded_stream.h>
55 #include <google/protobuf/util/message_differencer.h>
56 #include <google/protobuf/descriptor.h>
57 #include <google/protobuf/message.h>
58 #include <google/protobuf/text_format.h>
59 #include <google/protobuf/unknown_field_set.h>
60 #include <google/protobuf/pyext/descriptor.h>
61 #include <google/protobuf/pyext/descriptor_pool.h>
62 #include <google/protobuf/pyext/extension_dict.h>
63 #include <google/protobuf/pyext/repeated_composite_container.h>
64 #include <google/protobuf/pyext/repeated_scalar_container.h>
65 #include <google/protobuf/pyext/map_container.h>
66 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
67 #include <google/protobuf/stubs/strutil.h>
68
69 #if PY_MAJOR_VERSION >= 3
70 #define PyInt_Check PyLong_Check
71 #define PyInt_AsLong PyLong_AsLong
72 #define PyInt_FromLong PyLong_FromLong
73 #define PyInt_FromSize_t PyLong_FromSize_t
74 #define PyString_Check PyUnicode_Check
75 #define PyString_FromString PyUnicode_FromString
76 #define PyString_FromStringAndSize PyUnicode_FromStringAndSize
77 #if PY_VERSION_HEX < 0x03030000
78 #error "Python 3.0 - 3.2 are not supported."
79 #else
80 #define PyString_AsString(ob) \
81 (PyUnicode_Check(ob)? PyUnicode_AsUTF8(ob): PyBytes_AsString(ob))
82 #define PyString_AsStringAndSize(ob, charpp, sizep) \
83 (PyUnicode_Check(ob)? \
84 ((*(charpp) = PyUnicode_AsUTF8AndSize(ob, (sizep))) == NULL? -1: 0): \
85 PyBytes_AsStringAndSize(ob, (charpp), (sizep)))
86 #endif
87 #endif
88
89 namespace google {
90 namespace protobuf {
91 namespace python {
92
93 static PyObject* kDESCRIPTOR;
94 static PyObject* k_extensions_by_name;
95 static PyObject* k_extensions_by_number;
96 PyObject* EnumTypeWrapper_class;
97 static PyObject* PythonMessage_class;
98 static PyObject* kEmptyWeakref;
99 static PyObject* WKT_classes = NULL;
100
101 namespace message_meta {
102
103 static int InsertEmptyWeakref(PyTypeObject* base);
104
105 // Add the number of a field descriptor to the containing message class.
106 // Equivalent to:
107 // _cls.<field>_FIELD_NUMBER = <number>
AddFieldNumberToClass(PyObject * cls,const FieldDescriptor * field_descriptor)108 static bool AddFieldNumberToClass(
109 PyObject* cls, const FieldDescriptor* field_descriptor) {
110 string constant_name = field_descriptor->name() + "_FIELD_NUMBER";
111 UpperString(&constant_name);
112 ScopedPyObjectPtr attr_name(PyString_FromStringAndSize(
113 constant_name.c_str(), constant_name.size()));
114 if (attr_name == NULL) {
115 return false;
116 }
117 ScopedPyObjectPtr number(PyInt_FromLong(field_descriptor->number()));
118 if (number == NULL) {
119 return false;
120 }
121 if (PyObject_SetAttr(cls, attr_name.get(), number.get()) == -1) {
122 return false;
123 }
124 return true;
125 }
126
127
128 // Finalize the creation of the Message class.
AddDescriptors(PyObject * cls,const Descriptor * descriptor)129 static int AddDescriptors(PyObject* cls, const Descriptor* descriptor) {
130 // If there are extension_ranges, the message is "extendable", and extension
131 // classes will register themselves in this class.
132 if (descriptor->extension_range_count() > 0) {
133 ScopedPyObjectPtr by_name(PyDict_New());
134 if (PyObject_SetAttr(cls, k_extensions_by_name, by_name.get()) < 0) {
135 return -1;
136 }
137 ScopedPyObjectPtr by_number(PyDict_New());
138 if (PyObject_SetAttr(cls, k_extensions_by_number, by_number.get()) < 0) {
139 return -1;
140 }
141 }
142
143 // For each field set: cls.<field>_FIELD_NUMBER = <number>
144 for (int i = 0; i < descriptor->field_count(); ++i) {
145 if (!AddFieldNumberToClass(cls, descriptor->field(i))) {
146 return -1;
147 }
148 }
149
150 // For each enum set cls.<enum name> = EnumTypeWrapper(<enum descriptor>).
151 for (int i = 0; i < descriptor->enum_type_count(); ++i) {
152 const EnumDescriptor* enum_descriptor = descriptor->enum_type(i);
153 ScopedPyObjectPtr enum_type(
154 PyEnumDescriptor_FromDescriptor(enum_descriptor));
155 if (enum_type == NULL) {
156 return -1;
157 }
158 // Add wrapped enum type to message class.
159 ScopedPyObjectPtr wrapped(PyObject_CallFunctionObjArgs(
160 EnumTypeWrapper_class, enum_type.get(), NULL));
161 if (wrapped == NULL) {
162 return -1;
163 }
164 if (PyObject_SetAttrString(
165 cls, enum_descriptor->name().c_str(), wrapped.get()) == -1) {
166 return -1;
167 }
168
169 // For each enum value add cls.<name> = <number>
170 for (int j = 0; j < enum_descriptor->value_count(); ++j) {
171 const EnumValueDescriptor* enum_value_descriptor =
172 enum_descriptor->value(j);
173 ScopedPyObjectPtr value_number(PyInt_FromLong(
174 enum_value_descriptor->number()));
175 if (value_number == NULL) {
176 return -1;
177 }
178 if (PyObject_SetAttrString(cls, enum_value_descriptor->name().c_str(),
179 value_number.get()) == -1) {
180 return -1;
181 }
182 }
183 }
184
185 // For each extension set cls.<extension name> = <extension descriptor>.
186 //
187 // Extension descriptors come from
188 // <message descriptor>.extensions_by_name[name]
189 // which was defined previously.
190 for (int i = 0; i < descriptor->extension_count(); ++i) {
191 const google::protobuf::FieldDescriptor* field = descriptor->extension(i);
192 ScopedPyObjectPtr extension_field(PyFieldDescriptor_FromDescriptor(field));
193 if (extension_field == NULL) {
194 return -1;
195 }
196
197 // Add the extension field to the message class.
198 if (PyObject_SetAttrString(
199 cls, field->name().c_str(), extension_field.get()) == -1) {
200 return -1;
201 }
202
203 // For each extension set cls.<extension name>_FIELD_NUMBER = <number>.
204 if (!AddFieldNumberToClass(cls, field)) {
205 return -1;
206 }
207 }
208
209 return 0;
210 }
211
New(PyTypeObject * type,PyObject * args,PyObject * kwargs)212 static PyObject* New(PyTypeObject* type,
213 PyObject* args, PyObject* kwargs) {
214 static char *kwlist[] = {"name", "bases", "dict", 0};
215 PyObject *bases, *dict;
216 const char* name;
217
218 // Check arguments: (name, bases, dict)
219 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sO!O!:type", kwlist,
220 &name,
221 &PyTuple_Type, &bases,
222 &PyDict_Type, &dict)) {
223 return NULL;
224 }
225
226 // Check bases: only (), or (message.Message,) are allowed
227 if (!(PyTuple_GET_SIZE(bases) == 0 ||
228 (PyTuple_GET_SIZE(bases) == 1 &&
229 PyTuple_GET_ITEM(bases, 0) == PythonMessage_class))) {
230 PyErr_SetString(PyExc_TypeError,
231 "A Message class can only inherit from Message");
232 return NULL;
233 }
234
235 // Check dict['DESCRIPTOR']
236 PyObject* py_descriptor = PyDict_GetItem(dict, kDESCRIPTOR);
237 if (py_descriptor == NULL) {
238 PyErr_SetString(PyExc_TypeError, "Message class has no DESCRIPTOR");
239 return NULL;
240 }
241 if (!PyObject_TypeCheck(py_descriptor, &PyMessageDescriptor_Type)) {
242 PyErr_Format(PyExc_TypeError, "Expected a message Descriptor, got %s",
243 py_descriptor->ob_type->tp_name);
244 return NULL;
245 }
246
247 // Build the arguments to the base metaclass.
248 // We change the __bases__ classes.
249 ScopedPyObjectPtr new_args;
250 const Descriptor* message_descriptor =
251 PyMessageDescriptor_AsDescriptor(py_descriptor);
252 if (message_descriptor == NULL) {
253 return NULL;
254 }
255
256 if (WKT_classes == NULL) {
257 ScopedPyObjectPtr well_known_types(PyImport_ImportModule(
258 "google.protobuf.internal.well_known_types"));
259 GOOGLE_DCHECK(well_known_types != NULL);
260
261 WKT_classes = PyObject_GetAttrString(well_known_types.get(), "WKTBASES");
262 GOOGLE_DCHECK(WKT_classes != NULL);
263 }
264
265 PyObject* well_known_class = PyDict_GetItemString(
266 WKT_classes, message_descriptor->full_name().c_str());
267 if (well_known_class == NULL) {
268 new_args.reset(Py_BuildValue("s(OO)O", name, &CMessage_Type,
269 PythonMessage_class, dict));
270 } else {
271 new_args.reset(Py_BuildValue("s(OOO)O", name, &CMessage_Type,
272 PythonMessage_class, well_known_class, dict));
273 }
274
275 if (new_args == NULL) {
276 return NULL;
277 }
278 // Call the base metaclass.
279 ScopedPyObjectPtr result(PyType_Type.tp_new(type, new_args.get(), NULL));
280 if (result == NULL) {
281 return NULL;
282 }
283 CMessageClass* newtype = reinterpret_cast<CMessageClass*>(result.get());
284
285 // Insert the empty weakref into the base classes.
286 if (InsertEmptyWeakref(
287 reinterpret_cast<PyTypeObject*>(PythonMessage_class)) < 0 ||
288 InsertEmptyWeakref(&CMessage_Type) < 0) {
289 return NULL;
290 }
291
292 // Cache the descriptor, both as Python object and as C++ pointer.
293 const Descriptor* descriptor =
294 PyMessageDescriptor_AsDescriptor(py_descriptor);
295 if (descriptor == NULL) {
296 return NULL;
297 }
298 Py_INCREF(py_descriptor);
299 newtype->py_message_descriptor = py_descriptor;
300 newtype->message_descriptor = descriptor;
301 // TODO(amauryfa): Don't always use the canonical pool of the descriptor,
302 // use the MessageFactory optionally passed in the class dict.
303 newtype->py_descriptor_pool = GetDescriptorPool_FromPool(
304 descriptor->file()->pool());
305 if (newtype->py_descriptor_pool == NULL) {
306 return NULL;
307 }
308 Py_INCREF(newtype->py_descriptor_pool);
309
310 // Add the message to the DescriptorPool.
311 if (cdescriptor_pool::RegisterMessageClass(newtype->py_descriptor_pool,
312 descriptor, newtype) < 0) {
313 return NULL;
314 }
315
316 // Continue with type initialization: add other descriptors, enum values...
317 if (AddDescriptors(result.get(), descriptor) < 0) {
318 return NULL;
319 }
320 return result.release();
321 }
322
Dealloc(CMessageClass * self)323 static void Dealloc(CMessageClass *self) {
324 Py_DECREF(self->py_message_descriptor);
325 Py_DECREF(self->py_descriptor_pool);
326 Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
327 }
328
329
330 // This function inserts and empty weakref at the end of the list of
331 // subclasses for the main protocol buffer Message class.
332 //
333 // This eliminates a O(n^2) behaviour in the internal add_subclass
334 // routine.
InsertEmptyWeakref(PyTypeObject * base_type)335 static int InsertEmptyWeakref(PyTypeObject *base_type) {
336 #if PY_MAJOR_VERSION >= 3
337 // Python 3.4 has already included the fix for the issue that this
338 // hack addresses. For further background and the fix please see
339 // https://bugs.python.org/issue17936.
340 return 0;
341 #else
342 PyObject *subclasses = base_type->tp_subclasses;
343 if (subclasses && PyList_CheckExact(subclasses)) {
344 return PyList_Append(subclasses, kEmptyWeakref);
345 }
346 return 0;
347 #endif // PY_MAJOR_VERSION >= 3
348 }
349
350 } // namespace message_meta
351
352 PyTypeObject CMessageClass_Type = {
353 PyVarObject_HEAD_INIT(&PyType_Type, 0)
354 FULL_MODULE_NAME ".MessageMeta", // tp_name
355 sizeof(CMessageClass), // tp_basicsize
356 0, // tp_itemsize
357 (destructor)message_meta::Dealloc, // tp_dealloc
358 0, // tp_print
359 0, // tp_getattr
360 0, // tp_setattr
361 0, // tp_compare
362 0, // tp_repr
363 0, // tp_as_number
364 0, // tp_as_sequence
365 0, // tp_as_mapping
366 0, // tp_hash
367 0, // tp_call
368 0, // tp_str
369 0, // tp_getattro
370 0, // tp_setattro
371 0, // tp_as_buffer
372 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // tp_flags
373 "The metaclass of ProtocolMessages", // tp_doc
374 0, // tp_traverse
375 0, // tp_clear
376 0, // tp_richcompare
377 0, // tp_weaklistoffset
378 0, // tp_iter
379 0, // tp_iternext
380 0, // tp_methods
381 0, // tp_members
382 0, // tp_getset
383 0, // tp_base
384 0, // tp_dict
385 0, // tp_descr_get
386 0, // tp_descr_set
387 0, // tp_dictoffset
388 0, // tp_init
389 0, // tp_alloc
390 message_meta::New, // tp_new
391 };
392
CheckMessageClass(PyTypeObject * cls)393 static CMessageClass* CheckMessageClass(PyTypeObject* cls) {
394 if (!PyObject_TypeCheck(cls, &CMessageClass_Type)) {
395 PyErr_Format(PyExc_TypeError, "Class %s is not a Message", cls->tp_name);
396 return NULL;
397 }
398 return reinterpret_cast<CMessageClass*>(cls);
399 }
400
GetMessageDescriptor(PyTypeObject * cls)401 static const Descriptor* GetMessageDescriptor(PyTypeObject* cls) {
402 CMessageClass* type = CheckMessageClass(cls);
403 if (type == NULL) {
404 return NULL;
405 }
406 return type->message_descriptor;
407 }
408
409 // Forward declarations
410 namespace cmessage {
411 int InternalReleaseFieldByDescriptor(
412 CMessage* self,
413 const FieldDescriptor* field_descriptor,
414 PyObject* composite_field);
415 } // namespace cmessage
416
417 // ---------------------------------------------------------------------
418 // Visiting the composite children of a CMessage
419
420 struct ChildVisitor {
421 // Returns 0 on success, -1 on failure.
VisitRepeatedCompositeContainergoogle::protobuf::python::ChildVisitor422 int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) {
423 return 0;
424 }
425
426 // Returns 0 on success, -1 on failure.
VisitRepeatedScalarContainergoogle::protobuf::python::ChildVisitor427 int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) {
428 return 0;
429 }
430
431 // Returns 0 on success, -1 on failure.
VisitCMessagegoogle::protobuf::python::ChildVisitor432 int VisitCMessage(CMessage* cmessage,
433 const FieldDescriptor* field_descriptor) {
434 return 0;
435 }
436 };
437
438 // Apply a function to a composite field. Does nothing if child is of
439 // non-composite type.
440 template<class Visitor>
VisitCompositeField(const FieldDescriptor * descriptor,PyObject * child,Visitor visitor)441 static int VisitCompositeField(const FieldDescriptor* descriptor,
442 PyObject* child,
443 Visitor visitor) {
444 if (descriptor->label() == FieldDescriptor::LABEL_REPEATED) {
445 if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
446 if (descriptor->is_map()) {
447 MapContainer* container = reinterpret_cast<MapContainer*>(child);
448 if (visitor.VisitMapContainer(container) == -1) {
449 return -1;
450 }
451 } else {
452 RepeatedCompositeContainer* container =
453 reinterpret_cast<RepeatedCompositeContainer*>(child);
454 if (visitor.VisitRepeatedCompositeContainer(container) == -1)
455 return -1;
456 }
457 } else {
458 RepeatedScalarContainer* container =
459 reinterpret_cast<RepeatedScalarContainer*>(child);
460 if (visitor.VisitRepeatedScalarContainer(container) == -1)
461 return -1;
462 }
463 } else if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
464 CMessage* cmsg = reinterpret_cast<CMessage*>(child);
465 if (visitor.VisitCMessage(cmsg, descriptor) == -1)
466 return -1;
467 }
468 // The ExtensionDict might contain non-composite fields, which we
469 // skip here.
470 return 0;
471 }
472
473 // Visit each composite field and extension field of this CMessage.
474 // Returns -1 on error and 0 on success.
475 template<class Visitor>
ForEachCompositeField(CMessage * self,Visitor visitor)476 int ForEachCompositeField(CMessage* self, Visitor visitor) {
477 Py_ssize_t pos = 0;
478 PyObject* key;
479 PyObject* field;
480
481 // Visit normal fields.
482 if (self->composite_fields) {
483 // Never use self->message in this function, it may be already freed.
484 const Descriptor* message_descriptor =
485 GetMessageDescriptor(Py_TYPE(self));
486 while (PyDict_Next(self->composite_fields, &pos, &key, &field)) {
487 Py_ssize_t key_str_size;
488 char *key_str_data;
489 if (PyString_AsStringAndSize(key, &key_str_data, &key_str_size) != 0)
490 return -1;
491 const string key_str(key_str_data, key_str_size);
492 const FieldDescriptor* descriptor =
493 message_descriptor->FindFieldByName(key_str);
494 if (descriptor != NULL) {
495 if (VisitCompositeField(descriptor, field, visitor) == -1)
496 return -1;
497 }
498 }
499 }
500
501 // Visit extension fields.
502 if (self->extensions != NULL) {
503 pos = 0;
504 while (PyDict_Next(self->extensions->values, &pos, &key, &field)) {
505 const FieldDescriptor* descriptor = cmessage::GetExtensionDescriptor(key);
506 if (descriptor == NULL)
507 return -1;
508 if (VisitCompositeField(descriptor, field, visitor) == -1)
509 return -1;
510 }
511 }
512
513 return 0;
514 }
515
516 // ---------------------------------------------------------------------
517
518 // Constants used for integer type range checking.
519 PyObject* kPythonZero;
520 PyObject* kint32min_py;
521 PyObject* kint32max_py;
522 PyObject* kuint32max_py;
523 PyObject* kint64min_py;
524 PyObject* kint64max_py;
525 PyObject* kuint64max_py;
526
527 PyObject* EncodeError_class;
528 PyObject* DecodeError_class;
529 PyObject* PickleError_class;
530
531 // Constant PyString values used for GetAttr/GetItem.
532 static PyObject* k_cdescriptor;
533 static PyObject* kfull_name;
534
535 /* Is 64bit */
FormatTypeError(PyObject * arg,char * expected_types)536 void FormatTypeError(PyObject* arg, char* expected_types) {
537 PyObject* repr = PyObject_Repr(arg);
538 if (repr) {
539 PyErr_Format(PyExc_TypeError,
540 "%.100s has type %.100s, but expected one of: %s",
541 PyString_AsString(repr),
542 Py_TYPE(arg)->tp_name,
543 expected_types);
544 Py_DECREF(repr);
545 }
546 }
547
548 template<class T>
CheckAndGetInteger(PyObject * arg,T * value,PyObject * min,PyObject * max)549 bool CheckAndGetInteger(
550 PyObject* arg, T* value, PyObject* min, PyObject* max) {
551 bool is_long = PyLong_Check(arg);
552 #if PY_MAJOR_VERSION < 3
553 if (!PyInt_Check(arg) && !is_long) {
554 FormatTypeError(arg, "int, long");
555 return false;
556 }
557 if (PyObject_Compare(min, arg) > 0 || PyObject_Compare(max, arg) < 0) {
558 #else
559 if (!is_long) {
560 FormatTypeError(arg, "int");
561 return false;
562 }
563 if (PyObject_RichCompareBool(min, arg, Py_LE) != 1 ||
564 PyObject_RichCompareBool(max, arg, Py_GE) != 1) {
565 #endif
566 if (!PyErr_Occurred()) {
567 PyObject *s = PyObject_Str(arg);
568 if (s) {
569 PyErr_Format(PyExc_ValueError,
570 "Value out of range: %s",
571 PyString_AsString(s));
572 Py_DECREF(s);
573 }
574 }
575 return false;
576 }
577 #if PY_MAJOR_VERSION < 3
578 if (!is_long) {
579 *value = static_cast<T>(PyInt_AsLong(arg));
580 } else // NOLINT
581 #endif
582 {
583 if (min == kPythonZero) {
584 *value = static_cast<T>(PyLong_AsUnsignedLongLong(arg));
585 } else {
586 *value = static_cast<T>(PyLong_AsLongLong(arg));
587 }
588 }
589 return true;
590 }
591
592 // These are referenced by repeated_scalar_container, and must
593 // be explicitly instantiated.
594 template bool CheckAndGetInteger<int32>(
595 PyObject*, int32*, PyObject*, PyObject*);
596 template bool CheckAndGetInteger<int64>(
597 PyObject*, int64*, PyObject*, PyObject*);
598 template bool CheckAndGetInteger<uint32>(
599 PyObject*, uint32*, PyObject*, PyObject*);
600 template bool CheckAndGetInteger<uint64>(
601 PyObject*, uint64*, PyObject*, PyObject*);
602
603 bool CheckAndGetDouble(PyObject* arg, double* value) {
604 if (!PyInt_Check(arg) && !PyLong_Check(arg) &&
605 !PyFloat_Check(arg)) {
606 FormatTypeError(arg, "int, long, float");
607 return false;
608 }
609 *value = PyFloat_AsDouble(arg);
610 return true;
611 }
612
613 bool CheckAndGetFloat(PyObject* arg, float* value) {
614 double double_value;
615 if (!CheckAndGetDouble(arg, &double_value)) {
616 return false;
617 }
618 *value = static_cast<float>(double_value);
619 return true;
620 }
621
622 bool CheckAndGetBool(PyObject* arg, bool* value) {
623 if (!PyInt_Check(arg) && !PyBool_Check(arg) && !PyLong_Check(arg)) {
624 FormatTypeError(arg, "int, long, bool");
625 return false;
626 }
627 *value = static_cast<bool>(PyInt_AsLong(arg));
628 return true;
629 }
630
631 // Checks whether the given object (which must be "bytes" or "unicode") contains
632 // valid UTF-8.
633 bool IsValidUTF8(PyObject* obj) {
634 if (PyBytes_Check(obj)) {
635 PyObject* unicode = PyUnicode_FromEncodedObject(obj, "utf-8", NULL);
636
637 // Clear the error indicator; we report our own error when desired.
638 PyErr_Clear();
639
640 if (unicode) {
641 Py_DECREF(unicode);
642 return true;
643 } else {
644 return false;
645 }
646 } else {
647 // Unicode object, known to be valid UTF-8.
648 return true;
649 }
650 }
651
652 bool AllowInvalidUTF8(const FieldDescriptor* field) { return false; }
653
654 PyObject* CheckString(PyObject* arg, const FieldDescriptor* descriptor) {
655 GOOGLE_DCHECK(descriptor->type() == FieldDescriptor::TYPE_STRING ||
656 descriptor->type() == FieldDescriptor::TYPE_BYTES);
657 if (descriptor->type() == FieldDescriptor::TYPE_STRING) {
658 if (!PyBytes_Check(arg) && !PyUnicode_Check(arg)) {
659 FormatTypeError(arg, "bytes, unicode");
660 return NULL;
661 }
662
663 if (!IsValidUTF8(arg) && !AllowInvalidUTF8(descriptor)) {
664 PyObject* repr = PyObject_Repr(arg);
665 PyErr_Format(PyExc_ValueError,
666 "%s has type str, but isn't valid UTF-8 "
667 "encoding. Non-UTF-8 strings must be converted to "
668 "unicode objects before being added.",
669 PyString_AsString(repr));
670 Py_DECREF(repr);
671 return NULL;
672 }
673 } else if (!PyBytes_Check(arg)) {
674 FormatTypeError(arg, "bytes");
675 return NULL;
676 }
677
678 PyObject* encoded_string = NULL;
679 if (descriptor->type() == FieldDescriptor::TYPE_STRING) {
680 if (PyBytes_Check(arg)) {
681 // The bytes were already validated as correctly encoded UTF-8 above.
682 encoded_string = arg; // Already encoded.
683 Py_INCREF(encoded_string);
684 } else {
685 encoded_string = PyUnicode_AsEncodedObject(arg, "utf-8", NULL);
686 }
687 } else {
688 // In this case field type is "bytes".
689 encoded_string = arg;
690 Py_INCREF(encoded_string);
691 }
692
693 return encoded_string;
694 }
695
696 bool CheckAndSetString(
697 PyObject* arg, Message* message,
698 const FieldDescriptor* descriptor,
699 const Reflection* reflection,
700 bool append,
701 int index) {
702 ScopedPyObjectPtr encoded_string(CheckString(arg, descriptor));
703
704 if (encoded_string.get() == NULL) {
705 return false;
706 }
707
708 char* value;
709 Py_ssize_t value_len;
710 if (PyBytes_AsStringAndSize(encoded_string.get(), &value, &value_len) < 0) {
711 return false;
712 }
713
714 string value_string(value, value_len);
715 if (append) {
716 reflection->AddString(message, descriptor, value_string);
717 } else if (index < 0) {
718 reflection->SetString(message, descriptor, value_string);
719 } else {
720 reflection->SetRepeatedString(message, descriptor, index, value_string);
721 }
722 return true;
723 }
724
725 PyObject* ToStringObject(const FieldDescriptor* descriptor, string value) {
726 if (descriptor->type() != FieldDescriptor::TYPE_STRING) {
727 return PyBytes_FromStringAndSize(value.c_str(), value.length());
728 }
729
730 PyObject* result = PyUnicode_DecodeUTF8(value.c_str(), value.length(), NULL);
731 // If the string can't be decoded in UTF-8, just return a string object that
732 // contains the raw bytes. This can't happen if the value was assigned using
733 // the members of the Python message object, but can happen if the values were
734 // parsed from the wire (binary).
735 if (result == NULL) {
736 PyErr_Clear();
737 result = PyBytes_FromStringAndSize(value.c_str(), value.length());
738 }
739 return result;
740 }
741
742 bool CheckFieldBelongsToMessage(const FieldDescriptor* field_descriptor,
743 const Message* message) {
744 if (message->GetDescriptor() == field_descriptor->containing_type()) {
745 return true;
746 }
747 PyErr_Format(PyExc_KeyError, "Field '%s' does not belong to message '%s'",
748 field_descriptor->full_name().c_str(),
749 message->GetDescriptor()->full_name().c_str());
750 return false;
751 }
752
753 namespace cmessage {
754
755 PyDescriptorPool* GetDescriptorPoolForMessage(CMessage* message) {
756 // No need to check the type: the type of instances of CMessage is always
757 // an instance of CMessageClass. Let's prove it with a debug-only check.
758 GOOGLE_DCHECK(PyObject_TypeCheck(message, &CMessage_Type));
759 return reinterpret_cast<CMessageClass*>(Py_TYPE(message))->py_descriptor_pool;
760 }
761
762 MessageFactory* GetFactoryForMessage(CMessage* message) {
763 return GetDescriptorPoolForMessage(message)->message_factory;
764 }
765
766 static int MaybeReleaseOverlappingOneofField(
767 CMessage* cmessage,
768 const FieldDescriptor* field) {
769 #ifdef GOOGLE_PROTOBUF_HAS_ONEOF
770 Message* message = cmessage->message;
771 const Reflection* reflection = message->GetReflection();
772 if (!field->containing_oneof() ||
773 !reflection->HasOneof(*message, field->containing_oneof()) ||
774 reflection->HasField(*message, field)) {
775 // No other field in this oneof, no need to release.
776 return 0;
777 }
778
779 const OneofDescriptor* oneof = field->containing_oneof();
780 const FieldDescriptor* existing_field =
781 reflection->GetOneofFieldDescriptor(*message, oneof);
782 if (existing_field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {
783 // Non-message fields don't need to be released.
784 return 0;
785 }
786 const char* field_name = existing_field->name().c_str();
787 PyObject* child_message = cmessage->composite_fields ?
788 PyDict_GetItemString(cmessage->composite_fields, field_name) : NULL;
789 if (child_message == NULL) {
790 // No python reference to this field so no need to release.
791 return 0;
792 }
793
794 if (InternalReleaseFieldByDescriptor(
795 cmessage, existing_field, child_message) < 0) {
796 return -1;
797 }
798 return PyDict_DelItemString(cmessage->composite_fields, field_name);
799 #else
800 return 0;
801 #endif
802 }
803
804 // ---------------------------------------------------------------------
805 // Making a message writable
806
807 static Message* GetMutableMessage(
808 CMessage* parent,
809 const FieldDescriptor* parent_field) {
810 Message* parent_message = parent->message;
811 const Reflection* reflection = parent_message->GetReflection();
812 if (MaybeReleaseOverlappingOneofField(parent, parent_field) < 0) {
813 return NULL;
814 }
815 return reflection->MutableMessage(
816 parent_message, parent_field, GetFactoryForMessage(parent));
817 }
818
819 struct FixupMessageReference : public ChildVisitor {
820 // message must outlive this object.
821 explicit FixupMessageReference(Message* message) :
822 message_(message) {}
823
824 int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) {
825 container->message = message_;
826 return 0;
827 }
828
829 int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) {
830 container->message = message_;
831 return 0;
832 }
833
834 int VisitMapContainer(MapContainer* container) {
835 container->message = message_;
836 return 0;
837 }
838
839 private:
840 Message* message_;
841 };
842
843 int AssureWritable(CMessage* self) {
844 if (self == NULL || !self->read_only) {
845 return 0;
846 }
847
848 if (self->parent == NULL) {
849 // If parent is NULL but we are trying to modify a read-only message, this
850 // is a reference to a constant default instance that needs to be replaced
851 // with a mutable top-level message.
852 self->message = self->message->New();
853 self->owner.reset(self->message);
854 // Cascade the new owner to eventual children: even if this message is
855 // empty, some submessages or repeated containers might exist already.
856 SetOwner(self, self->owner);
857 } else {
858 // Otherwise, we need a mutable child message.
859 if (AssureWritable(self->parent) == -1)
860 return -1;
861
862 // Make self->message writable.
863 Message* mutable_message = GetMutableMessage(
864 self->parent,
865 self->parent_field_descriptor);
866 if (mutable_message == NULL) {
867 return -1;
868 }
869 self->message = mutable_message;
870 }
871 self->read_only = false;
872
873 // When a CMessage is made writable its Message pointer is updated
874 // to point to a new mutable Message. When that happens we need to
875 // update any references to the old, read-only CMessage. There are
876 // four places such references occur: RepeatedScalarContainer,
877 // RepeatedCompositeContainer, MapContainer, and ExtensionDict.
878 if (self->extensions != NULL)
879 self->extensions->message = self->message;
880 if (ForEachCompositeField(self, FixupMessageReference(self->message)) == -1)
881 return -1;
882
883 return 0;
884 }
885
886 // --- Globals:
887
888 // Retrieve a C++ FieldDescriptor for a message attribute.
889 // The C++ message must be valid.
890 // TODO(amauryfa): This function should stay internal, because exception
891 // handling is not consistent.
892 static const FieldDescriptor* GetFieldDescriptor(
893 CMessage* self, PyObject* name) {
894 const Descriptor *message_descriptor = self->message->GetDescriptor();
895 char* field_name;
896 Py_ssize_t size;
897 if (PyString_AsStringAndSize(name, &field_name, &size) < 0) {
898 return NULL;
899 }
900 const FieldDescriptor *field_descriptor =
901 message_descriptor->FindFieldByName(string(field_name, size));
902 if (field_descriptor == NULL) {
903 // Note: No exception is set!
904 return NULL;
905 }
906 return field_descriptor;
907 }
908
909 // Retrieve a C++ FieldDescriptor for an extension handle.
910 const FieldDescriptor* GetExtensionDescriptor(PyObject* extension) {
911 ScopedPyObjectPtr cdescriptor;
912 if (!PyObject_TypeCheck(extension, &PyFieldDescriptor_Type)) {
913 // Most callers consider extensions as a plain dictionary. We should
914 // allow input which is not a field descriptor, and simply pretend it does
915 // not exist.
916 PyErr_SetObject(PyExc_KeyError, extension);
917 return NULL;
918 }
919 return PyFieldDescriptor_AsDescriptor(extension);
920 }
921
922 // If value is a string, convert it into an enum value based on the labels in
923 // descriptor, otherwise simply return value. Always returns a new reference.
924 static PyObject* GetIntegerEnumValue(const FieldDescriptor& descriptor,
925 PyObject* value) {
926 if (PyString_Check(value) || PyUnicode_Check(value)) {
927 const EnumDescriptor* enum_descriptor = descriptor.enum_type();
928 if (enum_descriptor == NULL) {
929 PyErr_SetString(PyExc_TypeError, "not an enum field");
930 return NULL;
931 }
932 char* enum_label;
933 Py_ssize_t size;
934 if (PyString_AsStringAndSize(value, &enum_label, &size) < 0) {
935 return NULL;
936 }
937 const EnumValueDescriptor* enum_value_descriptor =
938 enum_descriptor->FindValueByName(string(enum_label, size));
939 if (enum_value_descriptor == NULL) {
940 PyErr_SetString(PyExc_ValueError, "unknown enum label");
941 return NULL;
942 }
943 return PyInt_FromLong(enum_value_descriptor->number());
944 }
945 Py_INCREF(value);
946 return value;
947 }
948
949 // If cmessage_list is not NULL, this function releases values into the
950 // container CMessages instead of just removing. Repeated composite container
951 // needs to do this to make sure CMessages stay alive if they're still
952 // referenced after deletion. Repeated scalar container doesn't need to worry.
953 int InternalDeleteRepeatedField(
954 CMessage* self,
955 const FieldDescriptor* field_descriptor,
956 PyObject* slice,
957 PyObject* cmessage_list) {
958 Message* message = self->message;
959 Py_ssize_t length, from, to, step, slice_length;
960 const Reflection* reflection = message->GetReflection();
961 int min, max;
962 length = reflection->FieldSize(*message, field_descriptor);
963
964 if (PyInt_Check(slice) || PyLong_Check(slice)) {
965 from = to = PyLong_AsLong(slice);
966 if (from < 0) {
967 from = to = length + from;
968 }
969 step = 1;
970 min = max = from;
971
972 // Range check.
973 if (from < 0 || from >= length) {
974 PyErr_Format(PyExc_IndexError, "list assignment index out of range");
975 return -1;
976 }
977 } else if (PySlice_Check(slice)) {
978 from = to = step = slice_length = 0;
979 PySlice_GetIndicesEx(
980 #if PY_MAJOR_VERSION < 3
981 reinterpret_cast<PySliceObject*>(slice),
982 #else
983 slice,
984 #endif
985 length, &from, &to, &step, &slice_length);
986 if (from < to) {
987 min = from;
988 max = to - 1;
989 } else {
990 min = to + 1;
991 max = from;
992 }
993 } else {
994 PyErr_SetString(PyExc_TypeError, "list indices must be integers");
995 return -1;
996 }
997
998 Py_ssize_t i = from;
999 std::vector<bool> to_delete(length, false);
1000 while (i >= min && i <= max) {
1001 to_delete[i] = true;
1002 i += step;
1003 }
1004
1005 to = 0;
1006 for (i = 0; i < length; ++i) {
1007 if (!to_delete[i]) {
1008 if (i != to) {
1009 reflection->SwapElements(message, field_descriptor, i, to);
1010 if (cmessage_list != NULL) {
1011 // If a list of cmessages is passed in (i.e. from a repeated
1012 // composite container), swap those as well to correspond to the
1013 // swaps in the underlying message so they're in the right order
1014 // when we start releasing.
1015 PyObject* tmp = PyList_GET_ITEM(cmessage_list, i);
1016 PyList_SET_ITEM(cmessage_list, i,
1017 PyList_GET_ITEM(cmessage_list, to));
1018 PyList_SET_ITEM(cmessage_list, to, tmp);
1019 }
1020 }
1021 ++to;
1022 }
1023 }
1024
1025 while (i > to) {
1026 if (cmessage_list == NULL) {
1027 reflection->RemoveLast(message, field_descriptor);
1028 } else {
1029 CMessage* last_cmessage = reinterpret_cast<CMessage*>(
1030 PyList_GET_ITEM(cmessage_list, PyList_GET_SIZE(cmessage_list) - 1));
1031 repeated_composite_container::ReleaseLastTo(
1032 self, field_descriptor, last_cmessage);
1033 if (PySequence_DelItem(cmessage_list, -1) < 0) {
1034 return -1;
1035 }
1036 }
1037 --i;
1038 }
1039
1040 return 0;
1041 }
1042
1043 // Initializes fields of a message. Used in constructors.
1044 int InitAttributes(CMessage* self, PyObject* kwargs) {
1045 if (kwargs == NULL) {
1046 return 0;
1047 }
1048
1049 Py_ssize_t pos = 0;
1050 PyObject* name;
1051 PyObject* value;
1052 while (PyDict_Next(kwargs, &pos, &name, &value)) {
1053 if (!PyString_Check(name)) {
1054 PyErr_SetString(PyExc_ValueError, "Field name must be a string");
1055 return -1;
1056 }
1057 const FieldDescriptor* descriptor = GetFieldDescriptor(self, name);
1058 if (descriptor == NULL) {
1059 PyErr_Format(PyExc_ValueError, "Protocol message %s has no \"%s\" field.",
1060 self->message->GetDescriptor()->name().c_str(),
1061 PyString_AsString(name));
1062 return -1;
1063 }
1064 if (value == Py_None) {
1065 // field=None is the same as no field at all.
1066 continue;
1067 }
1068 if (descriptor->is_map()) {
1069 ScopedPyObjectPtr map(GetAttr(self, name));
1070 const FieldDescriptor* value_descriptor =
1071 descriptor->message_type()->FindFieldByName("value");
1072 if (value_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
1073 Py_ssize_t map_pos = 0;
1074 PyObject* map_key;
1075 PyObject* map_value;
1076 while (PyDict_Next(value, &map_pos, &map_key, &map_value)) {
1077 ScopedPyObjectPtr function_return;
1078 function_return.reset(PyObject_GetItem(map.get(), map_key));
1079 if (function_return.get() == NULL) {
1080 return -1;
1081 }
1082 ScopedPyObjectPtr ok(PyObject_CallMethod(
1083 function_return.get(), "MergeFrom", "O", map_value));
1084 if (ok.get() == NULL) {
1085 return -1;
1086 }
1087 }
1088 } else {
1089 ScopedPyObjectPtr function_return;
1090 function_return.reset(
1091 PyObject_CallMethod(map.get(), "update", "O", value));
1092 if (function_return.get() == NULL) {
1093 return -1;
1094 }
1095 }
1096 } else if (descriptor->label() == FieldDescriptor::LABEL_REPEATED) {
1097 ScopedPyObjectPtr container(GetAttr(self, name));
1098 if (container == NULL) {
1099 return -1;
1100 }
1101 if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
1102 RepeatedCompositeContainer* rc_container =
1103 reinterpret_cast<RepeatedCompositeContainer*>(container.get());
1104 ScopedPyObjectPtr iter(PyObject_GetIter(value));
1105 if (iter == NULL) {
1106 PyErr_SetString(PyExc_TypeError, "Value must be iterable");
1107 return -1;
1108 }
1109 ScopedPyObjectPtr next;
1110 while ((next.reset(PyIter_Next(iter.get()))) != NULL) {
1111 PyObject* kwargs = (PyDict_Check(next.get()) ? next.get() : NULL);
1112 ScopedPyObjectPtr new_msg(
1113 repeated_composite_container::Add(rc_container, NULL, kwargs));
1114 if (new_msg == NULL) {
1115 return -1;
1116 }
1117 if (kwargs == NULL) {
1118 // next was not a dict, it's a message we need to merge
1119 ScopedPyObjectPtr merged(MergeFrom(
1120 reinterpret_cast<CMessage*>(new_msg.get()), next.get()));
1121 if (merged.get() == NULL) {
1122 return -1;
1123 }
1124 }
1125 }
1126 if (PyErr_Occurred()) {
1127 // Check to see how PyIter_Next() exited.
1128 return -1;
1129 }
1130 } else if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) {
1131 RepeatedScalarContainer* rs_container =
1132 reinterpret_cast<RepeatedScalarContainer*>(container.get());
1133 ScopedPyObjectPtr iter(PyObject_GetIter(value));
1134 if (iter == NULL) {
1135 PyErr_SetString(PyExc_TypeError, "Value must be iterable");
1136 return -1;
1137 }
1138 ScopedPyObjectPtr next;
1139 while ((next.reset(PyIter_Next(iter.get()))) != NULL) {
1140 ScopedPyObjectPtr enum_value(
1141 GetIntegerEnumValue(*descriptor, next.get()));
1142 if (enum_value == NULL) {
1143 return -1;
1144 }
1145 ScopedPyObjectPtr new_msg(repeated_scalar_container::Append(
1146 rs_container, enum_value.get()));
1147 if (new_msg == NULL) {
1148 return -1;
1149 }
1150 }
1151 if (PyErr_Occurred()) {
1152 // Check to see how PyIter_Next() exited.
1153 return -1;
1154 }
1155 } else {
1156 if (ScopedPyObjectPtr(repeated_scalar_container::Extend(
1157 reinterpret_cast<RepeatedScalarContainer*>(container.get()),
1158 value)) ==
1159 NULL) {
1160 return -1;
1161 }
1162 }
1163 } else if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
1164 ScopedPyObjectPtr message(GetAttr(self, name));
1165 if (message == NULL) {
1166 return -1;
1167 }
1168 CMessage* cmessage = reinterpret_cast<CMessage*>(message.get());
1169 if (PyDict_Check(value)) {
1170 if (InitAttributes(cmessage, value) < 0) {
1171 return -1;
1172 }
1173 } else {
1174 ScopedPyObjectPtr merged(MergeFrom(cmessage, value));
1175 if (merged == NULL) {
1176 return -1;
1177 }
1178 }
1179 } else {
1180 ScopedPyObjectPtr new_val;
1181 if (descriptor->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) {
1182 new_val.reset(GetIntegerEnumValue(*descriptor, value));
1183 if (new_val == NULL) {
1184 return -1;
1185 }
1186 }
1187 if (SetAttr(self, name, (new_val.get() == NULL) ? value : new_val.get()) <
1188 0) {
1189 return -1;
1190 }
1191 }
1192 }
1193 return 0;
1194 }
1195
1196 // Allocates an incomplete Python Message: the caller must fill self->message,
1197 // self->owner and eventually self->parent.
1198 CMessage* NewEmptyMessage(CMessageClass* type) {
1199 CMessage* self = reinterpret_cast<CMessage*>(
1200 PyType_GenericAlloc(&type->super.ht_type, 0));
1201 if (self == NULL) {
1202 return NULL;
1203 }
1204
1205 self->message = NULL;
1206 self->parent = NULL;
1207 self->parent_field_descriptor = NULL;
1208 self->read_only = false;
1209 self->extensions = NULL;
1210
1211 self->composite_fields = NULL;
1212
1213 return self;
1214 }
1215
1216 // The __new__ method of Message classes.
1217 // Creates a new C++ message and takes ownership.
1218 static PyObject* New(PyTypeObject* cls,
1219 PyObject* unused_args, PyObject* unused_kwargs) {
1220 CMessageClass* type = CheckMessageClass(cls);
1221 if (type == NULL) {
1222 return NULL;
1223 }
1224 // Retrieve the message descriptor and the default instance (=prototype).
1225 const Descriptor* message_descriptor = type->message_descriptor;
1226 if (message_descriptor == NULL) {
1227 return NULL;
1228 }
1229 const Message* default_message = type->py_descriptor_pool->message_factory
1230 ->GetPrototype(message_descriptor);
1231 if (default_message == NULL) {
1232 PyErr_SetString(PyExc_TypeError, message_descriptor->full_name().c_str());
1233 return NULL;
1234 }
1235
1236 CMessage* self = NewEmptyMessage(type);
1237 if (self == NULL) {
1238 return NULL;
1239 }
1240 self->message = default_message->New();
1241 self->owner.reset(self->message);
1242 return reinterpret_cast<PyObject*>(self);
1243 }
1244
1245 // The __init__ method of Message classes.
1246 // It initializes fields from keywords passed to the constructor.
1247 static int Init(CMessage* self, PyObject* args, PyObject* kwargs) {
1248 if (PyTuple_Size(args) != 0) {
1249 PyErr_SetString(PyExc_TypeError, "No positional arguments allowed");
1250 return -1;
1251 }
1252
1253 return InitAttributes(self, kwargs);
1254 }
1255
1256 // ---------------------------------------------------------------------
1257 // Deallocating a CMessage
1258 //
1259 // Deallocating a CMessage requires that we clear any weak references
1260 // from children to the message being deallocated.
1261
1262 // Clear the weak reference from the child to the parent.
1263 struct ClearWeakReferences : public ChildVisitor {
1264 int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) {
1265 container->parent = NULL;
1266 // The elements in the container have the same parent as the
1267 // container itself, so NULL out that pointer as well.
1268 const Py_ssize_t n = PyList_GET_SIZE(container->child_messages);
1269 for (Py_ssize_t i = 0; i < n; ++i) {
1270 CMessage* child_cmessage = reinterpret_cast<CMessage*>(
1271 PyList_GET_ITEM(container->child_messages, i));
1272 child_cmessage->parent = NULL;
1273 }
1274 return 0;
1275 }
1276
1277 int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) {
1278 container->parent = NULL;
1279 return 0;
1280 }
1281
1282 int VisitMapContainer(MapContainer* container) {
1283 container->parent = NULL;
1284 return 0;
1285 }
1286
1287 int VisitCMessage(CMessage* cmessage,
1288 const FieldDescriptor* field_descriptor) {
1289 cmessage->parent = NULL;
1290 return 0;
1291 }
1292 };
1293
1294 static void Dealloc(CMessage* self) {
1295 // Null out all weak references from children to this message.
1296 GOOGLE_CHECK_EQ(0, ForEachCompositeField(self, ClearWeakReferences()));
1297 if (self->extensions) {
1298 self->extensions->parent = NULL;
1299 }
1300
1301 Py_CLEAR(self->extensions);
1302 Py_CLEAR(self->composite_fields);
1303 self->owner.reset();
1304 Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
1305 }
1306
1307 // ---------------------------------------------------------------------
1308
1309
1310 PyObject* IsInitialized(CMessage* self, PyObject* args) {
1311 PyObject* errors = NULL;
1312 if (PyArg_ParseTuple(args, "|O", &errors) < 0) {
1313 return NULL;
1314 }
1315 if (self->message->IsInitialized()) {
1316 Py_RETURN_TRUE;
1317 }
1318 if (errors != NULL) {
1319 ScopedPyObjectPtr initialization_errors(
1320 FindInitializationErrors(self));
1321 if (initialization_errors == NULL) {
1322 return NULL;
1323 }
1324 ScopedPyObjectPtr extend_name(PyString_FromString("extend"));
1325 if (extend_name == NULL) {
1326 return NULL;
1327 }
1328 ScopedPyObjectPtr result(PyObject_CallMethodObjArgs(
1329 errors,
1330 extend_name.get(),
1331 initialization_errors.get(),
1332 NULL));
1333 if (result == NULL) {
1334 return NULL;
1335 }
1336 }
1337 Py_RETURN_FALSE;
1338 }
1339
1340 PyObject* HasFieldByDescriptor(
1341 CMessage* self, const FieldDescriptor* field_descriptor) {
1342 Message* message = self->message;
1343 if (!CheckFieldBelongsToMessage(field_descriptor, message)) {
1344 return NULL;
1345 }
1346 if (field_descriptor->label() == FieldDescriptor::LABEL_REPEATED) {
1347 PyErr_SetString(PyExc_KeyError,
1348 "Field is repeated. A singular method is required.");
1349 return NULL;
1350 }
1351 bool has_field =
1352 message->GetReflection()->HasField(*message, field_descriptor);
1353 return PyBool_FromLong(has_field ? 1 : 0);
1354 }
1355
1356 const FieldDescriptor* FindFieldWithOneofs(
1357 const Message* message, const string& field_name, bool* in_oneof) {
1358 *in_oneof = false;
1359 const Descriptor* descriptor = message->GetDescriptor();
1360 const FieldDescriptor* field_descriptor =
1361 descriptor->FindFieldByName(field_name);
1362 if (field_descriptor != NULL) {
1363 return field_descriptor;
1364 }
1365 const OneofDescriptor* oneof_desc =
1366 descriptor->FindOneofByName(field_name);
1367 if (oneof_desc != NULL) {
1368 *in_oneof = true;
1369 return message->GetReflection()->GetOneofFieldDescriptor(*message,
1370 oneof_desc);
1371 }
1372 return NULL;
1373 }
1374
1375 bool CheckHasPresence(const FieldDescriptor* field_descriptor, bool in_oneof) {
1376 if (field_descriptor->label() == FieldDescriptor::LABEL_REPEATED) {
1377 PyErr_Format(PyExc_ValueError,
1378 "Protocol message has no singular \"%s\" field.",
1379 field_descriptor->name().c_str());
1380 return false;
1381 }
1382
1383 if (field_descriptor->file()->syntax() == FileDescriptor::SYNTAX_PROTO3) {
1384 // HasField() for a oneof *itself* isn't supported.
1385 if (in_oneof) {
1386 PyErr_Format(PyExc_ValueError,
1387 "Can't test oneof field \"%s\" for presence in proto3, use "
1388 "WhichOneof instead.",
1389 field_descriptor->containing_oneof()->name().c_str());
1390 return false;
1391 }
1392
1393 // ...but HasField() for fields *in* a oneof is supported.
1394 if (field_descriptor->containing_oneof() != NULL) {
1395 return true;
1396 }
1397
1398 if (field_descriptor->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) {
1399 PyErr_Format(
1400 PyExc_ValueError,
1401 "Can't test non-submessage field \"%s\" for presence in proto3.",
1402 field_descriptor->name().c_str());
1403 return false;
1404 }
1405 }
1406
1407 return true;
1408 }
1409
1410 PyObject* HasField(CMessage* self, PyObject* arg) {
1411 char* field_name;
1412 Py_ssize_t size;
1413 #if PY_MAJOR_VERSION < 3
1414 if (PyString_AsStringAndSize(arg, &field_name, &size) < 0) {
1415 return NULL;
1416 }
1417 #else
1418 field_name = PyUnicode_AsUTF8AndSize(arg, &size);
1419 if (!field_name) {
1420 return NULL;
1421 }
1422 #endif
1423
1424 Message* message = self->message;
1425 bool is_in_oneof;
1426 const FieldDescriptor* field_descriptor =
1427 FindFieldWithOneofs(message, string(field_name, size), &is_in_oneof);
1428 if (field_descriptor == NULL) {
1429 if (!is_in_oneof) {
1430 PyErr_Format(PyExc_ValueError, "Unknown field %s.", field_name);
1431 return NULL;
1432 } else {
1433 Py_RETURN_FALSE;
1434 }
1435 }
1436
1437 if (!CheckHasPresence(field_descriptor, is_in_oneof)) {
1438 return NULL;
1439 }
1440
1441 if (message->GetReflection()->HasField(*message, field_descriptor)) {
1442 Py_RETURN_TRUE;
1443 }
1444 if (!message->GetReflection()->SupportsUnknownEnumValues() &&
1445 field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) {
1446 // Special case: Python HasField() differs in semantics from C++
1447 // slightly: we return HasField('enum_field') == true if there is
1448 // an unknown enum value present. To implement this we have to
1449 // look in the UnknownFieldSet.
1450 const UnknownFieldSet& unknown_field_set =
1451 message->GetReflection()->GetUnknownFields(*message);
1452 for (int i = 0; i < unknown_field_set.field_count(); ++i) {
1453 if (unknown_field_set.field(i).number() == field_descriptor->number()) {
1454 Py_RETURN_TRUE;
1455 }
1456 }
1457 }
1458 Py_RETURN_FALSE;
1459 }
1460
1461 PyObject* ClearExtension(CMessage* self, PyObject* extension) {
1462 if (self->extensions != NULL) {
1463 return extension_dict::ClearExtension(self->extensions, extension);
1464 } else {
1465 const FieldDescriptor* descriptor = GetExtensionDescriptor(extension);
1466 if (descriptor == NULL) {
1467 return NULL;
1468 }
1469 if (ScopedPyObjectPtr(ClearFieldByDescriptor(self, descriptor)) == NULL) {
1470 return NULL;
1471 }
1472 }
1473 Py_RETURN_NONE;
1474 }
1475
1476 PyObject* HasExtension(CMessage* self, PyObject* extension) {
1477 const FieldDescriptor* descriptor = GetExtensionDescriptor(extension);
1478 if (descriptor == NULL) {
1479 return NULL;
1480 }
1481 return HasFieldByDescriptor(self, descriptor);
1482 }
1483
1484 // ---------------------------------------------------------------------
1485 // Releasing messages
1486 //
1487 // The Python API's ClearField() and Clear() methods behave
1488 // differently than their C++ counterparts. While the C++ versions
1489 // clears the children the Python versions detaches the children,
1490 // without touching their content. This impedance mismatch causes
1491 // some complexity in the implementation, which is captured in this
1492 // section.
1493 //
1494 // When a CMessage field is cleared we need to:
1495 //
1496 // * Release the Message used as the backing store for the CMessage
1497 // from its parent.
1498 //
1499 // * Change the owner field of the released CMessage and all of its
1500 // children to point to the newly released Message.
1501 //
1502 // * Clear the weak references from the released CMessage to the
1503 // parent.
1504 //
1505 // When a RepeatedCompositeContainer field is cleared we need to:
1506 //
1507 // * Release all the Message used as the backing store for the
1508 // CMessages stored in the container.
1509 //
1510 // * Change the owner field of all the released CMessage and all of
1511 // their children to point to the newly released Messages.
1512 //
1513 // * Clear the weak references from the released container to the
1514 // parent.
1515
1516 struct SetOwnerVisitor : public ChildVisitor {
1517 // new_owner must outlive this object.
1518 explicit SetOwnerVisitor(const shared_ptr<Message>& new_owner)
1519 : new_owner_(new_owner) {}
1520
1521 int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) {
1522 repeated_composite_container::SetOwner(container, new_owner_);
1523 return 0;
1524 }
1525
1526 int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) {
1527 repeated_scalar_container::SetOwner(container, new_owner_);
1528 return 0;
1529 }
1530
1531 int VisitMapContainer(MapContainer* container) {
1532 container->SetOwner(new_owner_);
1533 return 0;
1534 }
1535
1536 int VisitCMessage(CMessage* cmessage,
1537 const FieldDescriptor* field_descriptor) {
1538 return SetOwner(cmessage, new_owner_);
1539 }
1540
1541 private:
1542 const shared_ptr<Message>& new_owner_;
1543 };
1544
1545 // Change the owner of this CMessage and all its children, recursively.
1546 int SetOwner(CMessage* self, const shared_ptr<Message>& new_owner) {
1547 self->owner = new_owner;
1548 if (ForEachCompositeField(self, SetOwnerVisitor(new_owner)) == -1)
1549 return -1;
1550 return 0;
1551 }
1552
1553 // Releases the message specified by 'field' and returns the
1554 // pointer. If the field does not exist a new message is created using
1555 // 'descriptor'. The caller takes ownership of the returned pointer.
1556 Message* ReleaseMessage(CMessage* self,
1557 const Descriptor* descriptor,
1558 const FieldDescriptor* field_descriptor) {
1559 MessageFactory* message_factory = GetFactoryForMessage(self);
1560 Message* released_message = self->message->GetReflection()->ReleaseMessage(
1561 self->message, field_descriptor, message_factory);
1562 // ReleaseMessage will return NULL which differs from
1563 // child_cmessage->message, if the field does not exist. In this case,
1564 // the latter points to the default instance via a const_cast<>, so we
1565 // have to reset it to a new mutable object since we are taking ownership.
1566 if (released_message == NULL) {
1567 const Message* prototype = message_factory->GetPrototype(descriptor);
1568 GOOGLE_DCHECK(prototype != NULL);
1569 released_message = prototype->New();
1570 }
1571
1572 return released_message;
1573 }
1574
1575 int ReleaseSubMessage(CMessage* self,
1576 const FieldDescriptor* field_descriptor,
1577 CMessage* child_cmessage) {
1578 // Release the Message
1579 shared_ptr<Message> released_message(ReleaseMessage(
1580 self, child_cmessage->message->GetDescriptor(), field_descriptor));
1581 child_cmessage->message = released_message.get();
1582 child_cmessage->owner.swap(released_message);
1583 child_cmessage->parent = NULL;
1584 child_cmessage->parent_field_descriptor = NULL;
1585 child_cmessage->read_only = false;
1586 return ForEachCompositeField(child_cmessage,
1587 SetOwnerVisitor(child_cmessage->owner));
1588 }
1589
1590 struct ReleaseChild : public ChildVisitor {
1591 // message must outlive this object.
1592 explicit ReleaseChild(CMessage* parent) :
1593 parent_(parent) {}
1594
1595 int VisitRepeatedCompositeContainer(RepeatedCompositeContainer* container) {
1596 return repeated_composite_container::Release(
1597 reinterpret_cast<RepeatedCompositeContainer*>(container));
1598 }
1599
1600 int VisitRepeatedScalarContainer(RepeatedScalarContainer* container) {
1601 return repeated_scalar_container::Release(
1602 reinterpret_cast<RepeatedScalarContainer*>(container));
1603 }
1604
1605 int VisitMapContainer(MapContainer* container) {
1606 return reinterpret_cast<MapContainer*>(container)->Release();
1607 }
1608
1609 int VisitCMessage(CMessage* cmessage,
1610 const FieldDescriptor* field_descriptor) {
1611 return ReleaseSubMessage(parent_, field_descriptor,
1612 reinterpret_cast<CMessage*>(cmessage));
1613 }
1614
1615 CMessage* parent_;
1616 };
1617
1618 int InternalReleaseFieldByDescriptor(
1619 CMessage* self,
1620 const FieldDescriptor* field_descriptor,
1621 PyObject* composite_field) {
1622 return VisitCompositeField(
1623 field_descriptor,
1624 composite_field,
1625 ReleaseChild(self));
1626 }
1627
1628 PyObject* ClearFieldByDescriptor(
1629 CMessage* self,
1630 const FieldDescriptor* descriptor) {
1631 if (!CheckFieldBelongsToMessage(descriptor, self->message)) {
1632 return NULL;
1633 }
1634 AssureWritable(self);
1635 self->message->GetReflection()->ClearField(self->message, descriptor);
1636 Py_RETURN_NONE;
1637 }
1638
1639 PyObject* ClearField(CMessage* self, PyObject* arg) {
1640 if (!PyString_Check(arg)) {
1641 PyErr_SetString(PyExc_TypeError, "field name must be a string");
1642 return NULL;
1643 }
1644 #if PY_MAJOR_VERSION < 3
1645 const char* field_name = PyString_AS_STRING(arg);
1646 Py_ssize_t size = PyString_GET_SIZE(arg);
1647 #else
1648 Py_ssize_t size;
1649 const char* field_name = PyUnicode_AsUTF8AndSize(arg, &size);
1650 #endif
1651 AssureWritable(self);
1652 Message* message = self->message;
1653 ScopedPyObjectPtr arg_in_oneof;
1654 bool is_in_oneof;
1655 const FieldDescriptor* field_descriptor =
1656 FindFieldWithOneofs(message, string(field_name, size), &is_in_oneof);
1657 if (field_descriptor == NULL) {
1658 if (!is_in_oneof) {
1659 PyErr_Format(PyExc_ValueError,
1660 "Protocol message has no \"%s\" field.", field_name);
1661 return NULL;
1662 } else {
1663 Py_RETURN_NONE;
1664 }
1665 } else if (is_in_oneof) {
1666 const string& name = field_descriptor->name();
1667 arg_in_oneof.reset(PyString_FromStringAndSize(name.c_str(), name.size()));
1668 arg = arg_in_oneof.get();
1669 }
1670
1671 PyObject* composite_field = self->composite_fields ?
1672 PyDict_GetItem(self->composite_fields, arg) : NULL;
1673
1674 // Only release the field if there's a possibility that there are
1675 // references to it.
1676 if (composite_field != NULL) {
1677 if (InternalReleaseFieldByDescriptor(self, field_descriptor,
1678 composite_field) < 0) {
1679 return NULL;
1680 }
1681 PyDict_DelItem(self->composite_fields, arg);
1682 }
1683 message->GetReflection()->ClearField(message, field_descriptor);
1684 if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_ENUM &&
1685 !message->GetReflection()->SupportsUnknownEnumValues()) {
1686 UnknownFieldSet* unknown_field_set =
1687 message->GetReflection()->MutableUnknownFields(message);
1688 unknown_field_set->DeleteByNumber(field_descriptor->number());
1689 }
1690
1691 Py_RETURN_NONE;
1692 }
1693
1694 PyObject* Clear(CMessage* self) {
1695 AssureWritable(self);
1696 if (ForEachCompositeField(self, ReleaseChild(self)) == -1)
1697 return NULL;
1698 Py_CLEAR(self->extensions);
1699 if (self->composite_fields) {
1700 PyDict_Clear(self->composite_fields);
1701 }
1702 self->message->Clear();
1703 Py_RETURN_NONE;
1704 }
1705
1706 // ---------------------------------------------------------------------
1707
1708 static string GetMessageName(CMessage* self) {
1709 if (self->parent_field_descriptor != NULL) {
1710 return self->parent_field_descriptor->full_name();
1711 } else {
1712 return self->message->GetDescriptor()->full_name();
1713 }
1714 }
1715
1716 static PyObject* SerializeToString(CMessage* self, PyObject* args) {
1717 if (!self->message->IsInitialized()) {
1718 ScopedPyObjectPtr errors(FindInitializationErrors(self));
1719 if (errors == NULL) {
1720 return NULL;
1721 }
1722 ScopedPyObjectPtr comma(PyString_FromString(","));
1723 if (comma == NULL) {
1724 return NULL;
1725 }
1726 ScopedPyObjectPtr joined(
1727 PyObject_CallMethod(comma.get(), "join", "O", errors.get()));
1728 if (joined == NULL) {
1729 return NULL;
1730 }
1731
1732 // TODO(haberman): this is a (hopefully temporary) hack. The unit testing
1733 // infrastructure reloads all pure-Python modules for every test, but not
1734 // C++ modules (because that's generally impossible:
1735 // http://bugs.python.org/issue1144263). But if we cache EncodeError, we'll
1736 // return the EncodeError from a previous load of the module, which won't
1737 // match a user's attempt to catch EncodeError. So we have to look it up
1738 // again every time.
1739 ScopedPyObjectPtr message_module(PyImport_ImportModule(
1740 "google.protobuf.message"));
1741 if (message_module.get() == NULL) {
1742 return NULL;
1743 }
1744
1745 ScopedPyObjectPtr encode_error(
1746 PyObject_GetAttrString(message_module.get(), "EncodeError"));
1747 if (encode_error.get() == NULL) {
1748 return NULL;
1749 }
1750 PyErr_Format(encode_error.get(),
1751 "Message %s is missing required fields: %s",
1752 GetMessageName(self).c_str(), PyString_AsString(joined.get()));
1753 return NULL;
1754 }
1755 int size = self->message->ByteSize();
1756 if (size <= 0) {
1757 return PyBytes_FromString("");
1758 }
1759 PyObject* result = PyBytes_FromStringAndSize(NULL, size);
1760 if (result == NULL) {
1761 return NULL;
1762 }
1763 char* buffer = PyBytes_AS_STRING(result);
1764 self->message->SerializeWithCachedSizesToArray(
1765 reinterpret_cast<uint8*>(buffer));
1766 return result;
1767 }
1768
1769 static PyObject* SerializePartialToString(CMessage* self) {
1770 string contents;
1771 self->message->SerializePartialToString(&contents);
1772 return PyBytes_FromStringAndSize(contents.c_str(), contents.size());
1773 }
1774
1775 // Formats proto fields for ascii dumps using python formatting functions where
1776 // appropriate.
1777 class PythonFieldValuePrinter : public TextFormat::FieldValuePrinter {
1778 public:
1779 // Python has some differences from C++ when printing floating point numbers.
1780 //
1781 // 1) Trailing .0 is always printed.
1782 // 2) (Python2) Output is rounded to 12 digits.
1783 // 3) (Python3) The full precision of the double is preserved (and Python uses
1784 // David M. Gay's dtoa(), when the C++ code uses SimpleDtoa. There are some
1785 // differences, but they rarely happen)
1786 //
1787 // We override floating point printing with the C-API function for printing
1788 // Python floats to ensure consistency.
1789 string PrintFloat(float value) const { return PrintDouble(value); }
1790 string PrintDouble(double value) const {
1791 // This implementation is not highly optimized (it allocates two temporary
1792 // Python objects) but it is simple and portable. If this is shown to be a
1793 // performance bottleneck, we can optimize it, but the results will likely
1794 // be more complicated to accommodate the differing behavior of double
1795 // formatting between Python 2 and Python 3.
1796 //
1797 // (Though a valid question is: do we really want to make out output
1798 // dependent on the Python version?)
1799 ScopedPyObjectPtr py_value(PyFloat_FromDouble(value));
1800 if (!py_value.get()) {
1801 return string();
1802 }
1803
1804 ScopedPyObjectPtr py_str(PyObject_Str(py_value.get()));
1805 if (!py_str.get()) {
1806 return string();
1807 }
1808
1809 return string(PyString_AsString(py_str.get()));
1810 }
1811 };
1812
1813 static PyObject* ToStr(CMessage* self) {
1814 TextFormat::Printer printer;
1815 // Passes ownership
1816 printer.SetDefaultFieldValuePrinter(new PythonFieldValuePrinter());
1817 printer.SetHideUnknownFields(true);
1818 string output;
1819 if (!printer.PrintToString(*self->message, &output)) {
1820 PyErr_SetString(PyExc_ValueError, "Unable to convert message to str");
1821 return NULL;
1822 }
1823 return PyString_FromString(output.c_str());
1824 }
1825
1826 PyObject* MergeFrom(CMessage* self, PyObject* arg) {
1827 CMessage* other_message;
1828 if (!PyObject_TypeCheck(arg, &CMessage_Type)) {
1829 PyErr_Format(PyExc_TypeError,
1830 "Parameter to MergeFrom() must be instance of same class: "
1831 "expected %s got %s.",
1832 self->message->GetDescriptor()->full_name().c_str(),
1833 Py_TYPE(arg)->tp_name);
1834 return NULL;
1835 }
1836
1837 other_message = reinterpret_cast<CMessage*>(arg);
1838 if (other_message->message->GetDescriptor() !=
1839 self->message->GetDescriptor()) {
1840 PyErr_Format(PyExc_TypeError,
1841 "Parameter to MergeFrom() must be instance of same class: "
1842 "expected %s got %s.",
1843 self->message->GetDescriptor()->full_name().c_str(),
1844 other_message->message->GetDescriptor()->full_name().c_str());
1845 return NULL;
1846 }
1847 AssureWritable(self);
1848
1849 // TODO(tibell): Message::MergeFrom might turn some child Messages
1850 // into mutable messages, invalidating the message field in the
1851 // corresponding CMessages. We should run a FixupMessageReferences
1852 // pass here.
1853
1854 self->message->MergeFrom(*other_message->message);
1855 Py_RETURN_NONE;
1856 }
1857
1858 static PyObject* CopyFrom(CMessage* self, PyObject* arg) {
1859 CMessage* other_message;
1860 if (!PyObject_TypeCheck(arg, &CMessage_Type)) {
1861 PyErr_Format(PyExc_TypeError,
1862 "Parameter to CopyFrom() must be instance of same class: "
1863 "expected %s got %s.",
1864 self->message->GetDescriptor()->full_name().c_str(),
1865 Py_TYPE(arg)->tp_name);
1866 return NULL;
1867 }
1868
1869 other_message = reinterpret_cast<CMessage*>(arg);
1870
1871 if (self == other_message) {
1872 Py_RETURN_NONE;
1873 }
1874
1875 if (other_message->message->GetDescriptor() !=
1876 self->message->GetDescriptor()) {
1877 PyErr_Format(PyExc_TypeError,
1878 "Parameter to CopyFrom() must be instance of same class: "
1879 "expected %s got %s.",
1880 self->message->GetDescriptor()->full_name().c_str(),
1881 other_message->message->GetDescriptor()->full_name().c_str());
1882 return NULL;
1883 }
1884
1885 AssureWritable(self);
1886
1887 // CopyFrom on the message will not clean up self->composite_fields,
1888 // which can leave us in an inconsistent state, so clear it out here.
1889 (void)ScopedPyObjectPtr(Clear(self));
1890
1891 self->message->CopyFrom(*other_message->message);
1892
1893 Py_RETURN_NONE;
1894 }
1895
1896 // Protobuf has a 64MB limit built in, this variable will override this. Please
1897 // do not enable this unless you fully understand the implications: protobufs
1898 // must all be kept in memory at the same time, so if they grow too big you may
1899 // get OOM errors. The protobuf APIs do not provide any tools for processing
1900 // protobufs in chunks. If you have protos this big you should break them up if
1901 // it is at all convenient to do so.
1902 static bool allow_oversize_protos = false;
1903
1904 // Provide a method in the module to set allow_oversize_protos to a boolean
1905 // value. This method returns the newly value of allow_oversize_protos.
1906 static PyObject* SetAllowOversizeProtos(PyObject* m, PyObject* arg) {
1907 if (!arg || !PyBool_Check(arg)) {
1908 PyErr_SetString(PyExc_TypeError,
1909 "Argument to SetAllowOversizeProtos must be boolean");
1910 return NULL;
1911 }
1912 allow_oversize_protos = PyObject_IsTrue(arg);
1913 if (allow_oversize_protos) {
1914 Py_RETURN_TRUE;
1915 } else {
1916 Py_RETURN_FALSE;
1917 }
1918 }
1919
1920 static PyObject* MergeFromString(CMessage* self, PyObject* arg) {
1921 const void* data;
1922 Py_ssize_t data_length;
1923 if (PyObject_AsReadBuffer(arg, &data, &data_length) < 0) {
1924 return NULL;
1925 }
1926
1927 AssureWritable(self);
1928 io::CodedInputStream input(
1929 reinterpret_cast<const uint8*>(data), data_length);
1930 if (allow_oversize_protos) {
1931 input.SetTotalBytesLimit(INT_MAX, INT_MAX);
1932 }
1933 PyDescriptorPool* pool = GetDescriptorPoolForMessage(self);
1934 input.SetExtensionRegistry(pool->pool, pool->message_factory);
1935 bool success = self->message->MergePartialFromCodedStream(&input);
1936 if (success) {
1937 return PyInt_FromLong(input.CurrentPosition());
1938 } else {
1939 PyErr_Format(DecodeError_class, "Error parsing message");
1940 return NULL;
1941 }
1942 }
1943
1944 static PyObject* ParseFromString(CMessage* self, PyObject* arg) {
1945 if (ScopedPyObjectPtr(Clear(self)) == NULL) {
1946 return NULL;
1947 }
1948 return MergeFromString(self, arg);
1949 }
1950
1951 static PyObject* ByteSize(CMessage* self, PyObject* args) {
1952 return PyLong_FromLong(self->message->ByteSize());
1953 }
1954
1955 static PyObject* RegisterExtension(PyObject* cls,
1956 PyObject* extension_handle) {
1957 const FieldDescriptor* descriptor =
1958 GetExtensionDescriptor(extension_handle);
1959 if (descriptor == NULL) {
1960 return NULL;
1961 }
1962
1963 ScopedPyObjectPtr extensions_by_name(
1964 PyObject_GetAttr(cls, k_extensions_by_name));
1965 if (extensions_by_name == NULL) {
1966 PyErr_SetString(PyExc_TypeError, "no extensions_by_name on class");
1967 return NULL;
1968 }
1969 ScopedPyObjectPtr full_name(PyObject_GetAttr(extension_handle, kfull_name));
1970 if (full_name == NULL) {
1971 return NULL;
1972 }
1973
1974 // If the extension was already registered, check that it is the same.
1975 PyObject* existing_extension =
1976 PyDict_GetItem(extensions_by_name.get(), full_name.get());
1977 if (existing_extension != NULL) {
1978 const FieldDescriptor* existing_extension_descriptor =
1979 GetExtensionDescriptor(existing_extension);
1980 if (existing_extension_descriptor != descriptor) {
1981 PyErr_SetString(PyExc_ValueError, "Double registration of Extensions");
1982 return NULL;
1983 }
1984 // Nothing else to do.
1985 Py_RETURN_NONE;
1986 }
1987
1988 if (PyDict_SetItem(extensions_by_name.get(), full_name.get(),
1989 extension_handle) < 0) {
1990 return NULL;
1991 }
1992
1993 // Also store a mapping from extension number to implementing class.
1994 ScopedPyObjectPtr extensions_by_number(
1995 PyObject_GetAttr(cls, k_extensions_by_number));
1996 if (extensions_by_number == NULL) {
1997 PyErr_SetString(PyExc_TypeError, "no extensions_by_number on class");
1998 return NULL;
1999 }
2000
2001 ScopedPyObjectPtr number(PyObject_GetAttrString(extension_handle, "number"));
2002 if (number == NULL) {
2003 return NULL;
2004 }
2005
2006 // If the extension was already registered by number, check that it is the
2007 // same.
2008 existing_extension = PyDict_GetItem(extensions_by_number.get(), number.get());
2009 if (existing_extension != NULL) {
2010 const FieldDescriptor* existing_extension_descriptor =
2011 GetExtensionDescriptor(existing_extension);
2012 if (existing_extension_descriptor != descriptor) {
2013 const Descriptor* msg_desc = GetMessageDescriptor(
2014 reinterpret_cast<PyTypeObject*>(cls));
2015 PyErr_Format(
2016 PyExc_ValueError,
2017 "Extensions \"%s\" and \"%s\" both try to extend message type "
2018 "\"%s\" with field number %ld.",
2019 existing_extension_descriptor->full_name().c_str(),
2020 descriptor->full_name().c_str(),
2021 msg_desc->full_name().c_str(),
2022 PyInt_AsLong(number.get()));
2023 return NULL;
2024 }
2025 // Nothing else to do.
2026 Py_RETURN_NONE;
2027 }
2028 if (PyDict_SetItem(extensions_by_number.get(), number.get(),
2029 extension_handle) < 0) {
2030 return NULL;
2031 }
2032
2033 // Check if it's a message set
2034 if (descriptor->is_extension() &&
2035 descriptor->containing_type()->options().message_set_wire_format() &&
2036 descriptor->type() == FieldDescriptor::TYPE_MESSAGE &&
2037 descriptor->label() == FieldDescriptor::LABEL_OPTIONAL) {
2038 ScopedPyObjectPtr message_name(PyString_FromStringAndSize(
2039 descriptor->message_type()->full_name().c_str(),
2040 descriptor->message_type()->full_name().size()));
2041 if (message_name == NULL) {
2042 return NULL;
2043 }
2044 PyDict_SetItem(extensions_by_name.get(), message_name.get(),
2045 extension_handle);
2046 }
2047
2048 Py_RETURN_NONE;
2049 }
2050
2051 static PyObject* SetInParent(CMessage* self, PyObject* args) {
2052 AssureWritable(self);
2053 Py_RETURN_NONE;
2054 }
2055
2056 static PyObject* WhichOneof(CMessage* self, PyObject* arg) {
2057 Py_ssize_t name_size;
2058 char *name_data;
2059 if (PyString_AsStringAndSize(arg, &name_data, &name_size) < 0)
2060 return NULL;
2061 string oneof_name = string(name_data, name_size);
2062 const OneofDescriptor* oneof_desc =
2063 self->message->GetDescriptor()->FindOneofByName(oneof_name);
2064 if (oneof_desc == NULL) {
2065 PyErr_Format(PyExc_ValueError,
2066 "Protocol message has no oneof \"%s\" field.",
2067 oneof_name.c_str());
2068 return NULL;
2069 }
2070 const FieldDescriptor* field_in_oneof =
2071 self->message->GetReflection()->GetOneofFieldDescriptor(
2072 *self->message, oneof_desc);
2073 if (field_in_oneof == NULL) {
2074 Py_RETURN_NONE;
2075 } else {
2076 const string& name = field_in_oneof->name();
2077 return PyString_FromStringAndSize(name.c_str(), name.size());
2078 }
2079 }
2080
2081 static PyObject* GetExtensionDict(CMessage* self, void *closure);
2082
2083 static PyObject* ListFields(CMessage* self) {
2084 vector<const FieldDescriptor*> fields;
2085 self->message->GetReflection()->ListFields(*self->message, &fields);
2086
2087 // Normally, the list will be exactly the size of the fields.
2088 ScopedPyObjectPtr all_fields(PyList_New(fields.size()));
2089 if (all_fields == NULL) {
2090 return NULL;
2091 }
2092
2093 // When there are unknown extensions, the py list will *not* contain
2094 // the field information. Thus the actual size of the py list will be
2095 // smaller than the size of fields. Set the actual size at the end.
2096 Py_ssize_t actual_size = 0;
2097 for (size_t i = 0; i < fields.size(); ++i) {
2098 ScopedPyObjectPtr t(PyTuple_New(2));
2099 if (t == NULL) {
2100 return NULL;
2101 }
2102
2103 if (fields[i]->is_extension()) {
2104 ScopedPyObjectPtr extension_field(
2105 PyFieldDescriptor_FromDescriptor(fields[i]));
2106 if (extension_field == NULL) {
2107 return NULL;
2108 }
2109 // With C++ descriptors, the field can always be retrieved, but for
2110 // unknown extensions which have not been imported in Python code, there
2111 // is no message class and we cannot retrieve the value.
2112 // TODO(amauryfa): consider building the class on the fly!
2113 if (fields[i]->message_type() != NULL &&
2114 cdescriptor_pool::GetMessageClass(
2115 GetDescriptorPoolForMessage(self),
2116 fields[i]->message_type()) == NULL) {
2117 PyErr_Clear();
2118 continue;
2119 }
2120 ScopedPyObjectPtr extensions(GetExtensionDict(self, NULL));
2121 if (extensions == NULL) {
2122 return NULL;
2123 }
2124 // 'extension' reference later stolen by PyTuple_SET_ITEM.
2125 PyObject* extension = PyObject_GetItem(
2126 extensions.get(), extension_field.get());
2127 if (extension == NULL) {
2128 return NULL;
2129 }
2130 PyTuple_SET_ITEM(t.get(), 0, extension_field.release());
2131 // Steals reference to 'extension'
2132 PyTuple_SET_ITEM(t.get(), 1, extension);
2133 } else {
2134 // Normal field
2135 const string& field_name = fields[i]->name();
2136 ScopedPyObjectPtr py_field_name(PyString_FromStringAndSize(
2137 field_name.c_str(), field_name.length()));
2138 if (py_field_name == NULL) {
2139 PyErr_SetString(PyExc_ValueError, "bad string");
2140 return NULL;
2141 }
2142 ScopedPyObjectPtr field_descriptor(
2143 PyFieldDescriptor_FromDescriptor(fields[i]));
2144 if (field_descriptor == NULL) {
2145 return NULL;
2146 }
2147
2148 PyObject* field_value = GetAttr(self, py_field_name.get());
2149 if (field_value == NULL) {
2150 PyErr_SetObject(PyExc_ValueError, py_field_name.get());
2151 return NULL;
2152 }
2153 PyTuple_SET_ITEM(t.get(), 0, field_descriptor.release());
2154 PyTuple_SET_ITEM(t.get(), 1, field_value);
2155 }
2156 PyList_SET_ITEM(all_fields.get(), actual_size, t.release());
2157 ++actual_size;
2158 }
2159 if (static_cast<size_t>(actual_size) != fields.size() &&
2160 (PyList_SetSlice(all_fields.get(), actual_size, fields.size(), NULL) <
2161 0)) {
2162 return NULL;
2163 }
2164 return all_fields.release();
2165 }
2166
2167 static PyObject* DiscardUnknownFields(CMessage* self) {
2168 AssureWritable(self);
2169 self->message->DiscardUnknownFields();
2170 Py_RETURN_NONE;
2171 }
2172
2173 PyObject* FindInitializationErrors(CMessage* self) {
2174 Message* message = self->message;
2175 vector<string> errors;
2176 message->FindInitializationErrors(&errors);
2177
2178 PyObject* error_list = PyList_New(errors.size());
2179 if (error_list == NULL) {
2180 return NULL;
2181 }
2182 for (size_t i = 0; i < errors.size(); ++i) {
2183 const string& error = errors[i];
2184 PyObject* error_string = PyString_FromStringAndSize(
2185 error.c_str(), error.length());
2186 if (error_string == NULL) {
2187 Py_DECREF(error_list);
2188 return NULL;
2189 }
2190 PyList_SET_ITEM(error_list, i, error_string);
2191 }
2192 return error_list;
2193 }
2194
2195 static PyObject* RichCompare(CMessage* self, PyObject* other, int opid) {
2196 // Only equality comparisons are implemented.
2197 if (opid != Py_EQ && opid != Py_NE) {
2198 Py_INCREF(Py_NotImplemented);
2199 return Py_NotImplemented;
2200 }
2201 bool equals = true;
2202 // If other is not a message, it cannot be equal.
2203 if (!PyObject_TypeCheck(other, &CMessage_Type)) {
2204 equals = false;
2205 }
2206 const google::protobuf::Message* other_message =
2207 reinterpret_cast<CMessage*>(other)->message;
2208 // If messages don't have the same descriptors, they are not equal.
2209 if (equals &&
2210 self->message->GetDescriptor() != other_message->GetDescriptor()) {
2211 equals = false;
2212 }
2213 // Check the message contents.
2214 if (equals && !google::protobuf::util::MessageDifferencer::Equals(
2215 *self->message,
2216 *reinterpret_cast<CMessage*>(other)->message)) {
2217 equals = false;
2218 }
2219 if (equals ^ (opid == Py_EQ)) {
2220 Py_RETURN_FALSE;
2221 } else {
2222 Py_RETURN_TRUE;
2223 }
2224 }
2225
2226 PyObject* InternalGetScalar(const Message* message,
2227 const FieldDescriptor* field_descriptor) {
2228 const Reflection* reflection = message->GetReflection();
2229
2230 if (!CheckFieldBelongsToMessage(field_descriptor, message)) {
2231 return NULL;
2232 }
2233
2234 PyObject* result = NULL;
2235 switch (field_descriptor->cpp_type()) {
2236 case FieldDescriptor::CPPTYPE_INT32: {
2237 int32 value = reflection->GetInt32(*message, field_descriptor);
2238 result = PyInt_FromLong(value);
2239 break;
2240 }
2241 case FieldDescriptor::CPPTYPE_INT64: {
2242 int64 value = reflection->GetInt64(*message, field_descriptor);
2243 result = PyLong_FromLongLong(value);
2244 break;
2245 }
2246 case FieldDescriptor::CPPTYPE_UINT32: {
2247 uint32 value = reflection->GetUInt32(*message, field_descriptor);
2248 result = PyInt_FromSize_t(value);
2249 break;
2250 }
2251 case FieldDescriptor::CPPTYPE_UINT64: {
2252 uint64 value = reflection->GetUInt64(*message, field_descriptor);
2253 result = PyLong_FromUnsignedLongLong(value);
2254 break;
2255 }
2256 case FieldDescriptor::CPPTYPE_FLOAT: {
2257 float value = reflection->GetFloat(*message, field_descriptor);
2258 result = PyFloat_FromDouble(value);
2259 break;
2260 }
2261 case FieldDescriptor::CPPTYPE_DOUBLE: {
2262 double value = reflection->GetDouble(*message, field_descriptor);
2263 result = PyFloat_FromDouble(value);
2264 break;
2265 }
2266 case FieldDescriptor::CPPTYPE_BOOL: {
2267 bool value = reflection->GetBool(*message, field_descriptor);
2268 result = PyBool_FromLong(value);
2269 break;
2270 }
2271 case FieldDescriptor::CPPTYPE_STRING: {
2272 string value = reflection->GetString(*message, field_descriptor);
2273 result = ToStringObject(field_descriptor, value);
2274 break;
2275 }
2276 case FieldDescriptor::CPPTYPE_ENUM: {
2277 if (!message->GetReflection()->SupportsUnknownEnumValues() &&
2278 !message->GetReflection()->HasField(*message, field_descriptor)) {
2279 // Look for the value in the unknown fields.
2280 const UnknownFieldSet& unknown_field_set =
2281 message->GetReflection()->GetUnknownFields(*message);
2282 for (int i = 0; i < unknown_field_set.field_count(); ++i) {
2283 if (unknown_field_set.field(i).number() ==
2284 field_descriptor->number() &&
2285 unknown_field_set.field(i).type() ==
2286 google::protobuf::UnknownField::TYPE_VARINT) {
2287 result = PyInt_FromLong(unknown_field_set.field(i).varint());
2288 break;
2289 }
2290 }
2291 }
2292
2293 if (result == NULL) {
2294 const EnumValueDescriptor* enum_value =
2295 message->GetReflection()->GetEnum(*message, field_descriptor);
2296 result = PyInt_FromLong(enum_value->number());
2297 }
2298 break;
2299 }
2300 default:
2301 PyErr_Format(
2302 PyExc_SystemError, "Getting a value from a field of unknown type %d",
2303 field_descriptor->cpp_type());
2304 }
2305
2306 return result;
2307 }
2308
2309 PyObject* InternalGetSubMessage(
2310 CMessage* self, const FieldDescriptor* field_descriptor) {
2311 const Reflection* reflection = self->message->GetReflection();
2312 PyDescriptorPool* pool = GetDescriptorPoolForMessage(self);
2313 const Message& sub_message = reflection->GetMessage(
2314 *self->message, field_descriptor, pool->message_factory);
2315
2316 CMessageClass* message_class = cdescriptor_pool::GetMessageClass(
2317 pool, field_descriptor->message_type());
2318 if (message_class == NULL) {
2319 return NULL;
2320 }
2321
2322 CMessage* cmsg = cmessage::NewEmptyMessage(message_class);
2323 if (cmsg == NULL) {
2324 return NULL;
2325 }
2326
2327 cmsg->owner = self->owner;
2328 cmsg->parent = self;
2329 cmsg->parent_field_descriptor = field_descriptor;
2330 cmsg->read_only = !reflection->HasField(*self->message, field_descriptor);
2331 cmsg->message = const_cast<Message*>(&sub_message);
2332
2333 return reinterpret_cast<PyObject*>(cmsg);
2334 }
2335
2336 int InternalSetNonOneofScalar(
2337 Message* message,
2338 const FieldDescriptor* field_descriptor,
2339 PyObject* arg) {
2340 const Reflection* reflection = message->GetReflection();
2341
2342 if (!CheckFieldBelongsToMessage(field_descriptor, message)) {
2343 return -1;
2344 }
2345
2346 switch (field_descriptor->cpp_type()) {
2347 case FieldDescriptor::CPPTYPE_INT32: {
2348 GOOGLE_CHECK_GET_INT32(arg, value, -1);
2349 reflection->SetInt32(message, field_descriptor, value);
2350 break;
2351 }
2352 case FieldDescriptor::CPPTYPE_INT64: {
2353 GOOGLE_CHECK_GET_INT64(arg, value, -1);
2354 reflection->SetInt64(message, field_descriptor, value);
2355 break;
2356 }
2357 case FieldDescriptor::CPPTYPE_UINT32: {
2358 GOOGLE_CHECK_GET_UINT32(arg, value, -1);
2359 reflection->SetUInt32(message, field_descriptor, value);
2360 break;
2361 }
2362 case FieldDescriptor::CPPTYPE_UINT64: {
2363 GOOGLE_CHECK_GET_UINT64(arg, value, -1);
2364 reflection->SetUInt64(message, field_descriptor, value);
2365 break;
2366 }
2367 case FieldDescriptor::CPPTYPE_FLOAT: {
2368 GOOGLE_CHECK_GET_FLOAT(arg, value, -1);
2369 reflection->SetFloat(message, field_descriptor, value);
2370 break;
2371 }
2372 case FieldDescriptor::CPPTYPE_DOUBLE: {
2373 GOOGLE_CHECK_GET_DOUBLE(arg, value, -1);
2374 reflection->SetDouble(message, field_descriptor, value);
2375 break;
2376 }
2377 case FieldDescriptor::CPPTYPE_BOOL: {
2378 GOOGLE_CHECK_GET_BOOL(arg, value, -1);
2379 reflection->SetBool(message, field_descriptor, value);
2380 break;
2381 }
2382 case FieldDescriptor::CPPTYPE_STRING: {
2383 if (!CheckAndSetString(
2384 arg, message, field_descriptor, reflection, false, -1)) {
2385 return -1;
2386 }
2387 break;
2388 }
2389 case FieldDescriptor::CPPTYPE_ENUM: {
2390 GOOGLE_CHECK_GET_INT32(arg, value, -1);
2391 if (reflection->SupportsUnknownEnumValues()) {
2392 reflection->SetEnumValue(message, field_descriptor, value);
2393 } else {
2394 const EnumDescriptor* enum_descriptor = field_descriptor->enum_type();
2395 const EnumValueDescriptor* enum_value =
2396 enum_descriptor->FindValueByNumber(value);
2397 if (enum_value != NULL) {
2398 reflection->SetEnum(message, field_descriptor, enum_value);
2399 } else {
2400 PyErr_Format(PyExc_ValueError, "Unknown enum value: %d", value);
2401 return -1;
2402 }
2403 }
2404 break;
2405 }
2406 default:
2407 PyErr_Format(
2408 PyExc_SystemError, "Setting value to a field of unknown type %d",
2409 field_descriptor->cpp_type());
2410 return -1;
2411 }
2412
2413 return 0;
2414 }
2415
2416 int InternalSetScalar(
2417 CMessage* self,
2418 const FieldDescriptor* field_descriptor,
2419 PyObject* arg) {
2420 if (!CheckFieldBelongsToMessage(field_descriptor, self->message)) {
2421 return -1;
2422 }
2423
2424 if (MaybeReleaseOverlappingOneofField(self, field_descriptor) < 0) {
2425 return -1;
2426 }
2427
2428 return InternalSetNonOneofScalar(self->message, field_descriptor, arg);
2429 }
2430
2431 PyObject* FromString(PyTypeObject* cls, PyObject* serialized) {
2432 PyObject* py_cmsg = PyObject_CallObject(
2433 reinterpret_cast<PyObject*>(cls), NULL);
2434 if (py_cmsg == NULL) {
2435 return NULL;
2436 }
2437 CMessage* cmsg = reinterpret_cast<CMessage*>(py_cmsg);
2438
2439 ScopedPyObjectPtr py_length(MergeFromString(cmsg, serialized));
2440 if (py_length == NULL) {
2441 Py_DECREF(py_cmsg);
2442 return NULL;
2443 }
2444
2445 return py_cmsg;
2446 }
2447
2448 PyObject* DeepCopy(CMessage* self, PyObject* arg) {
2449 PyObject* clone = PyObject_CallObject(
2450 reinterpret_cast<PyObject*>(Py_TYPE(self)), NULL);
2451 if (clone == NULL) {
2452 return NULL;
2453 }
2454 if (!PyObject_TypeCheck(clone, &CMessage_Type)) {
2455 Py_DECREF(clone);
2456 return NULL;
2457 }
2458 if (ScopedPyObjectPtr(MergeFrom(
2459 reinterpret_cast<CMessage*>(clone),
2460 reinterpret_cast<PyObject*>(self))) == NULL) {
2461 Py_DECREF(clone);
2462 return NULL;
2463 }
2464 return clone;
2465 }
2466
2467 PyObject* ToUnicode(CMessage* self) {
2468 // Lazy import to prevent circular dependencies
2469 ScopedPyObjectPtr text_format(
2470 PyImport_ImportModule("google.protobuf.text_format"));
2471 if (text_format == NULL) {
2472 return NULL;
2473 }
2474 ScopedPyObjectPtr method_name(PyString_FromString("MessageToString"));
2475 if (method_name == NULL) {
2476 return NULL;
2477 }
2478 Py_INCREF(Py_True);
2479 ScopedPyObjectPtr encoded(PyObject_CallMethodObjArgs(
2480 text_format.get(), method_name.get(), self, Py_True, NULL));
2481 Py_DECREF(Py_True);
2482 if (encoded == NULL) {
2483 return NULL;
2484 }
2485 #if PY_MAJOR_VERSION < 3
2486 PyObject* decoded = PyString_AsDecodedObject(encoded.get(), "utf-8", NULL);
2487 #else
2488 PyObject* decoded = PyUnicode_FromEncodedObject(encoded.get(), "utf-8", NULL);
2489 #endif
2490 if (decoded == NULL) {
2491 return NULL;
2492 }
2493 return decoded;
2494 }
2495
2496 PyObject* Reduce(CMessage* self) {
2497 ScopedPyObjectPtr constructor(reinterpret_cast<PyObject*>(Py_TYPE(self)));
2498 constructor.inc();
2499 ScopedPyObjectPtr args(PyTuple_New(0));
2500 if (args == NULL) {
2501 return NULL;
2502 }
2503 ScopedPyObjectPtr state(PyDict_New());
2504 if (state == NULL) {
2505 return NULL;
2506 }
2507 ScopedPyObjectPtr serialized(SerializePartialToString(self));
2508 if (serialized == NULL) {
2509 return NULL;
2510 }
2511 if (PyDict_SetItemString(state.get(), "serialized", serialized.get()) < 0) {
2512 return NULL;
2513 }
2514 return Py_BuildValue("OOO", constructor.get(), args.get(), state.get());
2515 }
2516
2517 PyObject* SetState(CMessage* self, PyObject* state) {
2518 if (!PyDict_Check(state)) {
2519 PyErr_SetString(PyExc_TypeError, "state not a dict");
2520 return NULL;
2521 }
2522 PyObject* serialized = PyDict_GetItemString(state, "serialized");
2523 if (serialized == NULL) {
2524 return NULL;
2525 }
2526 if (ScopedPyObjectPtr(ParseFromString(self, serialized)) == NULL) {
2527 return NULL;
2528 }
2529 Py_RETURN_NONE;
2530 }
2531
2532 // CMessage static methods:
2533 PyObject* _CheckCalledFromGeneratedFile(PyObject* unused,
2534 PyObject* unused_arg) {
2535 if (!_CalledFromGeneratedFile(1)) {
2536 PyErr_SetString(PyExc_TypeError,
2537 "Descriptors should not be created directly, "
2538 "but only retrieved from their parent.");
2539 return NULL;
2540 }
2541 Py_RETURN_NONE;
2542 }
2543
2544 static PyObject* GetExtensionDict(CMessage* self, void *closure) {
2545 if (self->extensions) {
2546 Py_INCREF(self->extensions);
2547 return reinterpret_cast<PyObject*>(self->extensions);
2548 }
2549
2550 // If there are extension_ranges, the message is "extendable". Allocate a
2551 // dictionary to store the extension fields.
2552 const Descriptor* descriptor = GetMessageDescriptor(Py_TYPE(self));
2553 if (descriptor->extension_range_count() > 0) {
2554 ExtensionDict* extension_dict = extension_dict::NewExtensionDict(self);
2555 if (extension_dict == NULL) {
2556 return NULL;
2557 }
2558 self->extensions = extension_dict;
2559 Py_INCREF(self->extensions);
2560 return reinterpret_cast<PyObject*>(self->extensions);
2561 }
2562
2563 PyErr_SetNone(PyExc_AttributeError);
2564 return NULL;
2565 }
2566
2567 static PyGetSetDef Getters[] = {
2568 {"Extensions", (getter)GetExtensionDict, NULL, "Extension dict"},
2569 {NULL}
2570 };
2571
2572 static PyMethodDef Methods[] = {
2573 { "__deepcopy__", (PyCFunction)DeepCopy, METH_VARARGS,
2574 "Makes a deep copy of the class." },
2575 { "__reduce__", (PyCFunction)Reduce, METH_NOARGS,
2576 "Outputs picklable representation of the message." },
2577 { "__setstate__", (PyCFunction)SetState, METH_O,
2578 "Inputs picklable representation of the message." },
2579 { "__unicode__", (PyCFunction)ToUnicode, METH_NOARGS,
2580 "Outputs a unicode representation of the message." },
2581 { "ByteSize", (PyCFunction)ByteSize, METH_NOARGS,
2582 "Returns the size of the message in bytes." },
2583 { "Clear", (PyCFunction)Clear, METH_NOARGS,
2584 "Clears the message." },
2585 { "ClearExtension", (PyCFunction)ClearExtension, METH_O,
2586 "Clears a message field." },
2587 { "ClearField", (PyCFunction)ClearField, METH_O,
2588 "Clears a message field." },
2589 { "CopyFrom", (PyCFunction)CopyFrom, METH_O,
2590 "Copies a protocol message into the current message." },
2591 { "DiscardUnknownFields", (PyCFunction)DiscardUnknownFields, METH_NOARGS,
2592 "Discards the unknown fields." },
2593 { "FindInitializationErrors", (PyCFunction)FindInitializationErrors,
2594 METH_NOARGS,
2595 "Finds unset required fields." },
2596 { "FromString", (PyCFunction)FromString, METH_O | METH_CLASS,
2597 "Creates new method instance from given serialized data." },
2598 { "HasExtension", (PyCFunction)HasExtension, METH_O,
2599 "Checks if a message field is set." },
2600 { "HasField", (PyCFunction)HasField, METH_O,
2601 "Checks if a message field is set." },
2602 { "IsInitialized", (PyCFunction)IsInitialized, METH_VARARGS,
2603 "Checks if all required fields of a protocol message are set." },
2604 { "ListFields", (PyCFunction)ListFields, METH_NOARGS,
2605 "Lists all set fields of a message." },
2606 { "MergeFrom", (PyCFunction)MergeFrom, METH_O,
2607 "Merges a protocol message into the current message." },
2608 { "MergeFromString", (PyCFunction)MergeFromString, METH_O,
2609 "Merges a serialized message into the current message." },
2610 { "ParseFromString", (PyCFunction)ParseFromString, METH_O,
2611 "Parses a serialized message into the current message." },
2612 { "RegisterExtension", (PyCFunction)RegisterExtension, METH_O | METH_CLASS,
2613 "Registers an extension with the current message." },
2614 { "SerializePartialToString", (PyCFunction)SerializePartialToString,
2615 METH_NOARGS,
2616 "Serializes the message to a string, even if it isn't initialized." },
2617 { "SerializeToString", (PyCFunction)SerializeToString, METH_NOARGS,
2618 "Serializes the message to a string, only for initialized messages." },
2619 { "SetInParent", (PyCFunction)SetInParent, METH_NOARGS,
2620 "Sets the has bit of the given field in its parent message." },
2621 { "WhichOneof", (PyCFunction)WhichOneof, METH_O,
2622 "Returns the name of the field set inside a oneof, "
2623 "or None if no field is set." },
2624
2625 // Static Methods.
2626 { "_CheckCalledFromGeneratedFile", (PyCFunction)_CheckCalledFromGeneratedFile,
2627 METH_NOARGS | METH_STATIC,
2628 "Raises TypeError if the caller is not in a _pb2.py file."},
2629 { NULL, NULL}
2630 };
2631
2632 static bool SetCompositeField(
2633 CMessage* self, PyObject* name, PyObject* value) {
2634 if (self->composite_fields == NULL) {
2635 self->composite_fields = PyDict_New();
2636 if (self->composite_fields == NULL) {
2637 return false;
2638 }
2639 }
2640 return PyDict_SetItem(self->composite_fields, name, value) == 0;
2641 }
2642
2643 PyObject* GetAttr(CMessage* self, PyObject* name) {
2644 PyObject* value = self->composite_fields ?
2645 PyDict_GetItem(self->composite_fields, name) : NULL;
2646 if (value != NULL) {
2647 Py_INCREF(value);
2648 return value;
2649 }
2650
2651 const FieldDescriptor* field_descriptor = GetFieldDescriptor(self, name);
2652 if (field_descriptor == NULL) {
2653 return CMessage_Type.tp_base->tp_getattro(
2654 reinterpret_cast<PyObject*>(self), name);
2655 }
2656
2657 if (field_descriptor->is_map()) {
2658 PyObject* py_container = NULL;
2659 const Descriptor* entry_type = field_descriptor->message_type();
2660 const FieldDescriptor* value_type = entry_type->FindFieldByName("value");
2661 if (value_type->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
2662 CMessageClass* value_class = cdescriptor_pool::GetMessageClass(
2663 GetDescriptorPoolForMessage(self), value_type->message_type());
2664 if (value_class == NULL) {
2665 return NULL;
2666 }
2667 py_container =
2668 NewMessageMapContainer(self, field_descriptor, value_class);
2669 } else {
2670 py_container = NewScalarMapContainer(self, field_descriptor);
2671 }
2672 if (py_container == NULL) {
2673 return NULL;
2674 }
2675 if (!SetCompositeField(self, name, py_container)) {
2676 Py_DECREF(py_container);
2677 return NULL;
2678 }
2679 return py_container;
2680 }
2681
2682 if (field_descriptor->label() == FieldDescriptor::LABEL_REPEATED) {
2683 PyObject* py_container = NULL;
2684 if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
2685 CMessageClass* message_class = cdescriptor_pool::GetMessageClass(
2686 GetDescriptorPoolForMessage(self), field_descriptor->message_type());
2687 if (message_class == NULL) {
2688 return NULL;
2689 }
2690 py_container = repeated_composite_container::NewContainer(
2691 self, field_descriptor, message_class);
2692 } else {
2693 py_container = repeated_scalar_container::NewContainer(
2694 self, field_descriptor);
2695 }
2696 if (py_container == NULL) {
2697 return NULL;
2698 }
2699 if (!SetCompositeField(self, name, py_container)) {
2700 Py_DECREF(py_container);
2701 return NULL;
2702 }
2703 return py_container;
2704 }
2705
2706 if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
2707 PyObject* sub_message = InternalGetSubMessage(self, field_descriptor);
2708 if (sub_message == NULL) {
2709 return NULL;
2710 }
2711 if (!SetCompositeField(self, name, sub_message)) {
2712 Py_DECREF(sub_message);
2713 return NULL;
2714 }
2715 return sub_message;
2716 }
2717
2718 return InternalGetScalar(self->message, field_descriptor);
2719 }
2720
2721 int SetAttr(CMessage* self, PyObject* name, PyObject* value) {
2722 if (self->composite_fields && PyDict_Contains(self->composite_fields, name)) {
2723 PyErr_SetString(PyExc_TypeError, "Can't set composite field");
2724 return -1;
2725 }
2726
2727 const FieldDescriptor* field_descriptor = GetFieldDescriptor(self, name);
2728 if (field_descriptor != NULL) {
2729 AssureWritable(self);
2730 if (field_descriptor->label() == FieldDescriptor::LABEL_REPEATED) {
2731 PyErr_Format(PyExc_AttributeError, "Assignment not allowed to repeated "
2732 "field \"%s\" in protocol message object.",
2733 field_descriptor->name().c_str());
2734 return -1;
2735 } else {
2736 if (field_descriptor->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) {
2737 PyErr_Format(PyExc_AttributeError, "Assignment not allowed to "
2738 "field \"%s\" in protocol message object.",
2739 field_descriptor->name().c_str());
2740 return -1;
2741 } else {
2742 return InternalSetScalar(self, field_descriptor, value);
2743 }
2744 }
2745 }
2746
2747 PyErr_Format(PyExc_AttributeError,
2748 "Assignment not allowed "
2749 "(no field \"%s\" in protocol message object).",
2750 PyString_AsString(name));
2751 return -1;
2752 }
2753
2754 } // namespace cmessage
2755
2756 PyTypeObject CMessage_Type = {
2757 PyVarObject_HEAD_INIT(&CMessageClass_Type, 0)
2758 FULL_MODULE_NAME ".CMessage", // tp_name
2759 sizeof(CMessage), // tp_basicsize
2760 0, // tp_itemsize
2761 (destructor)cmessage::Dealloc, // tp_dealloc
2762 0, // tp_print
2763 0, // tp_getattr
2764 0, // tp_setattr
2765 0, // tp_compare
2766 (reprfunc)cmessage::ToStr, // tp_repr
2767 0, // tp_as_number
2768 0, // tp_as_sequence
2769 0, // tp_as_mapping
2770 PyObject_HashNotImplemented, // tp_hash
2771 0, // tp_call
2772 (reprfunc)cmessage::ToStr, // tp_str
2773 (getattrofunc)cmessage::GetAttr, // tp_getattro
2774 (setattrofunc)cmessage::SetAttr, // tp_setattro
2775 0, // tp_as_buffer
2776 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, // tp_flags
2777 "A ProtocolMessage", // tp_doc
2778 0, // tp_traverse
2779 0, // tp_clear
2780 (richcmpfunc)cmessage::RichCompare, // tp_richcompare
2781 0, // tp_weaklistoffset
2782 0, // tp_iter
2783 0, // tp_iternext
2784 cmessage::Methods, // tp_methods
2785 0, // tp_members
2786 cmessage::Getters, // tp_getset
2787 0, // tp_base
2788 0, // tp_dict
2789 0, // tp_descr_get
2790 0, // tp_descr_set
2791 0, // tp_dictoffset
2792 (initproc)cmessage::Init, // tp_init
2793 0, // tp_alloc
2794 cmessage::New, // tp_new
2795 };
2796
2797 // --- Exposing the C proto living inside Python proto to C code:
2798
2799 const Message* (*GetCProtoInsidePyProtoPtr)(PyObject* msg);
2800 Message* (*MutableCProtoInsidePyProtoPtr)(PyObject* msg);
2801
2802 static const Message* GetCProtoInsidePyProtoImpl(PyObject* msg) {
2803 if (!PyObject_TypeCheck(msg, &CMessage_Type)) {
2804 return NULL;
2805 }
2806 CMessage* cmsg = reinterpret_cast<CMessage*>(msg);
2807 return cmsg->message;
2808 }
2809
2810 static Message* MutableCProtoInsidePyProtoImpl(PyObject* msg) {
2811 if (!PyObject_TypeCheck(msg, &CMessage_Type)) {
2812 return NULL;
2813 }
2814 CMessage* cmsg = reinterpret_cast<CMessage*>(msg);
2815 if ((cmsg->composite_fields && PyDict_Size(cmsg->composite_fields) != 0) ||
2816 (cmsg->extensions != NULL &&
2817 PyDict_Size(cmsg->extensions->values) != 0)) {
2818 // There is currently no way of accurately syncing arbitrary changes to
2819 // the underlying C++ message back to the CMessage (e.g. removed repeated
2820 // composite containers). We only allow direct mutation of the underlying
2821 // C++ message if there is no child data in the CMessage.
2822 return NULL;
2823 }
2824 cmessage::AssureWritable(cmsg);
2825 return cmsg->message;
2826 }
2827
2828 static const char module_docstring[] =
2829 "python-proto2 is a module that can be used to enhance proto2 Python API\n"
2830 "performance.\n"
2831 "\n"
2832 "It provides access to the protocol buffers C++ reflection API that\n"
2833 "implements the basic protocol buffer functions.";
2834
2835 void InitGlobals() {
2836 // TODO(gps): Check all return values in this function for NULL and propagate
2837 // the error (MemoryError) on up to result in an import failure. These should
2838 // also be freed and reset to NULL during finalization.
2839 kPythonZero = PyInt_FromLong(0);
2840 kint32min_py = PyInt_FromLong(kint32min);
2841 kint32max_py = PyInt_FromLong(kint32max);
2842 kuint32max_py = PyLong_FromLongLong(kuint32max);
2843 kint64min_py = PyLong_FromLongLong(kint64min);
2844 kint64max_py = PyLong_FromLongLong(kint64max);
2845 kuint64max_py = PyLong_FromUnsignedLongLong(kuint64max);
2846
2847 kDESCRIPTOR = PyString_FromString("DESCRIPTOR");
2848 k_cdescriptor = PyString_FromString("_cdescriptor");
2849 kfull_name = PyString_FromString("full_name");
2850 k_extensions_by_name = PyString_FromString("_extensions_by_name");
2851 k_extensions_by_number = PyString_FromString("_extensions_by_number");
2852
2853 PyObject *dummy_obj = PySet_New(NULL);
2854 kEmptyWeakref = PyWeakref_NewRef(dummy_obj, NULL);
2855 Py_DECREF(dummy_obj);
2856 }
2857
2858 bool InitProto2MessageModule(PyObject *m) {
2859 // Initialize types and globals in descriptor.cc
2860 if (!InitDescriptor()) {
2861 return false;
2862 }
2863
2864 // Initialize types and globals in descriptor_pool.cc
2865 if (!InitDescriptorPool()) {
2866 return false;
2867 }
2868
2869 // Initialize constants defined in this file.
2870 InitGlobals();
2871
2872 CMessageClass_Type.tp_base = &PyType_Type;
2873 if (PyType_Ready(&CMessageClass_Type) < 0) {
2874 return false;
2875 }
2876 PyModule_AddObject(m, "MessageMeta",
2877 reinterpret_cast<PyObject*>(&CMessageClass_Type));
2878
2879 if (PyType_Ready(&CMessage_Type) < 0) {
2880 return false;
2881 }
2882
2883 // DESCRIPTOR is set on each protocol buffer message class elsewhere, but set
2884 // it here as well to document that subclasses need to set it.
2885 PyDict_SetItem(CMessage_Type.tp_dict, kDESCRIPTOR, Py_None);
2886 // Subclasses with message extensions will override _extensions_by_name and
2887 // _extensions_by_number with fresh mutable dictionaries in AddDescriptors.
2888 // All other classes can share this same immutable mapping.
2889 ScopedPyObjectPtr empty_dict(PyDict_New());
2890 if (empty_dict == NULL) {
2891 return false;
2892 }
2893 ScopedPyObjectPtr immutable_dict(PyDictProxy_New(empty_dict.get()));
2894 if (immutable_dict == NULL) {
2895 return false;
2896 }
2897 if (PyDict_SetItem(CMessage_Type.tp_dict,
2898 k_extensions_by_name, immutable_dict.get()) < 0) {
2899 return false;
2900 }
2901 if (PyDict_SetItem(CMessage_Type.tp_dict,
2902 k_extensions_by_number, immutable_dict.get()) < 0) {
2903 return false;
2904 }
2905
2906 PyModule_AddObject(m, "Message", reinterpret_cast<PyObject*>(&CMessage_Type));
2907
2908 // Initialize Repeated container types.
2909 {
2910 if (PyType_Ready(&RepeatedScalarContainer_Type) < 0) {
2911 return false;
2912 }
2913
2914 PyModule_AddObject(m, "RepeatedScalarContainer",
2915 reinterpret_cast<PyObject*>(
2916 &RepeatedScalarContainer_Type));
2917
2918 if (PyType_Ready(&RepeatedCompositeContainer_Type) < 0) {
2919 return false;
2920 }
2921
2922 PyModule_AddObject(
2923 m, "RepeatedCompositeContainer",
2924 reinterpret_cast<PyObject*>(
2925 &RepeatedCompositeContainer_Type));
2926
2927 // Register them as collections.Sequence
2928 ScopedPyObjectPtr collections(PyImport_ImportModule("collections"));
2929 if (collections == NULL) {
2930 return false;
2931 }
2932 ScopedPyObjectPtr mutable_sequence(
2933 PyObject_GetAttrString(collections.get(), "MutableSequence"));
2934 if (mutable_sequence == NULL) {
2935 return false;
2936 }
2937 if (ScopedPyObjectPtr(
2938 PyObject_CallMethod(mutable_sequence.get(), "register", "O",
2939 &RepeatedScalarContainer_Type)) == NULL) {
2940 return false;
2941 }
2942 if (ScopedPyObjectPtr(
2943 PyObject_CallMethod(mutable_sequence.get(), "register", "O",
2944 &RepeatedCompositeContainer_Type)) == NULL) {
2945 return false;
2946 }
2947 }
2948
2949 // Initialize Map container types.
2950 {
2951 // ScalarMapContainer_Type derives from our MutableMapping type.
2952 ScopedPyObjectPtr containers(PyImport_ImportModule(
2953 "google.protobuf.internal.containers"));
2954 if (containers == NULL) {
2955 return false;
2956 }
2957
2958 ScopedPyObjectPtr mutable_mapping(
2959 PyObject_GetAttrString(containers.get(), "MutableMapping"));
2960 if (mutable_mapping == NULL) {
2961 return false;
2962 }
2963
2964 if (!PyObject_TypeCheck(mutable_mapping.get(), &PyType_Type)) {
2965 return false;
2966 }
2967
2968 Py_INCREF(mutable_mapping.get());
2969 #if PY_MAJOR_VERSION >= 3
2970 PyObject* bases = PyTuple_New(1);
2971 PyTuple_SET_ITEM(bases, 0, mutable_mapping.get());
2972
2973 ScalarMapContainer_Type =
2974 PyType_FromSpecWithBases(&ScalarMapContainer_Type_spec, bases);
2975 PyModule_AddObject(m, "ScalarMapContainer", ScalarMapContainer_Type);
2976 #else
2977 ScalarMapContainer_Type.tp_base =
2978 reinterpret_cast<PyTypeObject*>(mutable_mapping.get());
2979
2980 if (PyType_Ready(&ScalarMapContainer_Type) < 0) {
2981 return false;
2982 }
2983
2984 PyModule_AddObject(m, "ScalarMapContainer",
2985 reinterpret_cast<PyObject*>(&ScalarMapContainer_Type));
2986 #endif
2987
2988 if (PyType_Ready(&MapIterator_Type) < 0) {
2989 return false;
2990 }
2991
2992 PyModule_AddObject(m, "MapIterator",
2993 reinterpret_cast<PyObject*>(&MapIterator_Type));
2994
2995
2996 #if PY_MAJOR_VERSION >= 3
2997 MessageMapContainer_Type =
2998 PyType_FromSpecWithBases(&MessageMapContainer_Type_spec, bases);
2999 PyModule_AddObject(m, "MessageMapContainer", MessageMapContainer_Type);
3000 #else
3001 Py_INCREF(mutable_mapping.get());
3002 MessageMapContainer_Type.tp_base =
3003 reinterpret_cast<PyTypeObject*>(mutable_mapping.get());
3004
3005 if (PyType_Ready(&MessageMapContainer_Type) < 0) {
3006 return false;
3007 }
3008
3009 PyModule_AddObject(m, "MessageMapContainer",
3010 reinterpret_cast<PyObject*>(&MessageMapContainer_Type));
3011 #endif
3012 }
3013
3014 if (PyType_Ready(&ExtensionDict_Type) < 0) {
3015 return false;
3016 }
3017 PyModule_AddObject(
3018 m, "ExtensionDict",
3019 reinterpret_cast<PyObject*>(&ExtensionDict_Type));
3020
3021 // Expose the DescriptorPool used to hold all descriptors added from generated
3022 // pb2.py files.
3023 // PyModule_AddObject steals a reference.
3024 Py_INCREF(GetDefaultDescriptorPool());
3025 PyModule_AddObject(m, "default_pool",
3026 reinterpret_cast<PyObject*>(GetDefaultDescriptorPool()));
3027
3028 PyModule_AddObject(m, "DescriptorPool", reinterpret_cast<PyObject*>(
3029 &PyDescriptorPool_Type));
3030
3031 // This implementation provides full Descriptor types, we advertise it so that
3032 // descriptor.py can use them in replacement of the Python classes.
3033 PyModule_AddIntConstant(m, "_USE_C_DESCRIPTORS", 1);
3034
3035 PyModule_AddObject(m, "Descriptor", reinterpret_cast<PyObject*>(
3036 &PyMessageDescriptor_Type));
3037 PyModule_AddObject(m, "FieldDescriptor", reinterpret_cast<PyObject*>(
3038 &PyFieldDescriptor_Type));
3039 PyModule_AddObject(m, "EnumDescriptor", reinterpret_cast<PyObject*>(
3040 &PyEnumDescriptor_Type));
3041 PyModule_AddObject(m, "EnumValueDescriptor", reinterpret_cast<PyObject*>(
3042 &PyEnumValueDescriptor_Type));
3043 PyModule_AddObject(m, "FileDescriptor", reinterpret_cast<PyObject*>(
3044 &PyFileDescriptor_Type));
3045 PyModule_AddObject(m, "OneofDescriptor", reinterpret_cast<PyObject*>(
3046 &PyOneofDescriptor_Type));
3047
3048 PyObject* enum_type_wrapper = PyImport_ImportModule(
3049 "google.protobuf.internal.enum_type_wrapper");
3050 if (enum_type_wrapper == NULL) {
3051 return false;
3052 }
3053 EnumTypeWrapper_class =
3054 PyObject_GetAttrString(enum_type_wrapper, "EnumTypeWrapper");
3055 Py_DECREF(enum_type_wrapper);
3056
3057 PyObject* message_module = PyImport_ImportModule(
3058 "google.protobuf.message");
3059 if (message_module == NULL) {
3060 return false;
3061 }
3062 EncodeError_class = PyObject_GetAttrString(message_module, "EncodeError");
3063 DecodeError_class = PyObject_GetAttrString(message_module, "DecodeError");
3064 PythonMessage_class = PyObject_GetAttrString(message_module, "Message");
3065 Py_DECREF(message_module);
3066
3067 PyObject* pickle_module = PyImport_ImportModule("pickle");
3068 if (pickle_module == NULL) {
3069 return false;
3070 }
3071 PickleError_class = PyObject_GetAttrString(pickle_module, "PickleError");
3072 Py_DECREF(pickle_module);
3073
3074 // Override {Get,Mutable}CProtoInsidePyProto.
3075 GetCProtoInsidePyProtoPtr = GetCProtoInsidePyProtoImpl;
3076 MutableCProtoInsidePyProtoPtr = MutableCProtoInsidePyProtoImpl;
3077
3078 return true;
3079 }
3080
3081 } // namespace python
3082 } // namespace protobuf
3083
3084 static PyMethodDef ModuleMethods[] = {
3085 {"SetAllowOversizeProtos",
3086 (PyCFunction)google::protobuf::python::cmessage::SetAllowOversizeProtos,
3087 METH_O, "Enable/disable oversize proto parsing."},
3088 { NULL, NULL}
3089 };
3090
3091 #if PY_MAJOR_VERSION >= 3
3092 static struct PyModuleDef _module = {
3093 PyModuleDef_HEAD_INIT,
3094 "_message",
3095 google::protobuf::python::module_docstring,
3096 -1,
3097 ModuleMethods, /* m_methods */
3098 NULL,
3099 NULL,
3100 NULL,
3101 NULL
3102 };
3103 #define INITFUNC PyInit__message
3104 #define INITFUNC_ERRORVAL NULL
3105 #else // Python 2
3106 #define INITFUNC init_message
3107 #define INITFUNC_ERRORVAL
3108 #endif
3109
3110 extern "C" {
INITFUNC(void)3111 PyMODINIT_FUNC INITFUNC(void) {
3112 PyObject* m;
3113 #if PY_MAJOR_VERSION >= 3
3114 m = PyModule_Create(&_module);
3115 #else
3116 m = Py_InitModule3("_message", ModuleMethods,
3117 google::protobuf::python::module_docstring);
3118 #endif
3119 if (m == NULL) {
3120 return INITFUNC_ERRORVAL;
3121 }
3122
3123 if (!google::protobuf::python::InitProto2MessageModule(m)) {
3124 Py_DECREF(m);
3125 return INITFUNC_ERRORVAL;
3126 }
3127
3128 #if PY_MAJOR_VERSION >= 3
3129 return m;
3130 #endif
3131 }
3132 }
3133 } // namespace google
3134