Commit c3480926 authored by Paul Yang's avatar Paul Yang

Merge pull request #402 from thomasvl/objc_on_win

Getting the ObjC generator building on Windows.
parents 3668a224 ce55ff94
...@@ -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