Unverified Commit 43f8ae87 authored by Paul Yang's avatar Paul Yang Committed by GitHub

Fix oneof message in array constructor (#5727)

parent 9e381c05
...@@ -366,17 +366,29 @@ void Message_construct(zval* msg, zval* array_wrapper) { ...@@ -366,17 +366,29 @@ void Message_construct(zval* msg, zval* array_wrapper) {
const upb_msgdef* submsgdef = upb_fielddef_msgsubdef(field); const upb_msgdef* submsgdef = upb_fielddef_msgsubdef(field);
PHP_PROTO_HASHTABLE_VALUE desc_php = get_def_obj(submsgdef); PHP_PROTO_HASHTABLE_VALUE desc_php = get_def_obj(submsgdef);
Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, desc_php); 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 #if PHP_MAJOR_VERSION < 7
property_info = property_info =
zend_get_property_info(Z_OBJCE_P(msg), &key, true TSRMLS_CC); zend_get_property_info(Z_OBJCE_P(msg), &key, true TSRMLS_CC);
#else #else
property_info = property_info =
zend_get_property_info(Z_OBJCE_P(msg), Z_STR_P(&key), true); zend_get_property_info(Z_OBJCE_P(msg), Z_STR_P(&key), true);
#endif #endif
PHP_PROTO_FAKE_SCOPE_END; PHP_PROTO_FAKE_SCOPE_END;
CACHED_VALUE* cached = OBJ_PROP(Z_OBJ_P(msg), property_info->offset); cached = OBJ_PROP(Z_OBJ_P(msg), property_info->offset);
}
#if PHP_MAJOR_VERSION < 7 #if PHP_MAJOR_VERSION < 7
SEPARATE_ZVAL_IF_NOT_REF(cached); SEPARATE_ZVAL_IF_NOT_REF(cached);
#endif #endif
......
...@@ -1447,6 +1447,20 @@ class GeneratedClassTest extends TestBase ...@@ -1447,6 +1447,20 @@ class GeneratedClassTest extends TestBase
} }
} }
public function testOneofMessageInArrayConstructor()
{
$m = new TestMessage([
'oneof_message' => new Sub(),
]);
}
public function testOneofStringInArrayConstructor()
{
$m = new TestMessage([
'oneof_string' => 'abc',
]);
}
######################################################### #########################################################
# Test message equals. # Test message equals.
######################################################### #########################################################
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment