]> granicus.if.org Git - php/commitdiff
Fixed bug #64529 (Ran out of opcode space)
authorDmitry Stogov <dmitry@zend.com>
Wed, 27 Mar 2013 20:03:40 +0000 (00:03 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 27 Mar 2013 20:03:40 +0000 (00:03 +0400)
NEWS
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_execute_API.c
Zend/zend_language_scanner.c
Zend/zend_language_scanner.l
Zend/zend_language_scanner_defs.h

diff --git a/NEWS b/NEWS
index 010b8f11aba80d46040a848dcff39e2208fec9a5..c085d8f5664bd0bd5461f006b5d1ceb597cffabb 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,7 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2013, PHP 5.4.14
 - Core
+  . Fixed bug #64529 (Ran out of opcode space). (Dmitry)
   . Fixed bug #64515 (Memoryleak when using the same variablename 2times in
     function declaration). (Laruence)
   . Fixed bug #64432 (more empty delimiter warning in strX methods). (Laruence)
index 766a2de01a3bc9a7720b5127113f7c4d97caef6b..82275ce6246dfa3477249ae4ff8f8f71b5c1a638 100644 (file)
@@ -1798,7 +1798,7 @@ void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC) /*
        zend_do_return(NULL, 0 TSRMLS_CC);
 
        pass_two(CG(active_op_array) TSRMLS_CC);
-       zend_release_labels(TSRMLS_C);
+       zend_release_labels(0 TSRMLS_CC);
 
        if (CG(active_class_entry)) {
                zend_check_magic_method_implementation(CG(active_class_entry), (zend_function*)CG(active_op_array), E_COMPILE_ERROR TSRMLS_CC);
@@ -2320,13 +2320,14 @@ void zend_do_goto(const znode *label TSRMLS_DC) /* {{{ */
 }
 /* }}} */
 
-void zend_release_labels(TSRMLS_D) /* {{{ */
+void zend_release_labels(int temporary TSRMLS_DC) /* {{{ */
 {
        if (CG(context).labels) {
                zend_hash_destroy(CG(context).labels);
                FREE_HASHTABLE(CG(context).labels);
+               CG(context).labels = NULL;
        }
-       if (!zend_stack_is_empty(&CG(context_stack))) {
+       if (!temporary && !zend_stack_is_empty(&CG(context_stack))) {
                zend_compiler_context *ctx;
 
                zend_stack_top(&CG(context_stack), (void**)&ctx);
index 50ee3a4d7fd338c77a197e3c5381fe5265ca0263..32449d2a6608ae24440240eb559313b3a72348d8 100644 (file)
@@ -616,7 +616,7 @@ void zend_do_end_compilation(TSRMLS_D);
 void zend_do_label(znode *label TSRMLS_DC);
 void zend_do_goto(const znode *label TSRMLS_DC);
 void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline, int pass2 TSRMLS_DC);
-void zend_release_labels(TSRMLS_D);
+void zend_release_labels(int temporary TSRMLS_DC);
 
 ZEND_API void function_add_ref(zend_function *function);
 
index a38504fbb4c20a71d18071af544274dec801a05f..09e703ca59a73cb3cefffd066e011d291582fc80 100644 (file)
@@ -1313,7 +1313,7 @@ void execute_new_code(TSRMLS_D) /* {{{ */
                opline++;
        }
        
-       zend_release_labels(TSRMLS_C);
+       zend_release_labels(1 TSRMLS_CC);
        
        EG(return_value_ptr_ptr) = NULL;
        EG(active_op_array) = CG(active_op_array);
index 40fb5745597d0dc58671868bf3a2d935841cae9d..03cf334dbaf6c348d8c69824a4a04b854a4f6edc 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Wed Nov 14 17:46:56 2012 */
+/* Generated by re2c 0.13.5 on Wed Mar 27 23:52:29 2013 */
 #line 1 "Zend/zend_language_scanner.l"
 /*
    +----------------------------------------------------------------------+
@@ -595,7 +595,7 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSR
                CG(active_op_array) = original_active_op_array;
                if (compilation_successful) {
                        pass_two(op_array TSRMLS_CC);
-                       zend_release_labels(TSRMLS_C);
+                       zend_release_labels(0 TSRMLS_CC);
                } else {
                        efree(op_array);
                        retval = NULL;
@@ -770,7 +770,7 @@ zend_op_array *compile_string(zval *source_string, char *filename TSRMLS_DC)
                        zend_do_return(NULL, 0 TSRMLS_CC);
                        CG(active_op_array) = original_active_op_array;
                        pass_two(op_array TSRMLS_CC);
-                       zend_release_labels(TSRMLS_C);
+                       zend_release_labels(0 TSRMLS_CC);
                        retval = op_array;
                }
        }
index cc54557b3bb5c28edee83e1fc8ced288a9b19bc3..97c938ebf6cf1ade3218670802b42c56dea26624 100644 (file)
@@ -593,7 +593,7 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSR
                CG(active_op_array) = original_active_op_array;
                if (compilation_successful) {
                        pass_two(op_array TSRMLS_CC);
-                       zend_release_labels(TSRMLS_C);
+                       zend_release_labels(0 TSRMLS_CC);
                } else {
                        efree(op_array);
                        retval = NULL;
@@ -768,7 +768,7 @@ zend_op_array *compile_string(zval *source_string, char *filename TSRMLS_DC)
                        zend_do_return(NULL, 0 TSRMLS_CC);
                        CG(active_op_array) = original_active_op_array;
                        pass_two(op_array TSRMLS_CC);
-                       zend_release_labels(TSRMLS_C);
+                       zend_release_labels(0 TSRMLS_CC);
                        retval = op_array;
                }
        }
index 9bde2a0e14d9036ede940c70c70160af4d8ae31f..2e9b5c6535a8443afafeeeac5820ccc2b2801b42 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.13.5 on Wed Nov 14 17:46:56 2012 */
+/* Generated by re2c 0.13.5 on Wed Mar 27 23:52:29 2013 */
 #line 3 "Zend/zend_language_scanner_defs.h"
 
 enum YYCONDTYPE {