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

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

Issue 2599263002: third_party/protobuf: Update to HEAD (f52e188fe4) (Closed)
Patch Set: Address comments Created 3 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Protocol Buffers - Google's data interchange format 1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved. 2 // Copyright 2008 Google Inc. All rights reserved.
3 // https://developers.google.com/protocol-buffers/ 3 // https://developers.google.com/protocol-buffers/
4 // 4 //
5 // Redistribution and use in source and binary forms, with or without 5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are 6 // modification, are permitted provided that the following conditions are
7 // met: 7 // met:
8 // 8 //
9 // * Redistributions of source code must retain the above copyright 9 // * Redistributions of source code must retain the above copyright
10 // notice, this list of conditions and the following disclaimer. 10 // notice, this list of conditions and the following disclaimer.
(...skipping 590 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 if (index < 0) { 601 if (index < 0) {
602 index += Length(self); 602 index += Length(self);
603 } 603 }
604 if (index < 0 || index >= Length(self)) { 604 if (index < 0 || index >= Length(self)) {
605 PyErr_SetString(PyExc_IndexError, "index out of range"); 605 PyErr_SetString(PyExc_IndexError, "index out of range");
606 return NULL; 606 return NULL;
607 } 607 }
608 return _NewObj_ByIndex(self, index); 608 return _NewObj_ByIndex(self, index);
609 } 609 }
610 610
611 static PyObject *
612 SeqSubscript(PyContainer* self, PyObject* item) {
613 if (PyIndex_Check(item)) {
614 Py_ssize_t index;
615 index = PyNumber_AsSsize_t(item, PyExc_IndexError);
616 if (index == -1 && PyErr_Occurred())
617 return NULL;
618 return GetItem(self, index);
619 }
620 // Materialize the list and delegate the operation to it.
621 ScopedPyObjectPtr list(PyObject_CallFunctionObjArgs(
622 reinterpret_cast<PyObject*>(&PyList_Type), self, NULL));
623 if (list == NULL) {
624 return NULL;
625 }
626 return Py_TYPE(list.get())->tp_as_mapping->mp_subscript(list.get(), item);
627 }
628
611 // Returns the position of the item in the sequence, of -1 if not found. 629 // Returns the position of the item in the sequence, of -1 if not found.
612 // This function never fails. 630 // This function never fails.
613 int Find(PyContainer* self, PyObject* item) { 631 int Find(PyContainer* self, PyObject* item) {
614 // The item can only be in one position: item.index. 632 // The item can only be in one position: item.index.
615 // Check that self[item.index] == item, it's faster than a linear search. 633 // Check that self[item.index] == item, it's faster than a linear search.
616 // 634 //
617 // This assumes that sequences are only defined by syntax of the .proto file: 635 // This assumes that sequences are only defined by syntax of the .proto file:
618 // a specific item belongs to only one sequence, depending on its position in 636 // a specific item belongs to only one sequence, depending on its position in
619 // the .proto file definition. 637 // the .proto file definition.
620 const void* descriptor_ptr = PyDescriptor_AsVoidPtr(item); 638 const void* descriptor_ptr = PyDescriptor_AsVoidPtr(item);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 714
697 static PyMethodDef SeqMethods[] = { 715 static PyMethodDef SeqMethods[] = {
698 { "index", (PyCFunction)Index, METH_O, }, 716 { "index", (PyCFunction)Index, METH_O, },
699 { "count", (PyCFunction)Count, METH_O, }, 717 { "count", (PyCFunction)Count, METH_O, },
700 { "append", (PyCFunction)Append, METH_O, }, 718 { "append", (PyCFunction)Append, METH_O, },
701 { "__reversed__", (PyCFunction)Reversed, METH_NOARGS, }, 719 { "__reversed__", (PyCFunction)Reversed, METH_NOARGS, },
702 {NULL} 720 {NULL}
703 }; 721 };
704 722
705 static PySequenceMethods SeqSequenceMethods = { 723 static PySequenceMethods SeqSequenceMethods = {
706 (lenfunc)Length, // sq_length 724 (lenfunc)Length, // sq_length
707 0, // sq_concat 725 0, // sq_concat
708 0, // sq_repeat 726 0, // sq_repeat
709 (ssizeargfunc)GetItem, // sq_item 727 (ssizeargfunc)GetItem, // sq_item
710 0, // sq_slice 728 0, // sq_slice
711 0, // sq_ass_item 729 0, // sq_ass_item
712 0, // sq_ass_slice 730 0, // sq_ass_slice
713 (objobjproc)SeqContains, // sq_contains 731 (objobjproc)SeqContains, // sq_contains
732 };
733
734 static PyMappingMethods SeqMappingMethods = {
735 (lenfunc)Length, // mp_length
736 (binaryfunc)SeqSubscript, // mp_subscript
737 0, // mp_ass_subscript
714 }; 738 };
715 739
716 PyTypeObject DescriptorSequence_Type = { 740 PyTypeObject DescriptorSequence_Type = {
717 PyVarObject_HEAD_INIT(&PyType_Type, 0) 741 PyVarObject_HEAD_INIT(&PyType_Type, 0)
718 "DescriptorSequence", // tp_name 742 "DescriptorSequence", // tp_name
719 sizeof(PyContainer), // tp_basicsize 743 sizeof(PyContainer), // tp_basicsize
720 0, // tp_itemsize 744 0, // tp_itemsize
721 0, // tp_dealloc 745 0, // tp_dealloc
722 0, // tp_print 746 0, // tp_print
723 0, // tp_getattr 747 0, // tp_getattr
724 0, // tp_setattr 748 0, // tp_setattr
725 0, // tp_compare 749 0, // tp_compare
726 (reprfunc)ContainerRepr, // tp_repr 750 (reprfunc)ContainerRepr, // tp_repr
727 0, // tp_as_number 751 0, // tp_as_number
728 &SeqSequenceMethods, // tp_as_sequence 752 &SeqSequenceMethods, // tp_as_sequence
729 0, // tp_as_mapping 753 &SeqMappingMethods, // tp_as_mapping
730 0, // tp_hash 754 0, // tp_hash
731 0, // tp_call 755 0, // tp_call
732 0, // tp_str 756 0, // tp_str
733 0, // tp_getattro 757 0, // tp_getattro
734 0, // tp_setattro 758 0, // tp_setattro
735 0, // tp_as_buffer 759 0, // tp_as_buffer
736 Py_TPFLAGS_DEFAULT, // tp_flags 760 Py_TPFLAGS_DEFAULT, // tp_flags
737 0, // tp_doc 761 0, // tp_doc
738 0, // tp_traverse 762 0, // tp_traverse
739 0, // tp_clear 763 0, // tp_clear
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after
1400 }; 1424 };
1401 1425
1402 } // namespace fields 1426 } // namespace fields
1403 1427
1404 PyObject* NewOneofFieldsSeq(ParentDescriptor descriptor) { 1428 PyObject* NewOneofFieldsSeq(ParentDescriptor descriptor) {
1405 return descriptor::NewSequence(&fields::ContainerDef, descriptor); 1429 return descriptor::NewSequence(&fields::ContainerDef, descriptor);
1406 } 1430 }
1407 1431
1408 } // namespace oneof_descriptor 1432 } // namespace oneof_descriptor
1409 1433
1434 namespace service_descriptor {
1435
1436 typedef const ServiceDescriptor* ParentDescriptor;
1437
1438 static ParentDescriptor GetDescriptor(PyContainer* self) {
1439 return reinterpret_cast<ParentDescriptor>(self->descriptor);
1440 }
1441
1442 namespace methods {
1443
1444 typedef const MethodDescriptor* ItemDescriptor;
1445
1446 static int Count(PyContainer* self) {
1447 return GetDescriptor(self)->method_count();
1448 }
1449
1450 static ItemDescriptor GetByName(PyContainer* self, const string& name) {
1451 return GetDescriptor(self)->FindMethodByName(name);
1452 }
1453
1454 static ItemDescriptor GetByIndex(PyContainer* self, int index) {
1455 return GetDescriptor(self)->method(index);
1456 }
1457
1458 static PyObject* NewObjectFromItem(ItemDescriptor item) {
1459 return PyMethodDescriptor_FromDescriptor(item);
1460 }
1461
1462 static const string& GetItemName(ItemDescriptor item) {
1463 return item->name();
1464 }
1465
1466 static int GetItemIndex(ItemDescriptor item) {
1467 return item->index();
1468 }
1469
1470 static DescriptorContainerDef ContainerDef = {
1471 "ServiceMethods",
1472 (CountMethod)Count,
1473 (GetByIndexMethod)GetByIndex,
1474 (GetByNameMethod)GetByName,
1475 (GetByCamelcaseNameMethod)NULL,
1476 (GetByNumberMethod)NULL,
1477 (NewObjectFromItemMethod)NewObjectFromItem,
1478 (GetItemNameMethod)GetItemName,
1479 (GetItemCamelcaseNameMethod)NULL,
1480 (GetItemNumberMethod)NULL,
1481 (GetItemIndexMethod)GetItemIndex,
1482 };
1483
1484 } // namespace methods
1485
1486 PyObject* NewServiceMethodsSeq(ParentDescriptor descriptor) {
1487 return descriptor::NewSequence(&methods::ContainerDef, descriptor);
1488 }
1489
1490 PyObject* NewServiceMethodsByName(ParentDescriptor descriptor) {
1491 return descriptor::NewMappingByName(&methods::ContainerDef, descriptor);
1492 }
1493
1494 } // namespace service_descriptor
1495
1410 namespace file_descriptor { 1496 namespace file_descriptor {
1411 1497
1412 typedef const FileDescriptor* ParentDescriptor; 1498 typedef const FileDescriptor* ParentDescriptor;
1413 1499
1414 static ParentDescriptor GetDescriptor(PyContainer* self) { 1500 static ParentDescriptor GetDescriptor(PyContainer* self) {
1415 return reinterpret_cast<ParentDescriptor>(self->descriptor); 1501 return reinterpret_cast<ParentDescriptor>(self->descriptor);
1416 } 1502 }
1417 1503
1418 namespace messages { 1504 namespace messages {
1419 1505
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1452 (GetByNumberMethod)NULL, 1538 (GetByNumberMethod)NULL,
1453 (NewObjectFromItemMethod)NewObjectFromItem, 1539 (NewObjectFromItemMethod)NewObjectFromItem,
1454 (GetItemNameMethod)GetItemName, 1540 (GetItemNameMethod)GetItemName,
1455 (GetItemCamelcaseNameMethod)NULL, 1541 (GetItemCamelcaseNameMethod)NULL,
1456 (GetItemNumberMethod)NULL, 1542 (GetItemNumberMethod)NULL,
1457 (GetItemIndexMethod)GetItemIndex, 1543 (GetItemIndexMethod)GetItemIndex,
1458 }; 1544 };
1459 1545
1460 } // namespace messages 1546 } // namespace messages
1461 1547
1462 PyObject* NewFileMessageTypesByName(const FileDescriptor* descriptor) { 1548 PyObject* NewFileMessageTypesByName(ParentDescriptor descriptor) {
1463 return descriptor::NewMappingByName(&messages::ContainerDef, descriptor); 1549 return descriptor::NewMappingByName(&messages::ContainerDef, descriptor);
1464 } 1550 }
1465 1551
1466 namespace enums { 1552 namespace enums {
1467 1553
1468 typedef const EnumDescriptor* ItemDescriptor; 1554 typedef const EnumDescriptor* ItemDescriptor;
1469 1555
1470 static int Count(PyContainer* self) { 1556 static int Count(PyContainer* self) {
1471 return GetDescriptor(self)->enum_type_count(); 1557 return GetDescriptor(self)->enum_type_count();
1472 } 1558 }
(...skipping 27 matching lines...) Expand all
1500 (GetByNumberMethod)NULL, 1586 (GetByNumberMethod)NULL,
1501 (NewObjectFromItemMethod)NewObjectFromItem, 1587 (NewObjectFromItemMethod)NewObjectFromItem,
1502 (GetItemNameMethod)GetItemName, 1588 (GetItemNameMethod)GetItemName,
1503 (GetItemCamelcaseNameMethod)NULL, 1589 (GetItemCamelcaseNameMethod)NULL,
1504 (GetItemNumberMethod)NULL, 1590 (GetItemNumberMethod)NULL,
1505 (GetItemIndexMethod)GetItemIndex, 1591 (GetItemIndexMethod)GetItemIndex,
1506 }; 1592 };
1507 1593
1508 } // namespace enums 1594 } // namespace enums
1509 1595
1510 PyObject* NewFileEnumTypesByName(const FileDescriptor* descriptor) { 1596 PyObject* NewFileEnumTypesByName(ParentDescriptor descriptor) {
1511 return descriptor::NewMappingByName(&enums::ContainerDef, descriptor); 1597 return descriptor::NewMappingByName(&enums::ContainerDef, descriptor);
1512 } 1598 }
1513 1599
1514 namespace extensions { 1600 namespace extensions {
1515 1601
1516 typedef const FieldDescriptor* ItemDescriptor; 1602 typedef const FieldDescriptor* ItemDescriptor;
1517 1603
1518 static int Count(PyContainer* self) { 1604 static int Count(PyContainer* self) {
1519 return GetDescriptor(self)->extension_count(); 1605 return GetDescriptor(self)->extension_count();
1520 } 1606 }
(...skipping 27 matching lines...) Expand all
1548 (GetByNumberMethod)NULL, 1634 (GetByNumberMethod)NULL,
1549 (NewObjectFromItemMethod)NewObjectFromItem, 1635 (NewObjectFromItemMethod)NewObjectFromItem,
1550 (GetItemNameMethod)GetItemName, 1636 (GetItemNameMethod)GetItemName,
1551 (GetItemCamelcaseNameMethod)NULL, 1637 (GetItemCamelcaseNameMethod)NULL,
1552 (GetItemNumberMethod)NULL, 1638 (GetItemNumberMethod)NULL,
1553 (GetItemIndexMethod)GetItemIndex, 1639 (GetItemIndexMethod)GetItemIndex,
1554 }; 1640 };
1555 1641
1556 } // namespace extensions 1642 } // namespace extensions
1557 1643
1558 PyObject* NewFileExtensionsByName(const FileDescriptor* descriptor) { 1644 PyObject* NewFileExtensionsByName(ParentDescriptor descriptor) {
1559 return descriptor::NewMappingByName(&extensions::ContainerDef, descriptor); 1645 return descriptor::NewMappingByName(&extensions::ContainerDef, descriptor);
1560 } 1646 }
1561 1647
1648 namespace services {
1649
1650 typedef const ServiceDescriptor* ItemDescriptor;
1651
1652 static int Count(PyContainer* self) {
1653 return GetDescriptor(self)->service_count();
1654 }
1655
1656 static ItemDescriptor GetByName(PyContainer* self, const string& name) {
1657 return GetDescriptor(self)->FindServiceByName(name);
1658 }
1659
1660 static ItemDescriptor GetByIndex(PyContainer* self, int index) {
1661 return GetDescriptor(self)->service(index);
1662 }
1663
1664 static PyObject* NewObjectFromItem(ItemDescriptor item) {
1665 return PyServiceDescriptor_FromDescriptor(item);
1666 }
1667
1668 static const string& GetItemName(ItemDescriptor item) {
1669 return item->name();
1670 }
1671
1672 static int GetItemIndex(ItemDescriptor item) {
1673 return item->index();
1674 }
1675
1676 static DescriptorContainerDef ContainerDef = {
1677 "FileServices",
1678 (CountMethod)Count,
1679 (GetByIndexMethod)GetByIndex,
1680 (GetByNameMethod)GetByName,
1681 (GetByCamelcaseNameMethod)NULL,
1682 (GetByNumberMethod)NULL,
1683 (NewObjectFromItemMethod)NewObjectFromItem,
1684 (GetItemNameMethod)GetItemName,
1685 (GetItemCamelcaseNameMethod)NULL,
1686 (GetItemNumberMethod)NULL,
1687 (GetItemIndexMethod)GetItemIndex,
1688 };
1689
1690 } // namespace services
1691
1692 PyObject* NewFileServicesByName(const FileDescriptor* descriptor) {
1693 return descriptor::NewMappingByName(&services::ContainerDef, descriptor);
1694 }
1695
1562 namespace dependencies { 1696 namespace dependencies {
1563 1697
1564 typedef const FileDescriptor* ItemDescriptor; 1698 typedef const FileDescriptor* ItemDescriptor;
1565 1699
1566 static int Count(PyContainer* self) { 1700 static int Count(PyContainer* self) {
1567 return GetDescriptor(self)->dependency_count(); 1701 return GetDescriptor(self)->dependency_count();
1568 } 1702 }
1569 1703
1570 static ItemDescriptor GetByIndex(PyContainer* self, int index) { 1704 static ItemDescriptor GetByIndex(PyContainer* self, int index) {
1571 return GetDescriptor(self)->dependency(index); 1705 return GetDescriptor(self)->dependency(index);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1643 if (PyType_Ready(&descriptor::DescriptorSequence_Type) < 0) 1777 if (PyType_Ready(&descriptor::DescriptorSequence_Type) < 0)
1644 return false; 1778 return false;
1645 if (PyType_Ready(&descriptor::ContainerIterator_Type) < 0) 1779 if (PyType_Ready(&descriptor::ContainerIterator_Type) < 0)
1646 return false; 1780 return false;
1647 return true; 1781 return true;
1648 } 1782 }
1649 1783
1650 } // namespace python 1784 } // namespace python
1651 } // namespace protobuf 1785 } // namespace protobuf
1652 } // namespace google 1786 } // namespace google
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698