]> granicus.if.org Git - php/commitdiff
Fixed bug #35634 (Erroneous "Class declarations may not be nested" error raised)...
authorDmitry Stogov <dmitry@php.net>
Thu, 11 Jan 2007 16:47:32 +0000 (16:47 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 11 Jan 2007 16:47:32 +0000 (16:47 +0000)
NEWS
Zend/tests/bug35634.phpt [new file with mode: 0755]
Zend/zend.c

diff --git a/NEWS b/NEWS
index 5c37fde9ccdf23342a46b4dcaf970e3a4ae75912..3d493125cacf0df3709c2208e2223d59bbaaeb43 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -33,6 +33,8 @@ PHP                                                                        NEWS
   not found"). (Ilia)
 - Fixed bug #36214 (__get method works properly only when conditional operator
   is used). (Dmitry)
+- Fixed bug #35634 (Erroneous "Class declarations may not be nested" error
+  raised). (Carl P. Corliss, Dmitry)
 - Fixed bug #35106 (nested foreach fails when array variable has a reference).
   (Dmitry)
 
diff --git a/Zend/tests/bug35634.phpt b/Zend/tests/bug35634.phpt
new file mode 100755 (executable)
index 0000000..9681b6a
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+Bug #35634 (Erroneous "Class declarations may not be nested" error raised)
+--INI--
+error_reporting=0
+--FILE--
+<?php
+if (defined("pass3")) {
+
+  class ErrorClass {
+  }
+
+} else if (defined("pass2")) {
+
+  class TestClass {
+    function __construct() {
+    }
+    function TestClass() {
+      $this->__construct();
+    }
+  }
+
+} else {
+
+  function errorHandler($errorNumber, $errorMessage, $fileName, $lineNumber) {
+    define("pass3", 1);
+    include(__FILE__);
+    die("Error: $errorMessage ($fileName:$lineNumber)\n");
+  }
+
+  set_error_handler('errorHandler');
+  define("pass2", 1);
+  include(__FILE__);
+}
+?>
+--EXPECTF--
+Error: Redefining already defined constructor for class TestClass (%sbug35634.php:12)
index 988779f5e0ad348e3ed553ecc89ffeec3aecdb53..7f7580354475c49b5bc87d08944bb32963155a18 100644 (file)
@@ -900,6 +900,8 @@ ZEND_API void zend_error(int type, const char *format, ...)
        char *error_filename;
        uint error_lineno;
        zval *orig_user_error_handler;
+       zend_bool in_compilation;
+       zend_class_entry *saved_class_entry;
        TSRMLS_FETCH();
 
        /* Obtain relevant filename and lineno */
@@ -1007,7 +1009,18 @@ ZEND_API void zend_error(int type, const char *format, ...)
 
                        orig_user_error_handler = EG(user_error_handler);
                        EG(user_error_handler) = NULL;
-           
+                       
+                       /* User error handler may include() additinal PHP files.
+                        * If an error was generated during comilation PHP will compile
+                        * such scripts recursivly, but some CG() variables may be 
+                        * inconsistent. */ 
+
+                       in_compilation = zend_is_compiling(TSRMLS_C);
+                       if (in_compilation) {
+                               saved_class_entry = CG(active_class_entry);
+                               CG(active_class_entry) = NULL;
+                       }
+
                        if (call_user_function_ex(CG(function_table), NULL, orig_user_error_handler, &retval, 5, params, 1, NULL TSRMLS_CC)==SUCCESS) {
                                if (retval) {
                                        if (Z_TYPE_P(retval) == IS_BOOL && Z_LVAL_P(retval) == 0) {
@@ -1020,6 +1033,10 @@ ZEND_API void zend_error(int type, const char *format, ...)
                                zend_error_cb(type, error_filename, error_lineno, format, args);
                        }
 
+                       if (in_compilation) {
+                               CG(active_class_entry) = saved_class_entry;
+                       }
+
                        if (!EG(user_error_handler)) {
                                EG(user_error_handler) = orig_user_error_handler;
                        }