Index: third_party/protobuf/src/google/protobuf/compiler/java/java_helpers.cc |
diff --git a/third_party/protobuf/src/google/protobuf/compiler/java/java_helpers.cc b/third_party/protobuf/src/google/protobuf/compiler/java/java_helpers.cc |
index 7ed0c3cc185aa0ee4dcef10093656dc3a278a0a2..1b6f1653107147bd8d477bc9159a63c1ec6270ae 100644 |
--- a/third_party/protobuf/src/google/protobuf/compiler/java/java_helpers.cc |
+++ b/third_party/protobuf/src/google/protobuf/compiler/java/java_helpers.cc |
@@ -134,16 +134,27 @@ string FileClassName(const FileDescriptor* file) { |
} |
string FileJavaPackage(const FileDescriptor* file) { |
+ string result; |
+ |
if (file->options().has_java_package()) { |
- return file->options().java_package(); |
+ result = file->options().java_package(); |
} else { |
- string result = kDefaultPackage; |
+ result = kDefaultPackage; |
if (!file->package().empty()) { |
if (!result.empty()) result += '.'; |
result += file->package(); |
} |
- return result; |
} |
+ |
+ |
+ return result; |
+} |
+ |
+string JavaPackageToDir(string package_name) { |
+ string package_dir = |
+ StringReplace(package_name, ".", "/", true); |
+ if (!package_dir.empty()) package_dir += "/"; |
+ return package_dir; |
} |
string ToJavaName(const string& full_name, const FileDescriptor* file) { |
@@ -335,6 +346,132 @@ string DefaultValue(const FieldDescriptor* field) { |
return ""; |
} |
+bool IsDefaultValueJavaDefault(const FieldDescriptor* field) { |
+ // Switch on CppType since we need to know which default_value_* method |
+ // of FieldDescriptor to call. |
+ switch (field->cpp_type()) { |
+ case FieldDescriptor::CPPTYPE_INT32: |
+ return field->default_value_int32() == 0; |
+ case FieldDescriptor::CPPTYPE_UINT32: |
+ return field->default_value_uint32() == 0; |
+ case FieldDescriptor::CPPTYPE_INT64: |
+ return field->default_value_int64() == 0L; |
+ case FieldDescriptor::CPPTYPE_UINT64: |
+ return field->default_value_uint64() == 0L; |
+ case FieldDescriptor::CPPTYPE_DOUBLE: |
+ return field->default_value_double() == 0.0; |
+ case FieldDescriptor::CPPTYPE_FLOAT: |
+ return field->default_value_float() == 0.0; |
+ case FieldDescriptor::CPPTYPE_BOOL: |
+ return field->default_value_bool() == false; |
+ |
+ case FieldDescriptor::CPPTYPE_STRING: |
+ case FieldDescriptor::CPPTYPE_ENUM: |
+ case FieldDescriptor::CPPTYPE_MESSAGE: |
+ return false; |
+ |
+ // No default because we want the compiler to complain if any new |
+ // types are added. |
+ } |
+ |
+ GOOGLE_LOG(FATAL) << "Can't get here."; |
+ return false; |
+} |
+ |
+const char* bit_masks[] = { |
+ "0x00000001", |
+ "0x00000002", |
+ "0x00000004", |
+ "0x00000008", |
+ "0x00000010", |
+ "0x00000020", |
+ "0x00000040", |
+ "0x00000080", |
+ |
+ "0x00000100", |
+ "0x00000200", |
+ "0x00000400", |
+ "0x00000800", |
+ "0x00001000", |
+ "0x00002000", |
+ "0x00004000", |
+ "0x00008000", |
+ |
+ "0x00010000", |
+ "0x00020000", |
+ "0x00040000", |
+ "0x00080000", |
+ "0x00100000", |
+ "0x00200000", |
+ "0x00400000", |
+ "0x00800000", |
+ |
+ "0x01000000", |
+ "0x02000000", |
+ "0x04000000", |
+ "0x08000000", |
+ "0x10000000", |
+ "0x20000000", |
+ "0x40000000", |
+ "0x80000000", |
+}; |
+ |
+string GetBitFieldName(int index) { |
+ string varName = "bitField"; |
+ varName += SimpleItoa(index); |
+ varName += "_"; |
+ return varName; |
+} |
+ |
+string GetBitFieldNameForBit(int bitIndex) { |
+ return GetBitFieldName(bitIndex / 32); |
+} |
+ |
+string GenerateGetBit(int bitIndex) { |
+ string varName = GetBitFieldNameForBit(bitIndex); |
+ int bitInVarIndex = bitIndex % 32; |
+ |
+ string mask = bit_masks[bitInVarIndex]; |
+ string result = "((" + varName + " & " + mask + ") == " + mask + ")"; |
+ return result; |
+} |
+ |
+string GenerateSetBit(int bitIndex) { |
+ string varName = GetBitFieldNameForBit(bitIndex); |
+ int bitInVarIndex = bitIndex % 32; |
+ |
+ string mask = bit_masks[bitInVarIndex]; |
+ string result = varName + " |= " + mask; |
+ return result; |
+} |
+ |
+string GenerateClearBit(int bitIndex) { |
+ string varName = GetBitFieldNameForBit(bitIndex); |
+ int bitInVarIndex = bitIndex % 32; |
+ |
+ string mask = bit_masks[bitInVarIndex]; |
+ string result = varName + " = (" + varName + " & ~" + mask + ")"; |
+ return result; |
+} |
+ |
+string GenerateGetBitFromLocal(int bitIndex) { |
+ string varName = "from_" + GetBitFieldNameForBit(bitIndex); |
+ int bitInVarIndex = bitIndex % 32; |
+ |
+ string mask = bit_masks[bitInVarIndex]; |
+ string result = "((" + varName + " & " + mask + ") == " + mask + ")"; |
+ return result; |
+} |
+ |
+string GenerateSetBitToLocal(int bitIndex) { |
+ string varName = "to_" + GetBitFieldNameForBit(bitIndex); |
+ int bitInVarIndex = bitIndex % 32; |
+ |
+ string mask = bit_masks[bitInVarIndex]; |
+ string result = varName + " |= " + mask; |
+ return result; |
+} |
+ |
} // namespace java |
} // namespace compiler |
} // namespace protobuf |