|  | @@ -77,15 +77,28 @@
 | 
	
		
			
				|  |  |  #define php_proto_zend_hash_index_update_zval(ht, h, pData) \
 | 
	
		
			
				|  |  |    zend_hash_index_update(ht, h, &(pData), sizeof(void*), NULL)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#define php_proto_zend_hash_update_zval(ht, key, key_len, value) \
 | 
	
		
			
				|  |  | +  zend_hash_update(ht, key, key_len, value, sizeof(void*), NULL)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #define php_proto_zend_hash_index_update_mem(ht, h, pData, nDataSize, pDest) \
 | 
	
		
			
				|  |  |    zend_hash_index_update(ht, h, pData, nDataSize, pDest)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#define php_proto_zend_hash_update_mem(ht, key, key_len, pData, nDataSize, \
 | 
	
		
			
				|  |  | +                                       pDest)                              \
 | 
	
		
			
				|  |  | +  zend_hash_update(ht, key, key_len, pData, nDataSize, pDest)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #define php_proto_zend_hash_index_find_zval(ht, h, pDest) \
 | 
	
		
			
				|  |  |    zend_hash_index_find(ht, h, pDest)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #define php_proto_zend_hash_index_find_mem(ht, h, pDest) \
 | 
	
		
			
				|  |  |    zend_hash_index_find(ht, h, pDest)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#define php_proto_zend_hash_find_zval(ht, key, key_len, pDest) \
 | 
	
		
			
				|  |  | +  zend_hash_find(ht, key, key_len, pDest)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#define php_proto_zend_hash_find_mem(ht, key, key_len, pDest) \
 | 
	
		
			
				|  |  | +  zend_hash_find(ht, key, key_len, pDest)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #define php_proto_zend_hash_next_index_insert_zval(ht, pData) \
 | 
	
		
			
				|  |  |    zend_hash_next_index_insert(ht, pData, sizeof(void*), NULL)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -103,6 +116,17 @@
 | 
	
		
			
				|  |  |  #define PHP_PROTO_WRAP_OBJECT_END \
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#define PHP_PROTO_INIT_SUBMSGCLASS_START(CLASSNAME, CAMELNAME, LOWWERNAME)   \
 | 
	
		
			
				|  |  | +  void LOWWERNAME##_init(TSRMLS_D) {                                         \
 | 
	
		
			
				|  |  | +    zend_class_entry class_type;                                             \
 | 
	
		
			
				|  |  | +    const char* class_name = CLASSNAME;                                      \
 | 
	
		
			
				|  |  | +    INIT_CLASS_ENTRY_EX(class_type, CLASSNAME, strlen(CLASSNAME),            \
 | 
	
		
			
				|  |  | +                        LOWWERNAME##_methods);                               \
 | 
	
		
			
				|  |  | +    LOWWERNAME##_type = zend_register_internal_class(&class_type TSRMLS_CC); \
 | 
	
		
			
				|  |  | +    LOWWERNAME##_type->create_object = message_create;
 | 
	
		
			
				|  |  | +#define PHP_PROTO_INIT_SUBMSGCLASS_END \
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #define PHP_PROTO_INIT_CLASS_START(CLASSNAME, CAMELNAME, LOWWERNAME)         \
 | 
	
		
			
				|  |  |    void LOWWERNAME##_init(TSRMLS_D) {                                         \
 | 
	
		
			
				|  |  |      zend_class_entry class_type;                                             \
 | 
	
	
		
			
				|  | @@ -202,6 +226,8 @@
 | 
	
		
			
				|  |  |  #define php_proto_zend_lookup_class(name, name_length, ce) \
 | 
	
		
			
				|  |  |    zend_lookup_class(name, name_length, ce TSRMLS_CC)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#define PHP_PROTO_RETVAL_ZVAL(value) ZVAL_ZVAL(return_value, value, 1, 0)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #else  // PHP_MAJOR_VERSION >= 7
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #define php_proto_zend_literal void**
 | 
	
	
		
			
				|  | @@ -243,6 +269,23 @@ static inline int php_proto_zend_hash_index_update_mem(HashTable* ht, ulong h,
 | 
	
		
			
				|  |  |    return result != NULL ? SUCCESS : FAILURE;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +static inline int php_proto_zend_hash_update_zval(HashTable* ht,
 | 
	
		
			
				|  |  | +                                                  const char* key, uint key_len,
 | 
	
		
			
				|  |  | +                                                  zval* pData) {
 | 
	
		
			
				|  |  | +  zend_string* internal_key = zend_string_init(key, key_len, 0);
 | 
	
		
			
				|  |  | +  zend_hash_update(ht, internal_key, pData);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static inline int php_proto_zend_hash_update_mem(HashTable* ht, const char* key,
 | 
	
		
			
				|  |  | +                                                 uint key_len, void* pData,
 | 
	
		
			
				|  |  | +                                                 uint nDataSize, void** pDest) {
 | 
	
		
			
				|  |  | +  zend_string* internal_key = zend_string_init(key, key_len, 0);
 | 
	
		
			
				|  |  | +  void* result = zend_hash_update_mem(ht, internal_key, pData, nDataSize);
 | 
	
		
			
				|  |  | +  zend_string_release(internal_key);
 | 
	
		
			
				|  |  | +  if (pDest != NULL) *pDest = result;
 | 
	
		
			
				|  |  | +  return result != NULL ? SUCCESS : FAILURE;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  static inline int php_proto_zend_hash_index_find_zval(const HashTable* ht,
 | 
	
		
			
				|  |  |                                                        ulong h, void** pDest) {
 | 
	
		
			
				|  |  |    zval* result = zend_hash_index_find(ht, h);
 | 
	
	
		
			
				|  | @@ -258,6 +301,25 @@ static inline int php_proto_zend_hash_index_find_mem(const HashTable* ht,
 | 
	
		
			
				|  |  |    return result != NULL ? SUCCESS : FAILURE;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +static inline int php_proto_zend_hash_find_zval(const HashTable* ht,
 | 
	
		
			
				|  |  | +                                                const char* key, uint key_len,
 | 
	
		
			
				|  |  | +                                                void** pDest) {
 | 
	
		
			
				|  |  | +  zend_string* internal_key = zend_string_init(key, key_len, 1);
 | 
	
		
			
				|  |  | +  zval* result = zend_hash_find(ht, internal_key);
 | 
	
		
			
				|  |  | +  if (pDest != NULL) *pDest = result;
 | 
	
		
			
				|  |  | +  return result != NULL ? SUCCESS : FAILURE;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +static inline int php_proto_zend_hash_find_mem(const HashTable* ht,
 | 
	
		
			
				|  |  | +                                                const char* key, uint key_len,
 | 
	
		
			
				|  |  | +                                                void** pDest) {
 | 
	
		
			
				|  |  | +  zend_string* internal_key = zend_string_init(key, key_len, 1);
 | 
	
		
			
				|  |  | +  void* result = zend_hash_find_ptr(ht, internal_key);
 | 
	
		
			
				|  |  | +  zend_string_release(internal_key);
 | 
	
		
			
				|  |  | +  if (pDest != NULL) *pDest = result;
 | 
	
		
			
				|  |  | +  return result != NULL ? SUCCESS : FAILURE;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  static inline int php_proto_zend_hash_next_index_insert_zval(HashTable* ht,
 | 
	
		
			
				|  |  |                                                               void* pData) {
 | 
	
		
			
				|  |  |    zval tmp;
 | 
	
	
		
			
				|  | @@ -292,6 +354,17 @@ static inline int php_proto_zend_hash_get_current_data_ex(HashTable* ht,
 | 
	
		
			
				|  |  |    zend_object std;                \
 | 
	
		
			
				|  |  |    };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#define PHP_PROTO_INIT_SUBMSGCLASS_START(CLASSNAME, CAMELNAME, LOWWERNAME)   \
 | 
	
		
			
				|  |  | +  void LOWWERNAME##_init(TSRMLS_D) {                                         \
 | 
	
		
			
				|  |  | +    zend_class_entry class_type;                                             \
 | 
	
		
			
				|  |  | +    const char* class_name = CLASSNAME;                                      \
 | 
	
		
			
				|  |  | +    INIT_CLASS_ENTRY_EX(class_type, CLASSNAME, strlen(CLASSNAME),            \
 | 
	
		
			
				|  |  | +                        LOWWERNAME##_methods);                               \
 | 
	
		
			
				|  |  | +    LOWWERNAME##_type = zend_register_internal_class(&class_type TSRMLS_CC); \
 | 
	
		
			
				|  |  | +    LOWWERNAME##_type->create_object = message_create;
 | 
	
		
			
				|  |  | +#define PHP_PROTO_INIT_SUBMSGCLASS_END \
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #define PHP_PROTO_INIT_CLASS_START(CLASSNAME, CAMELNAME, LOWWERNAME)         \
 | 
	
		
			
				|  |  |    void LOWWERNAME##_init(TSRMLS_D) {                                         \
 | 
	
		
			
				|  |  |      zend_class_entry class_type;                                             \
 | 
	
	
		
			
				|  | @@ -390,12 +463,60 @@ static inline int php_proto_zend_lookup_class(
 | 
	
		
			
				|  |  |    return *ce != NULL ? SUCCESS : FAILURE;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#define PHP_PROTO_RETVAL_ZVAL(value) ZVAL_COPY(return_value, value)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #endif  // PHP_MAJOR_VERSION >= 7
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#if PHP_MAJOR_VERSION < 7 || (PHP_MAJOR_VERSION == 7 && PHP_MINOR_VERSION == 0)
 | 
	
		
			
				|  |  | +#define PHP_PROTO_FAKE_SCOPE_BEGIN(klass)  \
 | 
	
		
			
				|  |  | +  zend_class_entry* old_scope = EG(scope); \
 | 
	
		
			
				|  |  | +  EG(scope) = klass;
 | 
	
		
			
				|  |  | +#define PHP_PROTO_FAKE_SCOPE_RESTART(klass) \
 | 
	
		
			
				|  |  | +  old_scope = EG(scope);                    \
 | 
	
		
			
				|  |  | +  EG(scope) = klass;
 | 
	
		
			
				|  |  | +#define PHP_PROTO_FAKE_SCOPE_END EG(scope) = old_scope;
 | 
	
		
			
				|  |  | +#else
 | 
	
		
			
				|  |  | +#define PHP_PROTO_FAKE_SCOPE_BEGIN(klass)       \
 | 
	
		
			
				|  |  | +  zend_class_entry* old_scope = EG(fake_scope); \
 | 
	
		
			
				|  |  | +  EG(fake_scope) = klass;
 | 
	
		
			
				|  |  | +#define PHP_PROTO_FAKE_SCOPE_RESTART(klass) \
 | 
	
		
			
				|  |  | +  old_scope = EG(fake_scope);               \
 | 
	
		
			
				|  |  | +  EG(fake_scope) = klass;
 | 
	
		
			
				|  |  | +#define PHP_PROTO_FAKE_SCOPE_END EG(fake_scope) = old_scope;
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Define PHP class
 | 
	
		
			
				|  |  | +#define DEFINE_PROTOBUF_INIT_CLASS(CLASSNAME, CAMELNAME, LOWERNAME) \
 | 
	
		
			
				|  |  | +  PHP_PROTO_INIT_CLASS_START(CLASSNAME, CAMELNAME, LOWERNAME)       \
 | 
	
		
			
				|  |  | +  PHP_PROTO_INIT_CLASS_END
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#define DEFINE_PROTOBUF_CREATE(NAME, LOWERNAME)  \
 | 
	
		
			
				|  |  | +  PHP_PROTO_OBJECT_CREATE_START(NAME, LOWERNAME) \
 | 
	
		
			
				|  |  | +  LOWERNAME##_init_c_instance(intern TSRMLS_CC); \
 | 
	
		
			
				|  |  | +  PHP_PROTO_OBJECT_CREATE_END(NAME, LOWERNAME)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#define DEFINE_PROTOBUF_FREE(CAMELNAME, LOWERNAME)  \
 | 
	
		
			
				|  |  | +  PHP_PROTO_OBJECT_FREE_START(CAMELNAME, LOWERNAME) \
 | 
	
		
			
				|  |  | +  LOWERNAME##_free_c(intern TSRMLS_CC);             \
 | 
	
		
			
				|  |  | +  PHP_PROTO_OBJECT_FREE_END
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#define DEFINE_PROTOBUF_DTOR(CAMELNAME, LOWERNAME)  \
 | 
	
		
			
				|  |  | +  PHP_PROTO_OBJECT_DTOR_START(CAMELNAME, LOWERNAME) \
 | 
	
		
			
				|  |  | +  PHP_PROTO_OBJECT_DTOR_END
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#define DEFINE_CLASS(NAME, LOWERNAME, string_name) \
 | 
	
		
			
				|  |  | +  zend_class_entry *LOWERNAME##_type;              \
 | 
	
		
			
				|  |  | +  zend_object_handlers *LOWERNAME##_handlers;      \
 | 
	
		
			
				|  |  | +  DEFINE_PROTOBUF_FREE(NAME, LOWERNAME)            \
 | 
	
		
			
				|  |  | +  DEFINE_PROTOBUF_DTOR(NAME, LOWERNAME)            \
 | 
	
		
			
				|  |  | +  DEFINE_PROTOBUF_CREATE(NAME, LOWERNAME)          \
 | 
	
		
			
				|  |  | +  DEFINE_PROTOBUF_INIT_CLASS(string_name, NAME, LOWERNAME)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // -----------------------------------------------------------------------------
 | 
	
		
			
				|  |  |  // Forward Declaration
 | 
	
		
			
				|  |  |  // ----------------------------------------------------------------------------
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +struct Any;
 | 
	
		
			
				|  |  |  struct DescriptorPool;
 | 
	
		
			
				|  |  |  struct Descriptor;
 | 
	
		
			
				|  |  |  struct EnumDescriptor;
 | 
	
	
		
			
				|  | @@ -411,6 +532,7 @@ struct Map;
 | 
	
		
			
				|  |  |  struct MapIter;
 | 
	
		
			
				|  |  |  struct Oneof;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +typedef struct Any Any;
 | 
	
		
			
				|  |  |  typedef struct DescriptorPool DescriptorPool;
 | 
	
		
			
				|  |  |  typedef struct Descriptor Descriptor;
 | 
	
		
			
				|  |  |  typedef struct EnumDescriptor EnumDescriptor;
 | 
	
	
		
			
				|  | @@ -434,6 +556,7 @@ ZEND_BEGIN_MODULE_GLOBALS(protobuf)
 | 
	
		
			
				|  |  |  ZEND_END_MODULE_GLOBALS(protobuf)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Init module and PHP classes.
 | 
	
		
			
				|  |  | +void any_init(TSRMLS_D);
 | 
	
		
			
				|  |  |  void descriptor_init(TSRMLS_D);
 | 
	
		
			
				|  |  |  void enum_descriptor_init(TSRMLS_D);
 | 
	
		
			
				|  |  |  void descriptor_pool_init(TSRMLS_D);
 | 
	
	
		
			
				|  | @@ -442,11 +565,11 @@ void field_descriptor_init(TSRMLS_D);
 | 
	
		
			
				|  |  |  void gpb_type_init(TSRMLS_D);
 | 
	
		
			
				|  |  |  void map_field_init(TSRMLS_D);
 | 
	
		
			
				|  |  |  void map_field_iter_init(TSRMLS_D);
 | 
	
		
			
				|  |  | +void message_init(TSRMLS_D);
 | 
	
		
			
				|  |  |  void oneof_descriptor_init(TSRMLS_D);
 | 
	
		
			
				|  |  |  void repeated_field_init(TSRMLS_D);
 | 
	
		
			
				|  |  |  void repeated_field_iter_init(TSRMLS_D);
 | 
	
		
			
				|  |  |  void util_init(TSRMLS_D);
 | 
	
		
			
				|  |  | -void message_init(TSRMLS_D);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Global map from upb {msg,enum}defs to wrapper Descriptor/EnumDescriptor
 | 
	
		
			
				|  |  |  // instances.
 | 
	
	
		
			
				|  | @@ -459,6 +582,11 @@ void add_ce_obj(const void* ce, PHP_PROTO_HASHTABLE_VALUE value);
 | 
	
		
			
				|  |  |  PHP_PROTO_HASHTABLE_VALUE get_ce_obj(const void* ce);
 | 
	
		
			
				|  |  |  bool class_added(const void* ce);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// Global map from message/enum's proto fully-qualified name to corresponding
 | 
	
		
			
				|  |  | +// wrapper Descriptor/EnumDescriptor instances.
 | 
	
		
			
				|  |  | +void add_proto_obj(const char* proto, PHP_PROTO_HASHTABLE_VALUE value);
 | 
	
		
			
				|  |  | +PHP_PROTO_HASHTABLE_VALUE get_proto_obj(const char* proto);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  extern zend_class_entry* map_field_type;
 | 
	
		
			
				|  |  |  extern zend_class_entry* repeated_field_type;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -482,6 +610,10 @@ PHP_PROTO_WRAP_OBJECT_END
 | 
	
		
			
				|  |  |  PHP_METHOD(InternalDescriptorPool, getGeneratedPool);
 | 
	
		
			
				|  |  |  PHP_METHOD(InternalDescriptorPool, internalAddGeneratedFile);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void internal_add_generated_file(const char* data, PHP_PROTO_SIZE data_len,
 | 
	
		
			
				|  |  | +                                 InternalDescriptorPool* pool TSRMLS_DC);
 | 
	
		
			
				|  |  | +void init_generated_pool_once(TSRMLS_D);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // wrapper of generated pool
 | 
	
		
			
				|  |  |  #if PHP_MAJOR_VERSION < 7
 | 
	
		
			
				|  |  |  extern zval* generated_pool_php;
 | 
	
	
		
			
				|  | @@ -567,6 +699,7 @@ void custom_data_init(const zend_class_entry* ce,
 | 
	
		
			
				|  |  |  void build_class_from_descriptor(
 | 
	
		
			
				|  |  |      PHP_PROTO_HASHTABLE_VALUE php_descriptor TSRMLS_DC);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +extern zend_class_entry* message_type;
 | 
	
		
			
				|  |  |  extern zend_object_handlers* message_handlers;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // -----------------------------------------------------------------------------
 | 
	
	
		
			
				|  | @@ -674,6 +807,9 @@ PHP_METHOD(Message, __construct);
 | 
	
		
			
				|  |  |  // This is called from the message class creation code.
 | 
	
		
			
				|  |  |  const upb_pbdecodermethod *new_fillmsg_decodermethod(Descriptor *desc,
 | 
	
		
			
				|  |  |                                                       const void *owner);
 | 
	
		
			
				|  |  | +void serialize_to_string(zval* val, zval* return_value TSRMLS_DC);
 | 
	
		
			
				|  |  | +void merge_from_string(const char* data, int data_len, const Descriptor* desc,
 | 
	
		
			
				|  |  | +                       MessageHeader* msg);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  PHP_METHOD(Message, serializeToString);
 | 
	
		
			
				|  |  |  PHP_METHOD(Message, mergeFromString);
 | 
	
	
		
			
				|  | @@ -880,6 +1016,21 @@ extern zend_class_entry* oneof_descriptor_type;
 | 
	
		
			
				|  |  |  // have a number of 0.
 | 
	
		
			
				|  |  |  #define ONEOF_CASE_NONE 0
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// -----------------------------------------------------------------------------
 | 
	
		
			
				|  |  | +// Well Known Type.
 | 
	
		
			
				|  |  | +// -----------------------------------------------------------------------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +PHP_METHOD(Any, __construct);
 | 
	
		
			
				|  |  | +PHP_METHOD(Any, getTypeUrl);
 | 
	
		
			
				|  |  | +PHP_METHOD(Any, setTypeUrl);
 | 
	
		
			
				|  |  | +PHP_METHOD(Any, getValue);
 | 
	
		
			
				|  |  | +PHP_METHOD(Any, setValue);
 | 
	
		
			
				|  |  | +PHP_METHOD(Any, unpack);
 | 
	
		
			
				|  |  | +PHP_METHOD(Any, pack);
 | 
	
		
			
				|  |  | +PHP_METHOD(Any, is);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +extern zend_class_entry* any_type;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // -----------------------------------------------------------------------------
 | 
	
		
			
				|  |  |  // Upb.
 | 
	
		
			
				|  |  |  // -----------------------------------------------------------------------------
 | 
	
	
		
			
				|  | @@ -910,4 +1061,16 @@ const zend_class_entry* field_type_class(
 | 
	
		
			
				|  |  |                        .bucket.obj.object))
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// Message handler
 | 
	
		
			
				|  |  | +static inline zval* php_proto_message_read_property(
 | 
	
		
			
				|  |  | +    zval* msg, zval* member PHP_PROTO_TSRMLS_DC) {
 | 
	
		
			
				|  |  | +#if PHP_MAJOR_VERSION < 7
 | 
	
		
			
				|  |  | +  return message_handlers->read_property(msg, member, BP_VAR_R,
 | 
	
		
			
				|  |  | +                                         NULL PHP_PROTO_TSRMLS_CC);
 | 
	
		
			
				|  |  | +#else
 | 
	
		
			
				|  |  | +  return message_handlers->read_property(msg, member, BP_VAR_R, NULL,
 | 
	
		
			
				|  |  | +                                         NULL PHP_PROTO_TSRMLS_CC);
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  #endif  // __GOOGLE_PROTOBUF_PHP_PROTOBUF_H__
 |