@@ -658,6 +658,7 @@ static HashTable *date_object_get_gc_timezone(zval *object, zval **table, int *n
658
658
659
659
zval * date_interval_read_property (zval * object , zval * member , int type , void * * cache_slot , zval * rv );
660
660
void date_interval_write_property (zval * object , zval * member , zval * value , void * * cache_slot );
661
+ static zval * date_interval_get_property_ptr_ptr (zval * object , zval * member , int type , void * * cache_slot );
661
662
static zval * date_period_read_property (zval * object , zval * member , int type , void * * cache_slot , zval * rv );
662
663
static void date_period_write_property (zval * object , zval * member , zval * value , void * * cache_slot );
663
664
@@ -2129,7 +2130,7 @@ static void date_register_classes(void) /* {{{ */
2129
2130
date_object_handlers_interval .read_property = date_interval_read_property ;
2130
2131
date_object_handlers_interval .write_property = date_interval_write_property ;
2131
2132
date_object_handlers_interval .get_properties = date_object_get_properties_interval ;
2132
- date_object_handlers_interval .get_property_ptr_ptr = NULL ;
2133
+ date_object_handlers_interval .get_property_ptr_ptr = date_interval_get_property_ptr_ptr ;
2133
2134
date_object_handlers_interval .get_gc = date_object_get_gc_interval ;
2134
2135
2135
2136
INIT_CLASS_ENTRY (ce_period , "DatePeriod" , date_funcs_period );
@@ -4215,6 +4216,40 @@ void date_interval_write_property(zval *object, zval *member, zval *value, void
4215
4216
}
4216
4217
/* }}} */
4217
4218
4219
+ /* {{{ date_interval_get_property_ptr_ptr */
4220
+ static zval * date_interval_get_property_ptr_ptr (zval * object , zval * member , int type , void * * cache_slot )
4221
+ {
4222
+ zval tmp_member , * ret ;
4223
+
4224
+ if (Z_TYPE_P (member ) != IS_STRING ) {
4225
+ tmp_member = * member ;
4226
+ zval_copy_ctor (& tmp_member );
4227
+ convert_to_string (& tmp_member );
4228
+ member = & tmp_member ;
4229
+ cache_slot = NULL ;
4230
+ }
4231
+
4232
+ if (zend_binary_strcmp ("y" , sizeof ("y" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4233
+ zend_binary_strcmp ("m" , sizeof ("m" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4234
+ zend_binary_strcmp ("d" , sizeof ("d" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4235
+ zend_binary_strcmp ("h" , sizeof ("h" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4236
+ zend_binary_strcmp ("i" , sizeof ("i" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4237
+ zend_binary_strcmp ("s" , sizeof ("s" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4238
+ zend_binary_strcmp ("days" , sizeof ("days" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4239
+ zend_binary_strcmp ("invert" , sizeof ("invert" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ) {
4240
+ /* Fallback to read_property. */
4241
+ ret = NULL ;
4242
+ } else {
4243
+ ret = (zend_get_std_object_handlers ())-> get_property_ptr_ptr (object , member , type , cache_slot );
4244
+ }
4245
+
4246
+ if (member == & tmp_member ) {
4247
+ zval_dtor (member );
4248
+ }
4249
+
4250
+ return ret ;
4251
+ }
4252
+ /* }}} */
4218
4253
4219
4254
/* {{{ proto DateInterval::__construct([string interval_spec])
4220
4255
Creates new DateInterval object.
0 commit comments