From 1a8b87d2c5c642cc1ba08e0fc75fd4bcc4393292 Mon Sep 17 00:00:00 2001 From: Stanislav Malyshev Date: Mon, 24 Jan 2011 02:31:48 +0000 Subject: [PATCH] Fixed bug #5273 (Can't use new properties in class extended from DateInterval) --- ext/date/php_date.c | 68 ++++++++++++++++++++---------------- ext/date/tests/bug52738.phpt | 32 +++++++++++++++++ 2 files changed, 70 insertions(+), 30 deletions(-) create mode 100644 ext/date/tests/bug52738.phpt diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 4cd62131bc..8fe41ab124 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1029,7 +1029,7 @@ static char *date_format(char *format, int format_len, timelib_time *t, int loca offset->offset = (t->z) * -60; offset->leap_secs = 0; offset->is_dst = 0; - offset->abbr = malloc(9); /* GMT±xxxx\0 */ + offset->abbr = malloc(9); /* GMT�xxxx\0 */ snprintf(offset->abbr, 9, "GMT%c%02d%02d", localtime ? ((offset->offset < 0) ? '-' : '+') : '+', localtime ? abs(offset->offset / 3600) : 0, @@ -1237,7 +1237,7 @@ PHPAPI int php_idate(char format, time_t ts, int localtime TSRMLS_DC) offset->offset = (t->z - (t->dst * 60)) * -60; offset->leap_secs = 0; offset->is_dst = t->dst; - offset->abbr = malloc(9); /* GMT±xxxx\0 */ + offset->abbr = malloc(9); /* GMT�xxxx\0 */ snprintf(offset->abbr, 9, "GMT%c%02d%02d", !localtime ? ((offset->offset < 0) ? '-' : '+') : '+', !localtime ? abs(offset->offset / 3600) : 0, @@ -1996,6 +1996,7 @@ static void date_register_classes(TSRMLS_D) 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; + date_object_handlers_interval.get_property_ptr_ptr = NULL; INIT_CLASS_ENTRY(ce_period, "DatePeriod", date_funcs_period); ce_period.create_object = date_object_new_period; @@ -3482,23 +3483,30 @@ zval *date_interval_read_property(zval *object, zval *member, int type, const ze #define GET_VALUE_FROM_STRUCT(n,m) \ if (strcmp(Z_STRVAL_P(member), m) == 0) { \ value = obj->diff->n; \ + break; \ } - GET_VALUE_FROM_STRUCT(y, "y"); - GET_VALUE_FROM_STRUCT(m, "m"); - GET_VALUE_FROM_STRUCT(d, "d"); - GET_VALUE_FROM_STRUCT(h, "h"); - GET_VALUE_FROM_STRUCT(i, "i"); - GET_VALUE_FROM_STRUCT(s, "s"); - GET_VALUE_FROM_STRUCT(invert, "invert"); - GET_VALUE_FROM_STRUCT(days, "days"); + do { + GET_VALUE_FROM_STRUCT(y, "y"); + GET_VALUE_FROM_STRUCT(m, "m"); + GET_VALUE_FROM_STRUCT(d, "d"); + GET_VALUE_FROM_STRUCT(h, "h"); + GET_VALUE_FROM_STRUCT(i, "i"); + GET_VALUE_FROM_STRUCT(s, "s"); + GET_VALUE_FROM_STRUCT(invert, "invert"); + GET_VALUE_FROM_STRUCT(days, "days"); + /* didn't find any */ + retval = (zend_get_std_object_handlers())->read_property(object, member, type, key TSRMLS_CC); + + if (member == &tmp_member) { + zval_dtor(member); + } + + return retval; + } while(0); ALLOC_INIT_ZVAL(retval); Z_SET_REFCOUNT_P(retval, 0); - if (value == -1) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Unknown property (%s)", Z_STRVAL_P(member)); - } - ZVAL_LONG(retval, value); if (member == &tmp_member) { @@ -3532,24 +3540,24 @@ void date_interval_write_property(zval *object, zval *member, zval *value, const convert_to_long(&tmp_value); \ value = &tmp_value; \ } \ - found = 1; \ - obj->diff->n = Z_LVAL_P(value); \ - if (value == &tmp_value) { \ - zval_dtor(value); \ - } \ + obj->diff->n = Z_LVAL_P(value); \ + if (value == &tmp_value) { \ + zval_dtor(value); \ + } \ + break; \ } - SET_VALUE_FROM_STRUCT(y, "y"); - SET_VALUE_FROM_STRUCT(m, "m"); - SET_VALUE_FROM_STRUCT(d, "d"); - SET_VALUE_FROM_STRUCT(h, "h"); - SET_VALUE_FROM_STRUCT(i, "i"); - SET_VALUE_FROM_STRUCT(s, "s"); - SET_VALUE_FROM_STRUCT(invert, "invert"); - - if (!found) { - php_error_docref(NULL TSRMLS_CC, E_ERROR, "Unknown property (%s)", Z_STRVAL_P(member)); - } + do { + SET_VALUE_FROM_STRUCT(y, "y"); + SET_VALUE_FROM_STRUCT(m, "m"); + SET_VALUE_FROM_STRUCT(d, "d"); + SET_VALUE_FROM_STRUCT(h, "h"); + SET_VALUE_FROM_STRUCT(i, "i"); + SET_VALUE_FROM_STRUCT(s, "s"); + SET_VALUE_FROM_STRUCT(invert, "invert"); + /* didn't find any */ + (zend_get_std_object_handlers())->write_property(object, member, value, key TSRMLS_CC); + } while(0); if (member == &tmp_member) { zval_dtor(member); diff --git a/ext/date/tests/bug52738.phpt b/ext/date/tests/bug52738.phpt new file mode 100644 index 0000000000..fc1b6029e9 --- /dev/null +++ b/ext/date/tests/bug52738.phpt @@ -0,0 +1,32 @@ +--TEST-- +Bug #52738 (Can't use new properties in class extended from DateInterval) +--FILE-- +unit."\n"; +$I->unit++; +echo $I->unit."\n"; +$I->unit = 42; +echo $I->unit."\n"; +$I->d++; +print_r($I); +--EXPECT-- +1 +2 +42 +di Object +( + [unit] => 42 + [y] => 0 + [m] => 0 + [d] => 11 + [h] => 0 + [i] => 0 + [s] => 0 + [invert] => 0 + [days] => +) -- 2.40.0