Commit 1900c536 authored by kenton@google.com's avatar kenton@google.com

Fix compile for GCC 3.4.4.

parent 39671e53
...@@ -61,6 +61,7 @@ namespace protobuf { ...@@ -61,6 +61,7 @@ namespace protobuf {
} }
namespace internal { namespace internal {
class FieldSkipper; // wire_format_lite.h class FieldSkipper; // wire_format_lite.h
class RepeatedPtrFieldBase; // repeated_field.h
} }
template <typename Element> class RepeatedField; // repeated_field.h template <typename Element> class RepeatedField; // repeated_field.h
template <typename Element> class RepeatedPtrField; // repeated_field.h template <typename Element> class RepeatedPtrField; // repeated_field.h
...@@ -388,6 +389,15 @@ class LIBPROTOBUF_EXPORT ExtensionSet { ...@@ -388,6 +389,15 @@ class LIBPROTOBUF_EXPORT ExtensionSet {
const MessageLite* containing_type, const MessageLite* containing_type,
FieldSkipper* field_skipper); FieldSkipper* field_skipper);
// Hack: RepeatedPtrFieldBase declares ExtensionSet as a friend. This
// friendship should automatically extend to ExtensionSet::Extension, but
// unfortunately some older compilers (e.g. GCC 3.4.4) do not implement this
// correctly. So, we must provide helpers for calling methods of that
// class.
// Defined in extension_set_heavy.cc.
static inline int RepeatedMessage_SpaceUsedExcludingSelf(
RepeatedPtrFieldBase* field);
// The Extension struct is small enough to be passed by value, so we use it // The Extension struct is small enough to be passed by value, so we use it
// directly as the value type in the map rather than use pointers. We use // directly as the value type in the map rather than use pointers. We use
......
...@@ -165,6 +165,11 @@ int ExtensionSet::SpaceUsedExcludingSelf() const { ...@@ -165,6 +165,11 @@ int ExtensionSet::SpaceUsedExcludingSelf() const {
return total_size; return total_size;
} }
inline int ExtensionSet::RepeatedMessage_SpaceUsedExcludingSelf(
RepeatedPtrFieldBase* field) {
return field->SpaceUsedExcludingSelf<GenericTypeHandler<Message> >();
}
int ExtensionSet::Extension::SpaceUsedExcludingSelf() const { int ExtensionSet::Extension::SpaceUsedExcludingSelf() const {
int total_size = 0; int total_size = 0;
if (is_repeated) { if (is_repeated) {
...@@ -191,9 +196,7 @@ int ExtensionSet::Extension::SpaceUsedExcludingSelf() const { ...@@ -191,9 +196,7 @@ int ExtensionSet::Extension::SpaceUsedExcludingSelf() const {
// RepeatedPtrFieldBase::SpaceUsedExcludingSelf() with a different type // RepeatedPtrFieldBase::SpaceUsedExcludingSelf() with a different type
// handler. // handler.
total_size += sizeof(*repeated_message_value) + total_size += sizeof(*repeated_message_value) +
repeated_message_value-> RepeatedMessage_SpaceUsedExcludingSelf(repeated_message_value);
RepeatedPtrFieldBase::SpaceUsedExcludingSelf<
GenericTypeHandler<Message> >();
break; break;
} }
} else { } else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment