@@ -192,6 +192,36 @@ static bool php_phongo_document_get(php_phongo_document_t* intern, char* key, si
192
192
return true;
193
193
}
194
194
195
+ static bool php_phongo_document_get_by_zval (php_phongo_document_t * intern , zval * key , zval * return_value , bool null_if_missing )
196
+ {
197
+ if (Z_TYPE_P (key ) != IS_STRING && Z_TYPE_P (key ) != IS_LONG ) {
198
+ if (null_if_missing ) {
199
+ ZVAL_NULL (return_value );
200
+ return true;
201
+ }
202
+
203
+ phongo_throw_exception (PHONGO_ERROR_RUNTIME , "Could not find key of type \"%s\" in BSON document" , zend_zval_type_name (key ));
204
+ return false;
205
+ }
206
+
207
+ zend_string * tmp_str ;
208
+ zend_string * str = zval_try_get_tmp_string (key , & tmp_str );
209
+
210
+ if (!str ) {
211
+ // Exception already thrown
212
+ return false;
213
+ }
214
+
215
+ if (!php_phongo_document_get (intern , ZSTR_VAL (str ), ZSTR_LEN (str ), return_value , null_if_missing )) {
216
+ // Exception already thrown
217
+ zend_tmp_string_release (tmp_str );
218
+ return false;
219
+ }
220
+
221
+ zend_tmp_string_release (tmp_str );
222
+ return true;
223
+ }
224
+
195
225
static PHP_METHOD (MongoDB_BSON_Document , get )
196
226
{
197
227
php_phongo_document_t * intern ;
@@ -204,10 +234,8 @@ static PHP_METHOD(MongoDB_BSON_Document, get)
204
234
205
235
intern = Z_DOCUMENT_OBJ_P (getThis ());
206
236
207
- if (!php_phongo_document_get (intern , key , key_len , return_value , false)) {
208
- // Exception already thrown
209
- RETURN_NULL ();
210
- }
237
+ // May throw, in which case we do nothing
238
+ php_phongo_document_get (intern , key , key_len , return_value , false);
211
239
}
212
240
213
241
static PHP_METHOD (MongoDB_BSON_Document , getIterator )
@@ -229,6 +257,30 @@ static bool php_phongo_document_has(php_phongo_document_t* intern, char* key, si
229
257
return bson_iter_find_w_len (& iter , key , key_len );
230
258
}
231
259
260
+ static bool php_phongo_document_has_by_zval (php_phongo_document_t * intern , zval * key )
261
+ {
262
+ if (Z_TYPE_P (key ) != IS_STRING && Z_TYPE_P (key ) != IS_LONG ) {
263
+ return false;
264
+ }
265
+
266
+ zend_string * tmp_str ;
267
+ zend_string * str = zval_try_get_tmp_string (key , & tmp_str );
268
+
269
+ if (!str ) {
270
+ // Exception already thrown
271
+ return false;
272
+ }
273
+
274
+ if (!php_phongo_document_has (intern , ZSTR_VAL (str ), ZSTR_LEN (str ))) {
275
+ // Exception may be thrown if BSON iterator could not be initialized
276
+ zend_tmp_string_release (tmp_str );
277
+ return false;
278
+ }
279
+
280
+ zend_tmp_string_release (tmp_str );
281
+ return true;
282
+ }
283
+
232
284
static PHP_METHOD (MongoDB_BSON_Document , has )
233
285
{
234
286
php_phongo_document_t * intern ;
@@ -309,11 +361,7 @@ static PHP_METHOD(MongoDB_BSON_Document, offsetExists)
309
361
310
362
intern = Z_DOCUMENT_OBJ_P (getThis ());
311
363
312
- if (Z_TYPE_P (offset ) != IS_STRING ) {
313
- RETURN_FALSE ;
314
- }
315
-
316
- RETURN_BOOL (php_phongo_document_has (intern , Z_STRVAL_P (offset ), Z_STRLEN_P (offset )));
364
+ RETURN_BOOL (php_phongo_document_has_by_zval (intern , offset ));
317
365
}
318
366
319
367
static PHP_METHOD (MongoDB_BSON_Document , offsetGet )
@@ -327,13 +375,8 @@ static PHP_METHOD(MongoDB_BSON_Document, offsetGet)
327
375
328
376
intern = Z_DOCUMENT_OBJ_P (getThis ());
329
377
330
- if (Z_TYPE_P (offset ) != IS_STRING ) {
331
- phongo_throw_exception (PHONGO_ERROR_RUNTIME , "Could not find key of type \"%s\" in BSON document" , zend_zval_type_name (offset ));
332
- return ;
333
- }
334
-
335
378
// May throw, in which case we do nothing
336
- php_phongo_document_get (intern , Z_STRVAL_P ( offset ), Z_STRLEN_P ( offset ) , return_value , false);
379
+ php_phongo_document_get_by_zval (intern , offset , return_value , false);
337
380
}
338
381
339
382
static PHP_METHOD (MongoDB_BSON_Document , offsetSet )
@@ -550,13 +593,9 @@ static HashTable* php_phongo_document_get_properties(zend_object* object)
550
593
551
594
zval * php_phongo_document_read_property (zend_object * object , zend_string * member , int type , void * * cache_slot , zval * rv )
552
595
{
553
- php_phongo_document_t * intern ;
554
- char * key = ZSTR_VAL (member );
555
- size_t key_len = ZSTR_LEN (member );
556
-
557
- intern = Z_OBJ_DOCUMENT (object );
596
+ php_phongo_document_t * intern = Z_OBJ_DOCUMENT (object );
558
597
559
- if (!php_phongo_document_get (intern , key , key_len , rv , type == BP_VAR_IS )) {
598
+ if (!php_phongo_document_get (intern , ZSTR_VAL ( member ), ZSTR_LEN ( member ) , rv , type == BP_VAR_IS )) {
560
599
// Exception already thrown
561
600
return & EG (uninitialized_zval );
562
601
}
@@ -570,15 +609,11 @@ zval* php_phongo_document_write_property(zend_object* object, zend_string* membe
570
609
return value ;
571
610
}
572
611
573
- int php_phongo_document_has_property (zend_object * object , zend_string * name , int has_set_exists , void * * cache_slot )
612
+ int php_phongo_document_has_property (zend_object * object , zend_string * member , int has_set_exists , void * * cache_slot )
574
613
{
575
- php_phongo_document_t * intern ;
576
- char * key = ZSTR_VAL (name );
577
- size_t key_len = ZSTR_LEN (name );
578
-
579
- intern = Z_OBJ_DOCUMENT (object );
614
+ php_phongo_document_t * intern = Z_OBJ_DOCUMENT (object );
580
615
581
- return php_phongo_document_has (intern , key , key_len );
616
+ return php_phongo_document_has (intern , ZSTR_VAL ( member ), ZSTR_LEN ( member ) );
582
617
}
583
618
584
619
void php_phongo_document_unset_property (zend_object * object , zend_string * member , void * * cache_slot )
@@ -588,21 +623,9 @@ void php_phongo_document_unset_property(zend_object* object, zend_string* member
588
623
589
624
zval * php_phongo_document_read_dimension (zend_object * object , zval * offset , int type , zval * rv )
590
625
{
591
- php_phongo_document_t * intern ;
592
-
593
- intern = Z_OBJ_DOCUMENT (object );
594
-
595
- if (Z_TYPE_P (offset ) != IS_STRING ) {
596
- if (type == BP_VAR_IS ) {
597
- ZVAL_NULL (rv );
598
- return rv ;
599
- }
600
-
601
- phongo_throw_exception (PHONGO_ERROR_RUNTIME , "Could not find key of type \"%s\" in BSON document" , zend_zval_type_name (offset ));
602
- return & EG (uninitialized_zval );
603
- }
626
+ php_phongo_document_t * intern = Z_OBJ_DOCUMENT (object );
604
627
605
- if (!php_phongo_document_get (intern , Z_STRVAL_P ( offset ), Z_STRLEN_P ( offset ) , rv , type == BP_VAR_IS )) {
628
+ if (!php_phongo_document_get_by_zval (intern , offset , rv , type == BP_VAR_IS )) {
606
629
// Exception already thrown
607
630
return & EG (uninitialized_zval );
608
631
}
@@ -617,15 +640,9 @@ void php_phongo_document_write_dimension(zend_object* object, zval* offset, zval
617
640
618
641
int php_phongo_document_has_dimension (zend_object * object , zval * member , int check_empty )
619
642
{
620
- php_phongo_document_t * intern ;
621
-
622
- intern = Z_OBJ_DOCUMENT (object );
623
-
624
- if (Z_TYPE_P (member ) != IS_STRING ) {
625
- return false;
626
- }
643
+ php_phongo_document_t * intern = Z_OBJ_DOCUMENT (object );
627
644
628
- return php_phongo_document_has (intern , Z_STRVAL_P ( member ), Z_STRLEN_P ( member ) );
645
+ return php_phongo_document_has_by_zval (intern , member );
629
646
}
630
647
631
648
void php_phongo_document_unset_dimension (zend_object * object , zval * offset )
0 commit comments