descriptor.cc 56 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583
  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. PyThreadState *state = PyThreadState_GET();
  88. if (state == NULL) {
  89. return false;
  90. }
  91. PyFrameObject* frame = state->frame;
  92. if (frame == NULL) {
  93. return false;
  94. }
  95. while (stacklevel-- > 0) {
  96. frame = frame->f_back;
  97. if (frame == NULL) {
  98. return false;
  99. }
  100. }
  101. if (frame->f_globals != frame->f_locals) {
  102. // Not at global module scope
  103. return false;
  104. }
  105. if (frame->f_code->co_filename == NULL) {
  106. return false;
  107. }
  108. char* filename;
  109. Py_ssize_t filename_size;
  110. if (PyString_AsStringAndSize(frame->f_code->co_filename,
  111. &filename, &filename_size) < 0) {
  112. // filename is not a string.
  113. PyErr_Clear();
  114. return false;
  115. }
  116. if (filename_size < 7) {
  117. // filename is too short.
  118. return false;
  119. }
  120. if (strcmp(&filename[filename_size - 7], "_pb2.py") != 0) {
  121. // Filename is not ending with _pb2.
  122. return false;
  123. }
  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. // Converts options into a Python protobuf, and cache the result.
  161. //
  162. // This is a bit tricky because options can contain extension fields defined in
  163. // the same proto file. In this case the options parsed from the serialized_pb
  164. // have unkown fields, and we need to parse them again.
  165. //
  166. // Always returns a new reference.
  167. template<class DescriptorClass>
  168. static PyObject* GetOrBuildOptions(const DescriptorClass *descriptor) {
  169. // Options (and their extensions) are completely resolved in the proto file
  170. // containing the descriptor.
  171. PyDescriptorPool* pool = GetDescriptorPool_FromPool(
  172. GetFileDescriptor(descriptor)->pool());
  173. hash_map<const void*, PyObject*>* descriptor_options =
  174. pool->descriptor_options;
  175. // First search in the cache.
  176. if (descriptor_options->find(descriptor) != descriptor_options->end()) {
  177. PyObject *value = (*descriptor_options)[descriptor];
  178. Py_INCREF(value);
  179. return value;
  180. }
  181. // Build the Options object: get its Python class, and make a copy of the C++
  182. // read-only instance.
  183. const Message& options(descriptor->options());
  184. const Descriptor *message_type = options.GetDescriptor();
  185. PyObject* message_class(cdescriptor_pool::GetMessageClass(
  186. pool, message_type));
  187. if (message_class == NULL) {
  188. // The Options message was not found in the current DescriptorPool.
  189. // In this case, there cannot be extensions to these options, and we can
  190. // try to use the basic pool instead.
  191. PyErr_Clear();
  192. message_class = cdescriptor_pool::GetMessageClass(
  193. GetDefaultDescriptorPool(), message_type);
  194. }
  195. if (message_class == NULL) {
  196. PyErr_Format(PyExc_TypeError, "Could not retrieve class for Options: %s",
  197. message_type->full_name().c_str());
  198. return NULL;
  199. }
  200. ScopedPyObjectPtr value(PyEval_CallObject(message_class, NULL));
  201. if (value == NULL) {
  202. return NULL;
  203. }
  204. if (!PyObject_TypeCheck(value.get(), &CMessage_Type)) {
  205. PyErr_Format(PyExc_TypeError, "Invalid class for %s: %s",
  206. message_type->full_name().c_str(),
  207. Py_TYPE(value.get())->tp_name);
  208. return NULL;
  209. }
  210. CMessage* cmsg = reinterpret_cast<CMessage*>(value.get());
  211. const Reflection* reflection = options.GetReflection();
  212. const UnknownFieldSet& unknown_fields(reflection->GetUnknownFields(options));
  213. if (unknown_fields.empty()) {
  214. cmsg->message->CopyFrom(options);
  215. } else {
  216. // Reparse options string! XXX call cmessage::MergeFromString
  217. string serialized;
  218. options.SerializeToString(&serialized);
  219. io::CodedInputStream input(
  220. reinterpret_cast<const uint8*>(serialized.c_str()), serialized.size());
  221. input.SetExtensionRegistry(pool->pool, pool->message_factory);
  222. bool success = cmsg->message->MergePartialFromCodedStream(&input);
  223. if (!success) {
  224. PyErr_Format(PyExc_ValueError, "Error parsing Options message");
  225. return NULL;
  226. }
  227. }
  228. // Cache the result.
  229. Py_INCREF(value.get());
  230. (*pool->descriptor_options)[descriptor] = value.get();
  231. return value.release();
  232. }
  233. // Copy the C++ descriptor to a Python message.
  234. // The Python message is an instance of descriptor_pb2.DescriptorProto
  235. // or similar.
  236. template<class DescriptorProtoClass, class DescriptorClass>
  237. static PyObject* CopyToPythonProto(const DescriptorClass *descriptor,
  238. PyObject *target) {
  239. const Descriptor* self_descriptor =
  240. DescriptorProtoClass::default_instance().GetDescriptor();
  241. CMessage* message = reinterpret_cast<CMessage*>(target);
  242. if (!PyObject_TypeCheck(target, &CMessage_Type) ||
  243. message->message->GetDescriptor() != self_descriptor) {
  244. PyErr_Format(PyExc_TypeError, "Not a %s message",
  245. self_descriptor->full_name().c_str());
  246. return NULL;
  247. }
  248. cmessage::AssureWritable(message);
  249. DescriptorProtoClass* descriptor_message =
  250. static_cast<DescriptorProtoClass*>(message->message);
  251. descriptor->CopyTo(descriptor_message);
  252. Py_RETURN_NONE;
  253. }
  254. // All Descriptors classes share the same memory layout.
  255. typedef struct PyBaseDescriptor {
  256. PyObject_HEAD
  257. // Pointer to the C++ proto2 descriptor.
  258. // Like all descriptors, it is owned by the global DescriptorPool.
  259. const void* descriptor;
  260. // Owned reference to the DescriptorPool, to ensure it is kept alive.
  261. PyDescriptorPool* pool;
  262. } PyBaseDescriptor;
  263. // FileDescriptor structure "inherits" from the base descriptor.
  264. typedef struct PyFileDescriptor {
  265. PyBaseDescriptor base;
  266. // The cached version of serialized pb. Either NULL, or a Bytes string.
  267. // We own the reference.
  268. PyObject *serialized_pb;
  269. } PyFileDescriptor;
  270. namespace descriptor {
  271. // Creates or retrieve a Python descriptor of the specified type.
  272. // Objects are interned: the same descriptor will return the same object if it
  273. // was kept alive.
  274. // 'was_created' is an optional pointer to a bool, and is set to true if a new
  275. // object was allocated.
  276. // Always return a new reference.
  277. template<class DescriptorClass>
  278. PyObject* NewInternedDescriptor(PyTypeObject* type,
  279. const DescriptorClass* descriptor,
  280. bool* was_created) {
  281. if (was_created) {
  282. *was_created = false;
  283. }
  284. if (descriptor == NULL) {
  285. PyErr_BadInternalCall();
  286. return NULL;
  287. }
  288. // See if the object is in the map of interned descriptors
  289. hash_map<const void*, PyObject*>::iterator it =
  290. interned_descriptors.find(descriptor);
  291. if (it != interned_descriptors.end()) {
  292. GOOGLE_DCHECK(Py_TYPE(it->second) == type);
  293. Py_INCREF(it->second);
  294. return it->second;
  295. }
  296. // Create a new descriptor object
  297. PyBaseDescriptor* py_descriptor = PyObject_New(
  298. PyBaseDescriptor, type);
  299. if (py_descriptor == NULL) {
  300. return NULL;
  301. }
  302. py_descriptor->descriptor = descriptor;
  303. // and cache it.
  304. interned_descriptors.insert(
  305. std::make_pair(descriptor, reinterpret_cast<PyObject*>(py_descriptor)));
  306. // Ensures that the DescriptorPool stays alive.
  307. PyDescriptorPool* pool = GetDescriptorPool_FromPool(
  308. GetFileDescriptor(descriptor)->pool());
  309. if (pool == NULL) {
  310. // Don't DECREF, the object is not fully initialized.
  311. PyObject_Del(py_descriptor);
  312. return NULL;
  313. }
  314. Py_INCREF(pool);
  315. py_descriptor->pool = pool;
  316. if (was_created) {
  317. *was_created = true;
  318. }
  319. return reinterpret_cast<PyObject*>(py_descriptor);
  320. }
  321. static void Dealloc(PyBaseDescriptor* self) {
  322. // Remove from interned dictionary
  323. interned_descriptors.erase(self->descriptor);
  324. Py_CLEAR(self->pool);
  325. Py_TYPE(self)->tp_free(reinterpret_cast<PyObject*>(self));
  326. }
  327. static PyGetSetDef Getters[] = {
  328. {NULL}
  329. };
  330. PyTypeObject PyBaseDescriptor_Type = {
  331. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  332. FULL_MODULE_NAME ".DescriptorBase", // tp_name
  333. sizeof(PyBaseDescriptor), // tp_basicsize
  334. 0, // tp_itemsize
  335. (destructor)Dealloc, // tp_dealloc
  336. 0, // tp_print
  337. 0, // tp_getattr
  338. 0, // tp_setattr
  339. 0, // tp_compare
  340. 0, // tp_repr
  341. 0, // tp_as_number
  342. 0, // tp_as_sequence
  343. 0, // tp_as_mapping
  344. 0, // tp_hash
  345. 0, // tp_call
  346. 0, // tp_str
  347. 0, // tp_getattro
  348. 0, // tp_setattro
  349. 0, // tp_as_buffer
  350. Py_TPFLAGS_DEFAULT, // tp_flags
  351. "Descriptors base class", // tp_doc
  352. 0, // tp_traverse
  353. 0, // tp_clear
  354. 0, // tp_richcompare
  355. 0, // tp_weaklistoffset
  356. 0, // tp_iter
  357. 0, // tp_iternext
  358. 0, // tp_methods
  359. 0, // tp_members
  360. Getters, // tp_getset
  361. };
  362. } // namespace descriptor
  363. const void* PyDescriptor_AsVoidPtr(PyObject* obj) {
  364. if (!PyObject_TypeCheck(obj, &descriptor::PyBaseDescriptor_Type)) {
  365. PyErr_SetString(PyExc_TypeError, "Not a BaseDescriptor");
  366. return NULL;
  367. }
  368. return reinterpret_cast<PyBaseDescriptor*>(obj)->descriptor;
  369. }
  370. namespace message_descriptor {
  371. // Unchecked accessor to the C++ pointer.
  372. static const Descriptor* _GetDescriptor(PyBaseDescriptor* self) {
  373. return reinterpret_cast<const Descriptor*>(self->descriptor);
  374. }
  375. static PyObject* GetName(PyBaseDescriptor* self, void *closure) {
  376. return PyString_FromCppString(_GetDescriptor(self)->name());
  377. }
  378. static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
  379. return PyString_FromCppString(_GetDescriptor(self)->full_name());
  380. }
  381. static PyObject* GetFile(PyBaseDescriptor *self, void *closure) {
  382. return PyFileDescriptor_FromDescriptor(_GetDescriptor(self)->file());
  383. }
  384. static PyObject* GetConcreteClass(PyBaseDescriptor* self, void *closure) {
  385. // Retuns the canonical class for the given descriptor.
  386. // This is the class that was registered with the primary descriptor pool
  387. // which contains this descriptor.
  388. // This might not be the one you expect! For example the returned object does
  389. // not know about extensions defined in a custom pool.
  390. PyObject* concrete_class(cdescriptor_pool::GetMessageClass(
  391. GetDescriptorPool_FromPool(_GetDescriptor(self)->file()->pool()),
  392. _GetDescriptor(self)));
  393. Py_XINCREF(concrete_class);
  394. return concrete_class;
  395. }
  396. static PyObject* GetFieldsByName(PyBaseDescriptor* self, void *closure) {
  397. return NewMessageFieldsByName(_GetDescriptor(self));
  398. }
  399. static PyObject* GetFieldsByCamelcaseName(PyBaseDescriptor* self,
  400. void *closure) {
  401. return NewMessageFieldsByCamelcaseName(_GetDescriptor(self));
  402. }
  403. static PyObject* GetFieldsByNumber(PyBaseDescriptor* self, void *closure) {
  404. return NewMessageFieldsByNumber(_GetDescriptor(self));
  405. }
  406. static PyObject* GetFieldsSeq(PyBaseDescriptor* self, void *closure) {
  407. return NewMessageFieldsSeq(_GetDescriptor(self));
  408. }
  409. static PyObject* GetNestedTypesByName(PyBaseDescriptor* self, void *closure) {
  410. return NewMessageNestedTypesByName(_GetDescriptor(self));
  411. }
  412. static PyObject* GetNestedTypesSeq(PyBaseDescriptor* self, void *closure) {
  413. return NewMessageNestedTypesSeq(_GetDescriptor(self));
  414. }
  415. static PyObject* GetExtensionsByName(PyBaseDescriptor* self, void *closure) {
  416. return NewMessageExtensionsByName(_GetDescriptor(self));
  417. }
  418. static PyObject* GetExtensions(PyBaseDescriptor* self, void *closure) {
  419. return NewMessageExtensionsSeq(_GetDescriptor(self));
  420. }
  421. static PyObject* GetEnumsSeq(PyBaseDescriptor* self, void *closure) {
  422. return NewMessageEnumsSeq(_GetDescriptor(self));
  423. }
  424. static PyObject* GetEnumTypesByName(PyBaseDescriptor* self, void *closure) {
  425. return NewMessageEnumsByName(_GetDescriptor(self));
  426. }
  427. static PyObject* GetEnumValuesByName(PyBaseDescriptor* self, void *closure) {
  428. return NewMessageEnumValuesByName(_GetDescriptor(self));
  429. }
  430. static PyObject* GetOneofsByName(PyBaseDescriptor* self, void *closure) {
  431. return NewMessageOneofsByName(_GetDescriptor(self));
  432. }
  433. static PyObject* GetOneofsSeq(PyBaseDescriptor* self, void *closure) {
  434. return NewMessageOneofsSeq(_GetDescriptor(self));
  435. }
  436. static PyObject* IsExtendable(PyBaseDescriptor *self, void *closure) {
  437. if (_GetDescriptor(self)->extension_range_count() > 0) {
  438. Py_RETURN_TRUE;
  439. } else {
  440. Py_RETURN_FALSE;
  441. }
  442. }
  443. static PyObject* GetExtensionRanges(PyBaseDescriptor *self, void *closure) {
  444. const Descriptor* descriptor = _GetDescriptor(self);
  445. PyObject* range_list = PyList_New(descriptor->extension_range_count());
  446. for (int i = 0; i < descriptor->extension_range_count(); i++) {
  447. const Descriptor::ExtensionRange* range = descriptor->extension_range(i);
  448. PyObject* start = PyInt_FromLong(range->start);
  449. PyObject* end = PyInt_FromLong(range->end);
  450. PyList_SetItem(range_list, i, PyTuple_Pack(2, start, end));
  451. }
  452. return range_list;
  453. }
  454. static PyObject* GetContainingType(PyBaseDescriptor *self, void *closure) {
  455. const Descriptor* containing_type =
  456. _GetDescriptor(self)->containing_type();
  457. if (containing_type) {
  458. return PyMessageDescriptor_FromDescriptor(containing_type);
  459. } else {
  460. Py_RETURN_NONE;
  461. }
  462. }
  463. static int SetContainingType(PyBaseDescriptor *self, PyObject *value,
  464. void *closure) {
  465. return CheckCalledFromGeneratedFile("containing_type");
  466. }
  467. static PyObject* GetHasOptions(PyBaseDescriptor *self, void *closure) {
  468. const MessageOptions& options(_GetDescriptor(self)->options());
  469. if (&options != &MessageOptions::default_instance()) {
  470. Py_RETURN_TRUE;
  471. } else {
  472. Py_RETURN_FALSE;
  473. }
  474. }
  475. static int SetHasOptions(PyBaseDescriptor *self, PyObject *value,
  476. void *closure) {
  477. return CheckCalledFromGeneratedFile("has_options");
  478. }
  479. static PyObject* GetOptions(PyBaseDescriptor *self) {
  480. return GetOrBuildOptions(_GetDescriptor(self));
  481. }
  482. static int SetOptions(PyBaseDescriptor *self, PyObject *value,
  483. void *closure) {
  484. return CheckCalledFromGeneratedFile("_options");
  485. }
  486. static PyObject* CopyToProto(PyBaseDescriptor *self, PyObject *target) {
  487. return CopyToPythonProto<DescriptorProto>(_GetDescriptor(self), target);
  488. }
  489. static PyObject* EnumValueName(PyBaseDescriptor *self, PyObject *args) {
  490. const char *enum_name;
  491. int number;
  492. if (!PyArg_ParseTuple(args, "si", &enum_name, &number))
  493. return NULL;
  494. const EnumDescriptor *enum_type =
  495. _GetDescriptor(self)->FindEnumTypeByName(enum_name);
  496. if (enum_type == NULL) {
  497. PyErr_SetString(PyExc_KeyError, enum_name);
  498. return NULL;
  499. }
  500. const EnumValueDescriptor *enum_value =
  501. enum_type->FindValueByNumber(number);
  502. if (enum_value == NULL) {
  503. PyErr_Format(PyExc_KeyError, "%d", number);
  504. return NULL;
  505. }
  506. return PyString_FromCppString(enum_value->name());
  507. }
  508. static PyObject* GetSyntax(PyBaseDescriptor *self, void *closure) {
  509. return PyString_InternFromString(
  510. FileDescriptor::SyntaxName(_GetDescriptor(self)->file()->syntax()));
  511. }
  512. static PyGetSetDef Getters[] = {
  513. { "name", (getter)GetName, NULL, "Last name"},
  514. { "full_name", (getter)GetFullName, NULL, "Full name"},
  515. { "_concrete_class", (getter)GetConcreteClass, NULL, "concrete class"},
  516. { "file", (getter)GetFile, NULL, "File descriptor"},
  517. { "fields", (getter)GetFieldsSeq, NULL, "Fields sequence"},
  518. { "fields_by_name", (getter)GetFieldsByName, NULL, "Fields by name"},
  519. { "fields_by_camelcase_name", (getter)GetFieldsByCamelcaseName, NULL,
  520. "Fields by camelCase name"},
  521. { "fields_by_number", (getter)GetFieldsByNumber, NULL, "Fields by number"},
  522. { "nested_types", (getter)GetNestedTypesSeq, NULL, "Nested types sequence"},
  523. { "nested_types_by_name", (getter)GetNestedTypesByName, NULL,
  524. "Nested types by name"},
  525. { "extensions", (getter)GetExtensions, NULL, "Extensions Sequence"},
  526. { "extensions_by_name", (getter)GetExtensionsByName, NULL,
  527. "Extensions by name"},
  528. { "extension_ranges", (getter)GetExtensionRanges, NULL, "Extension ranges"},
  529. { "enum_types", (getter)GetEnumsSeq, NULL, "Enum sequence"},
  530. { "enum_types_by_name", (getter)GetEnumTypesByName, NULL,
  531. "Enum types by name"},
  532. { "enum_values_by_name", (getter)GetEnumValuesByName, NULL,
  533. "Enum values by name"},
  534. { "oneofs_by_name", (getter)GetOneofsByName, NULL, "Oneofs by name"},
  535. { "oneofs", (getter)GetOneofsSeq, NULL, "Oneofs by name"},
  536. { "containing_type", (getter)GetContainingType, (setter)SetContainingType,
  537. "Containing type"},
  538. { "is_extendable", (getter)IsExtendable, (setter)NULL},
  539. { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
  540. { "_options", (getter)NULL, (setter)SetOptions, "Options"},
  541. { "syntax", (getter)GetSyntax, (setter)NULL, "Syntax"},
  542. {NULL}
  543. };
  544. static PyMethodDef Methods[] = {
  545. { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS, },
  546. { "CopyToProto", (PyCFunction)CopyToProto, METH_O, },
  547. { "EnumValueName", (PyCFunction)EnumValueName, METH_VARARGS, },
  548. {NULL}
  549. };
  550. } // namespace message_descriptor
  551. PyTypeObject PyMessageDescriptor_Type = {
  552. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  553. FULL_MODULE_NAME ".MessageDescriptor", // tp_name
  554. sizeof(PyBaseDescriptor), // tp_basicsize
  555. 0, // tp_itemsize
  556. 0, // tp_dealloc
  557. 0, // tp_print
  558. 0, // tp_getattr
  559. 0, // tp_setattr
  560. 0, // tp_compare
  561. 0, // tp_repr
  562. 0, // tp_as_number
  563. 0, // tp_as_sequence
  564. 0, // tp_as_mapping
  565. 0, // tp_hash
  566. 0, // tp_call
  567. 0, // tp_str
  568. 0, // tp_getattro
  569. 0, // tp_setattro
  570. 0, // tp_as_buffer
  571. Py_TPFLAGS_DEFAULT, // tp_flags
  572. "A Message Descriptor", // tp_doc
  573. 0, // tp_traverse
  574. 0, // tp_clear
  575. 0, // tp_richcompare
  576. 0, // tp_weaklistoffset
  577. 0, // tp_iter
  578. 0, // tp_iternext
  579. message_descriptor::Methods, // tp_methods
  580. 0, // tp_members
  581. message_descriptor::Getters, // tp_getset
  582. &descriptor::PyBaseDescriptor_Type, // tp_base
  583. };
  584. PyObject* PyMessageDescriptor_FromDescriptor(
  585. const Descriptor* message_descriptor) {
  586. return descriptor::NewInternedDescriptor(
  587. &PyMessageDescriptor_Type, message_descriptor, NULL);
  588. }
  589. const Descriptor* PyMessageDescriptor_AsDescriptor(PyObject* obj) {
  590. if (!PyObject_TypeCheck(obj, &PyMessageDescriptor_Type)) {
  591. PyErr_SetString(PyExc_TypeError, "Not a MessageDescriptor");
  592. return NULL;
  593. }
  594. return reinterpret_cast<const Descriptor*>(
  595. reinterpret_cast<PyBaseDescriptor*>(obj)->descriptor);
  596. }
  597. namespace field_descriptor {
  598. // Unchecked accessor to the C++ pointer.
  599. static const FieldDescriptor* _GetDescriptor(
  600. PyBaseDescriptor *self) {
  601. return reinterpret_cast<const FieldDescriptor*>(self->descriptor);
  602. }
  603. static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
  604. return PyString_FromCppString(_GetDescriptor(self)->full_name());
  605. }
  606. static PyObject* GetName(PyBaseDescriptor *self, void *closure) {
  607. return PyString_FromCppString(_GetDescriptor(self)->name());
  608. }
  609. static PyObject* GetCamelcaseName(PyBaseDescriptor* self, void *closure) {
  610. return PyString_FromCppString(_GetDescriptor(self)->camelcase_name());
  611. }
  612. static PyObject* GetType(PyBaseDescriptor *self, void *closure) {
  613. return PyInt_FromLong(_GetDescriptor(self)->type());
  614. }
  615. static PyObject* GetCppType(PyBaseDescriptor *self, void *closure) {
  616. return PyInt_FromLong(_GetDescriptor(self)->cpp_type());
  617. }
  618. static PyObject* GetLabel(PyBaseDescriptor *self, void *closure) {
  619. return PyInt_FromLong(_GetDescriptor(self)->label());
  620. }
  621. static PyObject* GetNumber(PyBaseDescriptor *self, void *closure) {
  622. return PyInt_FromLong(_GetDescriptor(self)->number());
  623. }
  624. static PyObject* GetIndex(PyBaseDescriptor *self, void *closure) {
  625. return PyInt_FromLong(_GetDescriptor(self)->index());
  626. }
  627. static PyObject* GetID(PyBaseDescriptor *self, void *closure) {
  628. return PyLong_FromVoidPtr(self);
  629. }
  630. static PyObject* IsExtension(PyBaseDescriptor *self, void *closure) {
  631. return PyBool_FromLong(_GetDescriptor(self)->is_extension());
  632. }
  633. static PyObject* HasDefaultValue(PyBaseDescriptor *self, void *closure) {
  634. return PyBool_FromLong(_GetDescriptor(self)->has_default_value());
  635. }
  636. static PyObject* GetDefaultValue(PyBaseDescriptor *self, void *closure) {
  637. PyObject *result;
  638. switch (_GetDescriptor(self)->cpp_type()) {
  639. case FieldDescriptor::CPPTYPE_INT32: {
  640. int32 value = _GetDescriptor(self)->default_value_int32();
  641. result = PyInt_FromLong(value);
  642. break;
  643. }
  644. case FieldDescriptor::CPPTYPE_INT64: {
  645. int64 value = _GetDescriptor(self)->default_value_int64();
  646. result = PyLong_FromLongLong(value);
  647. break;
  648. }
  649. case FieldDescriptor::CPPTYPE_UINT32: {
  650. uint32 value = _GetDescriptor(self)->default_value_uint32();
  651. result = PyInt_FromSize_t(value);
  652. break;
  653. }
  654. case FieldDescriptor::CPPTYPE_UINT64: {
  655. uint64 value = _GetDescriptor(self)->default_value_uint64();
  656. result = PyLong_FromUnsignedLongLong(value);
  657. break;
  658. }
  659. case FieldDescriptor::CPPTYPE_FLOAT: {
  660. float value = _GetDescriptor(self)->default_value_float();
  661. result = PyFloat_FromDouble(value);
  662. break;
  663. }
  664. case FieldDescriptor::CPPTYPE_DOUBLE: {
  665. double value = _GetDescriptor(self)->default_value_double();
  666. result = PyFloat_FromDouble(value);
  667. break;
  668. }
  669. case FieldDescriptor::CPPTYPE_BOOL: {
  670. bool value = _GetDescriptor(self)->default_value_bool();
  671. result = PyBool_FromLong(value);
  672. break;
  673. }
  674. case FieldDescriptor::CPPTYPE_STRING: {
  675. string value = _GetDescriptor(self)->default_value_string();
  676. result = ToStringObject(_GetDescriptor(self), value);
  677. break;
  678. }
  679. case FieldDescriptor::CPPTYPE_ENUM: {
  680. const EnumValueDescriptor* value =
  681. _GetDescriptor(self)->default_value_enum();
  682. result = PyInt_FromLong(value->number());
  683. break;
  684. }
  685. default:
  686. PyErr_Format(PyExc_NotImplementedError, "default value for %s",
  687. _GetDescriptor(self)->full_name().c_str());
  688. return NULL;
  689. }
  690. return result;
  691. }
  692. static PyObject* GetCDescriptor(PyObject *self, void *closure) {
  693. Py_INCREF(self);
  694. return self;
  695. }
  696. static PyObject *GetEnumType(PyBaseDescriptor *self, void *closure) {
  697. const EnumDescriptor* enum_type = _GetDescriptor(self)->enum_type();
  698. if (enum_type) {
  699. return PyEnumDescriptor_FromDescriptor(enum_type);
  700. } else {
  701. Py_RETURN_NONE;
  702. }
  703. }
  704. static int SetEnumType(PyBaseDescriptor *self, PyObject *value, void *closure) {
  705. return CheckCalledFromGeneratedFile("enum_type");
  706. }
  707. static PyObject *GetMessageType(PyBaseDescriptor *self, void *closure) {
  708. const Descriptor* message_type = _GetDescriptor(self)->message_type();
  709. if (message_type) {
  710. return PyMessageDescriptor_FromDescriptor(message_type);
  711. } else {
  712. Py_RETURN_NONE;
  713. }
  714. }
  715. static int SetMessageType(PyBaseDescriptor *self, PyObject *value,
  716. void *closure) {
  717. return CheckCalledFromGeneratedFile("message_type");
  718. }
  719. static PyObject* GetContainingType(PyBaseDescriptor *self, void *closure) {
  720. const Descriptor* containing_type =
  721. _GetDescriptor(self)->containing_type();
  722. if (containing_type) {
  723. return PyMessageDescriptor_FromDescriptor(containing_type);
  724. } else {
  725. Py_RETURN_NONE;
  726. }
  727. }
  728. static int SetContainingType(PyBaseDescriptor *self, PyObject *value,
  729. void *closure) {
  730. return CheckCalledFromGeneratedFile("containing_type");
  731. }
  732. static PyObject* GetExtensionScope(PyBaseDescriptor *self, void *closure) {
  733. const Descriptor* extension_scope =
  734. _GetDescriptor(self)->extension_scope();
  735. if (extension_scope) {
  736. return PyMessageDescriptor_FromDescriptor(extension_scope);
  737. } else {
  738. Py_RETURN_NONE;
  739. }
  740. }
  741. static PyObject* GetContainingOneof(PyBaseDescriptor *self, void *closure) {
  742. const OneofDescriptor* containing_oneof =
  743. _GetDescriptor(self)->containing_oneof();
  744. if (containing_oneof) {
  745. return PyOneofDescriptor_FromDescriptor(containing_oneof);
  746. } else {
  747. Py_RETURN_NONE;
  748. }
  749. }
  750. static int SetContainingOneof(PyBaseDescriptor *self, PyObject *value,
  751. void *closure) {
  752. return CheckCalledFromGeneratedFile("containing_oneof");
  753. }
  754. static PyObject* GetHasOptions(PyBaseDescriptor *self, void *closure) {
  755. const FieldOptions& options(_GetDescriptor(self)->options());
  756. if (&options != &FieldOptions::default_instance()) {
  757. Py_RETURN_TRUE;
  758. } else {
  759. Py_RETURN_FALSE;
  760. }
  761. }
  762. static int SetHasOptions(PyBaseDescriptor *self, PyObject *value,
  763. void *closure) {
  764. return CheckCalledFromGeneratedFile("has_options");
  765. }
  766. static PyObject* GetOptions(PyBaseDescriptor *self) {
  767. return GetOrBuildOptions(_GetDescriptor(self));
  768. }
  769. static int SetOptions(PyBaseDescriptor *self, PyObject *value,
  770. void *closure) {
  771. return CheckCalledFromGeneratedFile("_options");
  772. }
  773. static PyGetSetDef Getters[] = {
  774. { "full_name", (getter)GetFullName, NULL, "Full name"},
  775. { "name", (getter)GetName, NULL, "Unqualified name"},
  776. { "camelcase_name", (getter)GetCamelcaseName, NULL, "Camelcase name"},
  777. { "type", (getter)GetType, NULL, "C++ Type"},
  778. { "cpp_type", (getter)GetCppType, NULL, "C++ Type"},
  779. { "label", (getter)GetLabel, NULL, "Label"},
  780. { "number", (getter)GetNumber, NULL, "Number"},
  781. { "index", (getter)GetIndex, NULL, "Index"},
  782. { "default_value", (getter)GetDefaultValue, NULL, "Default Value"},
  783. { "has_default_value", (getter)HasDefaultValue},
  784. { "is_extension", (getter)IsExtension, NULL, "ID"},
  785. { "id", (getter)GetID, NULL, "ID"},
  786. { "_cdescriptor", (getter)GetCDescriptor, NULL, "HAACK REMOVE ME"},
  787. { "message_type", (getter)GetMessageType, (setter)SetMessageType,
  788. "Message type"},
  789. { "enum_type", (getter)GetEnumType, (setter)SetEnumType, "Enum type"},
  790. { "containing_type", (getter)GetContainingType, (setter)SetContainingType,
  791. "Containing type"},
  792. { "extension_scope", (getter)GetExtensionScope, (setter)NULL,
  793. "Extension scope"},
  794. { "containing_oneof", (getter)GetContainingOneof, (setter)SetContainingOneof,
  795. "Containing oneof"},
  796. { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
  797. { "_options", (getter)NULL, (setter)SetOptions, "Options"},
  798. {NULL}
  799. };
  800. static PyMethodDef Methods[] = {
  801. { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS, },
  802. {NULL}
  803. };
  804. } // namespace field_descriptor
  805. PyTypeObject PyFieldDescriptor_Type = {
  806. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  807. FULL_MODULE_NAME ".FieldDescriptor", // tp_name
  808. sizeof(PyBaseDescriptor), // tp_basicsize
  809. 0, // tp_itemsize
  810. 0, // tp_dealloc
  811. 0, // tp_print
  812. 0, // tp_getattr
  813. 0, // tp_setattr
  814. 0, // tp_compare
  815. 0, // tp_repr
  816. 0, // tp_as_number
  817. 0, // tp_as_sequence
  818. 0, // tp_as_mapping
  819. 0, // tp_hash
  820. 0, // tp_call
  821. 0, // tp_str
  822. 0, // tp_getattro
  823. 0, // tp_setattro
  824. 0, // tp_as_buffer
  825. Py_TPFLAGS_DEFAULT, // tp_flags
  826. "A Field Descriptor", // tp_doc
  827. 0, // tp_traverse
  828. 0, // tp_clear
  829. 0, // tp_richcompare
  830. 0, // tp_weaklistoffset
  831. 0, // tp_iter
  832. 0, // tp_iternext
  833. field_descriptor::Methods, // tp_methods
  834. 0, // tp_members
  835. field_descriptor::Getters, // tp_getset
  836. &descriptor::PyBaseDescriptor_Type, // tp_base
  837. };
  838. PyObject* PyFieldDescriptor_FromDescriptor(
  839. const FieldDescriptor* field_descriptor) {
  840. return descriptor::NewInternedDescriptor(
  841. &PyFieldDescriptor_Type, field_descriptor, NULL);
  842. }
  843. const FieldDescriptor* PyFieldDescriptor_AsDescriptor(PyObject* obj) {
  844. if (!PyObject_TypeCheck(obj, &PyFieldDescriptor_Type)) {
  845. PyErr_SetString(PyExc_TypeError, "Not a FieldDescriptor");
  846. return NULL;
  847. }
  848. return reinterpret_cast<const FieldDescriptor*>(
  849. reinterpret_cast<PyBaseDescriptor*>(obj)->descriptor);
  850. }
  851. namespace enum_descriptor {
  852. // Unchecked accessor to the C++ pointer.
  853. static const EnumDescriptor* _GetDescriptor(
  854. PyBaseDescriptor *self) {
  855. return reinterpret_cast<const EnumDescriptor*>(self->descriptor);
  856. }
  857. static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
  858. return PyString_FromCppString(_GetDescriptor(self)->full_name());
  859. }
  860. static PyObject* GetName(PyBaseDescriptor *self, void *closure) {
  861. return PyString_FromCppString(_GetDescriptor(self)->name());
  862. }
  863. static PyObject* GetFile(PyBaseDescriptor *self, void *closure) {
  864. return PyFileDescriptor_FromDescriptor(_GetDescriptor(self)->file());
  865. }
  866. static PyObject* GetEnumvaluesByName(PyBaseDescriptor* self, void *closure) {
  867. return NewEnumValuesByName(_GetDescriptor(self));
  868. }
  869. static PyObject* GetEnumvaluesByNumber(PyBaseDescriptor* self, void *closure) {
  870. return NewEnumValuesByNumber(_GetDescriptor(self));
  871. }
  872. static PyObject* GetEnumvaluesSeq(PyBaseDescriptor* self, void *closure) {
  873. return NewEnumValuesSeq(_GetDescriptor(self));
  874. }
  875. static PyObject* GetContainingType(PyBaseDescriptor *self, void *closure) {
  876. const Descriptor* containing_type =
  877. _GetDescriptor(self)->containing_type();
  878. if (containing_type) {
  879. return PyMessageDescriptor_FromDescriptor(containing_type);
  880. } else {
  881. Py_RETURN_NONE;
  882. }
  883. }
  884. static int SetContainingType(PyBaseDescriptor *self, PyObject *value,
  885. void *closure) {
  886. return CheckCalledFromGeneratedFile("containing_type");
  887. }
  888. static PyObject* GetHasOptions(PyBaseDescriptor *self, void *closure) {
  889. const EnumOptions& options(_GetDescriptor(self)->options());
  890. if (&options != &EnumOptions::default_instance()) {
  891. Py_RETURN_TRUE;
  892. } else {
  893. Py_RETURN_FALSE;
  894. }
  895. }
  896. static int SetHasOptions(PyBaseDescriptor *self, PyObject *value,
  897. void *closure) {
  898. return CheckCalledFromGeneratedFile("has_options");
  899. }
  900. static PyObject* GetOptions(PyBaseDescriptor *self) {
  901. return GetOrBuildOptions(_GetDescriptor(self));
  902. }
  903. static int SetOptions(PyBaseDescriptor *self, PyObject *value,
  904. void *closure) {
  905. return CheckCalledFromGeneratedFile("_options");
  906. }
  907. static PyObject* CopyToProto(PyBaseDescriptor *self, PyObject *target) {
  908. return CopyToPythonProto<EnumDescriptorProto>(_GetDescriptor(self), target);
  909. }
  910. static PyMethodDef Methods[] = {
  911. { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS, },
  912. { "CopyToProto", (PyCFunction)CopyToProto, METH_O, },
  913. {NULL}
  914. };
  915. static PyGetSetDef Getters[] = {
  916. { "full_name", (getter)GetFullName, NULL, "Full name"},
  917. { "name", (getter)GetName, NULL, "last name"},
  918. { "file", (getter)GetFile, NULL, "File descriptor"},
  919. { "values", (getter)GetEnumvaluesSeq, NULL, "values"},
  920. { "values_by_name", (getter)GetEnumvaluesByName, NULL,
  921. "Enum values by name"},
  922. { "values_by_number", (getter)GetEnumvaluesByNumber, NULL,
  923. "Enum values by number"},
  924. { "containing_type", (getter)GetContainingType, (setter)SetContainingType,
  925. "Containing type"},
  926. { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
  927. { "_options", (getter)NULL, (setter)SetOptions, "Options"},
  928. {NULL}
  929. };
  930. } // namespace enum_descriptor
  931. PyTypeObject PyEnumDescriptor_Type = {
  932. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  933. FULL_MODULE_NAME ".EnumDescriptor", // tp_name
  934. sizeof(PyBaseDescriptor), // tp_basicsize
  935. 0, // tp_itemsize
  936. 0, // tp_dealloc
  937. 0, // tp_print
  938. 0, // tp_getattr
  939. 0, // tp_setattr
  940. 0, // tp_compare
  941. 0, // tp_repr
  942. 0, // tp_as_number
  943. 0, // tp_as_sequence
  944. 0, // tp_as_mapping
  945. 0, // tp_hash
  946. 0, // tp_call
  947. 0, // tp_str
  948. 0, // tp_getattro
  949. 0, // tp_setattro
  950. 0, // tp_as_buffer
  951. Py_TPFLAGS_DEFAULT, // tp_flags
  952. "A Enum Descriptor", // tp_doc
  953. 0, // tp_traverse
  954. 0, // tp_clear
  955. 0, // tp_richcompare
  956. 0, // tp_weaklistoffset
  957. 0, // tp_iter
  958. 0, // tp_iternext
  959. enum_descriptor::Methods, // tp_getset
  960. 0, // tp_members
  961. enum_descriptor::Getters, // tp_getset
  962. &descriptor::PyBaseDescriptor_Type, // tp_base
  963. };
  964. PyObject* PyEnumDescriptor_FromDescriptor(
  965. const EnumDescriptor* enum_descriptor) {
  966. return descriptor::NewInternedDescriptor(
  967. &PyEnumDescriptor_Type, enum_descriptor, NULL);
  968. }
  969. const EnumDescriptor* PyEnumDescriptor_AsDescriptor(PyObject* obj) {
  970. if (!PyObject_TypeCheck(obj, &PyEnumDescriptor_Type)) {
  971. PyErr_SetString(PyExc_TypeError, "Not an EnumDescriptor");
  972. return NULL;
  973. }
  974. return reinterpret_cast<const EnumDescriptor*>(
  975. reinterpret_cast<PyBaseDescriptor*>(obj)->descriptor);
  976. }
  977. namespace enumvalue_descriptor {
  978. // Unchecked accessor to the C++ pointer.
  979. static const EnumValueDescriptor* _GetDescriptor(
  980. PyBaseDescriptor *self) {
  981. return reinterpret_cast<const EnumValueDescriptor*>(self->descriptor);
  982. }
  983. static PyObject* GetName(PyBaseDescriptor *self, void *closure) {
  984. return PyString_FromCppString(_GetDescriptor(self)->name());
  985. }
  986. static PyObject* GetNumber(PyBaseDescriptor *self, void *closure) {
  987. return PyInt_FromLong(_GetDescriptor(self)->number());
  988. }
  989. static PyObject* GetIndex(PyBaseDescriptor *self, void *closure) {
  990. return PyInt_FromLong(_GetDescriptor(self)->index());
  991. }
  992. static PyObject* GetType(PyBaseDescriptor *self, void *closure) {
  993. return PyEnumDescriptor_FromDescriptor(_GetDescriptor(self)->type());
  994. }
  995. static PyObject* GetHasOptions(PyBaseDescriptor *self, void *closure) {
  996. const EnumValueOptions& options(_GetDescriptor(self)->options());
  997. if (&options != &EnumValueOptions::default_instance()) {
  998. Py_RETURN_TRUE;
  999. } else {
  1000. Py_RETURN_FALSE;
  1001. }
  1002. }
  1003. static int SetHasOptions(PyBaseDescriptor *self, PyObject *value,
  1004. void *closure) {
  1005. return CheckCalledFromGeneratedFile("has_options");
  1006. }
  1007. static PyObject* GetOptions(PyBaseDescriptor *self) {
  1008. return GetOrBuildOptions(_GetDescriptor(self));
  1009. }
  1010. static int SetOptions(PyBaseDescriptor *self, PyObject *value,
  1011. void *closure) {
  1012. return CheckCalledFromGeneratedFile("_options");
  1013. }
  1014. static PyGetSetDef Getters[] = {
  1015. { "name", (getter)GetName, NULL, "name"},
  1016. { "number", (getter)GetNumber, NULL, "number"},
  1017. { "index", (getter)GetIndex, NULL, "index"},
  1018. { "type", (getter)GetType, NULL, "index"},
  1019. { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
  1020. { "_options", (getter)NULL, (setter)SetOptions, "Options"},
  1021. {NULL}
  1022. };
  1023. static PyMethodDef Methods[] = {
  1024. { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS, },
  1025. {NULL}
  1026. };
  1027. } // namespace enumvalue_descriptor
  1028. PyTypeObject PyEnumValueDescriptor_Type = {
  1029. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  1030. FULL_MODULE_NAME ".EnumValueDescriptor", // tp_name
  1031. sizeof(PyBaseDescriptor), // tp_basicsize
  1032. 0, // tp_itemsize
  1033. 0, // tp_dealloc
  1034. 0, // tp_print
  1035. 0, // tp_getattr
  1036. 0, // tp_setattr
  1037. 0, // tp_compare
  1038. 0, // tp_repr
  1039. 0, // tp_as_number
  1040. 0, // tp_as_sequence
  1041. 0, // tp_as_mapping
  1042. 0, // tp_hash
  1043. 0, // tp_call
  1044. 0, // tp_str
  1045. 0, // tp_getattro
  1046. 0, // tp_setattro
  1047. 0, // tp_as_buffer
  1048. Py_TPFLAGS_DEFAULT, // tp_flags
  1049. "A EnumValue Descriptor", // tp_doc
  1050. 0, // tp_traverse
  1051. 0, // tp_clear
  1052. 0, // tp_richcompare
  1053. 0, // tp_weaklistoffset
  1054. 0, // tp_iter
  1055. 0, // tp_iternext
  1056. enumvalue_descriptor::Methods, // tp_methods
  1057. 0, // tp_members
  1058. enumvalue_descriptor::Getters, // tp_getset
  1059. &descriptor::PyBaseDescriptor_Type, // tp_base
  1060. };
  1061. PyObject* PyEnumValueDescriptor_FromDescriptor(
  1062. const EnumValueDescriptor* enumvalue_descriptor) {
  1063. return descriptor::NewInternedDescriptor(
  1064. &PyEnumValueDescriptor_Type, enumvalue_descriptor, NULL);
  1065. }
  1066. namespace file_descriptor {
  1067. // Unchecked accessor to the C++ pointer.
  1068. static const FileDescriptor* _GetDescriptor(PyFileDescriptor *self) {
  1069. return reinterpret_cast<const FileDescriptor*>(self->base.descriptor);
  1070. }
  1071. static void Dealloc(PyFileDescriptor* self) {
  1072. Py_XDECREF(self->serialized_pb);
  1073. descriptor::Dealloc(&self->base);
  1074. }
  1075. static PyObject* GetPool(PyFileDescriptor *self, void *closure) {
  1076. PyObject* pool = reinterpret_cast<PyObject*>(
  1077. GetDescriptorPool_FromPool(_GetDescriptor(self)->pool()));
  1078. Py_XINCREF(pool);
  1079. return pool;
  1080. }
  1081. static PyObject* GetName(PyFileDescriptor *self, void *closure) {
  1082. return PyString_FromCppString(_GetDescriptor(self)->name());
  1083. }
  1084. static PyObject* GetPackage(PyFileDescriptor *self, void *closure) {
  1085. return PyString_FromCppString(_GetDescriptor(self)->package());
  1086. }
  1087. static PyObject* GetSerializedPb(PyFileDescriptor *self, void *closure) {
  1088. PyObject *serialized_pb = self->serialized_pb;
  1089. if (serialized_pb != NULL) {
  1090. Py_INCREF(serialized_pb);
  1091. return serialized_pb;
  1092. }
  1093. FileDescriptorProto file_proto;
  1094. _GetDescriptor(self)->CopyTo(&file_proto);
  1095. string contents;
  1096. file_proto.SerializePartialToString(&contents);
  1097. self->serialized_pb = PyBytes_FromStringAndSize(
  1098. contents.c_str(), contents.size());
  1099. if (self->serialized_pb == NULL) {
  1100. return NULL;
  1101. }
  1102. Py_INCREF(self->serialized_pb);
  1103. return self->serialized_pb;
  1104. }
  1105. static PyObject* GetMessageTypesByName(PyFileDescriptor* self, void *closure) {
  1106. return NewFileMessageTypesByName(_GetDescriptor(self));
  1107. }
  1108. static PyObject* GetEnumTypesByName(PyFileDescriptor* self, void *closure) {
  1109. return NewFileEnumTypesByName(_GetDescriptor(self));
  1110. }
  1111. static PyObject* GetExtensionsByName(PyFileDescriptor* self, void *closure) {
  1112. return NewFileExtensionsByName(_GetDescriptor(self));
  1113. }
  1114. static PyObject* GetDependencies(PyFileDescriptor* self, void *closure) {
  1115. return NewFileDependencies(_GetDescriptor(self));
  1116. }
  1117. static PyObject* GetPublicDependencies(PyFileDescriptor* self, void *closure) {
  1118. return NewFilePublicDependencies(_GetDescriptor(self));
  1119. }
  1120. static PyObject* GetHasOptions(PyFileDescriptor *self, void *closure) {
  1121. const FileOptions& options(_GetDescriptor(self)->options());
  1122. if (&options != &FileOptions::default_instance()) {
  1123. Py_RETURN_TRUE;
  1124. } else {
  1125. Py_RETURN_FALSE;
  1126. }
  1127. }
  1128. static int SetHasOptions(PyFileDescriptor *self, PyObject *value,
  1129. void *closure) {
  1130. return CheckCalledFromGeneratedFile("has_options");
  1131. }
  1132. static PyObject* GetOptions(PyFileDescriptor *self) {
  1133. return GetOrBuildOptions(_GetDescriptor(self));
  1134. }
  1135. static int SetOptions(PyFileDescriptor *self, PyObject *value,
  1136. void *closure) {
  1137. return CheckCalledFromGeneratedFile("_options");
  1138. }
  1139. static PyObject* GetSyntax(PyFileDescriptor *self, void *closure) {
  1140. return PyString_InternFromString(
  1141. FileDescriptor::SyntaxName(_GetDescriptor(self)->syntax()));
  1142. }
  1143. static PyObject* CopyToProto(PyFileDescriptor *self, PyObject *target) {
  1144. return CopyToPythonProto<FileDescriptorProto>(_GetDescriptor(self), target);
  1145. }
  1146. static PyGetSetDef Getters[] = {
  1147. { "pool", (getter)GetPool, NULL, "pool"},
  1148. { "name", (getter)GetName, NULL, "name"},
  1149. { "package", (getter)GetPackage, NULL, "package"},
  1150. { "serialized_pb", (getter)GetSerializedPb},
  1151. { "message_types_by_name", (getter)GetMessageTypesByName, NULL,
  1152. "Messages by name"},
  1153. { "enum_types_by_name", (getter)GetEnumTypesByName, NULL, "Enums by name"},
  1154. { "extensions_by_name", (getter)GetExtensionsByName, NULL,
  1155. "Extensions by name"},
  1156. { "dependencies", (getter)GetDependencies, NULL, "Dependencies"},
  1157. { "public_dependencies", (getter)GetPublicDependencies, NULL, "Dependencies"},
  1158. { "has_options", (getter)GetHasOptions, (setter)SetHasOptions, "Has Options"},
  1159. { "_options", (getter)NULL, (setter)SetOptions, "Options"},
  1160. { "syntax", (getter)GetSyntax, (setter)NULL, "Syntax"},
  1161. {NULL}
  1162. };
  1163. static PyMethodDef Methods[] = {
  1164. { "GetOptions", (PyCFunction)GetOptions, METH_NOARGS, },
  1165. { "CopyToProto", (PyCFunction)CopyToProto, METH_O, },
  1166. {NULL}
  1167. };
  1168. } // namespace file_descriptor
  1169. PyTypeObject PyFileDescriptor_Type = {
  1170. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  1171. FULL_MODULE_NAME ".FileDescriptor", // tp_name
  1172. sizeof(PyFileDescriptor), // tp_basicsize
  1173. 0, // tp_itemsize
  1174. (destructor)file_descriptor::Dealloc, // tp_dealloc
  1175. 0, // tp_print
  1176. 0, // tp_getattr
  1177. 0, // tp_setattr
  1178. 0, // tp_compare
  1179. 0, // tp_repr
  1180. 0, // tp_as_number
  1181. 0, // tp_as_sequence
  1182. 0, // tp_as_mapping
  1183. 0, // tp_hash
  1184. 0, // tp_call
  1185. 0, // tp_str
  1186. 0, // tp_getattro
  1187. 0, // tp_setattro
  1188. 0, // tp_as_buffer
  1189. Py_TPFLAGS_DEFAULT, // tp_flags
  1190. "A File Descriptor", // tp_doc
  1191. 0, // tp_traverse
  1192. 0, // tp_clear
  1193. 0, // tp_richcompare
  1194. 0, // tp_weaklistoffset
  1195. 0, // tp_iter
  1196. 0, // tp_iternext
  1197. file_descriptor::Methods, // tp_methods
  1198. 0, // tp_members
  1199. file_descriptor::Getters, // tp_getset
  1200. &descriptor::PyBaseDescriptor_Type, // tp_base
  1201. 0, // tp_dict
  1202. 0, // tp_descr_get
  1203. 0, // tp_descr_set
  1204. 0, // tp_dictoffset
  1205. 0, // tp_init
  1206. 0, // tp_alloc
  1207. 0, // tp_new
  1208. PyObject_Del, // tp_free
  1209. };
  1210. PyObject* PyFileDescriptor_FromDescriptor(
  1211. const FileDescriptor* file_descriptor) {
  1212. return PyFileDescriptor_FromDescriptorWithSerializedPb(file_descriptor,
  1213. NULL);
  1214. }
  1215. PyObject* PyFileDescriptor_FromDescriptorWithSerializedPb(
  1216. const FileDescriptor* file_descriptor, PyObject *serialized_pb) {
  1217. bool was_created;
  1218. PyObject* py_descriptor = descriptor::NewInternedDescriptor(
  1219. &PyFileDescriptor_Type, file_descriptor, &was_created);
  1220. if (py_descriptor == NULL) {
  1221. return NULL;
  1222. }
  1223. if (was_created) {
  1224. PyFileDescriptor* cfile_descriptor =
  1225. reinterpret_cast<PyFileDescriptor*>(py_descriptor);
  1226. Py_XINCREF(serialized_pb);
  1227. cfile_descriptor->serialized_pb = serialized_pb;
  1228. }
  1229. // TODO(amauryfa): In the case of a cached object, check that serialized_pb
  1230. // is the same as before.
  1231. return py_descriptor;
  1232. }
  1233. const FileDescriptor* PyFileDescriptor_AsDescriptor(PyObject* obj) {
  1234. if (!PyObject_TypeCheck(obj, &PyFileDescriptor_Type)) {
  1235. PyErr_SetString(PyExc_TypeError, "Not a FileDescriptor");
  1236. return NULL;
  1237. }
  1238. return reinterpret_cast<const FileDescriptor*>(
  1239. reinterpret_cast<PyBaseDescriptor*>(obj)->descriptor);
  1240. }
  1241. namespace oneof_descriptor {
  1242. // Unchecked accessor to the C++ pointer.
  1243. static const OneofDescriptor* _GetDescriptor(
  1244. PyBaseDescriptor *self) {
  1245. return reinterpret_cast<const OneofDescriptor*>(self->descriptor);
  1246. }
  1247. static PyObject* GetName(PyBaseDescriptor* self, void *closure) {
  1248. return PyString_FromCppString(_GetDescriptor(self)->name());
  1249. }
  1250. static PyObject* GetFullName(PyBaseDescriptor* self, void *closure) {
  1251. return PyString_FromCppString(_GetDescriptor(self)->full_name());
  1252. }
  1253. static PyObject* GetIndex(PyBaseDescriptor *self, void *closure) {
  1254. return PyInt_FromLong(_GetDescriptor(self)->index());
  1255. }
  1256. static PyObject* GetFields(PyBaseDescriptor* self, void *closure) {
  1257. return NewOneofFieldsSeq(_GetDescriptor(self));
  1258. }
  1259. static PyObject* GetContainingType(PyBaseDescriptor *self, void *closure) {
  1260. const Descriptor* containing_type =
  1261. _GetDescriptor(self)->containing_type();
  1262. if (containing_type) {
  1263. return PyMessageDescriptor_FromDescriptor(containing_type);
  1264. } else {
  1265. Py_RETURN_NONE;
  1266. }
  1267. }
  1268. static PyGetSetDef Getters[] = {
  1269. { "name", (getter)GetName, NULL, "Name"},
  1270. { "full_name", (getter)GetFullName, NULL, "Full name"},
  1271. { "index", (getter)GetIndex, NULL, "Index"},
  1272. { "containing_type", (getter)GetContainingType, NULL, "Containing type"},
  1273. { "fields", (getter)GetFields, NULL, "Fields"},
  1274. {NULL}
  1275. };
  1276. } // namespace oneof_descriptor
  1277. PyTypeObject PyOneofDescriptor_Type = {
  1278. PyVarObject_HEAD_INIT(&PyType_Type, 0)
  1279. FULL_MODULE_NAME ".OneofDescriptor", // tp_name
  1280. sizeof(PyBaseDescriptor), // tp_basicsize
  1281. 0, // tp_itemsize
  1282. 0, // tp_dealloc
  1283. 0, // tp_print
  1284. 0, // tp_getattr
  1285. 0, // tp_setattr
  1286. 0, // tp_compare
  1287. 0, // tp_repr
  1288. 0, // tp_as_number
  1289. 0, // tp_as_sequence
  1290. 0, // tp_as_mapping
  1291. 0, // tp_hash
  1292. 0, // tp_call
  1293. 0, // tp_str
  1294. 0, // tp_getattro
  1295. 0, // tp_setattro
  1296. 0, // tp_as_buffer
  1297. Py_TPFLAGS_DEFAULT, // tp_flags
  1298. "A Oneof Descriptor", // tp_doc
  1299. 0, // tp_traverse
  1300. 0, // tp_clear
  1301. 0, // tp_richcompare
  1302. 0, // tp_weaklistoffset
  1303. 0, // tp_iter
  1304. 0, // tp_iternext
  1305. 0, // tp_methods
  1306. 0, // tp_members
  1307. oneof_descriptor::Getters, // tp_getset
  1308. &descriptor::PyBaseDescriptor_Type, // tp_base
  1309. };
  1310. PyObject* PyOneofDescriptor_FromDescriptor(
  1311. const OneofDescriptor* oneof_descriptor) {
  1312. return descriptor::NewInternedDescriptor(
  1313. &PyOneofDescriptor_Type, oneof_descriptor, NULL);
  1314. }
  1315. // Add a enum values to a type dictionary.
  1316. static bool AddEnumValues(PyTypeObject *type,
  1317. const EnumDescriptor* enum_descriptor) {
  1318. for (int i = 0; i < enum_descriptor->value_count(); ++i) {
  1319. const EnumValueDescriptor* value = enum_descriptor->value(i);
  1320. ScopedPyObjectPtr obj(PyInt_FromLong(value->number()));
  1321. if (obj == NULL) {
  1322. return false;
  1323. }
  1324. if (PyDict_SetItemString(type->tp_dict, value->name().c_str(), obj.get()) <
  1325. 0) {
  1326. return false;
  1327. }
  1328. }
  1329. return true;
  1330. }
  1331. static bool AddIntConstant(PyTypeObject *type, const char* name, int value) {
  1332. ScopedPyObjectPtr obj(PyInt_FromLong(value));
  1333. if (PyDict_SetItemString(type->tp_dict, name, obj.get()) < 0) {
  1334. return false;
  1335. }
  1336. return true;
  1337. }
  1338. bool InitDescriptor() {
  1339. if (PyType_Ready(&PyMessageDescriptor_Type) < 0)
  1340. return false;
  1341. if (PyType_Ready(&PyFieldDescriptor_Type) < 0)
  1342. return false;
  1343. if (!AddEnumValues(&PyFieldDescriptor_Type,
  1344. FieldDescriptorProto::Label_descriptor())) {
  1345. return false;
  1346. }
  1347. if (!AddEnumValues(&PyFieldDescriptor_Type,
  1348. FieldDescriptorProto::Type_descriptor())) {
  1349. return false;
  1350. }
  1351. #define ADD_FIELDDESC_CONSTANT(NAME) AddIntConstant( \
  1352. &PyFieldDescriptor_Type, #NAME, FieldDescriptor::NAME)
  1353. if (!ADD_FIELDDESC_CONSTANT(CPPTYPE_INT32) ||
  1354. !ADD_FIELDDESC_CONSTANT(CPPTYPE_INT64) ||
  1355. !ADD_FIELDDESC_CONSTANT(CPPTYPE_UINT32) ||
  1356. !ADD_FIELDDESC_CONSTANT(CPPTYPE_UINT64) ||
  1357. !ADD_FIELDDESC_CONSTANT(CPPTYPE_DOUBLE) ||
  1358. !ADD_FIELDDESC_CONSTANT(CPPTYPE_FLOAT) ||
  1359. !ADD_FIELDDESC_CONSTANT(CPPTYPE_BOOL) ||
  1360. !ADD_FIELDDESC_CONSTANT(CPPTYPE_ENUM) ||
  1361. !ADD_FIELDDESC_CONSTANT(CPPTYPE_STRING) ||
  1362. !ADD_FIELDDESC_CONSTANT(CPPTYPE_MESSAGE)) {
  1363. return false;
  1364. }
  1365. #undef ADD_FIELDDESC_CONSTANT
  1366. if (PyType_Ready(&PyEnumDescriptor_Type) < 0)
  1367. return false;
  1368. if (PyType_Ready(&PyEnumValueDescriptor_Type) < 0)
  1369. return false;
  1370. if (PyType_Ready(&PyFileDescriptor_Type) < 0)
  1371. return false;
  1372. if (PyType_Ready(&PyOneofDescriptor_Type) < 0)
  1373. return false;
  1374. if (!InitDescriptorMappingTypes())
  1375. return false;
  1376. return true;
  1377. }
  1378. } // namespace python
  1379. } // namespace protobuf
  1380. } // namespace google