]> granicus.if.org Git - php/commitdiff
Fixed bug #35509 (string constant as array key has different behavior inside object)
authorDmitry Stogov <dmitry@php.net>
Mon, 5 Dec 2005 08:56:09 +0000 (08:56 +0000)
committerDmitry Stogov <dmitry@php.net>
Mon, 5 Dec 2005 08:56:09 +0000 (08:56 +0000)
NEWS
Zend/tests/bug35509.phpt [new file with mode: 0755]
Zend/zend_execute_API.c
Zend/zend_hash.h

diff --git a/NEWS b/NEWS
index 41a3a9a2552ff2caf7a7c6c3788cbf8553e2b1b2..ccda9dbd00d8c7f2f72354af36181421bf0f8f2d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -24,6 +24,8 @@ PHP                                                                        NEWS
 - Fixed bug #35543 (php crash when calling non existing method of a class
   that extends PDO). (Tony)
 - Fixed bug #35539 (typo in error message for ErrorException). (Tony)
+- Fixed bug #35509 (string constant as array key has different behavior inside
+  object). (Dmitry)
 - Fixed bug #35508 (PDO fails when unknown fetch mode specified). (Tony)
 - Fixed bug #35499 (strtotime() does not handle whitespace around the date 
   string). (Ilia)
diff --git a/Zend/tests/bug35509.phpt b/Zend/tests/bug35509.phpt
new file mode 100755 (executable)
index 0000000..6cb54c0
--- /dev/null
@@ -0,0 +1,31 @@
+--TEST--
+Bug #35509 (string constant as array key has different behavior inside object)
+--FILE--
+<?php
+class mytest
+{
+  const classConstant = '01';
+
+  private $classArray = array( mytest::classConstant => 'value' );
+
+  public function __construct()
+  {
+    print_r($this->classArray);
+  }
+}
+
+$classtest = new mytest();
+
+define( "normalConstant", '01' );
+$normalArray = array( normalConstant => 'value' );
+print_r($normalArray);
+?>
+--EXPECT--
+Array
+(
+    [01] => value
+)
+Array
+(
+    [01] => value
+)
index 3e0bd367f15d11acaf55be65fc49aabe78cd9474..c0d585d835fa25fd3bb334092c8cc5905937508e 100644 (file)
@@ -501,17 +501,9 @@ ZEND_API int zval_update_constant(zval **pp, void *arg TSRMLS_DC)
                        *element = new_val;
 
                        switch (const_value.type) {
-                               case IS_STRING: {
-                                       long lval;
-                                       double dval;
-
-                                       if (is_numeric_string(const_value.value.str.val, const_value.value.str.len, &lval, &dval, 0) == IS_LONG) {
-                                               zend_hash_update_current_key(p->value.ht, HASH_KEY_IS_LONG, NULL, 0, lval);
-                                       } else {
-                                               zend_hash_update_current_key(p->value.ht, HASH_KEY_IS_STRING, const_value.value.str.val, const_value.value.str.len+1, 0);
-                                       }
+                               case IS_STRING:
+                                       zend_symtable_update_current_key(p->value.ht, const_value.value.str.val, const_value.value.str.len+1);
                                        break;
-                               }
                                case IS_BOOL:
                                case IS_LONG:
                                        zend_hash_update_current_key(p->value.ht, HASH_KEY_IS_LONG, NULL, 0, const_value.value.lval);
index 774c607418b324befc09ad3750a4d6f86c5a4c36..f2b8c9b1f69736a4f98f60727765a81dc9126173 100644 (file)
@@ -353,6 +353,12 @@ static inline int zend_symtable_exists(HashTable *ht, char *arKey, uint nKeyLeng
        return zend_hash_exists(ht, arKey, nKeyLength);
 }
 
+static inline int zend_symtable_update_current_key(HashTable *ht, char *arKey, uint nKeyLength)
+{
+       HANDLE_NUMERIC(arKey, nKeyLength, zend_hash_update_current_key(ht, HASH_KEY_IS_LONG, NULL, 0, idx));
+       return zend_hash_update_current_key(ht, HASH_KEY_IS_STRING, arKey, nKeyLength, 0);
+}
+
 #endif                                                 /* ZEND_HASH_H */
 
 /*