diff options
author | kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d> | 2008-09-24 20:31:01 +0000 |
---|---|---|
committer | kenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d> | 2008-09-24 20:31:01 +0000 |
commit | 24bf56fb3a2fab42d355b15de11782c3144b9e80 (patch) | |
tree | cf9cfeb512a4aa1b01ba85506e9f0a68f8817f12 /python/google/protobuf/reflection.py | |
parent | 3121a56ab46ecc7cd9cb135693ebe221b051029e (diff) | |
download | protobuf-24bf56fb3a2fab42d355b15de11782c3144b9e80.tar.gz protobuf-24bf56fb3a2fab42d355b15de11782c3144b9e80.tar.bz2 protobuf-24bf56fb3a2fab42d355b15de11782c3144b9e80.zip |
Integrate changes from internal Google-internal branch.
General
* License changed from Apache 2.0 to New BSD.
* It is now possible to define custom "options", which are basically
annotations which may be placed on definitions in a .proto file.
For example, you might define a field option called "foo" like so:
import "google/protobuf/descriptor.proto"
extend google.protobuf.FieldOptions {
optional string foo = 12345;
}
Then you annotate a field using the "foo" option:
message MyMessage {
optional int32 some_field = 1 [(foo) = "bar"]
}
The value of this option is then visible via the message's
Descriptor:
const FieldDescriptor* field =
MyMessage::descriptor()->FindFieldByName("some_field");
assert(field->options().GetExtension(foo) == "bar");
This feature has been implemented and tested in C++ and Java.
Other languages may or may not need to do extra work to support
custom options, depending on how they construct descriptors.
C++
* Fixed some GCC warnings that only occur when using -pedantic.
* Improved static initialization code, making ordering more
predictable among other things.
* TextFormat will no longer accept messages which contain multiple
instances of a singular field. Previously, the latter instance
would overwrite the former.
* Now works on systems that don't have hash_map.
Python
* Strings now use the "unicode" type rather than the "str" type.
String fields may still be assigned ASCII "str" values; they will
automatically be converted.
* Adding a property to an object representing a repeated field now
raises an exception. For example:
# No longer works (and never should have).
message.some_repeated_field.foo = 1
Diffstat (limited to 'python/google/protobuf/reflection.py')
-rwxr-xr-x | python/google/protobuf/reflection.py | 62 |
1 files changed, 44 insertions, 18 deletions
diff --git a/python/google/protobuf/reflection.py b/python/google/protobuf/reflection.py index ef054466..d80942e8 100755 --- a/python/google/protobuf/reflection.py +++ b/python/google/protobuf/reflection.py @@ -1,18 +1,32 @@ # Protocol Buffers - Google's data interchange format -# Copyright 2008 Google Inc. +# Copyright 2008 Google Inc. All rights reserved. # http://code.google.com/p/protobuf/ # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: # -# http://www.apache.org/licenses/LICENSE-2.0 +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # This code is meant to work on Python 2.4 and above only. # @@ -263,7 +277,7 @@ def _DefaultValueForField(message, field): return _RepeatedCompositeFieldContainer(listener, field.message_type) else: return _RepeatedScalarFieldContainer( - listener, type_checkers.VALUE_CHECKERS[field.cpp_type]) + listener, type_checkers.GetTypeChecker(field.cpp_type, field.type)) if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: assert field.default_value is None @@ -371,7 +385,7 @@ def _AddPropertiesForNonRepeatedScalarField(field, cls): python_field_name = _ValueFieldName(proto_field_name) has_field_name = _HasFieldName(proto_field_name) property_name = _PropertyName(proto_field_name) - type_checker = type_checkers.VALUE_CHECKERS[field.cpp_type] + type_checker = type_checkers.GetTypeChecker(field.cpp_type, field.type) def getter(self): return getattr(self, python_field_name) @@ -830,7 +844,7 @@ def _SkipField(field_number, wire_type, decoder): just after reading the the tag and wire type of the field. """ if wire_type == wire_format.WIRETYPE_VARINT: - decoder.ReadInt32() + decoder.ReadUInt64() elif wire_type == wire_format.WIRETYPE_FIXED64: decoder.ReadFixed64() elif wire_type == wire_format.WIRETYPE_LENGTH_DELIMITED: @@ -1260,8 +1274,10 @@ class _Listener(object): # TODO(robinson): Provide a clear() method here in addition to ClearField()? class _RepeatedScalarFieldContainer(object): - """Simple, type-checked, list-like container for holding repeated scalars. - """ + """Simple, type-checked, list-like container for holding repeated scalars.""" + + # Minimizes memory usage and disallows assignment to other attributes. + __slots__ = ['_message_listener', '_type_checker', '_values'] def __init__(self, message_listener, type_checker): """ @@ -1284,6 +1300,10 @@ class _RepeatedScalarFieldContainer(object): if len(self._values) == 1: self._message_listener.TransitionToNonempty() + def remove(self, elem): + self._values.remove(elem) + self._message_listener.ByteSizeDirty() + # List-like __getitem__() support also makes us iterable (via "iter(foo)" # or implicitly via "for i in mylist:") for free. def __getitem__(self, key): @@ -1320,8 +1340,10 @@ class _RepeatedScalarFieldContainer(object): # _RepeatedScalarFieldContaininer? class _RepeatedCompositeFieldContainer(object): - """Simple, list-like container for holding repeated composite fields. - """ + """Simple, list-like container for holding repeated composite fields.""" + + # Minimizes memory usage and disallows assignment to other attributes. + __slots__ = ['_values', '_message_descriptor', '_message_listener'] def __init__(self, message_listener, message_descriptor): """Note that we pass in a descriptor instead of the generated directly, @@ -1350,6 +1372,10 @@ class _RepeatedCompositeFieldContainer(object): self._message_listener.TransitionToNonempty() return new_element + def __delitem__(self, key): + self._message_listener.ByteSizeDirty() + del self._values[key] + # List-like __getitem__() support also makes us iterable (via "iter(foo)" # or implicitly via "for i in mylist:") for free. def __getitem__(self, key): @@ -1504,7 +1530,7 @@ class _ExtensionDict(object): and field.cpp_type != _FieldDescriptor.CPPTYPE_MESSAGE): # It's slightly wasteful to lookup the type checker each time, # but we expect this to be a vanishingly uncommon case anyway. - type_checker = type_checkers.VALUE_CHECKERS[field.cpp_type] + type_checker = type_checkers.GetTypeChecker(field.cpp_type, field.type) type_checker.CheckValue(value) self._values[handle_id] = value self._has_bits[handle_id] = True |