]> granicus.if.org Git - php/commitdiff
Add missing update_constants in ReflectionClassConstant
authorNikita Popov <nikic@php.net>
Mon, 2 May 2016 09:42:06 +0000 (11:42 +0200)
committerNikita Popov <nikic@php.net>
Mon, 2 May 2016 09:43:01 +0000 (11:43 +0200)
Also fix indentation of __toString().

ext/reflection/php_reflection.c
ext/reflection/tests/ReflectionClassConstant_basic1.phpt
ext/reflection/tests/ReflectionClassConstant_getValue.phpt [new file with mode: 0644]

index 5b8569e9f20417b0dbb19c3bad12fc1229578bfe..2a7ff61957c86653b980dcec39810609596c0d36 100644 (file)
@@ -456,8 +456,8 @@ static void _class_string(string *str, zend_class_entry *ce, zval *obj, char *in
                zend_class_constant *c;
 
                ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, key, c) {
-                       zval_update_constant_ex(&c->value, NULL);
-                       _class_const_string(str, ZSTR_VAL(key), c, indent);
+                       zval_update_constant_ex(&c->value, c->ce);
+                       _class_const_string(str, ZSTR_VAL(key), c, ZSTR_VAL(sub_indent.buf));
                } ZEND_HASH_FOREACH_END();
        }
        string_printf(str, "%s  }\n", indent);
@@ -633,11 +633,15 @@ static void _const_string(string *str, char *name, zval *value, char *indent)
 /* {{{ _class_const_string */
 static void _class_const_string(string *str, char *name, zend_class_constant *c, char *indent)
 {
-       char *type = zend_zval_type_name(&c->value);
        char *visibility = zend_visibility_string(Z_ACCESS_FLAGS(c->value));
-       zend_string *value_str = zval_get_string(&c->value);
+       zend_string *value_str;
+       char *type;
 
-       string_printf(str, "%s    Constant [ %s %s %s ] { %s }\n",
+       zval_update_constant_ex(&c->value, c->ce);
+       value_str = zval_get_string(&c->value);
+       type = zend_zval_type_name(&c->value);
+
+       string_printf(str, "%sConstant [ %s %s %s ] { %s }\n",
                                        indent, visibility, type, name, ZSTR_VAL(value_str));
 
        zend_string_release(value_str);
@@ -3821,6 +3825,9 @@ ZEND_METHOD(reflection_class_constant, getValue)
        GET_REFLECTION_OBJECT_PTR(ref);
 
        ZVAL_DUP(return_value, &ref->value);
+       if (Z_CONSTANT_P(return_value)) {
+               zval_update_constant_ex(return_value, ref->ce);
+       }
 }
 /* }}} */
 
index 3d4f49f144ae51f269f5b8f94d9d689cdd4484c7..fd8118650fcb39a2646bf3c30e45b4be1e46b435 100644 (file)
@@ -53,13 +53,13 @@ reflectClassConstant($instance, "BAD_CONST");
 Reflecting on class constant TestClass::PUB
 
 __toString():
-string(42) "    Constant [ public boolean PUB ] { 1 }
+string(38) "Constant [ public boolean PUB ] { 1 }
 "
 export():
-string(42) "    Constant [ public boolean PUB ] { 1 }
+string(38) "Constant [ public boolean PUB ] { 1 }
 "
 export():
-    Constant [ public boolean PUB ] { 1 }
+Constant [ public boolean PUB ] { 1 }
 
 NULL
 getName():
@@ -87,13 +87,13 @@ string(21) "/** My Doc comment */"
 Reflecting on class constant TestClass::PROT
 
 __toString():
-string(46) "    Constant [ protected integer PROT ] { 4 }
+string(42) "Constant [ protected integer PROT ] { 4 }
 "
 export():
-string(46) "    Constant [ protected integer PROT ] { 4 }
+string(42) "Constant [ protected integer PROT ] { 4 }
 "
 export():
-    Constant [ protected integer PROT ] { 4 }
+Constant [ protected integer PROT ] { 4 }
 
 NULL
 getName():
@@ -121,13 +121,13 @@ string(26) "/** Another doc comment */"
 Reflecting on class constant TestClass::PRIV
 
 __toString():
-string(49) "    Constant [ private string PRIV ] { keepOut }
+string(45) "Constant [ private string PRIV ] { keepOut }
 "
 export():
-string(49) "    Constant [ private string PRIV ] { keepOut }
+string(45) "Constant [ private string PRIV ] { keepOut }
 "
 export():
-    Constant [ private string PRIV ] { keepOut }
+Constant [ private string PRIV ] { keepOut }
 
 NULL
 getName():
@@ -155,13 +155,13 @@ bool(false)
 Reflecting on class constant TestClass::PRIV
 
 __toString():
-string(49) "    Constant [ private string PRIV ] { keepOut }
+string(45) "Constant [ private string PRIV ] { keepOut }
 "
 export():
-string(49) "    Constant [ private string PRIV ] { keepOut }
+string(45) "Constant [ private string PRIV ] { keepOut }
 "
 export():
-    Constant [ private string PRIV ] { keepOut }
+Constant [ private string PRIV ] { keepOut }
 
 NULL
 getName():
diff --git a/ext/reflection/tests/ReflectionClassConstant_getValue.phpt b/ext/reflection/tests/ReflectionClassConstant_getValue.phpt
new file mode 100644 (file)
index 0000000..e447d15
--- /dev/null
@@ -0,0 +1,47 @@
+--TEST--
+Test variations of getting constant values
+--FILE--
+<?php
+
+/* Use separate classes to make sure that in-place constant updates don't interfere */
+class A {
+    const X = self::Y * 2;
+    const Y = 1;
+}
+class B {
+    const X = self::Y * 2;
+    const Y = 1;
+}
+class C {
+    const X = self::Y * 2;
+    const Y = 1;
+}
+
+var_dump((new ReflectionClassConstant('A', 'X'))->getValue());
+echo new ReflectionClassConstant('B', 'X');
+echo new ReflectionClass('C');
+
+?>
+--EXPECTF--
+int(2)
+Constant [ public integer X ] { 2 }
+Class [ <user> class C ] {
+  @@ %s 12-15
+
+  - Constants [2] {
+    Constant [ public integer X ] { 2 }
+    Constant [ public integer Y ] { 1 }
+  }
+
+  - Static properties [0] {
+  }
+
+  - Static methods [0] {
+  }
+
+  - Properties [0] {
+  }
+
+  - Methods [0] {
+  }
+}