Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: third_party/protobuf/python/google/protobuf/pyext/descriptor.cc

Issue 2600753002: Reverts third_party/protobuf: Update to HEAD (f52e188fe4) (Closed)
Patch Set: Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Protocol Buffers - Google's data interchange format 1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved. 2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/ 3 // https://developers.google.com/protocol-buffers/
4 // 4 //
5 // Redistribution and use in source and binary forms, with or without 5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are 6 // modification, are permitted provided that the following conditions are
7 // met: 7 // met:
8 // 8 //
9 // * Redistributions of source code must retain the above copyright 9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer. 10 // notice, this list of conditions and the following disclaimer.
(...skipping 23 matching lines...) Expand all
34 #include <frameobject.h> 34 #include <frameobject.h>
35 #include <string> 35 #include <string>
36 36
37 #include <google/protobuf/io/coded_stream.h> 37 #include <google/protobuf/io/coded_stream.h>
38 #include <google/protobuf/descriptor.pb.h> 38 #include <google/protobuf/descriptor.pb.h>
39 #include <google/protobuf/dynamic_message.h> 39 #include <google/protobuf/dynamic_message.h>
40 #include <google/protobuf/pyext/descriptor.h> 40 #include <google/protobuf/pyext/descriptor.h>
41 #include <google/protobuf/pyext/descriptor_containers.h> 41 #include <google/protobuf/pyext/descriptor_containers.h>
42 #include <google/protobuf/pyext/descriptor_pool.h> 42 #include <google/protobuf/pyext/descriptor_pool.h>
43 #include <google/protobuf/pyext/message.h> 43 #include <google/protobuf/pyext/message.h>
44 #include <google/protobuf/pyext/message_factory.h>
45 #include <google/protobuf/pyext/scoped_pyobject_ptr.h> 44 #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
46 45
47 #if PY_MAJOR_VERSION >= 3 46 #if PY_MAJOR_VERSION >= 3
48 #define PyString_FromStringAndSize PyUnicode_FromStringAndSize 47 #define PyString_FromStringAndSize PyUnicode_FromStringAndSize
49 #define PyString_Check PyUnicode_Check 48 #define PyString_Check PyUnicode_Check
50 #define PyString_InternFromString PyUnicode_InternFromString 49 #define PyString_InternFromString PyUnicode_InternFromString
51 #define PyInt_FromLong PyLong_FromLong 50 #define PyInt_FromLong PyLong_FromLong
52 #define PyInt_FromSize_t PyLong_FromSize_t 51 #define PyInt_FromSize_t PyLong_FromSize_t
53 #if PY_VERSION_HEX < 0x03030000 52 #if PY_VERSION_HEX < 0x03030000
54 #error "Python 3.0 - 3.2 are not supported." 53 #error "Python 3.0 - 3.2 are not supported."
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 return descriptor; 165 return descriptor;
167 } 166 }
168 template<> 167 template<>
169 const FileDescriptor* GetFileDescriptor(const EnumValueDescriptor* descriptor) { 168 const FileDescriptor* GetFileDescriptor(const EnumValueDescriptor* descriptor) {
170 return descriptor->type()->file(); 169 return descriptor->type()->file();
171 } 170 }
172 template<> 171 template<>
173 const FileDescriptor* GetFileDescriptor(const OneofDescriptor* descriptor) { 172 const FileDescriptor* GetFileDescriptor(const OneofDescriptor* descriptor) {
174 return descriptor->containing_type()->file(); 173 return descriptor->containing_type()->file();
175 } 174 }
176 template<>
177 const FileDescriptor* GetFileDescriptor(const MethodDescriptor* descriptor) {
178 return descriptor->service()->file();
179 }
180 175
181 // Converts options into a Python protobuf, and cache the result. 176 // Converts options into a Python protobuf, and cache the result.
182 // 177 //
183 // This is a bit tricky because options can contain extension fields defined in 178 // This is a bit tricky because options can contain extension fields defined in
184 // the same proto file. In this case the options parsed from the serialized_pb 179 // the same proto file. In this case the options parsed from the serialized_pb
185 // have unknown fields, and we need to parse them again. 180 // have unkown fields, and we need to parse them again.
186 // 181 //
187 // Always returns a new reference. 182 // Always returns a new reference.
188 template<class DescriptorClass> 183 template<class DescriptorClass>
189 static PyObject* GetOrBuildOptions(const DescriptorClass *descriptor) { 184 static PyObject* GetOrBuildOptions(const DescriptorClass *descriptor) {
190 // Options (and their extensions) are completely resolved in the proto file 185 // Options (and their extensions) are completely resolved in the proto file
191 // containing the descriptor. 186 // containing the descriptor.
192 PyDescriptorPool* pool = GetDescriptorPool_FromPool( 187 PyDescriptorPool* pool = GetDescriptorPool_FromPool(
193 GetFileDescriptor(descriptor)->pool()); 188 GetFileDescriptor(descriptor)->pool());
194 189
195 hash_map<const void*, PyObject*>* descriptor_options = 190 hash_map<const void*, PyObject*>* descriptor_options =
196 pool->descriptor_options; 191 pool->descriptor_options;
197 // First search in the cache. 192 // First search in the cache.
198 if (descriptor_options->find(descriptor) != descriptor_options->end()) { 193 if (descriptor_options->find(descriptor) != descriptor_options->end()) {
199 PyObject *value = (*descriptor_options)[descriptor]; 194 PyObject *value = (*descriptor_options)[descriptor];
200 Py_INCREF(value); 195 Py_INCREF(value);
201 return value; 196 return value;
202 } 197 }
203 198
204 // Build the Options object: get its Python class, and make a copy of the C++ 199 // Build the Options object: get its Python class, and make a copy of the C++
205 // read-only instance. 200 // read-only instance.
206 const Message& options(descriptor->options()); 201 const Message& options(descriptor->options());
207 const Descriptor *message_type = options.GetDescriptor(); 202 const Descriptor *message_type = options.GetDescriptor();
208 PyMessageFactory* message_factory = pool->py_message_factory; 203 CMessageClass* message_class(
209 CMessageClass* message_class = message_factory::GetMessageClass( 204 cdescriptor_pool::GetMessageClass(pool, message_type));
210 message_factory, message_type);
211 if (message_class == NULL) { 205 if (message_class == NULL) {
212 // The Options message was not found in the current DescriptorPool. 206 // The Options message was not found in the current DescriptorPool.
213 // This means that the pool cannot contain any extensions to the Options 207 // In this case, there cannot be extensions to these options, and we can
214 // message either, so falling back to the basic pool we can only increase 208 // try to use the basic pool instead.
215 // the chances of successfully parsing the options.
216 PyErr_Clear(); 209 PyErr_Clear();
217 pool = GetDefaultDescriptorPool(); 210 message_class = cdescriptor_pool::GetMessageClass(
218 message_factory = pool->py_message_factory; 211 GetDefaultDescriptorPool(), message_type);
219 message_class = message_factory::GetMessageClass(
220 message_factory, message_type);
221 } 212 }
222 if (message_class == NULL) { 213 if (message_class == NULL) {
223 PyErr_Format(PyExc_TypeError, "Could not retrieve class for Options: %s", 214 PyErr_Format(PyExc_TypeError, "Could not retrieve class for Options: %s",
224 message_type->full_name().c_str()); 215 message_type->full_name().c_str());
225 return NULL; 216 return NULL;
226 } 217 }
227 ScopedPyObjectPtr value( 218 ScopedPyObjectPtr value(
228 PyEval_CallObject(message_class->AsPyObject(), NULL)); 219 PyEval_CallObject(message_class->AsPyObject(), NULL));
229 if (value == NULL) { 220 if (value == NULL) {
230 return NULL; 221 return NULL;
231 } 222 }
232 if (!PyObject_TypeCheck(value.get(), &CMessage_Type)) { 223 if (!PyObject_TypeCheck(value.get(), &CMessage_Type)) {
233 PyErr_Format(PyExc_TypeError, "Invalid class for %s: %s", 224 PyErr_Format(PyExc_TypeError, "Invalid class for %s: %s",
234 message_type->full_name().c_str(), 225 message_type->full_name().c_str(),
235 Py_TYPE(value.get())->tp_name); 226 Py_TYPE(value.get())->tp_name);
236 return NULL; 227 return NULL;
237 } 228 }
238 CMessage* cmsg = reinterpret_cast<CMessage*>(value.get()); 229 CMessage* cmsg = reinterpret_cast<CMessage*>(value.get());
239 230
240 const Reflection* reflection = options.GetReflection(); 231 const Reflection* reflection = options.GetReflection();
241 const UnknownFieldSet& unknown_fields(reflection->GetUnknownFields(options)); 232 const UnknownFieldSet& unknown_fields(reflection->GetUnknownFields(options));
242 if (unknown_fields.empty()) { 233 if (unknown_fields.empty()) {
243 cmsg->message->CopyFrom(options); 234 cmsg->message->CopyFrom(options);
244 } else { 235 } else {
245 // Reparse options string! XXX call cmessage::MergeFromString 236 // Reparse options string! XXX call cmessage::MergeFromString
246 string serialized; 237 string serialized;
247 options.SerializeToString(&serialized); 238 options.SerializeToString(&serialized);
248 io::CodedInputStream input( 239 io::CodedInputStream input(
249 reinterpret_cast<const uint8*>(serialized.c_str()), serialized.size()); 240 reinterpret_cast<const uint8*>(serialized.c_str()), serialized.size());
250 input.SetExtensionRegistry(pool->pool, message_factory->message_factory); 241 input.SetExtensionRegistry(pool->pool, pool->message_factory);
251 bool success = cmsg->message->MergePartialFromCodedStream(&input); 242 bool success = cmsg->message->MergePartialFromCodedStream(&input);
252 if (!success) { 243 if (!success) {
253 PyErr_Format(PyExc_ValueError, "Error parsing Options message"); 244 PyErr_Format(PyExc_ValueError, "Error parsing Options message");
254 return NULL; 245 return NULL;
255 } 246 }
256 } 247 }
257 248
258 // Cache the result. 249 // Cache the result.
259 Py_INCREF(value.get()); 250 Py_INCREF(value.get());
260 (*descriptor_options)[descriptor] = value.get(); 251 (*pool->descriptor_options)[descriptor] = value.get();
261 252
262 return value.release(); 253 return value.release();
263 } 254 }
264 255
265 // Copy the C++ descriptor to a Python message. 256 // Copy the C++ descriptor to a Python message.
266 // The Python message is an instance of descriptor_pb2.DescriptorProto 257 // The Python message is an instance of descriptor_pb2.DescriptorProto
267 // or similar. 258 // or similar.
268 template<class DescriptorProtoClass, class DescriptorClass> 259 template<class DescriptorProtoClass, class DescriptorClass>
269 static PyObject* CopyToPythonProto(const DescriptorClass *descriptor, 260 static PyObject* CopyToPythonProto(const DescriptorClass *descriptor,
270 PyObject *target) { 261 PyObject *target) {
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 static PyObject* GetFile(PyBaseDescriptor *self, void *closure) { 427 static PyObject* GetFile(PyBaseDescriptor *self, void *closure) {
437 return PyFileDescriptor_FromDescriptor(_GetDescriptor(self)->file()); 428 return PyFileDescriptor_FromDescriptor(_GetDescriptor(self)->file());
438 } 429 }
439 430
440 static PyObject* GetConcreteClass(PyBaseDescriptor* self, void *closure) { 431 static PyObject* GetConcreteClass(PyBaseDescriptor* self, void *closure) {
441 // Retuns the canonical class for the given descriptor. 432 // Retuns the canonical class for the given descriptor.
442 // This is the class that was registered with the primary descriptor pool 433 // This is the class that was registered with the primary descriptor pool
443 // which contains this descriptor. 434 // which contains this descriptor.
444 // This might not be the one you expect! For example the returned object does 435 // This might not be the one you expect! For example the returned object does
445 // not know about extensions defined in a custom pool. 436 // not know about extensions defined in a custom pool.
446 CMessageClass* concrete_class(message_factory::GetMessageClass( 437 CMessageClass* concrete_class(cdescriptor_pool::GetMessageClass(
447 GetDescriptorPool_FromPool( 438 GetDescriptorPool_FromPool(_GetDescriptor(self)->file()->pool()),
448 _GetDescriptor(self)->file()->pool())->py_message_factory,
449 _GetDescriptor(self))); 439 _GetDescriptor(self)));
450 Py_XINCREF(concrete_class); 440 Py_XINCREF(concrete_class);
451 return concrete_class->AsPyObject(); 441 return concrete_class->AsPyObject();
452 } 442 }
453 443
454 static PyObject* GetFieldsByName(PyBaseDescriptor* self, void *closure) { 444 static PyObject* GetFieldsByName(PyBaseDescriptor* self, void *closure) {
455 return NewMessageFieldsByName(_GetDescriptor(self)); 445 return NewMessageFieldsByName(_GetDescriptor(self));
456 } 446 }
457 447
458 static PyObject* GetFieldsByCamelcaseName(PyBaseDescriptor* self, 448 static PyObject* GetFieldsByCamelcaseName(PyBaseDescriptor* self,
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 } 687 }
698 688
699 static PyObject* GetName(PyBaseDescriptor *self, void *closure) { 689 static PyObject* GetName(PyBaseDescriptor *self, void *closure) {
700 return PyString_FromCppString(_GetDescriptor(self)->name()); 690 return PyString_FromCppString(_GetDescriptor(self)->name());
701 } 691 }
702 692
703 static PyObject* GetCamelcaseName(PyBaseDescriptor* self, void *closure) { 693 static PyObject* GetCamelcaseName(PyBaseDescriptor* self, void *closure) {
704 return PyString_FromCppString(_GetDescriptor(self)->camelcase_name()); 694 return PyString_FromCppString(_GetDescriptor(self)->camelcase_name());
705 } 695 }
706 696
707 static PyObject* GetJsonName(PyBaseDescriptor* self, void *closure) {
708 return PyString_FromCppString(_GetDescriptor(self)->json_name());
709 }
710
711 static PyObject* GetType(PyBaseDescriptor *self, void *closure) { 697 static PyObject* GetType(PyBaseDescriptor *self, void *closure) {
712 return PyInt_FromLong(_GetDescriptor(self)->type()); 698 return PyInt_FromLong(_GetDescriptor(self)->type());
713 } 699 }
714 700
715 static PyObject* GetCppType(PyBaseDescriptor *self, void *closure) { 701 static PyObject* GetCppType(PyBaseDescriptor *self, void *closure) {
716 return PyInt_FromLong(_GetDescriptor(self)->cpp_type()); 702 return PyInt_FromLong(_GetDescriptor(self)->cpp_type());
717 } 703 }
718 704
719 static PyObject* GetLabel(PyBaseDescriptor *self, void *closure) { 705 static PyObject* GetLabel(PyBaseDescriptor *self, void *closure) {
720 return PyInt_FromLong(_GetDescriptor(self)->label()); 706 return PyInt_FromLong(_GetDescriptor(self)->label());
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
890 static int SetOptions(PyBaseDescriptor *self, PyObject *value, 876 static int SetOptions(PyBaseDescriptor *self, PyObject *value,
891 void *closure) { 877 void *closure) {
892 return CheckCalledFromGeneratedFile("_options"); 878 return CheckCalledFromGeneratedFile("_options");
893 } 879 }
894 880
895 881
896 static PyGetSetDef Getters[] = { 882 static PyGetSetDef Getters[] = {
897 { "full_name", (getter)GetFullName, NULL, "Full name"}, 883 { "full_name", (getter)GetFullName, NULL, "Full name"},
898 { "name", (getter)GetName, NULL, "Unqualified name"}, 884 { "name", (getter)GetName, NULL, "Unqualified name"},
899 { "camelcase_name", (getter)GetCamelcaseName, NULL, "Camelcase name"}, 885 { "camelcase_name", (getter)GetCamelcaseName, NULL, "Camelcase name"},
900 { "json_name", (getter)GetJsonName, NULL, "Json name"},
901 { "type", (getter)GetType, NULL, "C++ Type"}, 886 { "type", (getter)GetType, NULL, "C++ Type"},
902 { "cpp_type", (getter)GetCppType, NULL, "C++ Type"}, 887 { "cpp_type", (getter)GetCppType, NULL, "C++ Type"},
903 { "label", (getter)GetLabel, NULL, "Label"}, 888 { "label", (getter)GetLabel, NULL, "Label"},
904 { "number", (getter)GetNumber, NULL, "Number"}, 889 { "number", (getter)GetNumber, NULL, "Number"},
905 { "index", (getter)GetIndex, NULL, "Index"}, 890 { "index", (getter)GetIndex, NULL, "Index"},
906 { "default_value", (getter)GetDefaultValue, NULL, "Default Value"}, 891 { "default_value", (getter)GetDefaultValue, NULL, "Default Value"},
907 { "has_default_value", (getter)HasDefaultValue}, 892 { "has_default_value", (getter)HasDefaultValue},
908 { "is_extension", (getter)IsExtension, NULL, "ID"}, 893 { "is_extension", (getter)IsExtension, NULL, "ID"},
909 { "id", (getter)GetID, NULL, "ID"}, 894 { "id", (getter)GetID, NULL, "ID"},
910 { "_cdescriptor", (getter)GetCDescriptor, NULL, "HAACK REMOVE ME"}, 895 { "_cdescriptor", (getter)GetCDescriptor, NULL, "HAACK REMOVE ME"},
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
1099 0, // tp_setattro 1084 0, // tp_setattro
1100 0, // tp_as_buffer 1085 0, // tp_as_buffer
1101 Py_TPFLAGS_DEFAULT, // tp_flags 1086 Py_TPFLAGS_DEFAULT, // tp_flags
1102 "A Enum Descriptor", // tp_doc 1087 "A Enum Descriptor", // tp_doc
1103 0, // tp_traverse 1088 0, // tp_traverse
1104 0, // tp_clear 1089 0, // tp_clear
1105 0, // tp_richcompare 1090 0, // tp_richcompare
1106 0, // tp_weaklistoffset 1091 0, // tp_weaklistoffset
1107 0, // tp_iter 1092 0, // tp_iter
1108 0, // tp_iternext 1093 0, // tp_iternext
1109 enum_descriptor::Methods, // tp_methods 1094 enum_descriptor::Methods, // tp_getset
1110 0, // tp_members 1095 0, // tp_members
1111 enum_descriptor::Getters, // tp_getset 1096 enum_descriptor::Getters, // tp_getset
1112 &descriptor::PyBaseDescriptor_Type, // tp_base 1097 &descriptor::PyBaseDescriptor_Type, // tp_base
1113 }; 1098 };
1114 1099
1115 PyObject* PyEnumDescriptor_FromDescriptor( 1100 PyObject* PyEnumDescriptor_FromDescriptor(
1116 const EnumDescriptor* enum_descriptor) { 1101 const EnumDescriptor* enum_descriptor) {
1117 return descriptor::NewInternedDescriptor( 1102 return descriptor::NewInternedDescriptor(
1118 &PyEnumDescriptor_Type, enum_descriptor, NULL); 1103 &PyEnumDescriptor_Type, enum_descriptor, NULL);
1119 } 1104 }
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
1283 } 1268 }
1284 1269
1285 static PyObject* GetEnumTypesByName(PyFileDescriptor* self, void *closure) { 1270 static PyObject* GetEnumTypesByName(PyFileDescriptor* self, void *closure) {
1286 return NewFileEnumTypesByName(_GetDescriptor(self)); 1271 return NewFileEnumTypesByName(_GetDescriptor(self));
1287 } 1272 }
1288 1273
1289 static PyObject* GetExtensionsByName(PyFileDescriptor* self, void *closure) { 1274 static PyObject* GetExtensionsByName(PyFileDescriptor* self, void *closure) {
1290 return NewFileExtensionsByName(_GetDescriptor(self)); 1275 return NewFileExtensionsByName(_GetDescriptor(self));
1291 } 1276 }
1292 1277
1293 static PyObject* GetServicesByName(PyFileDescriptor* self, void *closure) {
1294 return NewFileServicesByName(_GetDescriptor(self));
1295 }
1296
1297 static PyObject* GetDependencies(PyFileDescriptor* self, void *closure) { 1278 static PyObject* GetDependencies(PyFileDescriptor* self, void *closure) {
1298 return NewFileDependencies(_GetDescriptor(self)); 1279 return NewFileDependencies(_GetDescriptor(self));
1299 } 1280 }
1300 1281
1301 static PyObject* GetPublicDependencies(PyFileDescriptor* self, void *closure) { 1282 static PyObject* GetPublicDependencies(PyFileDescriptor* self, void *closure) {
1302 return NewFilePublicDependencies(_GetDescriptor(self)); 1283 return NewFilePublicDependencies(_GetDescriptor(self));
1303 } 1284 }
1304 1285
1305 static PyObject* GetHasOptions(PyFileDescriptor *self, void *closure) { 1286 static PyObject* GetHasOptions(PyFileDescriptor *self, void *closure) {
1306 const FileOptions& options(_GetDescriptor(self)->options()); 1287 const FileOptions& options(_GetDescriptor(self)->options());
(...skipping 29 matching lines...) Expand all
1336 static PyGetSetDef Getters[] = { 1317 static PyGetSetDef Getters[] = {
1337 { "pool", (getter)GetPool, NULL, "pool"}, 1318 { "pool", (getter)GetPool, NULL, "pool"},
1338 { "name", (getter)GetName, NULL, "name"}, 1319 { "name", (getter)GetName, NULL, "name"},
1339 { "package", (getter)GetPackage, NULL, "package"}, 1320 { "package", (getter)GetPackage, NULL, "package"},
1340 { "serialized_pb", (getter)GetSerializedPb}, 1321 { "serialized_pb", (getter)GetSerializedPb},
1341 { "message_types_by_name", (getter)GetMessageTypesByName, NULL, 1322 { "message_types_by_name", (getter)GetMessageTypesByName, NULL,
1342 "Messages by name"}, 1323 "Messages by name"},
1343 { "enum_types_by_name", (getter)GetEnumTypesByName, NULL, "Enums by name"}, 1324 { "enum_types_by_name", (getter)GetEnumTypesByName, NULL, "Enums by name"},
1344 { "extensions_by_name", (getter)GetExtensionsByName, NULL, 1325 { "extensions_by_name", (getter)GetExtensionsByName, NULL,
1345 "Extensions by name"}, 1326 "Extensions by name"},
1346 { "services_by_name", (getter)GetServicesByName, NULL, "Services by name"},
1347 { "dependencies", (getter)GetDependencies, NULL, "Dependencies"}, 1327 { "dependencies", (getter)GetDependencies, NULL, "Dependencies"},
1348 { "public_dependencies", (getter)GetPublicDependencies, NULL, "Dependencies"}, 1328 { "public_dependencies", (getter)GetPublicDependencies, NULL, "Dependencies"},
1349 1329
1350 { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"}, 1330 { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
1351 { "_options", (getter)NULL, (setter)SetOptions, "Options"}, 1331 { "_options", (getter)NULL, (setter)SetOptions, "Options"},
1352 { "syntax", (getter)GetSyntax, (setter)NULL, "Syntax"}, 1332 { "syntax", (getter)GetSyntax, (setter)NULL, "Syntax"},
1353 {NULL} 1333 {NULL}
1354 }; 1334 };
1355 1335
1356 static PyMethodDef Methods[] = { 1336 static PyMethodDef Methods[] = {
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
1465 static PyObject* GetContainingType(PyBaseDescriptor *self, void *closure) { 1445 static PyObject* GetContainingType(PyBaseDescriptor *self, void *closure) {
1466 const Descriptor* containing_type = 1446 const Descriptor* containing_type =
1467 _GetDescriptor(self)->containing_type(); 1447 _GetDescriptor(self)->containing_type();
1468 if (containing_type) { 1448 if (containing_type) {
1469 return PyMessageDescriptor_FromDescriptor(containing_type); 1449 return PyMessageDescriptor_FromDescriptor(containing_type);
1470 } else { 1450 } else {
1471 Py_RETURN_NONE; 1451 Py_RETURN_NONE;
1472 } 1452 }
1473 } 1453 }
1474 1454
1475 static PyObject* GetHasOptions(PyBaseDescriptor *self, void *closure) {
1476 const OneofOptions& options(_GetDescriptor(self)->options());
1477 if (&options != &OneofOptions::default_instance()) {
1478 Py_RETURN_TRUE;
1479 } else {
1480 Py_RETURN_FALSE;
1481 }
1482 }
1483 static int SetHasOptions(PyBaseDescriptor *self, PyObject *value,
1484 void *closure) {
1485 return CheckCalledFromGeneratedFile("has_options");
1486 }
1487
1488 static PyObject* GetOptions(PyBaseDescriptor *self) {
1489 return GetOrBuildOptions(_GetDescriptor(self));
1490 }
1491
1492 static int SetOptions(PyBaseDescriptor *self, PyObject *value,
1493 void *closure) {
1494 return CheckCalledFromGeneratedFile("_options");
1495 }
1496
1497 static PyGetSetDef Getters[] = { 1455 static PyGetSetDef Getters[] = {
1498 { "name", (getter)GetName, NULL, "Name"}, 1456 { "name", (getter)GetName, NULL, "Name"},
1499 { "full_name", (getter)GetFullName, NULL, "Full name"}, 1457 { "full_name", (getter)GetFullName, NULL, "Full name"},
1500 { "index", (getter)GetIndex, NULL, "Index"}, 1458 { "index", (getter)GetIndex, NULL, "Index"},
1501 1459
1502 { "containing_type", (getter)GetContainingType, NULL, "Containing type"}, 1460 { "containing_type", (getter)GetContainingType, NULL, "Containing type"},
1503 { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
1504 { "_options", (getter)NULL, (setter)SetOptions, "Options"},
1505 { "fields", (getter)GetFields, NULL, "Fields"}, 1461 { "fields", (getter)GetFields, NULL, "Fields"},
1506 {NULL} 1462 {NULL}
1507 }; 1463 };
1508 1464
1509 static PyMethodDef Methods[] = {
1510 { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS },
1511 {NULL}
1512 };
1513
1514 } // namespace oneof_descriptor 1465 } // namespace oneof_descriptor
1515 1466
1516 PyTypeObject PyOneofDescriptor_Type = { 1467 PyTypeObject PyOneofDescriptor_Type = {
1517 PyVarObject_HEAD_INIT(&PyType_Type, 0) 1468 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1518 FULL_MODULE_NAME ".OneofDescriptor", // tp_name 1469 FULL_MODULE_NAME ".OneofDescriptor", // tp_name
1519 sizeof(PyBaseDescriptor), // tp_basicsize 1470 sizeof(PyBaseDescriptor), // tp_basicsize
1520 0, // tp_itemsize 1471 0, // tp_itemsize
1521 0, // tp_dealloc 1472 0, // tp_dealloc
1522 0, // tp_print 1473 0, // tp_print
1523 0, // tp_getattr 1474 0, // tp_getattr
(...skipping 10 matching lines...) Expand all
1534 0, // tp_setattro 1485 0, // tp_setattro
1535 0, // tp_as_buffer 1486 0, // tp_as_buffer
1536 Py_TPFLAGS_DEFAULT, // tp_flags 1487 Py_TPFLAGS_DEFAULT, // tp_flags
1537 "A Oneof Descriptor", // tp_doc 1488 "A Oneof Descriptor", // tp_doc
1538 0, // tp_traverse 1489 0, // tp_traverse
1539 0, // tp_clear 1490 0, // tp_clear
1540 0, // tp_richcompare 1491 0, // tp_richcompare
1541 0, // tp_weaklistoffset 1492 0, // tp_weaklistoffset
1542 0, // tp_iter 1493 0, // tp_iter
1543 0, // tp_iternext 1494 0, // tp_iternext
1544 oneof_descriptor::Methods, // tp_methods 1495 0, // tp_methods
1545 0, // tp_members 1496 0, // tp_members
1546 oneof_descriptor::Getters, // tp_getset 1497 oneof_descriptor::Getters, // tp_getset
1547 &descriptor::PyBaseDescriptor_Type, // tp_base 1498 &descriptor::PyBaseDescriptor_Type, // tp_base
1548 }; 1499 };
1549 1500
1550 PyObject* PyOneofDescriptor_FromDescriptor( 1501 PyObject* PyOneofDescriptor_FromDescriptor(
1551 const OneofDescriptor* oneof_descriptor) { 1502 const OneofDescriptor* oneof_descriptor) {
1552 return descriptor::NewInternedDescriptor( 1503 return descriptor::NewInternedDescriptor(
1553 &PyOneofDescriptor_Type, oneof_descriptor, NULL); 1504 &PyOneofDescriptor_Type, oneof_descriptor, NULL);
1554 } 1505 }
1555 1506
1556 namespace service_descriptor {
1557
1558 // Unchecked accessor to the C++ pointer.
1559 static const ServiceDescriptor* _GetDescriptor(
1560 PyBaseDescriptor *self) {
1561 return reinterpret_cast<const ServiceDescriptor*>(self->descriptor);
1562 }
1563
1564 static PyObject* GetName(PyBaseDescriptor* self, void *closure) {
1565 return PyString_FromCppString(_GetDescriptor(self)->name());
1566 }
1567
1568 static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
1569 return PyString_FromCppString(_GetDescriptor(self)->full_name());
1570 }
1571
1572 static PyObject* GetIndex(PyBaseDescriptor *self, void *closure) {
1573 return PyInt_FromLong(_GetDescriptor(self)->index());
1574 }
1575
1576 static PyObject* GetMethods(PyBaseDescriptor* self, void *closure) {
1577 return NewServiceMethodsSeq(_GetDescriptor(self));
1578 }
1579
1580 static PyObject* GetMethodsByName(PyBaseDescriptor* self, void *closure) {
1581 return NewServiceMethodsByName(_GetDescriptor(self));
1582 }
1583
1584 static PyObject* FindMethodByName(PyBaseDescriptor *self, PyObject* arg) {
1585 Py_ssize_t name_size;
1586 char* name;
1587 if (PyString_AsStringAndSize(arg, &name, &name_size) < 0) {
1588 return NULL;
1589 }
1590
1591 const MethodDescriptor* method_descriptor =
1592 _GetDescriptor(self)->FindMethodByName(string(name, name_size));
1593 if (method_descriptor == NULL) {
1594 PyErr_Format(PyExc_KeyError, "Couldn't find method %.200s", name);
1595 return NULL;
1596 }
1597
1598 return PyMethodDescriptor_FromDescriptor(method_descriptor);
1599 }
1600
1601 static PyObject* GetOptions(PyBaseDescriptor *self) {
1602 return GetOrBuildOptions(_GetDescriptor(self));
1603 }
1604
1605 static PyObject* CopyToProto(PyBaseDescriptor *self, PyObject *target) {
1606 return CopyToPythonProto<ServiceDescriptorProto>(_GetDescriptor(self),
1607 target);
1608 }
1609
1610 static PyGetSetDef Getters[] = {
1611 { "name", (getter)GetName, NULL, "Name", NULL},
1612 { "full_name", (getter)GetFullName, NULL, "Full name", NULL},
1613 { "index", (getter)GetIndex, NULL, "Index", NULL},
1614
1615 { "methods", (getter)GetMethods, NULL, "Methods", NULL},
1616 { "methods_by_name", (getter)GetMethodsByName, NULL, "Methods by name", NULL},
1617 {NULL}
1618 };
1619
1620 static PyMethodDef Methods[] = {
1621 { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS },
1622 { "CopyToProto", (PyCFunction)CopyToProto, METH_O, },
1623 { "FindMethodByName", (PyCFunction)FindMethodByName, METH_O },
1624 {NULL}
1625 };
1626
1627 } // namespace service_descriptor
1628
1629 PyTypeObject PyServiceDescriptor_Type = {
1630 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1631 FULL_MODULE_NAME ".ServiceDescriptor", // tp_name
1632 sizeof(PyBaseDescriptor), // tp_basicsize
1633 0, // tp_itemsize
1634 0, // tp_dealloc
1635 0, // tp_print
1636 0, // tp_getattr
1637 0, // tp_setattr
1638 0, // tp_compare
1639 0, // tp_repr
1640 0, // tp_as_number
1641 0, // tp_as_sequence
1642 0, // tp_as_mapping
1643 0, // tp_hash
1644 0, // tp_call
1645 0, // tp_str
1646 0, // tp_getattro
1647 0, // tp_setattro
1648 0, // tp_as_buffer
1649 Py_TPFLAGS_DEFAULT, // tp_flags
1650 "A Service Descriptor", // tp_doc
1651 0, // tp_traverse
1652 0, // tp_clear
1653 0, // tp_richcompare
1654 0, // tp_weaklistoffset
1655 0, // tp_iter
1656 0, // tp_iternext
1657 service_descriptor::Methods, // tp_methods
1658 0, // tp_members
1659 service_descriptor::Getters, // tp_getset
1660 &descriptor::PyBaseDescriptor_Type, // tp_base
1661 };
1662
1663 PyObject* PyServiceDescriptor_FromDescriptor(
1664 const ServiceDescriptor* service_descriptor) {
1665 return descriptor::NewInternedDescriptor(
1666 &PyServiceDescriptor_Type, service_descriptor, NULL);
1667 }
1668
1669 namespace method_descriptor {
1670
1671 // Unchecked accessor to the C++ pointer.
1672 static const MethodDescriptor* _GetDescriptor(
1673 PyBaseDescriptor *self) {
1674 return reinterpret_cast<const MethodDescriptor*>(self->descriptor);
1675 }
1676
1677 static PyObject* GetName(PyBaseDescriptor* self, void *closure) {
1678 return PyString_FromCppString(_GetDescriptor(self)->name());
1679 }
1680
1681 static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
1682 return PyString_FromCppString(_GetDescriptor(self)->full_name());
1683 }
1684
1685 static PyObject* GetIndex(PyBaseDescriptor *self, void *closure) {
1686 return PyInt_FromLong(_GetDescriptor(self)->index());
1687 }
1688
1689 static PyObject* GetContainingService(PyBaseDescriptor *self, void *closure) {
1690 const ServiceDescriptor* containing_service =
1691 _GetDescriptor(self)->service();
1692 return PyServiceDescriptor_FromDescriptor(containing_service);
1693 }
1694
1695 static PyObject* GetInputType(PyBaseDescriptor *self, void *closure) {
1696 const Descriptor* input_type = _GetDescriptor(self)->input_type();
1697 return PyMessageDescriptor_FromDescriptor(input_type);
1698 }
1699
1700 static PyObject* GetOutputType(PyBaseDescriptor *self, void *closure) {
1701 const Descriptor* output_type = _GetDescriptor(self)->output_type();
1702 return PyMessageDescriptor_FromDescriptor(output_type);
1703 }
1704
1705 static PyObject* GetOptions(PyBaseDescriptor *self) {
1706 return GetOrBuildOptions(_GetDescriptor(self));
1707 }
1708
1709 static PyObject* CopyToProto(PyBaseDescriptor *self, PyObject *target) {
1710 return CopyToPythonProto<MethodDescriptorProto>(_GetDescriptor(self), target);
1711 }
1712
1713 static PyGetSetDef Getters[] = {
1714 { "name", (getter)GetName, NULL, "Name", NULL},
1715 { "full_name", (getter)GetFullName, NULL, "Full name", NULL},
1716 { "index", (getter)GetIndex, NULL, "Index", NULL},
1717 { "containing_service", (getter)GetContainingService, NULL,
1718 "Containing service", NULL},
1719 { "input_type", (getter)GetInputType, NULL, "Input type", NULL},
1720 { "output_type", (getter)GetOutputType, NULL, "Output type", NULL},
1721 {NULL}
1722 };
1723
1724 static PyMethodDef Methods[] = {
1725 { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS, },
1726 { "CopyToProto", (PyCFunction)CopyToProto, METH_O, },
1727 {NULL}
1728 };
1729
1730 } // namespace method_descriptor
1731
1732 PyTypeObject PyMethodDescriptor_Type = {
1733 PyVarObject_HEAD_INIT(&PyType_Type, 0)
1734 FULL_MODULE_NAME ".MethodDescriptor", // tp_name
1735 sizeof(PyBaseDescriptor), // tp_basicsize
1736 0, // tp_itemsize
1737 0, // tp_dealloc
1738 0, // tp_print
1739 0, // tp_getattr
1740 0, // tp_setattr
1741 0, // tp_compare
1742 0, // tp_repr
1743 0, // tp_as_number
1744 0, // tp_as_sequence
1745 0, // tp_as_mapping
1746 0, // tp_hash
1747 0, // tp_call
1748 0, // tp_str
1749 0, // tp_getattro
1750 0, // tp_setattro
1751 0, // tp_as_buffer
1752 Py_TPFLAGS_DEFAULT, // tp_flags
1753 "A Method Descriptor", // tp_doc
1754 0, // tp_traverse
1755 0, // tp_clear
1756 0, // tp_richcompare
1757 0, // tp_weaklistoffset
1758 0, // tp_iter
1759 0, // tp_iternext
1760 method_descriptor::Methods, // tp_methods
1761 0, // tp_members
1762 method_descriptor::Getters, // tp_getset
1763 &descriptor::PyBaseDescriptor_Type, // tp_base
1764 };
1765
1766 PyObject* PyMethodDescriptor_FromDescriptor(
1767 const MethodDescriptor* method_descriptor) {
1768 return descriptor::NewInternedDescriptor(
1769 &PyMethodDescriptor_Type, method_descriptor, NULL);
1770 }
1771
1772 // Add a enum values to a type dictionary. 1507 // Add a enum values to a type dictionary.
1773 static bool AddEnumValues(PyTypeObject *type, 1508 static bool AddEnumValues(PyTypeObject *type,
1774 const EnumDescriptor* enum_descriptor) { 1509 const EnumDescriptor* enum_descriptor) {
1775 for (int i = 0; i < enum_descriptor->value_count(); ++i) { 1510 for (int i = 0; i < enum_descriptor->value_count(); ++i) {
1776 const EnumValueDescriptor* value = enum_descriptor->value(i); 1511 const EnumValueDescriptor* value = enum_descriptor->value(i);
1777 ScopedPyObjectPtr obj(PyInt_FromLong(value->number())); 1512 ScopedPyObjectPtr obj(PyInt_FromLong(value->number()));
1778 if (obj == NULL) { 1513 if (obj == NULL) {
1779 return false; 1514 return false;
1780 } 1515 }
1781 if (PyDict_SetItemString(type->tp_dict, value->name().c_str(), obj.get()) < 1516 if (PyDict_SetItemString(type->tp_dict, value->name().c_str(), obj.get()) <
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1831 1566
1832 if (PyType_Ready(&PyEnumValueDescriptor_Type) < 0) 1567 if (PyType_Ready(&PyEnumValueDescriptor_Type) < 0)
1833 return false; 1568 return false;
1834 1569
1835 if (PyType_Ready(&PyFileDescriptor_Type) < 0) 1570 if (PyType_Ready(&PyFileDescriptor_Type) < 0)
1836 return false; 1571 return false;
1837 1572
1838 if (PyType_Ready(&PyOneofDescriptor_Type) < 0) 1573 if (PyType_Ready(&PyOneofDescriptor_Type) < 0)
1839 return false; 1574 return false;
1840 1575
1841 if (PyType_Ready(&PyServiceDescriptor_Type) < 0)
1842 return false;
1843
1844 if (PyType_Ready(&PyMethodDescriptor_Type) < 0)
1845 return false;
1846
1847 if (!InitDescriptorMappingTypes()) 1576 if (!InitDescriptorMappingTypes())
1848 return false; 1577 return false;
1849 1578
1850 return true; 1579 return true;
1851 } 1580 }
1852 1581
1853 } // namespace python 1582 } // namespace python
1854 } // namespace protobuf 1583 } // namespace protobuf
1855 } // namespace google 1584 } // namespace google
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698