@@ -665,6 +665,7 @@ static HashTable *date_object_get_gc_timezone(zval *object, zval **table, int *n
665
665
666
666
zval * date_interval_read_property (zval * object , zval * member , int type , void * * cache_slot , zval * rv );
667
667
void date_interval_write_property (zval * object , zval * member , zval * value , void * * cache_slot );
668
+ static zval * date_interval_get_property_ptr_ptr (zval * object , zval * member , int type , void * * cache_slot );
668
669
static zval * date_period_read_property (zval * object , zval * member , int type , void * * cache_slot , zval * rv );
669
670
static void date_period_write_property (zval * object , zval * member , zval * value , void * * cache_slot );
670
671
@@ -2159,7 +2160,7 @@ static void date_register_classes(void) /* {{{ */
2159
2160
date_object_handlers_interval .read_property = date_interval_read_property ;
2160
2161
date_object_handlers_interval .write_property = date_interval_write_property ;
2161
2162
date_object_handlers_interval .get_properties = date_object_get_properties_interval ;
2162
- date_object_handlers_interval .get_property_ptr_ptr = NULL ;
2163
+ date_object_handlers_interval .get_property_ptr_ptr = date_interval_get_property_ptr_ptr ;
2163
2164
date_object_handlers_interval .get_gc = date_object_get_gc_interval ;
2164
2165
2165
2166
INIT_CLASS_ENTRY (ce_period , "DatePeriod" , date_funcs_period );
@@ -4274,6 +4275,40 @@ void date_interval_write_property(zval *object, zval *member, zval *value, void
4274
4275
}
4275
4276
/* }}} */
4276
4277
4278
+ /* {{{ date_interval_get_property_ptr_ptr */
4279
+ static zval * date_interval_get_property_ptr_ptr (zval * object , zval * member , int type , void * * cache_slot )
4280
+ {
4281
+ zval tmp_member , * ret ;
4282
+
4283
+ if (Z_TYPE_P (member ) != IS_STRING ) {
4284
+ tmp_member = * member ;
4285
+ zval_copy_ctor (& tmp_member );
4286
+ convert_to_string (& tmp_member );
4287
+ member = & tmp_member ;
4288
+ cache_slot = NULL ;
4289
+ }
4290
+
4291
+ if (zend_binary_strcmp ("y" , sizeof ("y" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4292
+ zend_binary_strcmp ("m" , sizeof ("m" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4293
+ zend_binary_strcmp ("d" , sizeof ("d" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4294
+ zend_binary_strcmp ("h" , sizeof ("h" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4295
+ zend_binary_strcmp ("i" , sizeof ("i" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4296
+ zend_binary_strcmp ("s" , sizeof ("s" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4297
+ zend_binary_strcmp ("days" , sizeof ("days" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4298
+ zend_binary_strcmp ("invert" , sizeof ("invert" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ) {
4299
+ /* Fallback to read_property. */
4300
+ ret = NULL ;
4301
+ } else {
4302
+ ret = (zend_get_std_object_handlers ())-> get_property_ptr_ptr (object , member , type , cache_slot );
4303
+ }
4304
+
4305
+ if (member == & tmp_member ) {
4306
+ zval_dtor (member );
4307
+ }
4308
+
4309
+ return ret ;
4310
+ }
4311
+ /* }}} */
4277
4312
4278
4313
/* {{{ proto DateInterval::__construct([string interval_spec])
4279
4314
Creates new DateInterval object.
0 commit comments