descriptor.cc 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845
  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. // Author: petar@google.com (Petar Petrov)
  31. #include <Python.h>
  32. #include <frameobject.h>
  33. #include <string>
  34. #include <google/protobuf/io/coded_stream.h>
  35. #include <google/protobuf/descriptor.pb.h>
  36. #include <google/protobuf/dynamic_message.h>
  37. #include <google/protobuf/pyext/descriptor.h>
  38. #include <google/protobuf/pyext/descriptor_containers.h>
  39. #include <google/protobuf/pyext/descriptor_pool.h>
  40. #include <google/protobuf/pyext/message.h>
  41. #include <google/protobuf/pyext/scoped_pyobject_ptr.h>
  42. #if PY_MAJOR_VERSION >= 3
  43. #define PyString_FromStringAndSize PyUnicode_FromStringAndSize
  44. #define PyString_Check PyUnicode_Check
  45. #define PyString_InternFromString PyUnicode_InternFromString
  46. #define PyInt_FromLong PyLong_FromLong
  47. #define PyInt_FromSize_t PyLong_FromSize_t
  48. #if PY_VERSION_HEX < 0x03030000
  49. #error "Python 3.0 - 3.2 are not supported."
  50. #endif
  51. #define PyString_AsStringAndSize(ob, charpp, sizep) \
  52. (PyUnicode_Check(ob)? \
  53. ((*(charpp) = PyUnicode_AsUTF8AndSize(ob, (sizep))) == NULL? -1: 0): \
  54. PyBytes_AsStringAndSize(ob, (charpp), (sizep)))
  55. #endif
  56. namespace google {
  57. namespace protobuf {
  58. namespace python {
  59. // Store interned descriptors, so that the same C++ descriptor yields the same
  60. // Python object. Objects are not immortal: this map does not own the
  61. // references, and items are deleted when the last reference to the object is
  62. // released.
  63. // This is enough to support the "is" operator on live objects.
  64. // All descriptors are stored here.
  65. hash_map<const void*, PyObject*> interned_descriptors;
  66. PyObject* PyString_FromCppString(const string& str) {
  67. return PyString_FromStringAndSize(str.c_str(), str.size());
  68. }
  69. // Check that the calling Python code is the global scope of a _pb2.py module.
  70. // This function is used to support the current code generated by the proto
  71. // compiler, which creates descriptors, then update some properties.
  72. // For example:
  73. // message_descriptor = Descriptor(
  74. // name='Message',
  75. // fields = [FieldDescriptor(name='field')]
  76. // message_descriptor.fields[0].containing_type = message_descriptor
  77. //
  78. // This code is still executed, but the descriptors now have no other storage
  79. // than the (const) C++ pointer, and are immutable.
  80. // So we let this code pass, by simply ignoring the new value.
  81. //
  82. // From user code, descriptors still look immutable.
  83. //
  84. // TODO(amauryfa): Change the proto2 compiler to remove the assignments, and
  85. // remove this hack.
  86. bool _CalledFromGeneratedFile(int stacklevel) {
  87. #ifndef PYPY_VERSION
  88. // This check is not critical and is somewhat difficult to implement correctly
  89. // in PyPy.
  90. PyFrameObject* frame = PyEval_GetFrame();
  91. if (frame == NULL) {
  92. return false;
  93. }
  94. while (stacklevel-- > 0) {
  95. frame = frame->f_back;
  96. if (frame == NULL) {
  97. return false;
  98. }
  99. }
  100. if (frame->f_globals != frame->f_locals) {
  101. // Not at global module scope
  102. return false;
  103. }
  104. if (frame->f_code->co_filename == NULL) {
  105. return false;
  106. }
  107. char* filename;
  108. Py_ssize_t filename_size;
  109. if (PyString_AsStringAndSize(frame->f_code->co_filename,
  110. &filename, &filename_size) < 0) {
  111. // filename is not a string.
  112. PyErr_Clear();
  113. return false;
  114. }
  115. if (filename_size < 7) {
  116. // filename is too short.
  117. return false;
  118. }
  119. if (strcmp(&filename[filename_size - 7], "_pb2.py") != 0) {
  120. // Filename is not ending with _pb2.
  121. return false;
  122. }
  123. #endif
  124. return true;
  125. }
  126. // If the calling code is not a _pb2.py file, raise AttributeError.
  127. // To be used in attribute setters.
  128. static int CheckCalledFromGeneratedFile(const char* attr_name) {
  129. if (_CalledFromGeneratedFile(0)) {
  130. return 0;
  131. }
  132. PyErr_Format(PyExc_AttributeError,
  133. "attribute is not writable: %s", attr_name);
  134. return -1;
  135. }
  136. #ifndef PyVarObject_HEAD_INIT
  137. #define PyVarObject_HEAD_INIT(type, size) PyObject_HEAD_INIT(type) size,
  138. #endif
  139. #ifndef Py_TYPE
  140. #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type)
  141. #endif
  142. // Helper functions for descriptor objects.
  143. // A set of templates to retrieve the C++ FileDescriptor of any descriptor.
  144. template<class DescriptorClass>
  145. const FileDescriptor* GetFileDescriptor(const DescriptorClass* descriptor) {
  146. return descriptor->file();
  147. }
  148. template<>
  149. const FileDescriptor* GetFileDescriptor(const FileDescriptor* descriptor) {
  150. return descriptor;
  151. }
  152. template<>
  153. const FileDescriptor* GetFileDescriptor(const EnumValueDescriptor* descriptor) {
  154. return descriptor->type()->file();
  155. }
  156. template<>
  157. const FileDescriptor* GetFileDescriptor(const OneofDescriptor* descriptor) {
  158. return descriptor->containing_type()->file();
  159. }
  160. template<>
  161. const FileDescriptor* GetFileDescriptor(const MethodDescriptor* descriptor) {
  162. return descriptor->service()->file();
  163. }
  164. // Converts options into a Python protobuf, and cache the result.
  165. //
  166. // This is a bit tricky because options can contain extension fields defined in
  167. // the same proto file. In this case the options parsed from the serialized_pb
  168. // have unknown fields, and we need to parse them again.
  169. //
  170. // Always returns a new reference.
  171. template<class DescriptorClass>
  172. static PyObject* GetOrBuildOptions(const DescriptorClass *descriptor) {
  173. // Options (and their extensions) are completely resolved in the proto file
  174. // containing the descriptor.
  175. PyDescriptorPool* pool = GetDescriptorPool_FromPool(
  176. GetFileDescriptor(descriptor)->pool());
  177. hash_map<const void*, PyObject*>* descriptor_options =
  178. pool->descriptor_options;
  179. // First search in the cache.
  180. if (descriptor_options->find(descriptor) != descriptor_options->end()) {
  181. PyObject *value = (*descriptor_options)[descriptor];
  182. Py_INCREF(value);
  183. return value;
  184. }
  185. // Build the Options object: get its Python class, and make a copy of the C++
  186. // read-only instance.
  187. const Message& options(descriptor->options());
  188. const Descriptor *message_type = options.GetDescriptor();
  189. CMessageClass* message_class(
  190. cdescriptor_pool::GetMessageClass(pool, message_type));
  191. if (message_class == NULL) {
  192. // The Options message was not found in the current DescriptorPool.
  193. // This means that the pool cannot contain any extensions to the Options
  194. // message either, so falling back to the basic pool we can only increase
  195. // the chances of successfully parsing the options.
  196. PyErr_Clear();
  197. pool = GetDefaultDescriptorPool();
  198. message_class = cdescriptor_pool::GetMessageClass(pool, message_type);
  199. }
  200. if (message_class == NULL) {
  201. PyErr_Format(PyExc_TypeError, "Could not retrieve class for Options: %s",
  202. message_type->full_name().c_str());
  203. return NULL;
  204. }
  205. ScopedPyObjectPtr value(
  206. PyEval_CallObject(message_class->AsPyObject(), NULL));
  207. if (value == NULL) {
  208. return NULL;
  209. }
  210. if (!PyObject_TypeCheck(value.get(), &CMessage_Type)) {
  211. PyErr_Format(PyExc_TypeError, "Invalid class for %s: %s",
  212. message_type->full_name().c_str(),
  213. Py_TYPE(value.get())->tp_name);
  214. return NULL;
  215. }
  216. CMessage* cmsg = reinterpret_cast<CMessage*>(value.get());
  217. const Reflection* reflection = options.GetReflection();
  218. const UnknownFieldSet& unknown_fields(reflection->GetUnknownFields(options));
  219. if (unknown_fields.empty()) {
  220. cmsg->message->CopyFrom(options);
  221. } else {
  222. // Reparse options string! XXX call cmessage::MergeFromString
  223. string serialized;
  224. options.SerializeToString(&serialized);
  225. io::CodedInputStream input(
  226. reinterpret_cast<const uint8*>(serialized.c_str()), serialized.size());
  227. input.SetExtensionRegistry(pool->pool, pool->message_factory);
  228. bool success = cmsg->message->MergePartialFromCodedStream(&input);
  229. if (!success) {
  230. PyErr_Format(PyExc_ValueError, "Error parsing Options message");
  231. return NULL;
  232. }
  233. }
  234. // Cache the result.
  235. Py_INCREF(value.get());
  236. (*descriptor_options)[descriptor] = value.get();
  237. return value.release();
  238. }
  239. // Copy the C++ descriptor to a Python message.
  240. // The Python message is an instance of descriptor_pb2.DescriptorProto
  241. // or similar.
  242. template<class DescriptorProtoClass, class DescriptorClass>
  243. static PyObject* CopyToPythonProto(const DescriptorClass *descriptor,
  244. PyObject *target) {
  245. const Descriptor* self_descriptor =
  246. DescriptorProtoClass::default_instance().GetDescriptor();
  247. CMessage* message = reinterpret_cast<CMessage*>(target);
  248. if (!PyObject_TypeCheck(target, &CMessage_Type) ||
  249. message->message->GetDescriptor() != self_descriptor) {
  250. PyErr_Format(PyExc_TypeError, "Not a %s message",
  251. self_descriptor->full_name().c_str());
  252. return NULL;
  253. }
  254. cmessage::AssureWritable(message);
  255. DescriptorProtoClass* descriptor_message =
  256. static_cast<DescriptorProtoClass*>(message->message);
  257. descriptor->CopyTo(descriptor_message);
  258. Py_RETURN_NONE;
  259. }
  260. // All Descriptors classes share the same memory layout.
  261. typedef struct PyBaseDescriptor {
  262. PyObject_HEAD
  263. // Pointer to the C++ proto2 descriptor.
  264. // Like all descriptors, it is owned by the global DescriptorPool.
  265. const void* descriptor;
  266. // Owned reference to the DescriptorPool, to ensure it is kept alive.
  267. PyDescriptorPool* pool;
  268. } PyBaseDescriptor;
  269. // FileDescriptor structure "inherits" from the base descriptor.
  270. typedef struct PyFileDescriptor {
  271. PyBaseDescriptor base;
  272. // The cached version of serialized pb. Either NULL, or a Bytes string.
  273. // We own the reference.
  274. PyObject *serialized_pb;
  275. } PyFileDescriptor;
  276. namespace descriptor {
  277. // Creates or retrieve a Python descriptor of the specified type.
  278. // Objects are interned: the same descriptor will return the same object if it
  279. // was kept alive.
  280. // 'was_created' is an optional pointer to a bool, and is set to true if a new
  281. // object was allocated.
  282. // Always return a new reference.
  283. template<class DescriptorClass>
  284. PyObject* NewInternedDescriptor(PyTypeObject* type,
  285. const DescriptorClass* descriptor,
  286. bool* was_created) {
  287. if (was_created) {
  288. *was_created = false;
  289. }
  290. if (descriptor == NULL) {
  291. PyErr_BadInternalCall();
  292. return NULL;
  293. }
  294. // See if the object is in the map of interned descriptors
  295. hash_map<const void*, PyObject*>::iterator it =
  296. interned_descriptors.find(descriptor);
  297. if (it != interned_descriptors.end()) {
  298. GOOGLE_DCHECK(Py_TYPE(it->second) == type);
  299. Py_INCREF(it->second);
  300. return it->second;
  301. }
  302. // Create a new descriptor object
  303. PyBaseDescriptor* py_descriptor = PyObject_New(
  304. PyBaseDescriptor, type);
  305. if (py_descriptor == NULL) {
  306. return NULL;
  307. }
  308. py_descriptor->descriptor = descriptor;
  309. // and cache it.
  310. interned_descriptors.insert(
  311. std::make_pair(descriptor, reinterpret_cast<PyObject*>(py_descriptor)));
  312. // Ensures that the DescriptorPool stays alive.
  313. PyDescriptorPool* pool = GetDescriptorPool_FromPool(
  314. GetFileDescriptor(descriptor)->pool());
  315. if (pool == NULL) {
  316. // Don't DECREF, the object is not fully initialized.
  317. PyObject_Del(py_descriptor);
  318. return NULL;
  319. }
  320. Py_INCREF(pool);
  321. py_descriptor->pool = pool;
  322. if (was_created) {
  323. *was_created = true;
  324. }
  325. return reinterpret_cast<PyObject*>(py_descriptor);
  326. }
  327. static void Dealloc(PyBaseDescriptor* self) {
  328. // Remove from interned dictionary
  329. interned_descriptors.erase(self->descriptor);
  330. Py_CLEAR(self->pool);
  331. Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
  332. }
  333. static PyGetSetDef Getters[] = {
  334. {NULL}
  335. };
  336. PyTypeObject PyBaseDescriptor_Type = {
  337. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  338. FULL_MODULE_NAME ".DescriptorBase", // tp_name
  339. sizeof(PyBaseDescriptor), // tp_basicsize
  340. 0, // tp_itemsize
  341. (destructor)Dealloc, // tp_dealloc
  342. 0, // tp_print
  343. 0, // tp_getattr
  344. 0, // tp_setattr
  345. 0, // tp_compare
  346. 0, // tp_repr
  347. 0, // tp_as_number
  348. 0, // tp_as_sequence
  349. 0, // tp_as_mapping
  350. 0, // tp_hash
  351. 0, // tp_call
  352. 0, // tp_str
  353. 0, // tp_getattro
  354. 0, // tp_setattro
  355. 0, // tp_as_buffer
  356. Py_TPFLAGS_DEFAULT, // tp_flags
  357. "Descriptors base class", // tp_doc
  358. 0, // tp_traverse
  359. 0, // tp_clear
  360. 0, // tp_richcompare
  361. 0, // tp_weaklistoffset
  362. 0, // tp_iter
  363. 0, // tp_iternext
  364. 0, // tp_methods
  365. 0, // tp_members
  366. Getters, // tp_getset
  367. };
  368. } // namespace descriptor
  369. const void* PyDescriptor_AsVoidPtr(PyObject* obj) {
  370. if (!PyObject_TypeCheck(obj, &descriptor::PyBaseDescriptor_Type)) {
  371. PyErr_SetString(PyExc_TypeError, "Not a BaseDescriptor");
  372. return NULL;
  373. }
  374. return reinterpret_cast<PyBaseDescriptor*>(obj)->descriptor;
  375. }
  376. namespace message_descriptor {
  377. // Unchecked accessor to the C++ pointer.
  378. static const Descriptor* _GetDescriptor(PyBaseDescriptor* self) {
  379. return reinterpret_cast<const Descriptor*>(self->descriptor);
  380. }
  381. static PyObject* GetName(PyBaseDescriptor* self, void *closure) {
  382. return PyString_FromCppString(_GetDescriptor(self)->name());
  383. }
  384. static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
  385. return PyString_FromCppString(_GetDescriptor(self)->full_name());
  386. }
  387. static PyObject* GetFile(PyBaseDescriptor *self, void *closure) {
  388. return PyFileDescriptor_FromDescriptor(_GetDescriptor(self)->file());
  389. }
  390. static PyObject* GetConcreteClass(PyBaseDescriptor* self, void *closure) {
  391. // Retuns the canonical class for the given descriptor.
  392. // This is the class that was registered with the primary descriptor pool
  393. // which contains this descriptor.
  394. // This might not be the one you expect! For example the returned object does
  395. // not know about extensions defined in a custom pool.
  396. CMessageClass* concrete_class(cdescriptor_pool::GetMessageClass(
  397. GetDescriptorPool_FromPool(_GetDescriptor(self)->file()->pool()),
  398. _GetDescriptor(self)));
  399. Py_XINCREF(concrete_class);
  400. return concrete_class->AsPyObject();
  401. }
  402. static PyObject* GetFieldsByName(PyBaseDescriptor* self, void *closure) {
  403. return NewMessageFieldsByName(_GetDescriptor(self));
  404. }
  405. static PyObject* GetFieldsByCamelcaseName(PyBaseDescriptor* self,
  406. void *closure) {
  407. return NewMessageFieldsByCamelcaseName(_GetDescriptor(self));
  408. }
  409. static PyObject* GetFieldsByNumber(PyBaseDescriptor* self, void *closure) {
  410. return NewMessageFieldsByNumber(_GetDescriptor(self));
  411. }
  412. static PyObject* GetFieldsSeq(PyBaseDescriptor* self, void *closure) {
  413. return NewMessageFieldsSeq(_GetDescriptor(self));
  414. }
  415. static PyObject* GetNestedTypesByName(PyBaseDescriptor* self, void *closure) {
  416. return NewMessageNestedTypesByName(_GetDescriptor(self));
  417. }
  418. static PyObject* GetNestedTypesSeq(PyBaseDescriptor* self, void *closure) {
  419. return NewMessageNestedTypesSeq(_GetDescriptor(self));
  420. }
  421. static PyObject* GetExtensionsByName(PyBaseDescriptor* self, void *closure) {
  422. return NewMessageExtensionsByName(_GetDescriptor(self));
  423. }
  424. static PyObject* GetExtensions(PyBaseDescriptor* self, void *closure) {
  425. return NewMessageExtensionsSeq(_GetDescriptor(self));
  426. }
  427. static PyObject* GetEnumsSeq(PyBaseDescriptor* self, void *closure) {
  428. return NewMessageEnumsSeq(_GetDescriptor(self));
  429. }
  430. static PyObject* GetEnumTypesByName(PyBaseDescriptor* self, void *closure) {
  431. return NewMessageEnumsByName(_GetDescriptor(self));
  432. }
  433. static PyObject* GetEnumValuesByName(PyBaseDescriptor* self, void *closure) {
  434. return NewMessageEnumValuesByName(_GetDescriptor(self));
  435. }
  436. static PyObject* GetOneofsByName(PyBaseDescriptor* self, void *closure) {
  437. return NewMessageOneofsByName(_GetDescriptor(self));
  438. }
  439. static PyObject* GetOneofsSeq(PyBaseDescriptor* self, void *closure) {
  440. return NewMessageOneofsSeq(_GetDescriptor(self));
  441. }
  442. static PyObject* IsExtendable(PyBaseDescriptor *self, void *closure) {
  443. if (_GetDescriptor(self)->extension_range_count() > 0) {
  444. Py_RETURN_TRUE;
  445. } else {
  446. Py_RETURN_FALSE;
  447. }
  448. }
  449. static PyObject* GetExtensionRanges(PyBaseDescriptor *self, void *closure) {
  450. const Descriptor* descriptor = _GetDescriptor(self);
  451. PyObject* range_list = PyList_New(descriptor->extension_range_count());
  452. for (int i = 0; i < descriptor->extension_range_count(); i++) {
  453. const Descriptor::ExtensionRange* range = descriptor->extension_range(i);
  454. PyObject* start = PyInt_FromLong(range->start);
  455. PyObject* end = PyInt_FromLong(range->end);
  456. PyList_SetItem(range_list, i, PyTuple_Pack(2, start, end));
  457. }
  458. return range_list;
  459. }
  460. static PyObject* GetContainingType(PyBaseDescriptor *self, void *closure) {
  461. const Descriptor* containing_type =
  462. _GetDescriptor(self)->containing_type();
  463. if (containing_type) {
  464. return PyMessageDescriptor_FromDescriptor(containing_type);
  465. } else {
  466. Py_RETURN_NONE;
  467. }
  468. }
  469. static int SetContainingType(PyBaseDescriptor *self, PyObject *value,
  470. void *closure) {
  471. return CheckCalledFromGeneratedFile("containing_type");
  472. }
  473. static PyObject* GetHasOptions(PyBaseDescriptor *self, void *closure) {
  474. const MessageOptions& options(_GetDescriptor(self)->options());
  475. if (&options != &MessageOptions::default_instance()) {
  476. Py_RETURN_TRUE;
  477. } else {
  478. Py_RETURN_FALSE;
  479. }
  480. }
  481. static int SetHasOptions(PyBaseDescriptor *self, PyObject *value,
  482. void *closure) {
  483. return CheckCalledFromGeneratedFile("has_options");
  484. }
  485. static PyObject* GetOptions(PyBaseDescriptor *self) {
  486. return GetOrBuildOptions(_GetDescriptor(self));
  487. }
  488. static int SetOptions(PyBaseDescriptor *self, PyObject *value,
  489. void *closure) {
  490. return CheckCalledFromGeneratedFile("_options");
  491. }
  492. static PyObject* CopyToProto(PyBaseDescriptor *self, PyObject *target) {
  493. return CopyToPythonProto<DescriptorProto>(_GetDescriptor(self), target);
  494. }
  495. static PyObject* EnumValueName(PyBaseDescriptor *self, PyObject *args) {
  496. const char *enum_name;
  497. int number;
  498. if (!PyArg_ParseTuple(args, "si", &enum_name, &number))
  499. return NULL;
  500. const EnumDescriptor *enum_type =
  501. _GetDescriptor(self)->FindEnumTypeByName(enum_name);
  502. if (enum_type == NULL) {
  503. PyErr_SetString(PyExc_KeyError, enum_name);
  504. return NULL;
  505. }
  506. const EnumValueDescriptor *enum_value =
  507. enum_type->FindValueByNumber(number);
  508. if (enum_value == NULL) {
  509. PyErr_Format(PyExc_KeyError, "%d", number);
  510. return NULL;
  511. }
  512. return PyString_FromCppString(enum_value->name());
  513. }
  514. static PyObject* GetSyntax(PyBaseDescriptor *self, void *closure) {
  515. return PyString_InternFromString(
  516. FileDescriptor::SyntaxName(_GetDescriptor(self)->file()->syntax()));
  517. }
  518. static PyGetSetDef Getters[] = {
  519. { "name", (getter)GetName, NULL, "Last name"},
  520. { "full_name", (getter)GetFullName, NULL, "Full name"},
  521. { "_concrete_class", (getter)GetConcreteClass, NULL, "concrete class"},
  522. { "file", (getter)GetFile, NULL, "File descriptor"},
  523. { "fields", (getter)GetFieldsSeq, NULL, "Fields sequence"},
  524. { "fields_by_name", (getter)GetFieldsByName, NULL, "Fields by name"},
  525. { "fields_by_camelcase_name", (getter)GetFieldsByCamelcaseName, NULL,
  526. "Fields by camelCase name"},
  527. { "fields_by_number", (getter)GetFieldsByNumber, NULL, "Fields by number"},
  528. { "nested_types", (getter)GetNestedTypesSeq, NULL, "Nested types sequence"},
  529. { "nested_types_by_name", (getter)GetNestedTypesByName, NULL,
  530. "Nested types by name"},
  531. { "extensions", (getter)GetExtensions, NULL, "Extensions Sequence"},
  532. { "extensions_by_name", (getter)GetExtensionsByName, NULL,
  533. "Extensions by name"},
  534. { "extension_ranges", (getter)GetExtensionRanges, NULL, "Extension ranges"},
  535. { "enum_types", (getter)GetEnumsSeq, NULL, "Enum sequence"},
  536. { "enum_types_by_name", (getter)GetEnumTypesByName, NULL,
  537. "Enum types by name"},
  538. { "enum_values_by_name", (getter)GetEnumValuesByName, NULL,
  539. "Enum values by name"},
  540. { "oneofs_by_name", (getter)GetOneofsByName, NULL, "Oneofs by name"},
  541. { "oneofs", (getter)GetOneofsSeq, NULL, "Oneofs by name"},
  542. { "containing_type", (getter)GetContainingType, (setter)SetContainingType,
  543. "Containing type"},
  544. { "is_extendable", (getter)IsExtendable, (setter)NULL},
  545. { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
  546. { "_options", (getter)NULL, (setter)SetOptions, "Options"},
  547. { "syntax", (getter)GetSyntax, (setter)NULL, "Syntax"},
  548. {NULL}
  549. };
  550. static PyMethodDef Methods[] = {
  551. { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS, },
  552. { "CopyToProto", (PyCFunction)CopyToProto, METH_O, },
  553. { "EnumValueName", (PyCFunction)EnumValueName, METH_VARARGS, },
  554. {NULL}
  555. };
  556. } // namespace message_descriptor
  557. PyTypeObject PyMessageDescriptor_Type = {
  558. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  559. FULL_MODULE_NAME ".MessageDescriptor", // tp_name
  560. sizeof(PyBaseDescriptor), // tp_basicsize
  561. 0, // tp_itemsize
  562. 0, // tp_dealloc
  563. 0, // tp_print
  564. 0, // tp_getattr
  565. 0, // tp_setattr
  566. 0, // tp_compare
  567. 0, // tp_repr
  568. 0, // tp_as_number
  569. 0, // tp_as_sequence
  570. 0, // tp_as_mapping
  571. 0, // tp_hash
  572. 0, // tp_call
  573. 0, // tp_str
  574. 0, // tp_getattro
  575. 0, // tp_setattro
  576. 0, // tp_as_buffer
  577. Py_TPFLAGS_DEFAULT, // tp_flags
  578. "A Message Descriptor", // tp_doc
  579. 0, // tp_traverse
  580. 0, // tp_clear
  581. 0, // tp_richcompare
  582. 0, // tp_weaklistoffset
  583. 0, // tp_iter
  584. 0, // tp_iternext
  585. message_descriptor::Methods, // tp_methods
  586. 0, // tp_members
  587. message_descriptor::Getters, // tp_getset
  588. &descriptor::PyBaseDescriptor_Type, // tp_base
  589. };
  590. PyObject* PyMessageDescriptor_FromDescriptor(
  591. const Descriptor* message_descriptor) {
  592. return descriptor::NewInternedDescriptor(
  593. &PyMessageDescriptor_Type, message_descriptor, NULL);
  594. }
  595. const Descriptor* PyMessageDescriptor_AsDescriptor(PyObject* obj) {
  596. if (!PyObject_TypeCheck(obj, &PyMessageDescriptor_Type)) {
  597. PyErr_SetString(PyExc_TypeError, "Not a MessageDescriptor");
  598. return NULL;
  599. }
  600. return reinterpret_cast<const Descriptor*>(
  601. reinterpret_cast<PyBaseDescriptor*>(obj)->descriptor);
  602. }
  603. namespace field_descriptor {
  604. // Unchecked accessor to the C++ pointer.
  605. static const FieldDescriptor* _GetDescriptor(
  606. PyBaseDescriptor *self) {
  607. return reinterpret_cast<const FieldDescriptor*>(self->descriptor);
  608. }
  609. static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
  610. return PyString_FromCppString(_GetDescriptor(self)->full_name());
  611. }
  612. static PyObject* GetName(PyBaseDescriptor *self, void *closure) {
  613. return PyString_FromCppString(_GetDescriptor(self)->name());
  614. }
  615. static PyObject* GetCamelcaseName(PyBaseDescriptor* self, void *closure) {
  616. return PyString_FromCppString(_GetDescriptor(self)->camelcase_name());
  617. }
  618. static PyObject* GetType(PyBaseDescriptor *self, void *closure) {
  619. return PyInt_FromLong(_GetDescriptor(self)->type());
  620. }
  621. static PyObject* GetCppType(PyBaseDescriptor *self, void *closure) {
  622. return PyInt_FromLong(_GetDescriptor(self)->cpp_type());
  623. }
  624. static PyObject* GetLabel(PyBaseDescriptor *self, void *closure) {
  625. return PyInt_FromLong(_GetDescriptor(self)->label());
  626. }
  627. static PyObject* GetNumber(PyBaseDescriptor *self, void *closure) {
  628. return PyInt_FromLong(_GetDescriptor(self)->number());
  629. }
  630. static PyObject* GetIndex(PyBaseDescriptor *self, void *closure) {
  631. return PyInt_FromLong(_GetDescriptor(self)->index());
  632. }
  633. static PyObject* GetID(PyBaseDescriptor *self, void *closure) {
  634. return PyLong_FromVoidPtr(self);
  635. }
  636. static PyObject* IsExtension(PyBaseDescriptor *self, void *closure) {
  637. return PyBool_FromLong(_GetDescriptor(self)->is_extension());
  638. }
  639. static PyObject* HasDefaultValue(PyBaseDescriptor *self, void *closure) {
  640. return PyBool_FromLong(_GetDescriptor(self)->has_default_value());
  641. }
  642. static PyObject* GetDefaultValue(PyBaseDescriptor *self, void *closure) {
  643. PyObject *result;
  644. switch (_GetDescriptor(self)->cpp_type()) {
  645. case FieldDescriptor::CPPTYPE_INT32: {
  646. int32 value = _GetDescriptor(self)->default_value_int32();
  647. result = PyInt_FromLong(value);
  648. break;
  649. }
  650. case FieldDescriptor::CPPTYPE_INT64: {
  651. int64 value = _GetDescriptor(self)->default_value_int64();
  652. result = PyLong_FromLongLong(value);
  653. break;
  654. }
  655. case FieldDescriptor::CPPTYPE_UINT32: {
  656. uint32 value = _GetDescriptor(self)->default_value_uint32();
  657. result = PyInt_FromSize_t(value);
  658. break;
  659. }
  660. case FieldDescriptor::CPPTYPE_UINT64: {
  661. uint64 value = _GetDescriptor(self)->default_value_uint64();
  662. result = PyLong_FromUnsignedLongLong(value);
  663. break;
  664. }
  665. case FieldDescriptor::CPPTYPE_FLOAT: {
  666. float value = _GetDescriptor(self)->default_value_float();
  667. result = PyFloat_FromDouble(value);
  668. break;
  669. }
  670. case FieldDescriptor::CPPTYPE_DOUBLE: {
  671. double value = _GetDescriptor(self)->default_value_double();
  672. result = PyFloat_FromDouble(value);
  673. break;
  674. }
  675. case FieldDescriptor::CPPTYPE_BOOL: {
  676. bool value = _GetDescriptor(self)->default_value_bool();
  677. result = PyBool_FromLong(value);
  678. break;
  679. }
  680. case FieldDescriptor::CPPTYPE_STRING: {
  681. string value = _GetDescriptor(self)->default_value_string();
  682. result = ToStringObject(_GetDescriptor(self), value);
  683. break;
  684. }
  685. case FieldDescriptor::CPPTYPE_ENUM: {
  686. const EnumValueDescriptor* value =
  687. _GetDescriptor(self)->default_value_enum();
  688. result = PyInt_FromLong(value->number());
  689. break;
  690. }
  691. default:
  692. PyErr_Format(PyExc_NotImplementedError, "default value for %s",
  693. _GetDescriptor(self)->full_name().c_str());
  694. return NULL;
  695. }
  696. return result;
  697. }
  698. static PyObject* GetCDescriptor(PyObject *self, void *closure) {
  699. Py_INCREF(self);
  700. return self;
  701. }
  702. static PyObject *GetEnumType(PyBaseDescriptor *self, void *closure) {
  703. const EnumDescriptor* enum_type = _GetDescriptor(self)->enum_type();
  704. if (enum_type) {
  705. return PyEnumDescriptor_FromDescriptor(enum_type);
  706. } else {
  707. Py_RETURN_NONE;
  708. }
  709. }
  710. static int SetEnumType(PyBaseDescriptor *self, PyObject *value, void *closure) {
  711. return CheckCalledFromGeneratedFile("enum_type");
  712. }
  713. static PyObject *GetMessageType(PyBaseDescriptor *self, void *closure) {
  714. const Descriptor* message_type = _GetDescriptor(self)->message_type();
  715. if (message_type) {
  716. return PyMessageDescriptor_FromDescriptor(message_type);
  717. } else {
  718. Py_RETURN_NONE;
  719. }
  720. }
  721. static int SetMessageType(PyBaseDescriptor *self, PyObject *value,
  722. void *closure) {
  723. return CheckCalledFromGeneratedFile("message_type");
  724. }
  725. static PyObject* GetContainingType(PyBaseDescriptor *self, void *closure) {
  726. const Descriptor* containing_type =
  727. _GetDescriptor(self)->containing_type();
  728. if (containing_type) {
  729. return PyMessageDescriptor_FromDescriptor(containing_type);
  730. } else {
  731. Py_RETURN_NONE;
  732. }
  733. }
  734. static int SetContainingType(PyBaseDescriptor *self, PyObject *value,
  735. void *closure) {
  736. return CheckCalledFromGeneratedFile("containing_type");
  737. }
  738. static PyObject* GetExtensionScope(PyBaseDescriptor *self, void *closure) {
  739. const Descriptor* extension_scope =
  740. _GetDescriptor(self)->extension_scope();
  741. if (extension_scope) {
  742. return PyMessageDescriptor_FromDescriptor(extension_scope);
  743. } else {
  744. Py_RETURN_NONE;
  745. }
  746. }
  747. static PyObject* GetContainingOneof(PyBaseDescriptor *self, void *closure) {
  748. const OneofDescriptor* containing_oneof =
  749. _GetDescriptor(self)->containing_oneof();
  750. if (containing_oneof) {
  751. return PyOneofDescriptor_FromDescriptor(containing_oneof);
  752. } else {
  753. Py_RETURN_NONE;
  754. }
  755. }
  756. static int SetContainingOneof(PyBaseDescriptor *self, PyObject *value,
  757. void *closure) {
  758. return CheckCalledFromGeneratedFile("containing_oneof");
  759. }
  760. static PyObject* GetHasOptions(PyBaseDescriptor *self, void *closure) {
  761. const FieldOptions& options(_GetDescriptor(self)->options());
  762. if (&options != &FieldOptions::default_instance()) {
  763. Py_RETURN_TRUE;
  764. } else {
  765. Py_RETURN_FALSE;
  766. }
  767. }
  768. static int SetHasOptions(PyBaseDescriptor *self, PyObject *value,
  769. void *closure) {
  770. return CheckCalledFromGeneratedFile("has_options");
  771. }
  772. static PyObject* GetOptions(PyBaseDescriptor *self) {
  773. return GetOrBuildOptions(_GetDescriptor(self));
  774. }
  775. static int SetOptions(PyBaseDescriptor *self, PyObject *value,
  776. void *closure) {
  777. return CheckCalledFromGeneratedFile("_options");
  778. }
  779. static PyGetSetDef Getters[] = {
  780. { "full_name", (getter)GetFullName, NULL, "Full name"},
  781. { "name", (getter)GetName, NULL, "Unqualified name"},
  782. { "camelcase_name", (getter)GetCamelcaseName, NULL, "Camelcase name"},
  783. { "type", (getter)GetType, NULL, "C++ Type"},
  784. { "cpp_type", (getter)GetCppType, NULL, "C++ Type"},
  785. { "label", (getter)GetLabel, NULL, "Label"},
  786. { "number", (getter)GetNumber, NULL, "Number"},
  787. { "index", (getter)GetIndex, NULL, "Index"},
  788. { "default_value", (getter)GetDefaultValue, NULL, "Default Value"},
  789. { "has_default_value", (getter)HasDefaultValue},
  790. { "is_extension", (getter)IsExtension, NULL, "ID"},
  791. { "id", (getter)GetID, NULL, "ID"},
  792. { "_cdescriptor", (getter)GetCDescriptor, NULL, "HAACK REMOVE ME"},
  793. { "message_type", (getter)GetMessageType, (setter)SetMessageType,
  794. "Message type"},
  795. { "enum_type", (getter)GetEnumType, (setter)SetEnumType, "Enum type"},
  796. { "containing_type", (getter)GetContainingType, (setter)SetContainingType,
  797. "Containing type"},
  798. { "extension_scope", (getter)GetExtensionScope, (setter)NULL,
  799. "Extension scope"},
  800. { "containing_oneof", (getter)GetContainingOneof, (setter)SetContainingOneof,
  801. "Containing oneof"},
  802. { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
  803. { "_options", (getter)NULL, (setter)SetOptions, "Options"},
  804. {NULL}
  805. };
  806. static PyMethodDef Methods[] = {
  807. { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS, },
  808. {NULL}
  809. };
  810. } // namespace field_descriptor
  811. PyTypeObject PyFieldDescriptor_Type = {
  812. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  813. FULL_MODULE_NAME ".FieldDescriptor", // tp_name
  814. sizeof(PyBaseDescriptor), // tp_basicsize
  815. 0, // tp_itemsize
  816. 0, // tp_dealloc
  817. 0, // tp_print
  818. 0, // tp_getattr
  819. 0, // tp_setattr
  820. 0, // tp_compare
  821. 0, // tp_repr
  822. 0, // tp_as_number
  823. 0, // tp_as_sequence
  824. 0, // tp_as_mapping
  825. 0, // tp_hash
  826. 0, // tp_call
  827. 0, // tp_str
  828. 0, // tp_getattro
  829. 0, // tp_setattro
  830. 0, // tp_as_buffer
  831. Py_TPFLAGS_DEFAULT, // tp_flags
  832. "A Field Descriptor", // tp_doc
  833. 0, // tp_traverse
  834. 0, // tp_clear
  835. 0, // tp_richcompare
  836. 0, // tp_weaklistoffset
  837. 0, // tp_iter
  838. 0, // tp_iternext
  839. field_descriptor::Methods, // tp_methods
  840. 0, // tp_members
  841. field_descriptor::Getters, // tp_getset
  842. &descriptor::PyBaseDescriptor_Type, // tp_base
  843. };
  844. PyObject* PyFieldDescriptor_FromDescriptor(
  845. const FieldDescriptor* field_descriptor) {
  846. return descriptor::NewInternedDescriptor(
  847. &PyFieldDescriptor_Type, field_descriptor, NULL);
  848. }
  849. const FieldDescriptor* PyFieldDescriptor_AsDescriptor(PyObject* obj) {
  850. if (!PyObject_TypeCheck(obj, &PyFieldDescriptor_Type)) {
  851. PyErr_SetString(PyExc_TypeError, "Not a FieldDescriptor");
  852. return NULL;
  853. }
  854. return reinterpret_cast<const FieldDescriptor*>(
  855. reinterpret_cast<PyBaseDescriptor*>(obj)->descriptor);
  856. }
  857. namespace enum_descriptor {
  858. // Unchecked accessor to the C++ pointer.
  859. static const EnumDescriptor* _GetDescriptor(
  860. PyBaseDescriptor *self) {
  861. return reinterpret_cast<const EnumDescriptor*>(self->descriptor);
  862. }
  863. static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
  864. return PyString_FromCppString(_GetDescriptor(self)->full_name());
  865. }
  866. static PyObject* GetName(PyBaseDescriptor *self, void *closure) {
  867. return PyString_FromCppString(_GetDescriptor(self)->name());
  868. }
  869. static PyObject* GetFile(PyBaseDescriptor *self, void *closure) {
  870. return PyFileDescriptor_FromDescriptor(_GetDescriptor(self)->file());
  871. }
  872. static PyObject* GetEnumvaluesByName(PyBaseDescriptor* self, void *closure) {
  873. return NewEnumValuesByName(_GetDescriptor(self));
  874. }
  875. static PyObject* GetEnumvaluesByNumber(PyBaseDescriptor* self, void *closure) {
  876. return NewEnumValuesByNumber(_GetDescriptor(self));
  877. }
  878. static PyObject* GetEnumvaluesSeq(PyBaseDescriptor* self, void *closure) {
  879. return NewEnumValuesSeq(_GetDescriptor(self));
  880. }
  881. static PyObject* GetContainingType(PyBaseDescriptor *self, void *closure) {
  882. const Descriptor* containing_type =
  883. _GetDescriptor(self)->containing_type();
  884. if (containing_type) {
  885. return PyMessageDescriptor_FromDescriptor(containing_type);
  886. } else {
  887. Py_RETURN_NONE;
  888. }
  889. }
  890. static int SetContainingType(PyBaseDescriptor *self, PyObject *value,
  891. void *closure) {
  892. return CheckCalledFromGeneratedFile("containing_type");
  893. }
  894. static PyObject* GetHasOptions(PyBaseDescriptor *self, void *closure) {
  895. const EnumOptions& options(_GetDescriptor(self)->options());
  896. if (&options != &EnumOptions::default_instance()) {
  897. Py_RETURN_TRUE;
  898. } else {
  899. Py_RETURN_FALSE;
  900. }
  901. }
  902. static int SetHasOptions(PyBaseDescriptor *self, PyObject *value,
  903. void *closure) {
  904. return CheckCalledFromGeneratedFile("has_options");
  905. }
  906. static PyObject* GetOptions(PyBaseDescriptor *self) {
  907. return GetOrBuildOptions(_GetDescriptor(self));
  908. }
  909. static int SetOptions(PyBaseDescriptor *self, PyObject *value,
  910. void *closure) {
  911. return CheckCalledFromGeneratedFile("_options");
  912. }
  913. static PyObject* CopyToProto(PyBaseDescriptor *self, PyObject *target) {
  914. return CopyToPythonProto<EnumDescriptorProto>(_GetDescriptor(self), target);
  915. }
  916. static PyMethodDef Methods[] = {
  917. { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS, },
  918. { "CopyToProto", (PyCFunction)CopyToProto, METH_O, },
  919. {NULL}
  920. };
  921. static PyGetSetDef Getters[] = {
  922. { "full_name", (getter)GetFullName, NULL, "Full name"},
  923. { "name", (getter)GetName, NULL, "last name"},
  924. { "file", (getter)GetFile, NULL, "File descriptor"},
  925. { "values", (getter)GetEnumvaluesSeq, NULL, "values"},
  926. { "values_by_name", (getter)GetEnumvaluesByName, NULL,
  927. "Enum values by name"},
  928. { "values_by_number", (getter)GetEnumvaluesByNumber, NULL,
  929. "Enum values by number"},
  930. { "containing_type", (getter)GetContainingType, (setter)SetContainingType,
  931. "Containing type"},
  932. { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
  933. { "_options", (getter)NULL, (setter)SetOptions, "Options"},
  934. {NULL}
  935. };
  936. } // namespace enum_descriptor
  937. PyTypeObject PyEnumDescriptor_Type = {
  938. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  939. FULL_MODULE_NAME ".EnumDescriptor", // tp_name
  940. sizeof(PyBaseDescriptor), // tp_basicsize
  941. 0, // tp_itemsize
  942. 0, // tp_dealloc
  943. 0, // tp_print
  944. 0, // tp_getattr
  945. 0, // tp_setattr
  946. 0, // tp_compare
  947. 0, // tp_repr
  948. 0, // tp_as_number
  949. 0, // tp_as_sequence
  950. 0, // tp_as_mapping
  951. 0, // tp_hash
  952. 0, // tp_call
  953. 0, // tp_str
  954. 0, // tp_getattro
  955. 0, // tp_setattro
  956. 0, // tp_as_buffer
  957. Py_TPFLAGS_DEFAULT, // tp_flags
  958. "A Enum Descriptor", // tp_doc
  959. 0, // tp_traverse
  960. 0, // tp_clear
  961. 0, // tp_richcompare
  962. 0, // tp_weaklistoffset
  963. 0, // tp_iter
  964. 0, // tp_iternext
  965. enum_descriptor::Methods, // tp_methods
  966. 0, // tp_members
  967. enum_descriptor::Getters, // tp_getset
  968. &descriptor::PyBaseDescriptor_Type, // tp_base
  969. };
  970. PyObject* PyEnumDescriptor_FromDescriptor(
  971. const EnumDescriptor* enum_descriptor) {
  972. return descriptor::NewInternedDescriptor(
  973. &PyEnumDescriptor_Type, enum_descriptor, NULL);
  974. }
  975. const EnumDescriptor* PyEnumDescriptor_AsDescriptor(PyObject* obj) {
  976. if (!PyObject_TypeCheck(obj, &PyEnumDescriptor_Type)) {
  977. PyErr_SetString(PyExc_TypeError, "Not an EnumDescriptor");
  978. return NULL;
  979. }
  980. return reinterpret_cast<const EnumDescriptor*>(
  981. reinterpret_cast<PyBaseDescriptor*>(obj)->descriptor);
  982. }
  983. namespace enumvalue_descriptor {
  984. // Unchecked accessor to the C++ pointer.
  985. static const EnumValueDescriptor* _GetDescriptor(
  986. PyBaseDescriptor *self) {
  987. return reinterpret_cast<const EnumValueDescriptor*>(self->descriptor);
  988. }
  989. static PyObject* GetName(PyBaseDescriptor *self, void *closure) {
  990. return PyString_FromCppString(_GetDescriptor(self)->name());
  991. }
  992. static PyObject* GetNumber(PyBaseDescriptor *self, void *closure) {
  993. return PyInt_FromLong(_GetDescriptor(self)->number());
  994. }
  995. static PyObject* GetIndex(PyBaseDescriptor *self, void *closure) {
  996. return PyInt_FromLong(_GetDescriptor(self)->index());
  997. }
  998. static PyObject* GetType(PyBaseDescriptor *self, void *closure) {
  999. return PyEnumDescriptor_FromDescriptor(_GetDescriptor(self)->type());
  1000. }
  1001. static PyObject* GetHasOptions(PyBaseDescriptor *self, void *closure) {
  1002. const EnumValueOptions& options(_GetDescriptor(self)->options());
  1003. if (&options != &EnumValueOptions::default_instance()) {
  1004. Py_RETURN_TRUE;
  1005. } else {
  1006. Py_RETURN_FALSE;
  1007. }
  1008. }
  1009. static int SetHasOptions(PyBaseDescriptor *self, PyObject *value,
  1010. void *closure) {
  1011. return CheckCalledFromGeneratedFile("has_options");
  1012. }
  1013. static PyObject* GetOptions(PyBaseDescriptor *self) {
  1014. return GetOrBuildOptions(_GetDescriptor(self));
  1015. }
  1016. static int SetOptions(PyBaseDescriptor *self, PyObject *value,
  1017. void *closure) {
  1018. return CheckCalledFromGeneratedFile("_options");
  1019. }
  1020. static PyGetSetDef Getters[] = {
  1021. { "name", (getter)GetName, NULL, "name"},
  1022. { "number", (getter)GetNumber, NULL, "number"},
  1023. { "index", (getter)GetIndex, NULL, "index"},
  1024. { "type", (getter)GetType, NULL, "index"},
  1025. { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
  1026. { "_options", (getter)NULL, (setter)SetOptions, "Options"},
  1027. {NULL}
  1028. };
  1029. static PyMethodDef Methods[] = {
  1030. { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS, },
  1031. {NULL}
  1032. };
  1033. } // namespace enumvalue_descriptor
  1034. PyTypeObject PyEnumValueDescriptor_Type = {
  1035. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  1036. FULL_MODULE_NAME ".EnumValueDescriptor", // tp_name
  1037. sizeof(PyBaseDescriptor), // tp_basicsize
  1038. 0, // tp_itemsize
  1039. 0, // tp_dealloc
  1040. 0, // tp_print
  1041. 0, // tp_getattr
  1042. 0, // tp_setattr
  1043. 0, // tp_compare
  1044. 0, // tp_repr
  1045. 0, // tp_as_number
  1046. 0, // tp_as_sequence
  1047. 0, // tp_as_mapping
  1048. 0, // tp_hash
  1049. 0, // tp_call
  1050. 0, // tp_str
  1051. 0, // tp_getattro
  1052. 0, // tp_setattro
  1053. 0, // tp_as_buffer
  1054. Py_TPFLAGS_DEFAULT, // tp_flags
  1055. "A EnumValue Descriptor", // tp_doc
  1056. 0, // tp_traverse
  1057. 0, // tp_clear
  1058. 0, // tp_richcompare
  1059. 0, // tp_weaklistoffset
  1060. 0, // tp_iter
  1061. 0, // tp_iternext
  1062. enumvalue_descriptor::Methods, // tp_methods
  1063. 0, // tp_members
  1064. enumvalue_descriptor::Getters, // tp_getset
  1065. &descriptor::PyBaseDescriptor_Type, // tp_base
  1066. };
  1067. PyObject* PyEnumValueDescriptor_FromDescriptor(
  1068. const EnumValueDescriptor* enumvalue_descriptor) {
  1069. return descriptor::NewInternedDescriptor(
  1070. &PyEnumValueDescriptor_Type, enumvalue_descriptor, NULL);
  1071. }
  1072. namespace file_descriptor {
  1073. // Unchecked accessor to the C++ pointer.
  1074. static const FileDescriptor* _GetDescriptor(PyFileDescriptor *self) {
  1075. return reinterpret_cast<const FileDescriptor*>(self->base.descriptor);
  1076. }
  1077. static void Dealloc(PyFileDescriptor* self) {
  1078. Py_XDECREF(self->serialized_pb);
  1079. descriptor::Dealloc(&self->base);
  1080. }
  1081. static PyObject* GetPool(PyFileDescriptor *self, void *closure) {
  1082. PyObject* pool = reinterpret_cast<PyObject*>(
  1083. GetDescriptorPool_FromPool(_GetDescriptor(self)->pool()));
  1084. Py_XINCREF(pool);
  1085. return pool;
  1086. }
  1087. static PyObject* GetName(PyFileDescriptor *self, void *closure) {
  1088. return PyString_FromCppString(_GetDescriptor(self)->name());
  1089. }
  1090. static PyObject* GetPackage(PyFileDescriptor *self, void *closure) {
  1091. return PyString_FromCppString(_GetDescriptor(self)->package());
  1092. }
  1093. static PyObject* GetSerializedPb(PyFileDescriptor *self, void *closure) {
  1094. PyObject *serialized_pb = self->serialized_pb;
  1095. if (serialized_pb != NULL) {
  1096. Py_INCREF(serialized_pb);
  1097. return serialized_pb;
  1098. }
  1099. FileDescriptorProto file_proto;
  1100. _GetDescriptor(self)->CopyTo(&file_proto);
  1101. string contents;
  1102. file_proto.SerializePartialToString(&contents);
  1103. self->serialized_pb = PyBytes_FromStringAndSize(
  1104. contents.c_str(), contents.size());
  1105. if (self->serialized_pb == NULL) {
  1106. return NULL;
  1107. }
  1108. Py_INCREF(self->serialized_pb);
  1109. return self->serialized_pb;
  1110. }
  1111. static PyObject* GetMessageTypesByName(PyFileDescriptor* self, void *closure) {
  1112. return NewFileMessageTypesByName(_GetDescriptor(self));
  1113. }
  1114. static PyObject* GetEnumTypesByName(PyFileDescriptor* self, void *closure) {
  1115. return NewFileEnumTypesByName(_GetDescriptor(self));
  1116. }
  1117. static PyObject* GetExtensionsByName(PyFileDescriptor* self, void *closure) {
  1118. return NewFileExtensionsByName(_GetDescriptor(self));
  1119. }
  1120. static PyObject* GetServicesByName(PyFileDescriptor* self, void *closure) {
  1121. return NewFileServicesByName(_GetDescriptor(self));
  1122. }
  1123. static PyObject* GetDependencies(PyFileDescriptor* self, void *closure) {
  1124. return NewFileDependencies(_GetDescriptor(self));
  1125. }
  1126. static PyObject* GetPublicDependencies(PyFileDescriptor* self, void *closure) {
  1127. return NewFilePublicDependencies(_GetDescriptor(self));
  1128. }
  1129. static PyObject* GetHasOptions(PyFileDescriptor *self, void *closure) {
  1130. const FileOptions& options(_GetDescriptor(self)->options());
  1131. if (&options != &FileOptions::default_instance()) {
  1132. Py_RETURN_TRUE;
  1133. } else {
  1134. Py_RETURN_FALSE;
  1135. }
  1136. }
  1137. static int SetHasOptions(PyFileDescriptor *self, PyObject *value,
  1138. void *closure) {
  1139. return CheckCalledFromGeneratedFile("has_options");
  1140. }
  1141. static PyObject* GetOptions(PyFileDescriptor *self) {
  1142. return GetOrBuildOptions(_GetDescriptor(self));
  1143. }
  1144. static int SetOptions(PyFileDescriptor *self, PyObject *value,
  1145. void *closure) {
  1146. return CheckCalledFromGeneratedFile("_options");
  1147. }
  1148. static PyObject* GetSyntax(PyFileDescriptor *self, void *closure) {
  1149. return PyString_InternFromString(
  1150. FileDescriptor::SyntaxName(_GetDescriptor(self)->syntax()));
  1151. }
  1152. static PyObject* CopyToProto(PyFileDescriptor *self, PyObject *target) {
  1153. return CopyToPythonProto<FileDescriptorProto>(_GetDescriptor(self), target);
  1154. }
  1155. static PyGetSetDef Getters[] = {
  1156. { "pool", (getter)GetPool, NULL, "pool"},
  1157. { "name", (getter)GetName, NULL, "name"},
  1158. { "package", (getter)GetPackage, NULL, "package"},
  1159. { "serialized_pb", (getter)GetSerializedPb},
  1160. { "message_types_by_name", (getter)GetMessageTypesByName, NULL,
  1161. "Messages by name"},
  1162. { "enum_types_by_name", (getter)GetEnumTypesByName, NULL, "Enums by name"},
  1163. { "extensions_by_name", (getter)GetExtensionsByName, NULL,
  1164. "Extensions by name"},
  1165. { "services_by_name", (getter)GetServicesByName, NULL, "Services by name"},
  1166. { "dependencies", (getter)GetDependencies, NULL, "Dependencies"},
  1167. { "public_dependencies", (getter)GetPublicDependencies, NULL, "Dependencies"},
  1168. { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
  1169. { "_options", (getter)NULL, (setter)SetOptions, "Options"},
  1170. { "syntax", (getter)GetSyntax, (setter)NULL, "Syntax"},
  1171. {NULL}
  1172. };
  1173. static PyMethodDef Methods[] = {
  1174. { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS, },
  1175. { "CopyToProto", (PyCFunction)CopyToProto, METH_O, },
  1176. {NULL}
  1177. };
  1178. } // namespace file_descriptor
  1179. PyTypeObject PyFileDescriptor_Type = {
  1180. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  1181. FULL_MODULE_NAME ".FileDescriptor", // tp_name
  1182. sizeof(PyFileDescriptor), // tp_basicsize
  1183. 0, // tp_itemsize
  1184. (destructor)file_descriptor::Dealloc, // tp_dealloc
  1185. 0, // tp_print
  1186. 0, // tp_getattr
  1187. 0, // tp_setattr
  1188. 0, // tp_compare
  1189. 0, // tp_repr
  1190. 0, // tp_as_number
  1191. 0, // tp_as_sequence
  1192. 0, // tp_as_mapping
  1193. 0, // tp_hash
  1194. 0, // tp_call
  1195. 0, // tp_str
  1196. 0, // tp_getattro
  1197. 0, // tp_setattro
  1198. 0, // tp_as_buffer
  1199. Py_TPFLAGS_DEFAULT, // tp_flags
  1200. "A File Descriptor", // tp_doc
  1201. 0, // tp_traverse
  1202. 0, // tp_clear
  1203. 0, // tp_richcompare
  1204. 0, // tp_weaklistoffset
  1205. 0, // tp_iter
  1206. 0, // tp_iternext
  1207. file_descriptor::Methods, // tp_methods
  1208. 0, // tp_members
  1209. file_descriptor::Getters, // tp_getset
  1210. &descriptor::PyBaseDescriptor_Type, // tp_base
  1211. 0, // tp_dict
  1212. 0, // tp_descr_get
  1213. 0, // tp_descr_set
  1214. 0, // tp_dictoffset
  1215. 0, // tp_init
  1216. 0, // tp_alloc
  1217. 0, // tp_new
  1218. PyObject_Del, // tp_free
  1219. };
  1220. PyObject* PyFileDescriptor_FromDescriptor(
  1221. const FileDescriptor* file_descriptor) {
  1222. return PyFileDescriptor_FromDescriptorWithSerializedPb(file_descriptor,
  1223. NULL);
  1224. }
  1225. PyObject* PyFileDescriptor_FromDescriptorWithSerializedPb(
  1226. const FileDescriptor* file_descriptor, PyObject *serialized_pb) {
  1227. bool was_created;
  1228. PyObject* py_descriptor = descriptor::NewInternedDescriptor(
  1229. &PyFileDescriptor_Type, file_descriptor, &was_created);
  1230. if (py_descriptor == NULL) {
  1231. return NULL;
  1232. }
  1233. if (was_created) {
  1234. PyFileDescriptor* cfile_descriptor =
  1235. reinterpret_cast<PyFileDescriptor*>(py_descriptor);
  1236. Py_XINCREF(serialized_pb);
  1237. cfile_descriptor->serialized_pb = serialized_pb;
  1238. }
  1239. // TODO(amauryfa): In the case of a cached object, check that serialized_pb
  1240. // is the same as before.
  1241. return py_descriptor;
  1242. }
  1243. const FileDescriptor* PyFileDescriptor_AsDescriptor(PyObject* obj) {
  1244. if (!PyObject_TypeCheck(obj, &PyFileDescriptor_Type)) {
  1245. PyErr_SetString(PyExc_TypeError, "Not a FileDescriptor");
  1246. return NULL;
  1247. }
  1248. return reinterpret_cast<const FileDescriptor*>(
  1249. reinterpret_cast<PyBaseDescriptor*>(obj)->descriptor);
  1250. }
  1251. namespace oneof_descriptor {
  1252. // Unchecked accessor to the C++ pointer.
  1253. static const OneofDescriptor* _GetDescriptor(
  1254. PyBaseDescriptor *self) {
  1255. return reinterpret_cast<const OneofDescriptor*>(self->descriptor);
  1256. }
  1257. static PyObject* GetName(PyBaseDescriptor* self, void *closure) {
  1258. return PyString_FromCppString(_GetDescriptor(self)->name());
  1259. }
  1260. static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
  1261. return PyString_FromCppString(_GetDescriptor(self)->full_name());
  1262. }
  1263. static PyObject* GetIndex(PyBaseDescriptor *self, void *closure) {
  1264. return PyInt_FromLong(_GetDescriptor(self)->index());
  1265. }
  1266. static PyObject* GetFields(PyBaseDescriptor* self, void *closure) {
  1267. return NewOneofFieldsSeq(_GetDescriptor(self));
  1268. }
  1269. static PyObject* GetContainingType(PyBaseDescriptor *self, void *closure) {
  1270. const Descriptor* containing_type =
  1271. _GetDescriptor(self)->containing_type();
  1272. if (containing_type) {
  1273. return PyMessageDescriptor_FromDescriptor(containing_type);
  1274. } else {
  1275. Py_RETURN_NONE;
  1276. }
  1277. }
  1278. static PyObject* GetHasOptions(PyBaseDescriptor *self, void *closure) {
  1279. const OneofOptions& options(_GetDescriptor(self)->options());
  1280. if (&options != &OneofOptions::default_instance()) {
  1281. Py_RETURN_TRUE;
  1282. } else {
  1283. Py_RETURN_FALSE;
  1284. }
  1285. }
  1286. static int SetHasOptions(PyBaseDescriptor *self, PyObject *value,
  1287. void *closure) {
  1288. return CheckCalledFromGeneratedFile("has_options");
  1289. }
  1290. static PyObject* GetOptions(PyBaseDescriptor *self) {
  1291. return GetOrBuildOptions(_GetDescriptor(self));
  1292. }
  1293. static int SetOptions(PyBaseDescriptor *self, PyObject *value,
  1294. void *closure) {
  1295. return CheckCalledFromGeneratedFile("_options");
  1296. }
  1297. static PyGetSetDef Getters[] = {
  1298. { "name", (getter)GetName, NULL, "Name"},
  1299. { "full_name", (getter)GetFullName, NULL, "Full name"},
  1300. { "index", (getter)GetIndex, NULL, "Index"},
  1301. { "containing_type", (getter)GetContainingType, NULL, "Containing type"},
  1302. { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
  1303. { "_options", (getter)NULL, (setter)SetOptions, "Options"},
  1304. { "fields", (getter)GetFields, NULL, "Fields"},
  1305. {NULL}
  1306. };
  1307. static PyMethodDef Methods[] = {
  1308. { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS },
  1309. {NULL}
  1310. };
  1311. } // namespace oneof_descriptor
  1312. PyTypeObject PyOneofDescriptor_Type = {
  1313. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  1314. FULL_MODULE_NAME ".OneofDescriptor", // tp_name
  1315. sizeof(PyBaseDescriptor), // tp_basicsize
  1316. 0, // tp_itemsize
  1317. 0, // tp_dealloc
  1318. 0, // tp_print
  1319. 0, // tp_getattr
  1320. 0, // tp_setattr
  1321. 0, // tp_compare
  1322. 0, // tp_repr
  1323. 0, // tp_as_number
  1324. 0, // tp_as_sequence
  1325. 0, // tp_as_mapping
  1326. 0, // tp_hash
  1327. 0, // tp_call
  1328. 0, // tp_str
  1329. 0, // tp_getattro
  1330. 0, // tp_setattro
  1331. 0, // tp_as_buffer
  1332. Py_TPFLAGS_DEFAULT, // tp_flags
  1333. "A Oneof Descriptor", // tp_doc
  1334. 0, // tp_traverse
  1335. 0, // tp_clear
  1336. 0, // tp_richcompare
  1337. 0, // tp_weaklistoffset
  1338. 0, // tp_iter
  1339. 0, // tp_iternext
  1340. oneof_descriptor::Methods, // tp_methods
  1341. 0, // tp_members
  1342. oneof_descriptor::Getters, // tp_getset
  1343. &descriptor::PyBaseDescriptor_Type, // tp_base
  1344. };
  1345. PyObject* PyOneofDescriptor_FromDescriptor(
  1346. const OneofDescriptor* oneof_descriptor) {
  1347. return descriptor::NewInternedDescriptor(
  1348. &PyOneofDescriptor_Type, oneof_descriptor, NULL);
  1349. }
  1350. namespace service_descriptor {
  1351. // Unchecked accessor to the C++ pointer.
  1352. static const ServiceDescriptor* _GetDescriptor(
  1353. PyBaseDescriptor *self) {
  1354. return reinterpret_cast<const ServiceDescriptor*>(self->descriptor);
  1355. }
  1356. static PyObject* GetName(PyBaseDescriptor* self, void *closure) {
  1357. return PyString_FromCppString(_GetDescriptor(self)->name());
  1358. }
  1359. static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
  1360. return PyString_FromCppString(_GetDescriptor(self)->full_name());
  1361. }
  1362. static PyObject* GetIndex(PyBaseDescriptor *self, void *closure) {
  1363. return PyInt_FromLong(_GetDescriptor(self)->index());
  1364. }
  1365. static PyObject* GetMethods(PyBaseDescriptor* self, void *closure) {
  1366. return NewServiceMethodsSeq(_GetDescriptor(self));
  1367. }
  1368. static PyObject* GetMethodsByName(PyBaseDescriptor* self, void *closure) {
  1369. return NewServiceMethodsByName(_GetDescriptor(self));
  1370. }
  1371. static PyObject* FindMethodByName(PyBaseDescriptor *self, PyObject* arg) {
  1372. Py_ssize_t name_size;
  1373. char* name;
  1374. if (PyString_AsStringAndSize(arg, &name, &name_size) < 0) {
  1375. return NULL;
  1376. }
  1377. const MethodDescriptor* method_descriptor =
  1378. _GetDescriptor(self)->FindMethodByName(string(name, name_size));
  1379. if (method_descriptor == NULL) {
  1380. PyErr_Format(PyExc_KeyError, "Couldn't find method %.200s", name);
  1381. return NULL;
  1382. }
  1383. return PyMethodDescriptor_FromDescriptor(method_descriptor);
  1384. }
  1385. static PyObject* GetOptions(PyBaseDescriptor *self) {
  1386. return GetOrBuildOptions(_GetDescriptor(self));
  1387. }
  1388. static PyObject* CopyToProto(PyBaseDescriptor *self, PyObject *target) {
  1389. return CopyToPythonProto<ServiceDescriptorProto>(_GetDescriptor(self),
  1390. target);
  1391. }
  1392. static PyGetSetDef Getters[] = {
  1393. { "name", (getter)GetName, NULL, "Name", NULL},
  1394. { "full_name", (getter)GetFullName, NULL, "Full name", NULL},
  1395. { "index", (getter)GetIndex, NULL, "Index", NULL},
  1396. { "methods", (getter)GetMethods, NULL, "Methods", NULL},
  1397. { "methods_by_name", (getter)GetMethodsByName, NULL, "Methods by name", NULL},
  1398. {NULL}
  1399. };
  1400. static PyMethodDef Methods[] = {
  1401. { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS },
  1402. { "CopyToProto", (PyCFunction)CopyToProto, METH_O, },
  1403. { "FindMethodByName", (PyCFunction)FindMethodByName, METH_O },
  1404. {NULL}
  1405. };
  1406. } // namespace service_descriptor
  1407. PyTypeObject PyServiceDescriptor_Type = {
  1408. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  1409. FULL_MODULE_NAME ".ServiceDescriptor", // tp_name
  1410. sizeof(PyBaseDescriptor), // tp_basicsize
  1411. 0, // tp_itemsize
  1412. 0, // tp_dealloc
  1413. 0, // tp_print
  1414. 0, // tp_getattr
  1415. 0, // tp_setattr
  1416. 0, // tp_compare
  1417. 0, // tp_repr
  1418. 0, // tp_as_number
  1419. 0, // tp_as_sequence
  1420. 0, // tp_as_mapping
  1421. 0, // tp_hash
  1422. 0, // tp_call
  1423. 0, // tp_str
  1424. 0, // tp_getattro
  1425. 0, // tp_setattro
  1426. 0, // tp_as_buffer
  1427. Py_TPFLAGS_DEFAULT, // tp_flags
  1428. "A Service Descriptor", // tp_doc
  1429. 0, // tp_traverse
  1430. 0, // tp_clear
  1431. 0, // tp_richcompare
  1432. 0, // tp_weaklistoffset
  1433. 0, // tp_iter
  1434. 0, // tp_iternext
  1435. service_descriptor::Methods, // tp_methods
  1436. 0, // tp_members
  1437. service_descriptor::Getters, // tp_getset
  1438. &descriptor::PyBaseDescriptor_Type, // tp_base
  1439. };
  1440. PyObject* PyServiceDescriptor_FromDescriptor(
  1441. const ServiceDescriptor* service_descriptor) {
  1442. return descriptor::NewInternedDescriptor(
  1443. &PyServiceDescriptor_Type, service_descriptor, NULL);
  1444. }
  1445. namespace method_descriptor {
  1446. // Unchecked accessor to the C++ pointer.
  1447. static const MethodDescriptor* _GetDescriptor(
  1448. PyBaseDescriptor *self) {
  1449. return reinterpret_cast<const MethodDescriptor*>(self->descriptor);
  1450. }
  1451. static PyObject* GetName(PyBaseDescriptor* self, void *closure) {
  1452. return PyString_FromCppString(_GetDescriptor(self)->name());
  1453. }
  1454. static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
  1455. return PyString_FromCppString(_GetDescriptor(self)->full_name());
  1456. }
  1457. static PyObject* GetIndex(PyBaseDescriptor *self, void *closure) {
  1458. return PyInt_FromLong(_GetDescriptor(self)->index());
  1459. }
  1460. static PyObject* GetContainingService(PyBaseDescriptor *self, void *closure) {
  1461. const ServiceDescriptor* containing_service =
  1462. _GetDescriptor(self)->service();
  1463. return PyServiceDescriptor_FromDescriptor(containing_service);
  1464. }
  1465. static PyObject* GetInputType(PyBaseDescriptor *self, void *closure) {
  1466. const Descriptor* input_type = _GetDescriptor(self)->input_type();
  1467. return PyMessageDescriptor_FromDescriptor(input_type);
  1468. }
  1469. static PyObject* GetOutputType(PyBaseDescriptor *self, void *closure) {
  1470. const Descriptor* output_type = _GetDescriptor(self)->output_type();
  1471. return PyMessageDescriptor_FromDescriptor(output_type);
  1472. }
  1473. static PyObject* GetOptions(PyBaseDescriptor *self) {
  1474. return GetOrBuildOptions(_GetDescriptor(self));
  1475. }
  1476. static PyObject* CopyToProto(PyBaseDescriptor *self, PyObject *target) {
  1477. return CopyToPythonProto<MethodDescriptorProto>(_GetDescriptor(self), target);
  1478. }
  1479. static PyGetSetDef Getters[] = {
  1480. { "name", (getter)GetName, NULL, "Name", NULL},
  1481. { "full_name", (getter)GetFullName, NULL, "Full name", NULL},
  1482. { "index", (getter)GetIndex, NULL, "Index", NULL},
  1483. { "containing_service", (getter)GetContainingService, NULL,
  1484. "Containing service", NULL},
  1485. { "input_type", (getter)GetInputType, NULL, "Input type", NULL},
  1486. { "output_type", (getter)GetOutputType, NULL, "Output type", NULL},
  1487. {NULL}
  1488. };
  1489. static PyMethodDef Methods[] = {
  1490. { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS, },
  1491. { "CopyToProto", (PyCFunction)CopyToProto, METH_O, },
  1492. {NULL}
  1493. };
  1494. } // namespace method_descriptor
  1495. PyTypeObject PyMethodDescriptor_Type = {
  1496. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  1497. FULL_MODULE_NAME ".MethodDescriptor", // tp_name
  1498. sizeof(PyBaseDescriptor), // tp_basicsize
  1499. 0, // tp_itemsize
  1500. 0, // tp_dealloc
  1501. 0, // tp_print
  1502. 0, // tp_getattr
  1503. 0, // tp_setattr
  1504. 0, // tp_compare
  1505. 0, // tp_repr
  1506. 0, // tp_as_number
  1507. 0, // tp_as_sequence
  1508. 0, // tp_as_mapping
  1509. 0, // tp_hash
  1510. 0, // tp_call
  1511. 0, // tp_str
  1512. 0, // tp_getattro
  1513. 0, // tp_setattro
  1514. 0, // tp_as_buffer
  1515. Py_TPFLAGS_DEFAULT, // tp_flags
  1516. "A Method Descriptor", // tp_doc
  1517. 0, // tp_traverse
  1518. 0, // tp_clear
  1519. 0, // tp_richcompare
  1520. 0, // tp_weaklistoffset
  1521. 0, // tp_iter
  1522. 0, // tp_iternext
  1523. method_descriptor::Methods, // tp_methods
  1524. 0, // tp_members
  1525. method_descriptor::Getters, // tp_getset
  1526. &descriptor::PyBaseDescriptor_Type, // tp_base
  1527. };
  1528. PyObject* PyMethodDescriptor_FromDescriptor(
  1529. const MethodDescriptor* method_descriptor) {
  1530. return descriptor::NewInternedDescriptor(
  1531. &PyMethodDescriptor_Type, method_descriptor, NULL);
  1532. }
  1533. // Add a enum values to a type dictionary.
  1534. static bool AddEnumValues(PyTypeObject *type,
  1535. const EnumDescriptor* enum_descriptor) {
  1536. for (int i = 0; i < enum_descriptor->value_count(); ++i) {
  1537. const EnumValueDescriptor* value = enum_descriptor->value(i);
  1538. ScopedPyObjectPtr obj(PyInt_FromLong(value->number()));
  1539. if (obj == NULL) {
  1540. return false;
  1541. }
  1542. if (PyDict_SetItemString(type->tp_dict, value->name().c_str(), obj.get()) <
  1543. 0) {
  1544. return false;
  1545. }
  1546. }
  1547. return true;
  1548. }
  1549. static bool AddIntConstant(PyTypeObject *type, const char* name, int value) {
  1550. ScopedPyObjectPtr obj(PyInt_FromLong(value));
  1551. if (PyDict_SetItemString(type->tp_dict, name, obj.get()) < 0) {
  1552. return false;
  1553. }
  1554. return true;
  1555. }
  1556. bool InitDescriptor() {
  1557. if (PyType_Ready(&PyMessageDescriptor_Type) < 0)
  1558. return false;
  1559. if (PyType_Ready(&PyFieldDescriptor_Type) < 0)
  1560. return false;
  1561. if (!AddEnumValues(&PyFieldDescriptor_Type,
  1562. FieldDescriptorProto::Label_descriptor())) {
  1563. return false;
  1564. }
  1565. if (!AddEnumValues(&PyFieldDescriptor_Type,
  1566. FieldDescriptorProto::Type_descriptor())) {
  1567. return false;
  1568. }
  1569. #define ADD_FIELDDESC_CONSTANT(NAME) AddIntConstant( \
  1570. &PyFieldDescriptor_Type, #NAME, FieldDescriptor::NAME)
  1571. if (!ADD_FIELDDESC_CONSTANT(CPPTYPE_INT32) ||
  1572. !ADD_FIELDDESC_CONSTANT(CPPTYPE_INT64) ||
  1573. !ADD_FIELDDESC_CONSTANT(CPPTYPE_UINT32) ||
  1574. !ADD_FIELDDESC_CONSTANT(CPPTYPE_UINT64) ||
  1575. !ADD_FIELDDESC_CONSTANT(CPPTYPE_DOUBLE) ||
  1576. !ADD_FIELDDESC_CONSTANT(CPPTYPE_FLOAT) ||
  1577. !ADD_FIELDDESC_CONSTANT(CPPTYPE_BOOL) ||
  1578. !ADD_FIELDDESC_CONSTANT(CPPTYPE_ENUM) ||
  1579. !ADD_FIELDDESC_CONSTANT(CPPTYPE_STRING) ||
  1580. !ADD_FIELDDESC_CONSTANT(CPPTYPE_MESSAGE)) {
  1581. return false;
  1582. }
  1583. #undef ADD_FIELDDESC_CONSTANT
  1584. if (PyType_Ready(&PyEnumDescriptor_Type) < 0)
  1585. return false;
  1586. if (PyType_Ready(&PyEnumValueDescriptor_Type) < 0)
  1587. return false;
  1588. if (PyType_Ready(&PyFileDescriptor_Type) < 0)
  1589. return false;
  1590. if (PyType_Ready(&PyOneofDescriptor_Type) < 0)
  1591. return false;
  1592. if (PyType_Ready(&PyServiceDescriptor_Type) < 0)
  1593. return false;
  1594. if (PyType_Ready(&PyMethodDescriptor_Type) < 0)
  1595. return false;
  1596. if (!InitDescriptorMappingTypes())
  1597. return false;
  1598. return true;
  1599. }
  1600. } // namespace python
  1601. } // namespace protobuf
  1602. } // namespace google