|
@@ -366,17 +366,29 @@ void Message_construct(zval* msg, zval* array_wrapper) {
|
|
|
const upb_msgdef* submsgdef = upb_fielddef_msgsubdef(field);
|
|
|
PHP_PROTO_HASHTABLE_VALUE desc_php = get_def_obj(submsgdef);
|
|
|
Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, desc_php);
|
|
|
- zend_property_info* property_info;
|
|
|
- PHP_PROTO_FAKE_SCOPE_BEGIN(Z_OBJCE_P(msg));
|
|
|
+
|
|
|
+ CACHED_VALUE* cached = NULL;
|
|
|
+ if (upb_fielddef_containingoneof(field)) {
|
|
|
+ void* memory = slot_memory(intern->descriptor->layout,
|
|
|
+ message_data(intern), field);
|
|
|
+ int property_cache_index =
|
|
|
+ intern->descriptor->layout->fields[upb_fielddef_index(field)]
|
|
|
+ .cache_index;
|
|
|
+ cached = OBJ_PROP(Z_OBJ_P(msg), property_cache_index);
|
|
|
+ *(CACHED_VALUE**)(memory) = cached;
|
|
|
+ } else {
|
|
|
+ zend_property_info* property_info;
|
|
|
+ PHP_PROTO_FAKE_SCOPE_BEGIN(Z_OBJCE_P(msg));
|
|
|
#if PHP_MAJOR_VERSION < 7
|
|
|
- property_info =
|
|
|
- zend_get_property_info(Z_OBJCE_P(msg), &key, true TSRMLS_CC);
|
|
|
+ property_info =
|
|
|
+ zend_get_property_info(Z_OBJCE_P(msg), &key, true TSRMLS_CC);
|
|
|
#else
|
|
|
- property_info =
|
|
|
- zend_get_property_info(Z_OBJCE_P(msg), Z_STR_P(&key), true);
|
|
|
+ property_info =
|
|
|
+ zend_get_property_info(Z_OBJCE_P(msg), Z_STR_P(&key), true);
|
|
|
#endif
|
|
|
- PHP_PROTO_FAKE_SCOPE_END;
|
|
|
- CACHED_VALUE* cached = OBJ_PROP(Z_OBJ_P(msg), property_info->offset);
|
|
|
+ PHP_PROTO_FAKE_SCOPE_END;
|
|
|
+ cached = OBJ_PROP(Z_OBJ_P(msg), property_info->offset);
|
|
|
+ }
|
|
|
#if PHP_MAJOR_VERSION < 7
|
|
|
SEPARATE_ZVAL_IF_NOT_REF(cached);
|
|
|
#endif
|