aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am2
-rw-r--r--php/ext/google/protobuf/def.c46
-rw-r--r--php/src/Google/Protobuf/descriptor.php10
-rw-r--r--php/tests/generated_class_test.php9
-rw-r--r--php/tests/test_no_namespace.pb.php34
-rw-r--r--php/tests/test_no_namespace.proto5
-rw-r--r--src/google/protobuf/stubs/type_traits.h10
7 files changed, 84 insertions, 32 deletions
diff --git a/Makefile.am b/Makefile.am
index 9f7e3ca8..7e47a119 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -600,6 +600,8 @@ php_EXTRA_DIST= \
php/tests/test_include.pb.php \
php/tests/map_field_test.php \
php/tests/test_base.php \
+ php/tests/test_no_namespace.proto \
+ php/tests/test_no_namespace.pb.php \
php/tests/test_util.php \
php/tests/test.proto \
php/tests/test.pb.php \
diff --git a/php/ext/google/protobuf/def.c b/php/ext/google/protobuf/def.c
index 156eca07..5a8c3c25 100644
--- a/php/ext/google/protobuf/def.c
+++ b/php/ext/google/protobuf/def.c
@@ -250,28 +250,36 @@ PHP_METHOD(DescriptorPool, getGeneratedPool) {
RETURN_ZVAL(generated_pool_php, 1, 0);
}
-static void convert_to_class_name_inplace(char *proto_name,
- size_t pkg_name_len) {
+static void convert_to_class_name_inplace(char *class_name,
+ const char* fullname,
+ const char* package_name) {
size_t i;
bool first_char = false;
-
- for (i = 0; i <= pkg_name_len + 1; i++) {
- // PHP package uses camel case.
- if (!first_char && proto_name[i] != '.') {
- first_char = true;
- proto_name[i] += 'A' - 'a';
- }
- // php packages are divided by '\'.
- if (proto_name[i] == '.') {
- first_char = false;
- proto_name[i] = '\\';
+ size_t pkg_name_len = package_name == NULL ? 0 : strlen(package_name);
+
+ if (pkg_name_len == 0) {
+ strcpy(class_name, fullname);
+ } else {
+ class_name[0] = '.';
+ strcpy(&class_name[1], fullname);
+ for (i = 0; i <= pkg_name_len + 1; i++) {
+ // PHP package uses camel case.
+ if (!first_char && class_name[i] != '.') {
+ first_char = true;
+ class_name[i] += 'A' - 'a';
+ }
+ // php packages are divided by '\'.
+ if (class_name[i] == '.') {
+ first_char = false;
+ class_name[i] = '\\';
+ }
}
}
// Submessage is concatenated with its containing messages by '_'.
- for (i = pkg_name_len; i < strlen(proto_name); i++) {
- if (proto_name[i] == '.') {
- proto_name[i] = '_';
+ for (i = pkg_name_len; i < strlen(class_name); i++) {
+ if (class_name[i] == '.') {
+ class_name[i] = '_';
}
}
}
@@ -325,10 +333,8 @@ PHP_METHOD(DescriptorPool, internalAddGeneratedFile) {
/* Prepend '.' to package name to make it absolute. */ \
const char *fullname = upb_##def_type_lower##_fullname(def_type_lower); \
char *klass_name = ecalloc(sizeof(char), 2 + strlen(fullname)); \
- klass_name[0] = '.'; \
- strcpy(&klass_name[1], fullname); \
- size_t pkg_name_len = strlen(upb_filedef_package(files[0])); \
- convert_to_class_name_inplace(klass_name, pkg_name_len); \
+ convert_to_class_name_inplace(klass_name, fullname, \
+ upb_filedef_package(files[0])); \
zend_class_entry **pce; \
if (zend_lookup_class(klass_name, strlen(klass_name), &pce TSRMLS_CC) == \
FAILURE) { \
diff --git a/php/src/Google/Protobuf/descriptor.php b/php/src/Google/Protobuf/descriptor.php
index afe08227..e5cff0ba 100644
--- a/php/src/Google/Protobuf/descriptor.php
+++ b/php/src/Google/Protobuf/descriptor.php
@@ -240,9 +240,13 @@ function getFullClassName(
$class_name_without_package =
implode('_', array_map('ucwords',
explode('.', $message_name_without_package)));
- $classname =
- implode('\\', array_map('ucwords', explode('.', $package))).
- "\\".$class_name_without_package;
+ if ($package === "") {
+ $classname = $class_name_without_package;
+ } else {
+ $classname =
+ implode('\\', array_map('ucwords', explode('.', $package))).
+ "\\".$class_name_without_package;
+ }
}
class OneofDescriptor
diff --git a/php/tests/generated_class_test.php b/php/tests/generated_class_test.php
index 56466cae..d1a0bd51 100644
--- a/php/tests/generated_class_test.php
+++ b/php/tests/generated_class_test.php
@@ -1,6 +1,7 @@
<?php
require_once('test.pb.php');
+require_once('test_no_namespace.pb.php');
require_once('test_util.php');
use Google\Protobuf\Internal\RepeatedField;
@@ -554,4 +555,12 @@ class GeneratedClassTest extends PHPUnit_Framework_TestCase
$this->assertSame('', $m->getOneofString());
$this->assertSame(1, $m->getOneofMessage()->getA());
}
+
+ #########################################################
+ # Test oneof field.
+ #########################################################
+
+ public function testMessageWithoutNamespace() {
+ $m = new NoNameSpace();
+ }
}
diff --git a/php/tests/test_no_namespace.pb.php b/php/tests/test_no_namespace.pb.php
new file mode 100644
index 00000000..2f92c955
--- /dev/null
+++ b/php/tests/test_no_namespace.pb.php
@@ -0,0 +1,34 @@
+<?php
+# Generated by the protocol buffer compiler. DO NOT EDIT!
+# source: test_no_namespace.proto
+
+use Google\Protobuf\Internal\DescriptorPool;
+use Google\Protobuf\Internal\GPBType;
+use Google\Protobuf\Internal\RepeatedField;
+use Google\Protobuf\Internal\GPBUtil;
+
+class NoNameSpace extends \Google\Protobuf\Internal\Message
+{
+ private $a = 0;
+
+ public function getA()
+ {
+ return $this->a;
+ }
+
+ public function setA($var)
+ {
+ GPBUtil::checkInt32($var);
+ $this->a = $var;
+ }
+
+}
+
+$pool = DescriptorPool::getGeneratedPool();
+
+$pool->internalAddGeneratedFile(hex2bin(
+ "0a3b0a17746573745f6e6f5f6e616d6573706163652e70726f746f22180a" .
+ "0b4e6f4e616d65537061636512090a0161180120012805620670726f746f" .
+ "33"
+));
+
diff --git a/php/tests/test_no_namespace.proto b/php/tests/test_no_namespace.proto
new file mode 100644
index 00000000..4331aeab
--- /dev/null
+++ b/php/tests/test_no_namespace.proto
@@ -0,0 +1,5 @@
+syntax = "proto3";
+
+message NoNameSpace {
+ int32 a = 1;
+}
diff --git a/src/google/protobuf/stubs/type_traits.h b/src/google/protobuf/stubs/type_traits.h
index 8d48c6aa..3ab5ea7d 100644
--- a/src/google/protobuf/stubs/type_traits.h
+++ b/src/google/protobuf/stubs/type_traits.h
@@ -139,18 +139,10 @@ template<> struct is_integral<int> : true_type { };
template<> struct is_integral<unsigned int> : true_type { };
template<> struct is_integral<long> : true_type { };
template<> struct is_integral<unsigned long> : true_type { };
-#ifdef HAVE_LONG_LONG
+#if defined(HAVE_LONG_LONG) || defined(_MSC_VER)
template<> struct is_integral<long long> : true_type { };
template<> struct is_integral<unsigned long long> : true_type { };
#endif
-#if defined(_MSC_VER)
-// With VC, __int8, __int16, and __int32 are synonymous with standard types
-// with the same size, but __int64 has not equivalent (i.e., it's neither
-// long, nor long long and should be treated differnetly).
-// https://msdn.microsoft.com/en-us/library/29dh1w7z.aspx
-template<> struct is_integral<__int64> : true_type { };
-template<> struct is_integral<unsigned __int64> : true_type {};
-#endif
template <class T> struct is_integral<const T> : is_integral<T> { };
template <class T> struct is_integral<volatile T> : is_integral<T> { };
template <class T> struct is_integral<const volatile T> : is_integral<T> { };