@@ -647,6 +647,7 @@ static HashTable *date_object_get_gc_timezone(zval *object, zval **table, int *n
647
647
648
648
zval * date_interval_read_property (zval * object , zval * member , int type , void * * cache_slot , zval * rv );
649
649
void date_interval_write_property (zval * object , zval * member , zval * value , void * * cache_slot );
650
+ static zval * date_interval_get_property_ptr_ptr (zval * object , zval * member , int type , void * * cache_slot );
650
651
static zval * date_period_read_property (zval * object , zval * member , int type , void * * cache_slot , zval * rv );
651
652
static void date_period_write_property (zval * object , zval * member , zval * value , void * * cache_slot );
652
653
@@ -2117,7 +2118,7 @@ static void date_register_classes(void) /* {{{ */
2117
2118
date_object_handlers_interval .read_property = date_interval_read_property ;
2118
2119
date_object_handlers_interval .write_property = date_interval_write_property ;
2119
2120
date_object_handlers_interval .get_properties = date_object_get_properties_interval ;
2120
- date_object_handlers_interval .get_property_ptr_ptr = NULL ;
2121
+ date_object_handlers_interval .get_property_ptr_ptr = date_interval_get_property_ptr_ptr ;
2121
2122
date_object_handlers_interval .get_gc = date_object_get_gc_interval ;
2122
2123
2123
2124
INIT_CLASS_ENTRY (ce_period , "DatePeriod" , date_funcs_period );
@@ -4142,6 +4143,40 @@ void date_interval_write_property(zval *object, zval *member, zval *value, void
4142
4143
}
4143
4144
/* }}} */
4144
4145
4146
+ /* {{{ date_interval_get_property_ptr_ptr */
4147
+ static zval * date_interval_get_property_ptr_ptr (zval * object , zval * member , int type , void * * cache_slot )
4148
+ {
4149
+ zval tmp_member , * ret ;
4150
+
4151
+ if (Z_TYPE_P (member ) != IS_STRING ) {
4152
+ tmp_member = * member ;
4153
+ zval_copy_ctor (& tmp_member );
4154
+ convert_to_string (& tmp_member );
4155
+ member = & tmp_member ;
4156
+ cache_slot = NULL ;
4157
+ }
4158
+
4159
+ if (zend_binary_strcmp ("y" , sizeof ("y" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4160
+ zend_binary_strcmp ("m" , sizeof ("m" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4161
+ zend_binary_strcmp ("d" , sizeof ("d" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4162
+ zend_binary_strcmp ("h" , sizeof ("h" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4163
+ zend_binary_strcmp ("i" , sizeof ("i" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4164
+ zend_binary_strcmp ("s" , sizeof ("s" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4165
+ zend_binary_strcmp ("days" , sizeof ("days" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ||
4166
+ zend_binary_strcmp ("invert" , sizeof ("invert" ) - 1 , Z_STRVAL_P (member ), Z_STRLEN_P (member )) == 0 ) {
4167
+ /* Fallback to read_property. */
4168
+ ret = NULL ;
4169
+ } else {
4170
+ ret = (zend_get_std_object_handlers ())-> get_property_ptr_ptr (object , member , type , cache_slot );
4171
+ }
4172
+
4173
+ if (member == & tmp_member ) {
4174
+ zval_dtor (member );
4175
+ }
4176
+
4177
+ return ret ;
4178
+ }
4179
+ /* }}} */
4145
4180
4146
4181
/* {{{ proto DateInterval::__construct([string interval_spec])
4147
4182
Creates new DateInterval object.
0 commit comments