]> granicus.if.org Git - php/commitdiff
Fixed bug #5273 (Can't use new properties in class extended from DateInterval)
authorStanislav Malyshev <stas@php.net>
Mon, 24 Jan 2011 02:31:48 +0000 (02:31 +0000)
committerStanislav Malyshev <stas@php.net>
Mon, 24 Jan 2011 02:31:48 +0000 (02:31 +0000)
NEWS
ext/date/php_date.c
ext/date/tests/bug52738.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 35461b41554a82a374b6ec02c3c4ad2ba1edeae0..e095764b9718bef0455fdb25da466b62f47bbc89 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -36,6 +36,8 @@
     no effect. (Derick)
   . Fixed bug #53729 (DatePeriod fails to initialize recurrences on 64bit
     big-endian systems). (Derick, rein@basefarm.no)
+  . Fixed bug #52738 (Can't use new properties in class extended from 
+    DateInterval). (Stas)
   . Fixed bug #52063 (DateTime constructor's second argument doesn't have a 
     null default value). (Gustavo, Stas)
 
index 876e2e39e45d88491c045451e8fdffa5a77eed9e..8b34ef46862683ea235bf9661856677540df6012 100644 (file)
@@ -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); /* GMTxxxx\0 */
                        snprintf(offset->abbr, 9, "GMT%c%02d%02d", 
                                                  localtime ? ((offset->offset < 0) ? '-' : '+') : '+',
                                                  localtime ? abs(offset->offset / 3600) : 0,
@@ -1238,7 +1238,7 @@ PHPAPI int php_idate(char format, time_t ts, int localtime)
                        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); /* GMTxxxx\0 */
                        snprintf(offset->abbr, 9, "GMT%c%02d%02d", 
                                                  !localtime ? ((offset->offset < 0) ? '-' : '+') : '+',
                                                  !localtime ? abs(offset->offset / 3600) : 0,
@@ -1997,6 +1997,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;
@@ -3487,23 +3488,30 @@ zval *date_interval_read_property(zval *object, zval *member, int type TSRMLS_DC
 #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 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) {
@@ -3537,24 +3545,24 @@ void date_interval_write_property(zval *object, zval *member, zval *value TSRMLS
                        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 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 (file)
index 0000000..fc1b602
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+Bug #52738 (Can't use new properties in class extended from DateInterval)
+--FILE--
+<?php
+class di extends DateInterval {
+    public $unit = 1;
+}
+
+$I = new di('P10D');
+echo $I->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] => 
+)