]> granicus.if.org Git - php/commitdiff
- MFH
authorMarcus Boerger <helly@php.net>
Sun, 13 Mar 2005 13:24:26 +0000 (13:24 +0000)
committerMarcus Boerger <helly@php.net>
Sun, 13 Mar 2005 13:24:26 +0000 (13:24 +0000)
Zend/tests/bug32290.phpt [new file with mode: 0755]
Zend/zend_execute_API.c
Zend/zend_reflection_api.c
ext/reflection/php_reflection.c

diff --git a/Zend/tests/bug32290.phpt b/Zend/tests/bug32290.phpt
new file mode 100755 (executable)
index 0000000..f754275
--- /dev/null
@@ -0,0 +1,35 @@
+--TEST--
+Bug #32290 (calling call_user_func_array() ends in infinite loop within child class)
+--FILE--
+<?php
+
+class TestA
+{
+       public function doSomething($i)
+       {
+               echo __METHOD__ . "($this)\n";
+               return --$i;
+       }
+}
+
+class TestB extends TestA
+{
+       public function doSomething($i)
+       {
+               echo __METHOD__ . "($this)\n";
+               $i++;
+               if ($i >= 5) return 5;
+               return call_user_func_array(array("TestA","doSomething"), array($i));
+       }
+}
+
+$x = new TestB();
+var_dump($x->doSomething(1));
+
+?>
+===DONE===
+--EXPECTF--
+TestB::doSomething(Object id #%d)
+TestA::doSomething(Object id #%d)
+int(1)
+===DONE===
index 307fa2d545850b16836e9688af4758b361d128ff..ea38c03156be81d9e35d2e4c3acf762d7630e901 100644 (file)
@@ -690,6 +690,14 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
                        }
                        EX(function_state).function = 
                                Z_OBJ_HT_PP(fci->object_pp)->get_method(*fci->object_pp, Z_STRVAL_P(fci->function_name), Z_STRLEN_P(fci->function_name) TSRMLS_CC);
+                       if (EX(function_state).function && calling_scope != EX(function_state).function->common.scope) {
+                               char *function_name_lc = zend_str_tolower_dup(Z_STRVAL_P(fci->function_name), Z_STRLEN_P(fci->function_name));
+                               if (zend_hash_find(&calling_scope->function_table, function_name_lc, fci->function_name->value.str.len+1, (void **) &EX(function_state).function)==FAILURE) {
+                                       efree(function_name_lc);
+                                       zend_error(E_ERROR, "Cannot call method %s::%s() or method does not exist", calling_scope->name, Z_STRVAL_P(fci->function_name));
+                               }
+                               efree(function_name_lc);
+                       }
                } else if (calling_scope) {
                        char *function_name_lc = zend_str_tolower_dup(Z_STRVAL_P(fci->function_name), Z_STRLEN_P(fci->function_name));
 
index 20e9a1ffc235ca6897a986c00c38a8ff0e48412e..1409cd6d8a5b810e1c0ca1155ec85f0bfb6aa0ec 100644 (file)
@@ -3051,6 +3051,7 @@ ZEND_METHOD(reflection_property, getValue)
        }
 
        if ((ref->prop->flags & ZEND_ACC_STATIC)) {
+               zend_update_class_constants(intern->ce TSRMLS_CC);
                if (zend_hash_quick_find(intern->ce->static_members, ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &member) == FAILURE) {
                        zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
                        /* Bails out */
index 20e9a1ffc235ca6897a986c00c38a8ff0e48412e..1409cd6d8a5b810e1c0ca1155ec85f0bfb6aa0ec 100644 (file)
@@ -3051,6 +3051,7 @@ ZEND_METHOD(reflection_property, getValue)
        }
 
        if ((ref->prop->flags & ZEND_ACC_STATIC)) {
+               zend_update_class_constants(intern->ce TSRMLS_CC);
                if (zend_hash_quick_find(intern->ce->static_members, ref->prop->name, ref->prop->name_length + 1, ref->prop->h, (void **) &member) == FAILURE) {
                        zend_error(E_ERROR, "Internal error: Could not find the property %s", ref->prop->name);
                        /* Bails out */