|
@@ -250,28 +250,36 @@ PHP_METHOD(DescriptorPool, getGeneratedPool) {
|
|
RETURN_ZVAL(generated_pool_php, 1, 0);
|
|
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;
|
|
size_t i;
|
|
bool first_char = false;
|
|
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 '_'.
|
|
// 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. */ \
|
|
/* Prepend '.' to package name to make it absolute. */ \
|
|
const char *fullname = upb_##def_type_lower##_fullname(def_type_lower); \
|
|
const char *fullname = upb_##def_type_lower##_fullname(def_type_lower); \
|
|
char *klass_name = ecalloc(sizeof(char), 2 + strlen(fullname)); \
|
|
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; \
|
|
zend_class_entry **pce; \
|
|
if (zend_lookup_class(klass_name, strlen(klass_name), &pce TSRMLS_CC) == \
|
|
if (zend_lookup_class(klass_name, strlen(klass_name), &pce TSRMLS_CC) == \
|
|
FAILURE) { \
|
|
FAILURE) { \
|