Эх сурвалжийг харах

Add new files for vcprojs, fix issues: 165, 211, 228, 240

liujisi@google.com 15 жил өмнө
parent
commit
1fd96c43a0

+ 55 - 43
m4/stl_hash.m4

@@ -1,60 +1,72 @@
-# We check two things: where the include file is for hash_map, and
-# what namespace hash_map lives in within that include file.  We
+# We check two things: where the include file is for
+# unordered_map/hash_map (we prefer the first form), and what
+# namespace unordered/hash_map lives in within that include file.  We
 # include AC_TRY_COMPILE for all the combinations we've seen in the
-# wild.  We define one of HAVE_HASH_MAP or HAVE_EXT_HASH_MAP depending
-# on location, and HASH_NAMESPACE to be the namespace hash_map is
-# defined in.
-#
-# Ideally we'd use AC_CACHE_CHECK, but that only lets us store one value
-# at a time, and we need to store two (filename and namespace).
-# prints messages itself, so we have to do the message-printing ourselves
-# via AC_MSG_CHECKING + AC_MSG_RESULT.  (TODO(csilvers): can we cache?)
+# wild.  We define HASH_MAP_H to the location of the header file, and
+# HASH_NAMESPACE to the namespace the class (unordered_map or
+# hash_map) is in.  We define HAVE_UNORDERED_MAP if the class we found
+# is named unordered_map, or leave it undefined if not.
 
+# This also checks if unordered map exists.
 AC_DEFUN([AC_CXX_STL_HASH],
-  [AC_MSG_CHECKING(the location of hash_map)
-  AC_LANG_SAVE
+  [
+   AC_MSG_CHECKING(the location of hash_map)
+   AC_LANG_SAVE
    AC_LANG_CPLUSPLUS
-   ac_cv_cxx_hash_map_header=""
-   ac_cv_cxx_hash_map_class=""
-   for location in [tr1/unordered_map ext/hash_map hash_map]; do
-     for namespace in [std::tr1 __gnu_cxx "" std stdext]; do
-       for name in [unordered_map hash_map]; do
-
-         if test -z "$ac_cv_cxx_hash_map_header"; then
-
-           # On OSX 1.5 / GCC 4.0.1 (the standard compiler on that platform),
-           # calling find() on a const unordered_map does not compile.  So, we
-           # include a call to find() in our test to detect this broken
-           # implementation and avoid using it.  Note that ext/hash_map works
-           # fine on this platform, so we'll end up using that.
-           AC_TRY_COMPILE([#include <$location>],
-                          [const ${namespace}::$name<int, int> t;
-                           t.find(1);],
-                          [ac_cv_cxx_hash_map_header="<$location>";
-                           ac_cv_cxx_hash_namespace="$namespace";
-                           ac_cv_cxx_hash_map_class="$name";])
-         fi
-       done
+   ac_cv_cxx_hash_map=""
+   # First try unordered_map, but not on gcc's before 4.2 -- I've
+   # seen unexplainable unordered_map bugs with -O2 on older gcc's.
+   AC_TRY_COMPILE([#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2))
+                   # error GCC too old for unordered_map
+                   #endif
+                   ],
+                   [/* no program body necessary */],
+                   [stl_hash_old_gcc=no],
+                   [stl_hash_old_gcc=yes])
+   for location in unordered_map tr1/unordered_map; do
+     for namespace in std std::tr1; do
+       if test -z "$ac_cv_cxx_hash_map" -a "$stl_hash_old_gcc" != yes; then
+         # Some older gcc's have a buggy tr1, so test a bit of code.
+         AC_TRY_COMPILE([#include <$location>],
+                        [const ${namespace}::unordered_map<int, int> t;
+                         return t.find(5) == t.end();],
+                        [ac_cv_cxx_hash_map="<$location>";
+                         ac_cv_cxx_hash_namespace="$namespace";
+                         ac_cv_cxx_hash_map_class="unordered_map";])
+       fi
      done
    done
-   ac_cv_cxx_hash_set_header=`echo "$ac_cv_cxx_hash_map_header" | sed s/map/set/`;
+   # Now try hash_map
+   for location in ext/hash_map hash_map; do
+     for namespace in __gnu_cxx "" std stdext; do
+       if test -z "$ac_cv_cxx_hash_map"; then
+         AC_TRY_COMPILE([#include <$location>],
+                        [${namespace}::hash_map<int, int> t],
+                        [ac_cv_cxx_hash_map="<$location>";
+                         ac_cv_cxx_hash_namespace="$namespace";
+                         ac_cv_cxx_hash_map_class="hash_map";])
+       fi
+     done
+   done
+   ac_cv_cxx_hash_set=`echo "$ac_cv_cxx_hash_map" | sed s/map/set/`;
    ac_cv_cxx_hash_set_class=`echo "$ac_cv_cxx_hash_map_class" | sed s/map/set/`;
-   if test -n "$ac_cv_cxx_hash_map_header"; then
+   if test -n "$ac_cv_cxx_hash_map"; then
       AC_DEFINE(HAVE_HASH_MAP, 1, [define if the compiler has hash_map])
       AC_DEFINE(HAVE_HASH_SET, 1, [define if the compiler has hash_set])
-      AC_DEFINE_UNQUOTED(HASH_MAP_H,$ac_cv_cxx_hash_map_header,
-                         [the location of <hash_map>])
-      AC_DEFINE_UNQUOTED(HASH_SET_H,$ac_cv_cxx_hash_set_header,
-                         [the location of <hash_set>])
+      AC_DEFINE_UNQUOTED(HASH_MAP_H,$ac_cv_cxx_hash_map,
+                         [the location of <unordered_map> or <hash_map>])
+      AC_DEFINE_UNQUOTED(HASH_SET_H,$ac_cv_cxx_hash_set,
+                         [the location of <unordered_set> or <hash_set>])
+      AC_DEFINE_UNQUOTED(HASH_NAMESPACE,$ac_cv_cxx_hash_namespace,
+                         [the namespace of hash_map/hash_set])
       AC_DEFINE_UNQUOTED(HASH_MAP_CLASS,$ac_cv_cxx_hash_map_class,
-                         [the name of <hash_set>])
+                         [the name of <hash_map>])
       AC_DEFINE_UNQUOTED(HASH_SET_CLASS,$ac_cv_cxx_hash_set_class,
                          [the name of <hash_set>])
-      AC_DEFINE_UNQUOTED(HASH_NAMESPACE,$ac_cv_cxx_hash_namespace,
-                         [the namespace of hash_map/hash_set])
-      AC_MSG_RESULT([$ac_cv_cxx_hash_map_header])
+      AC_MSG_RESULT([$ac_cv_cxx_hash_map])
    else
       AC_MSG_RESULT()
       AC_MSG_WARN([could not find an STL hash_map])
    fi
 ])
+

+ 1 - 1
python/google/protobuf/text_format.py

@@ -222,7 +222,7 @@ def _MergeField(tokenizer, message):
         sub_message = message.Extensions[field]
       else:
         sub_message = getattr(message, field.name)
-        sub_message.SetInParent()
+      sub_message.SetInParent()
 
     while not tokenizer.TryConsume(end_token):
       if tokenizer.AtEnd():

+ 6 - 1
src/google/protobuf/compiler/importer.cc

@@ -231,7 +231,12 @@ static string CanonicalizePath(string path) {
   // The Win32 API accepts forward slashes as a path delimiter even though
   // backslashes are standard.  Let's avoid confusion and use only forward
   // slashes.
-  path = StringReplace(path, "\\", "/", true);
+  if (HasPrefixString(path, "\\\\")) {
+    // Avoid converting two leading backslashes.
+    path = "\\\\" + StringReplace(path.substr(2), "\\", "/", true);
+  } else {
+    path = StringReplace(path, "\\", "/", true);
+  }
 #endif
 
   vector<string> parts;

+ 9 - 9
src/google/protobuf/stubs/common.cc

@@ -177,12 +177,6 @@ LogMessage::LogMessage(LogLevel level, const char* filename, int line)
   : level_(level), filename_(filename), line_(line) {}
 LogMessage::~LogMessage() {}
 
-#if defined(_MSC_VER) && defined(_CPPUNWIND)
-  #define PROTOBUF_USE_EXCEPTIONS
-#elif defined(__EXCEPTIONS)
-  #define PROTOBUF_USE_EXCEPTIONS
-#endif
-
 void LogMessage::Finish() {
   bool suppress = false;
 
@@ -198,15 +192,13 @@ void LogMessage::Finish() {
 
   if (level_ == LOGLEVEL_FATAL) {
 #ifdef PROTOBUF_USE_EXCEPTIONS
-    throw -1;
+    throw FatalException(filename_, line_, message_);
 #else
     abort();
 #endif
   }
 }
 
-#undef PROTOBUF_USE_EXCEPTIONS
-
 void LogFinisher::operator=(LogMessage& other) {
   other.Finish();
 }
@@ -373,5 +365,13 @@ void ShutdownProtobufLibrary() {
   internal::shutdown_functions_mutex = NULL;
 }
 
+#ifdef PROTOBUF_USE_EXCEPTIONS
+FatalException::~FatalException() throw() {}
+
+const char* FatalException::what() const throw() {
+  return message_.c_str();
+}
+#endif
+
 }  // namespace protobuf
 }  // namespace google

+ 29 - 0
src/google/protobuf/stubs/common.h

@@ -48,6 +48,15 @@
 #include <stdint.h>
 #endif
 
+#if defined(_MSC_VER) && defined(_CPPUNWIND)
+  #define PROTOBUF_USE_EXCEPTIONS
+#elif defined(__EXCEPTIONS)
+  #define PROTOBUF_USE_EXCEPTIONS
+#endif
+#ifdef PROTOBUF_USE_EXCEPTIONS
+#include <exception>
+#endif
+
 #if defined(_WIN32) && defined(GetMessage)
 // Allow GetMessage to be used as a valid method name in protobuf classes.
 // windows.h defines GetMessage() as a macro.  Let's re-define it as an inline
@@ -1172,6 +1181,26 @@ LIBPROTOBUF_EXPORT void OnShutdown(void (*func)());
 
 }  // namespace internal
 
+#ifdef PROTOBUF_USE_EXCEPTIONS
+class FatalException : public std::exception {
+ public:
+  FatalException(const char* filename, int line, const std::string& message)
+      : filename_(filename), line_(line), message_(message) {}
+  virtual ~FatalException() throw();
+
+  virtual const char* what() const throw();
+
+  const char* filename() const { return filename_; }
+  int line() const { return line_; }
+  const std::string& message() const { return message_; }
+
+ private:
+  const char* filename_;
+  const int line_;
+  const std::string message_;
+};
+#endif
+
 // This is at the end of the file instead of the beginning to work around a bug
 // in some versions of MSVC.
 using namespace std;  // Don't do this at home, kids.

+ 8 - 0
vsprojects/libprotoc.vcproj

@@ -263,6 +263,10 @@
 				RelativePath="..\src\google\protobuf\compiler\java\java_service.h"
 				>
 			</File>
+			<File
+				RelativePath="..\src\google\protobuf\compiler\java\java_string_field.h"
+				>
+			</File>
 			<File
 				RelativePath="..\src\google\protobuf\compiler\python\python_generator.h"
 				>
@@ -395,6 +399,10 @@
 				RelativePath="..\src\google\protobuf\compiler\java\java_service.cc"
 				>
 			</File>
+			<File
+				RelativePath="..\src\google\protobuf\compiler\java\java_string_filed.cc"
+				>
+			</File>
 			<File
 				RelativePath="..\src\google\protobuf\compiler\python\python_generator.cc"
 				>