Commit c44c3af2 authored by Jisi Liu's avatar Jisi Liu Committed by GitHub

Merge pull request #3548 from google/3.4.x

Merge fixes from 3.4.x into master
parents 7a431378 30681c75
...@@ -270,7 +270,7 @@ class GPBUtil ...@@ -270,7 +270,7 @@ class GPBUtil
$name, $name,
$file_proto) $file_proto)
{ {
$classname = implode('_', array_map('ucwords', explode('.', $name))); $classname = implode('_', explode('.', $name));
return static::getClassNamePrefix($classname, $file_proto) . $classname; return static::getClassNamePrefix($classname, $file_proto) . $classname;
} }
......
...@@ -76,6 +76,9 @@ class Message ...@@ -76,6 +76,9 @@ class Message
} }
$pool = DescriptorPool::getGeneratedPool(); $pool = DescriptorPool::getGeneratedPool();
$this->desc = $pool->getDescriptorByClassName(get_class($this)); $this->desc = $pool->getDescriptorByClassName(get_class($this));
if (is_null($this->desc)) {
user_error(get_class($this) . "is not found in descriptor pool.");
}
foreach ($this->desc->getField() as $field) { foreach ($this->desc->getField() as $field) {
$setter = $field->getSetter(); $setter = $field->getSetter();
if ($field->isMap()) { if ($field->isMap()) {
......
...@@ -14,6 +14,8 @@ use Foo\TestIncludePrefixMessage; ...@@ -14,6 +14,8 @@ use Foo\TestIncludePrefixMessage;
use Foo\TestMessage; use Foo\TestMessage;
use Foo\TestMessage_Sub; use Foo\TestMessage_Sub;
use Foo\TestReverseFieldOrder; use Foo\TestReverseFieldOrder;
use Foo\testLowerCaseMessage;
use Foo\testLowerCaseEnum;
use Php\Test\TestNamespace; use Php\Test\TestNamespace;
class GeneratedClassTest extends TestBase class GeneratedClassTest extends TestBase
...@@ -715,4 +717,14 @@ class GeneratedClassTest extends TestBase ...@@ -715,4 +717,14 @@ class GeneratedClassTest extends TestBase
$this->assertSame("abc", $m->getB()); $this->assertSame("abc", $m->getB());
$this->assertNotSame("abc", $m->getA()); $this->assertNotSame("abc", $m->getA());
} }
#########################################################
# Test Reverse Field Order.
#########################################################
public function testLowerCase()
{
$m = new testLowerCaseMessage();
$n = testLowerCaseEnum::VALUE;
}
} }
...@@ -23,6 +23,8 @@ require_once('generated/Foo/TestPhpDoc.php'); ...@@ -23,6 +23,8 @@ require_once('generated/Foo/TestPhpDoc.php');
require_once('generated/Foo/TestRandomFieldOrder.php'); require_once('generated/Foo/TestRandomFieldOrder.php');
require_once('generated/Foo/TestReverseFieldOrder.php'); require_once('generated/Foo/TestReverseFieldOrder.php');
require_once('generated/Foo/TestUnpackedMessage.php'); require_once('generated/Foo/TestUnpackedMessage.php');
require_once('generated/Foo/testLowerCaseMessage.php');
require_once('generated/Foo/testLowerCaseEnum.php');
require_once('generated/GPBMetadata/Proto/Test.php'); require_once('generated/GPBMetadata/Proto/Test.php');
require_once('generated/GPBMetadata/Proto/TestEmptyPhpNamespace.php'); require_once('generated/GPBMetadata/Proto/TestEmptyPhpNamespace.php');
require_once('generated/GPBMetadata/Proto/TestInclude.php'); require_once('generated/GPBMetadata/Proto/TestInclude.php');
......
...@@ -192,3 +192,10 @@ message TestReverseFieldOrder { ...@@ -192,3 +192,10 @@ message TestReverseFieldOrder {
repeated int32 a = 2; repeated int32 a = 2;
string b = 1; string b = 1;
} }
message testLowerCaseMessage {
}
enum testLowerCaseEnum {
VALUE = 0;
}
...@@ -257,44 +257,6 @@ TEST(MessageTest, CheckInitialized) { ...@@ -257,44 +257,6 @@ TEST(MessageTest, CheckInitialized) {
"fields: a, b, c"); "fields: a, b, c");
} }
TEST(MessageTest, CheckOverflow) {
unittest::TestAllTypes message;
// Create a message with size just over 2GB. This triggers integer overflow
// when computing message size.
const string data(1024, 'x');
Cord one_megabyte;
for (int i = 0; i < 1024; i++) {
one_megabyte.Append(data);
}
for (int i = 0; i < 2 * 1024 + 1; ++i) {
message.add_repeated_cord()->CopyFrom(one_megabyte);
}
Cord serialized;
EXPECT_FALSE(message.AppendToCord(&serialized));
}
TEST(MessageTest, CheckBigOverflow) {
// Checking for 4GB buffers on 32 bit systems is problematic.
if (sizeof(void*) < 8) return;
unittest::TestAllTypes message;
// Create a message with size just over 4GB. We should be able to detect this
// too, even though it will make a plain "int" wrap back to a positive number.
const string data(1024, 'x');
Cord one_megabyte;
for (int i = 0; i < 1024; i++) {
one_megabyte.Append(data);
}
for (int i = 0; i < 4 * 1024 + 1; ++i) {
message.add_repeated_cord()->CopyFrom(one_megabyte);
}
Cord serialized;
EXPECT_FALSE(message.AppendToCord(&serialized));
}
#endif // PROTOBUF_HAS_DEATH_TEST #endif // PROTOBUF_HAS_DEATH_TEST
namespace { namespace {
......
...@@ -57,6 +57,7 @@ ...@@ -57,6 +57,7 @@
#include <windows.h> #include <windows.h>
#include <google/protobuf/stubs/io_win32.h> #include <google/protobuf/stubs/io_win32.h>
#include <google/protobuf/stubs/scoped_ptr.h>
#include <cassert> #include <cassert>
#include <memory> #include <memory>
...@@ -71,7 +72,6 @@ namespace win32 { ...@@ -71,7 +72,6 @@ namespace win32 {
namespace { namespace {
using std::string; using std::string;
using std::unique_ptr;
using std::wstring; using std::wstring;
template <typename char_type> template <typename char_type>
...@@ -139,11 +139,11 @@ string join_paths(const string& path1, const string& path2) { ...@@ -139,11 +139,11 @@ string join_paths(const string& path1, const string& path2) {
return path1; return path1;
} }
if (is_separator(path1.back())) { if (is_separator(path1[path1.size() - 1])) {
return is_separator(path2.front()) ? (path1 + path2.substr(1)) return is_separator(path2[0]) ? (path1 + path2.substr(1))
: (path1 + path2); : (path1 + path2);
} else { } else {
return is_separator(path2.front()) ? (path1 + path2) return is_separator(path2[0]) ? (path1 + path2)
: (path1 + '\\' + path2); : (path1 + '\\' + path2);
} }
} }
...@@ -203,24 +203,24 @@ string normalize(string path) { ...@@ -203,24 +203,24 @@ string normalize(string path) {
result << s; result << s;
} }
// Preserve trailing separator if the input contained it. // Preserve trailing separator if the input contained it.
if (is_separator(path.back())) { if (!path.empty() && is_separator(path[path.size() - 1])) {
result << '\\'; result << '\\';
} }
return result.str(); return result.str();
} }
std::unique_ptr<WCHAR[]> as_wstring(const string& s) { WCHAR* as_wstring(const string& s) {
int len = ::MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.size(), NULL, 0); int len = ::MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.size(), NULL, 0);
std::unique_ptr<WCHAR[]> result(new WCHAR[len + 1]); WCHAR* result = new WCHAR[len + 1];
::MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.size(), result.get(), len + 1); ::MultiByteToWideChar(CP_UTF8, 0, s.c_str(), s.size(), result, len + 1);
result.get()[len] = 0; result[len] = 0;
return std::move(result); return result;
} }
wstring as_wchar_path(const string& path) { void as_wchar_path(const string& path, wstring* wchar_path) {
std::unique_ptr<WCHAR[]> wbuf(as_wstring(path)); scoped_array<WCHAR> wbuf(as_wstring(path));
replace_directory_separators(wbuf.get()); replace_directory_separators(wbuf.get());
return wstring(wbuf.get()); wchar_path->assign(wbuf.get());
} }
bool as_windows_path(const string& path, wstring* result) { bool as_windows_path(const string& path, wstring* result) {
...@@ -239,7 +239,7 @@ bool as_windows_path(const string& path, wstring* result) { ...@@ -239,7 +239,7 @@ bool as_windows_path(const string& path, wstring* result) {
::GetCurrentDirectoryA(MAX_PATH, cwd); ::GetCurrentDirectoryA(MAX_PATH, cwd);
mutable_path = join_paths(cwd, mutable_path); mutable_path = join_paths(cwd, mutable_path);
} }
*result = as_wchar_path(normalize(mutable_path)); as_wchar_path(normalize(mutable_path), result);
if (!has_longpath_prefix(result->c_str())) { if (!has_longpath_prefix(result->c_str())) {
// Add the "\\?\" prefix unconditionally. This way we prevent the Win32 API // Add the "\\?\" prefix unconditionally. This way we prevent the Win32 API
// from processing the path and "helpfully" removing trailing dots from the // from processing the path and "helpfully" removing trailing dots from the
...@@ -324,7 +324,7 @@ FILE* fopen(const char* path, const char* mode) { ...@@ -324,7 +324,7 @@ FILE* fopen(const char* path, const char* mode) {
errno = ENOENT; errno = ENOENT;
return NULL; return NULL;
} }
std::unique_ptr<WCHAR[]> wmode(as_wstring(mode)); scoped_array<WCHAR> wmode(as_wstring(mode));
return ::_wfopen(wpath.c_str(), wmode.get()); return ::_wfopen(wpath.c_str(), wmode.get());
#else #else
return ::fopen(path, mode); return ::fopen(path, mode);
......
...@@ -39,7 +39,8 @@ ...@@ -39,7 +39,8 @@
#include <google/protobuf/stubs/common.h> #include <google/protobuf/stubs/common.h>
#include <gmock/gmock.h> #include <gmock/gmock.h>
// Disable death tests if we use exceptions in CHECK(). // Disable death tests if we use exceptions in CHECK().
#if !PROTOBUF_USE_EXCEPTIONS && defined(GTEST_HAS_DEATH_TEST) #if !PROTOBUF_USE_EXCEPTIONS && defined(GTEST_HAS_DEATH_TEST) && \
!GTEST_OS_WINDOWS
#define PROTOBUF_HAS_DEATH_TEST #define PROTOBUF_HAS_DEATH_TEST
#endif #endif
......
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