Commit ce55ff94 authored by Thomas Van Lenten's avatar Thomas Van Lenten

Getting the ObjC generator building on Windows.

Remove the ClassList support (maybe bring it back in the future).
Trim the includes to hopefully get a working Window build.
Add some more returns after switches for compilers that warn even when all values of the enum are handled.
Use ghtonl instead of htonl.
Change the use of [u]int(8,32)_t within the ObjC generator code to [u]int(8,32) to match the rest of the compiler.
Add objective-c generator files to Visual Studio project.
parent 4324bf6b
...@@ -25,7 +25,7 @@ readonly ConstantName=GOOGLE_PROTOBUF_OBJC_GEN_VERSION ...@@ -25,7 +25,7 @@ readonly ConstantName=GOOGLE_PROTOBUF_OBJC_GEN_VERSION
readonly PluginSrc="${ProtoRootDir}/src/google/protobuf/compiler/objectivec/objectivec_file.cc" readonly PluginSrc="${ProtoRootDir}/src/google/protobuf/compiler/objectivec/objectivec_file.cc"
readonly PluginVersion=$( \ readonly PluginVersion=$( \
cat "${PluginSrc}" \ cat "${PluginSrc}" \
| sed -n -e "s:const int32_t ${ConstantName} = \([0-9]*\);:\1:p" | sed -n -e "s:const int32 ${ConstantName} = \([0-9]*\);:\1:p"
) )
if [[ -z "${PluginVersion}" ]] ; then if [[ -z "${PluginVersion}" ]] ; then
......
...@@ -77,7 +77,6 @@ ExtensionGenerator::ExtensionGenerator(const string& root_class_name, ...@@ -77,7 +77,6 @@ ExtensionGenerator::ExtensionGenerator(const string& root_class_name,
ExtensionGenerator::~ExtensionGenerator() {} ExtensionGenerator::~ExtensionGenerator() {}
void ExtensionGenerator::GenerateMembersHeader(io::Printer* printer) { void ExtensionGenerator::GenerateMembersHeader(io::Printer* printer) {
WriteClassNameToClassList(root_class_and_method_name_);
if (IsFiltered()) { if (IsFiltered()) {
printer->Print("// $filter_reason$\n\n", "filter_reason", filter_reason_); printer->Print("// $filter_reason$\n\n", "filter_reason", filter_reason_);
return; return;
......
...@@ -39,10 +39,6 @@ ...@@ -39,10 +39,6 @@
#include <google/protobuf/stubs/common.h> #include <google/protobuf/stubs/common.h>
#include <google/protobuf/stubs/strutil.h> #include <google/protobuf/stubs/strutil.h>
#ifndef htonl
#include <netinet/in.h>
#endif
namespace google { namespace google {
namespace protobuf { namespace protobuf {
namespace compiler { namespace compiler {
...@@ -107,7 +103,7 @@ void SetCommonFieldVariables(const FieldDescriptor* descriptor, ...@@ -107,7 +103,7 @@ void SetCommonFieldVariables(const FieldDescriptor* descriptor,
string field_options = descriptor->options().SerializeAsString(); string field_options = descriptor->options().SerializeAsString();
// Must convert to a standard byte order for packing length into // Must convert to a standard byte order for packing length into
// a cstring. // a cstring.
uint32_t length = htonl(field_options.length()); uint32 length = ghtonl(field_options.length());
if (length > 0) { if (length > 0) {
string bytes((const char*)&length, sizeof(length)); string bytes((const char*)&length, sizeof(length));
bytes.append(field_options); bytes.append(field_options);
......
...@@ -40,13 +40,14 @@ ...@@ -40,13 +40,14 @@
#include <google/protobuf/stubs/strutil.h> #include <google/protobuf/stubs/strutil.h>
#include <sstream> #include <sstream>
namespace google {
namespace protobuf {
// This is also found in GPBBootstrap.h, and needs to be kept in sync. It // This is also found in GPBBootstrap.h, and needs to be kept in sync. It
// is the version check done to ensure generated code works with the current // is the version check done to ensure generated code works with the current
// runtime being used. // runtime being used.
const int32_t GOOGLE_PROTOBUF_OBJC_GEN_VERSION = 30000; const int32 GOOGLE_PROTOBUF_OBJC_GEN_VERSION = 30000;
namespace google {
namespace protobuf {
namespace compiler { namespace compiler {
namespace objectivec { namespace objectivec {
FileGenerator::FileGenerator(const FileDescriptor *file) FileGenerator::FileGenerator(const FileDescriptor *file)
......
...@@ -82,10 +82,6 @@ bool ObjectiveCGenerator::Generate(const FileDescriptor* file, ...@@ -82,10 +82,6 @@ bool ObjectiveCGenerator::Generate(const FileDescriptor* file,
file_generator.GenerateSource(&printer); file_generator.GenerateSource(&printer);
} }
if (!WriteClassList(error)) {
return false;
}
return true; return true;
} }
......
...@@ -28,12 +28,6 @@ ...@@ -28,12 +28,6 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <arpa/inet.h>
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
#include <unistd.h>
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
...@@ -46,14 +40,6 @@ ...@@ -46,14 +40,6 @@
#include <google/protobuf/descriptor.pb.h> #include <google/protobuf/descriptor.pb.h>
#include <google/protobuf/stubs/strutil.h> #include <google/protobuf/stubs/strutil.h>
#ifndef htonl
#include <netinet/in.h>
#endif
#ifndef O_EXLOCK
#include <sys/file.h>
#endif
// NOTE: src/google/protobuf/compiler/plugin.cc makes use of cerr for some // NOTE: src/google/protobuf/compiler/plugin.cc makes use of cerr for some
// error case, so it seem to be ok to use as a back door for errors. // error case, so it seem to be ok to use as a back door for errors.
...@@ -65,7 +51,6 @@ namespace objectivec { ...@@ -65,7 +51,6 @@ namespace objectivec {
namespace { namespace {
hash_set<string> gClassWhitelist; hash_set<string> gClassWhitelist;
stringstream gClassListStream;
// islower()/isupper()/tolower()/toupper() change based on locale. // islower()/isupper()/tolower()/toupper() change based on locale.
...@@ -754,7 +739,7 @@ string DefaultValue(const FieldDescriptor* field) { ...@@ -754,7 +739,7 @@ string DefaultValue(const FieldDescriptor* field) {
// Must convert to a standard byte order for packing length into // Must convert to a standard byte order for packing length into
// a cstring. // a cstring.
uint32_t length = htonl(default_string.length()); uint32 length = ghtonl(default_string.length());
string bytes((const char*)&length, sizeof(length)); string bytes((const char*)&length, sizeof(length));
bytes.append(default_string); bytes.append(default_string);
return "(NSData*)\"" + CEscape(bytes) + "\""; return "(NSData*)\"" + CEscape(bytes) + "\"";
...@@ -809,60 +794,6 @@ string BuildCommentsString(const SourceLocation& location) { ...@@ -809,60 +794,6 @@ string BuildCommentsString(const SourceLocation& location) {
return final_comments; return final_comments;
} }
bool WriteClassList(string* error) {
const char* file_name = getenv("GPB_CLASSLIST_PATH");
if (file_name != NULL) {
#ifndef O_EXLOCK
int fd = open(file_name, O_WRONLY | O_APPEND | O_CREAT,
(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH));
#else
int fd = open(file_name, O_WRONLY | O_APPEND | O_EXLOCK | O_CREAT,
(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH));
#endif
if (fd == -1) {
if (error != NULL) {
stringstream err_stream;
err_stream << endl << file_name << ":0:0: error:"
<< "Unable to open (" << errno << ")";
*error = err_stream.str();
}
return false;
}
#ifndef O_EXLOCK
if (flock(fd, LOCK_EX) < 0) {
if (error != NULL) {
stringstream err_stream;
err_stream << endl << file_name << ":0:0: error:"
<< "Unable to lock (" << errno << ")";
*error = err_stream.str();
}
return false;
}
#endif
// Need a local to hold the list so the cstring stays valid for the
// write call.
const string& class_list_str = gClassListStream.str();
int write_out = write(fd, class_list_str.c_str(), class_list_str.length());
int close_out = close(fd);
if (write_out == -1 || close_out == -1) {
if (error != NULL) {
stringstream err_stream;
err_stream << endl << file_name << ":0:0: error:"
<< "Unable to write (" << errno << ")";
*error = err_stream.str();
}
return false;
}
}
return true;
}
void WriteClassNameToClassList(const string& name) {
if (gClassListStream.good()) {
gClassListStream << name << '\n';
}
}
bool InitializeClassWhitelist(string* error) { bool InitializeClassWhitelist(string* error) {
const char* env_var_value = getenv("GPB_OBJC_CLASS_WHITELIST_PATHS"); const char* env_var_value = getenv("GPB_OBJC_CLASS_WHITELIST_PATHS");
if (env_var_value == NULL) { if (env_var_value == NULL) {
...@@ -917,7 +848,7 @@ bool FilterClass(const string& name) { ...@@ -917,7 +848,7 @@ bool FilterClass(const string& name) {
return gClassWhitelist.size() > 0; return gClassWhitelist.size() > 0;
} }
void TextFormatDecodeData::AddString(int32_t key, void TextFormatDecodeData::AddString(int32 key,
const string& input_for_decode, const string& input_for_decode,
const string& desired_output) { const string& desired_output) {
for (vector<DataEntry>::const_iterator i = entries_.begin(); for (vector<DataEntry>::const_iterator i = entries_.begin();
...@@ -973,14 +904,14 @@ class DecodeDataBuilder { ...@@ -973,14 +904,14 @@ class DecodeDataBuilder {
} }
private: private:
static const uint8_t kAddUnderscore = 0b10000000; static const uint8 kAddUnderscore = 0x80;
static const uint8_t kOpAsIs = 0b00000000; static const uint8 kOpAsIs = 0x00;
static const uint8_t kOpFirstUpper = 0b01000000; static const uint8 kOpFirstUpper = 0x40;
static const uint8_t kOpFirstLower = 0b00100000; static const uint8 kOpFirstLower = 0x20;
static const uint8_t kOpAllUpper = 0b01100000; static const uint8 kOpAllUpper = 0x60;
static const int kMaxSegmentLen = 0b00011111; static const int kMaxSegmentLen = 0x1f;
void AddChar(const char desired) { void AddChar(const char desired) {
++segment_len_; ++segment_len_;
...@@ -988,7 +919,7 @@ class DecodeDataBuilder { ...@@ -988,7 +919,7 @@ class DecodeDataBuilder {
} }
void Push() { void Push() {
uint8_t op = (op_ | segment_len_); uint8 op = (op_ | segment_len_);
if (need_underscore_) op |= kAddUnderscore; if (need_underscore_) op |= kAddUnderscore;
if (op != 0) { if (op != 0) {
decode_data_ += (char)op; decode_data_ += (char)op;
...@@ -1020,7 +951,7 @@ class DecodeDataBuilder { ...@@ -1020,7 +951,7 @@ class DecodeDataBuilder {
bool need_underscore_; bool need_underscore_;
bool is_all_upper_; bool is_all_upper_;
uint8_t op_; uint8 op_;
int segment_len_; int segment_len_;
string decode_data_; string decode_data_;
......
...@@ -142,9 +142,6 @@ string BuildFlagsString(const vector<string>& strings); ...@@ -142,9 +142,6 @@ string BuildFlagsString(const vector<string>& strings);
string BuildCommentsString(const SourceLocation& location); string BuildCommentsString(const SourceLocation& location);
bool WriteClassList(string* error);
void WriteClassNameToClassList(const string& name);
bool InitializeClassWhitelist(string* error); bool InitializeClassWhitelist(string* error);
bool FilterClass(const string& name); bool FilterClass(const string& name);
...@@ -154,7 +151,7 @@ class TextFormatDecodeData { ...@@ -154,7 +151,7 @@ class TextFormatDecodeData {
public: public:
TextFormatDecodeData() {} TextFormatDecodeData() {}
void AddString(int32_t key, const string& input_for_decode, void AddString(int32 key, const string& input_for_decode,
const string& desired_output); const string& desired_output);
size_t num_entries() const { return entries_.size(); } size_t num_entries() const { return entries_.size(); }
string Data() const; string Data() const;
...@@ -165,7 +162,7 @@ class TextFormatDecodeData { ...@@ -165,7 +162,7 @@ class TextFormatDecodeData {
private: private:
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormatDecodeData); GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormatDecodeData);
typedef std::pair<int32_t, string> DataEntry; typedef std::pair<int32, string> DataEntry;
vector<DataEntry> entries_; vector<DataEntry> entries_;
}; };
......
...@@ -150,7 +150,7 @@ TEST(ObjCHelper, TextFormatDecodeData_RawStrings) { ...@@ -150,7 +150,7 @@ TEST(ObjCHelper, TextFormatDecodeData_RawStrings) {
EXPECT_EQ(4, decode_data.num_entries()); EXPECT_EQ(4, decode_data.num_entries());
uint8_t expected_data[] = { uint8 expected_data[] = {
0x4, 0x4,
0x1, 0x0, 'z', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'I', 'J', 0x0, 0x1, 0x0, 'z', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'I', 'J', 0x0,
0x3, 0x0, 'a', 'b', 'c', 'd', 'e', 'z', 'g', 'h', 'I', 'J', 0x0, 0x3, 0x0, 'a', 'b', 'c', 'd', 'e', 'z', 'g', 'h', 'I', 'J', 0x0,
...@@ -175,7 +175,7 @@ TEST(ObjCHelper, TextFormatDecodeData_ByteCodes) { ...@@ -175,7 +175,7 @@ TEST(ObjCHelper, TextFormatDecodeData_ByteCodes) {
EXPECT_EQ(5, decode_data.num_entries()); EXPECT_EQ(5, decode_data.num_entries());
uint8_t expected_data[] = { uint8 expected_data[] = {
0x5, 0x5,
// All as is (00 op) // All as is (00 op)
0x1, 0x0A, 0x0, 0x1, 0x0A, 0x0,
......
...@@ -119,6 +119,9 @@ int OrderGroupForFieldDescriptor(const FieldDescriptor* descriptor) { ...@@ -119,6 +119,9 @@ int OrderGroupForFieldDescriptor(const FieldDescriptor* descriptor) {
case FieldDescriptor::TYPE_BOOL: case FieldDescriptor::TYPE_BOOL:
return 1; return 1;
} }
GOOGLE_LOG(FATAL) << "Can't get here.";
return 0;
} }
struct FieldOrderingByStorageSize { struct FieldOrderingByStorageSize {
...@@ -303,8 +306,6 @@ void MessageGenerator::GenerateMessageHeader(io::Printer* printer) { ...@@ -303,8 +306,6 @@ void MessageGenerator::GenerateMessageHeader(io::Printer* printer) {
return; return;
} }
WriteClassNameToClassList(class_name_);
if (IsFiltered()) { if (IsFiltered()) {
printer->Print("// $filter_reason$\n\n", printer->Print("// $filter_reason$\n\n",
"filter_reason", filter_reason_); "filter_reason", filter_reason_);
......
...@@ -76,6 +76,9 @@ const char* PrimitiveTypeName(const FieldDescriptor* descriptor) { ...@@ -76,6 +76,9 @@ const char* PrimitiveTypeName(const FieldDescriptor* descriptor) {
case OBJECTIVECTYPE_MESSAGE: case OBJECTIVECTYPE_MESSAGE:
return NULL; return NULL;
} }
GOOGLE_LOG(FATAL) << "Can't get here.";
return NULL;
} }
const char* PrimitiveArrayTypeName(const FieldDescriptor* descriptor) { const char* PrimitiveArrayTypeName(const FieldDescriptor* descriptor) {
...@@ -104,6 +107,9 @@ const char* PrimitiveArrayTypeName(const FieldDescriptor* descriptor) { ...@@ -104,6 +107,9 @@ const char* PrimitiveArrayTypeName(const FieldDescriptor* descriptor) {
case OBJECTIVECTYPE_MESSAGE: case OBJECTIVECTYPE_MESSAGE:
return ""; // Want NSArray return ""; // Want NSArray
} }
GOOGLE_LOG(FATAL) << "Can't get here.";
return NULL;
} }
void SetPrimitiveVariables(const FieldDescriptor* descriptor, void SetPrimitiveVariables(const FieldDescriptor* descriptor,
...@@ -155,7 +161,6 @@ void RepeatedPrimitiveFieldGenerator::FinishInitialization(void) { ...@@ -155,7 +161,6 @@ void RepeatedPrimitiveFieldGenerator::FinishInitialization(void) {
} }
} }
} // namespace objectivec } // namespace objectivec
} // namespace compiler } // namespace compiler
} // namespace protobuf } // namespace protobuf
......
...@@ -371,6 +371,54 @@ ...@@ -371,6 +371,54 @@
<File RelativePath="..\src\google\protobuf\compiler\javanano\javanano_message.h"></File> <File RelativePath="..\src\google\protobuf\compiler\javanano\javanano_message.h"></File>
<File RelativePath="..\src\google\protobuf\compiler\javanano\javanano_params.h"></File> <File RelativePath="..\src\google\protobuf\compiler\javanano\javanano_params.h"></File>
<File RelativePath="..\src\google\protobuf\compiler\javanano\javanano_primitive_field.h"></File> <File RelativePath="..\src\google\protobuf\compiler\javanano\javanano_primitive_field.h"></File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_enum.h"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_enum_field.h"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_extension.h"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_field.h"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_file.h"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_generator.h"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_helpers.h"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_map_field.h"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_message.h"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_message_field.h"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_oneof.h"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_primitive_field.h"
>
</File>
<File <File
RelativePath="..\src\google\protobuf\compiler\python\python_generator.h" RelativePath="..\src\google\protobuf\compiler\python\python_generator.h"
> >
...@@ -635,6 +683,54 @@ ...@@ -635,6 +683,54 @@
RelativePath="..\src\google\protobuf\compiler\javanano\javanano_primitive_field.cc" RelativePath="..\src\google\protobuf\compiler\javanano\javanano_primitive_field.cc"
> >
</File> </File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_enum.cc"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_enum_field.cc"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_extension.cc"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_field.cc"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_file.cc"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_generator.cc"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_helpers.cc"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_map_field.cc"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_message.cc"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_message_field.cc"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_oneof.cc"
>
</File>
<File
RelativePath="..\src\google\protobuf\compiler\objectivec\objectivec_primitive_field.cc"
>
</File>
<File <File
RelativePath="..\src\google\protobuf\compiler\plugin.cc" RelativePath="..\src\google\protobuf\compiler\plugin.cc"
> >
......
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