@@ -65,7 +65,8 @@ static zend_object* Message_create(zend_class_entry* class_type) {
6565 Message_SuppressDefaultProperties (class_type );
6666 zend_object_std_init (& intern -> std , class_type );
6767 intern -> std .handlers = & message_object_handlers ;
68- Arena_Init (& intern -> arena );
68+ intern -> desc = NULL ;
69+ ZVAL_NULL (& intern -> arena );
6970 return & intern -> std ;
7071}
7172
@@ -89,6 +90,15 @@ static void Message_dtor(zend_object* obj) {
8990 * Helper function to look up a field given a member name (as a string).
9091 */
9192static const upb_FieldDef * get_field (Message * msg , zend_string * member ) {
93+ if (!msg || !msg -> desc || !msg -> desc -> msgdef ) {
94+ zend_throw_exception_ex (NULL , 0 ,
95+ "Couldn't find descriptor. "
96+ "The message constructor was likely bypassed, "
97+ "resulting in an uninitialized descriptor." );
98+
99+ return NULL ;
100+ }
101+
92102 const upb_MessageDef * m = msg -> desc -> msgdef ;
93103 const upb_FieldDef * f = upb_MessageDef_FindFieldByNameWithSize (
94104 m , ZSTR_VAL (member ), ZSTR_LEN (member ));
@@ -530,6 +540,7 @@ bool Message_InitFromPhp(upb_Message* msg, const upb_MessageDef* m, zval* init,
530540static void Message_Initialize (Message * intern , const Descriptor * desc ) {
531541 intern -> desc = desc ;
532542 const upb_MiniTable * t = upb_MessageDef_MiniTable (desc -> msgdef );
543+ Arena_Init (& intern -> arena );
533544 intern -> msg = upb_Message_New (t , Arena_Get (& intern -> arena ));
534545 ObjCache_Add (intern -> msg , & intern -> std );
535546}
@@ -544,7 +555,6 @@ PHP_METHOD(Message, __construct) {
544555 Message * intern = (Message * )Z_OBJ_P (getThis ());
545556 const Descriptor * desc ;
546557 zend_class_entry * ce = Z_OBJCE_P (getThis ());
547- upb_Arena * arena = Arena_Get (& intern -> arena );
548558 zval * init_arr = NULL ;
549559
550560 // This descriptor should always be available, as the generated __construct
@@ -573,7 +583,8 @@ PHP_METHOD(Message, __construct) {
573583 }
574584
575585 if (init_arr ) {
576- Message_InitFromPhp (intern -> msg , desc -> msgdef , init_arr , arena );
586+ Message_InitFromPhp (intern -> msg , desc -> msgdef , init_arr ,
587+ Arena_Get (& intern -> arena ));
577588 }
578589}
579590
0 commit comments