|  | @@ -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) {                                                             \
 |