From 23f9e482732b99f381e37afa77e04c2c480f372d Mon Sep 17 00:00:00 2001 From: jhdxr Date: Wed, 20 Apr 2016 23:37:26 +0800 Subject: fix bug #69587 DateInterval properties and isset --- ext/date/php_date.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'ext/date/php_date.c') diff --git a/ext/date/php_date.c b/ext/date/php_date.c index d4c695c6b7..4fead4a84d 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1970,6 +1970,53 @@ static int implement_date_interface_handler(zend_class_entry *interface, zend_cl return SUCCESS; } /* }}} */ +static int date_interval_has_property(zval *object, zval *member, int type, void **cache_slot) /* {{{ */ +{ + php_interval_obj *obj; + zval tmp_member, *prop; + int retval = 0; + + if (Z_TYPE_P(member) != IS_STRING) { + ZVAL_COPY(&tmp_member, member); + convert_to_string(&tmp_member); + member = &tmp_member; + cache_slot = NULL; + } + + obj = Z_PHPINTERVAL_P(object); + + if (!obj->initialized) { + retval = (zend_get_std_object_handlers())->has_property(object, member, type, cache_slot); + if (member == &tmp_member) { + zval_dtor(member); + } + return retval; + } + + zval rv; + prop = date_interval_read_property(object, member, type, cache_slot, &rv); + + if (prop != NULL) { + if (type == 2) { + retval = 1; + } else if (type == 1) { + retval = zend_is_true(prop); + } else if (type == 0) { + retval = (Z_TYPE(*prop) != IS_NULL); + } + } else { + retval = (zend_get_std_object_handlers())->has_property(object, member, type, cache_slot); + } + + if (member == &tmp_member) { + zval_dtor(member); + } + + return retval; + +} +/* }}} */ + static void date_register_classes(void) /* {{{ */ { zend_class_entry ce_date, ce_immutable, ce_timezone, ce_interval, ce_period, ce_interface; @@ -2051,6 +2098,7 @@ static void date_register_classes(void) /* {{{ */ date_object_handlers_interval.offset = XtOffsetOf(php_interval_obj, std); date_object_handlers_interval.free_obj = date_object_free_storage_interval; date_object_handlers_interval.clone_obj = date_object_clone_interval; + date_object_handlers_interval.has_property = date_interval_has_property; date_object_handlers_interval.read_property = date_interval_read_property; date_object_handlers_interval.write_property = date_interval_write_property; date_object_handlers_interval.get_properties = date_object_get_properties_interval; -- cgit v1.2.1 From 0bd63959c954cff6561739cf8a3d05a73d954835 Mon Sep 17 00:00:00 2001 From: jhdxr Date: Mon, 11 Jul 2016 21:12:23 +0800 Subject: move declaration of vars to top --- ext/date/php_date.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'ext/date/php_date.c') diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 4fead4a84d..558d6f8ba3 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1973,7 +1973,9 @@ static int implement_date_interface_handler(zend_class_entry *interface, zend_cl static int date_interval_has_property(zval *object, zval *member, int type, void **cache_slot) /* {{{ */ { php_interval_obj *obj; - zval tmp_member, *prop; + zval tmp_member; + zval rv; + zval *prop; int retval = 0; if (Z_TYPE_P(member) != IS_STRING) { @@ -1993,7 +1995,6 @@ static int date_interval_has_property(zval *object, zval *member, int type, void return retval; } - zval rv; prop = date_interval_read_property(object, member, type, cache_slot, &rv); if (prop != NULL) { -- cgit v1.2.1