@@ -85,11 +85,11 @@ static void Message_dtor(zend_object* obj) {
85
85
}
86
86
87
87
/**
88
- * get_field ()
88
+ * lookup_field ()
89
89
*
90
90
* Helper function to look up a field given a member name (as a string).
91
91
*/
92
- static const upb_FieldDef * get_field (Message * msg , zend_string * member ) {
92
+ static const upb_FieldDef * lookup_field (Message * msg , zend_string * member ) {
93
93
if (!msg || !msg -> desc || !msg -> desc -> msgdef ) {
94
94
zend_throw_exception_ex (NULL , 0 ,
95
95
"Couldn't find descriptor. "
@@ -104,8 +104,26 @@ static const upb_FieldDef* get_field(Message* msg, zend_string* member) {
104
104
m , ZSTR_VAL (member ), ZSTR_LEN (member ));
105
105
106
106
if (!f ) {
107
- zend_throw_exception_ex (NULL , 0 , "No such property %s." ,
108
- ZSTR_VAL (msg -> desc -> class_entry -> name ));
107
+ return NULL ;
108
+ }
109
+
110
+ return f ;
111
+ }
112
+
113
+ /**
114
+ * get_field()
115
+ *
116
+ * Helper function to get up a field given a member name (as a string).
117
+ * if the field is not found, a PHP warning is emitted and NULL is returned.
118
+ */
119
+ static const upb_FieldDef * get_field (Message * msg , zend_string * member ) {
120
+ const upb_FieldDef * f = lookup_field (msg , member );
121
+
122
+ if (!f && msg && msg -> desc ) {
123
+ // if the descriptor is undefined, an exception was already thrown.
124
+ php_error (E_WARNING , "Undefined property: %s::$%s" ,
125
+ ZSTR_VAL (msg -> desc -> class_entry -> name ),
126
+ ZSTR_VAL (member ));
109
127
}
110
128
111
129
return f ;
@@ -250,15 +268,11 @@ static int Message_compare_objects(zval* m1, zval* m2) {
250
268
static int Message_has_property (zend_object * obj , zend_string * member ,
251
269
int has_set_exists , void * * cache_slot ) {
252
270
Message * intern = (Message * )obj ;
253
- const upb_FieldDef * f = get_field (intern , member );
271
+ const upb_FieldDef * f = lookup_field (intern , member );
254
272
255
273
if (!f ) return 0 ;
256
274
257
- if (!upb_FieldDef_HasPresence (f )) {
258
- zend_throw_exception_ex (
259
- NULL , 0 ,
260
- "Cannot call isset() on field %s which does not have presence." ,
261
- upb_FieldDef_Name (f ));
275
+ if (upb_FieldDef_IsOptional (f ) && !upb_FieldDef_HasPresence (f )) {
262
276
return 0 ;
263
277
}
264
278
@@ -284,7 +298,7 @@ static int Message_has_property(zend_object* obj, zend_string* member,
284
298
static void Message_unset_property (zend_object * obj , zend_string * member ,
285
299
void * * cache_slot ) {
286
300
Message * intern = (Message * )obj ;
287
- const upb_FieldDef * f = get_field (intern , member );
301
+ const upb_FieldDef * f = lookup_field (intern , member );
288
302
289
303
if (!f ) return ;
290
304
0 commit comments