]> granicus.if.org Git - php/commitdiff
* Fix a bug that occured in case of parse errors. We need to restore the lexical...
authorZeev Suraski <zeev@php.net>
Tue, 11 May 1999 17:50:37 +0000 (17:50 +0000)
committerZeev Suraski <zeev@php.net>
Tue, 11 May 1999 17:50:37 +0000 (17:50 +0000)
even if the compilation failed.

Zend/zend-scanner.l
Zend/zend_compile.c
Zend/zend_globals.h
Zend/zend_highlight.c

index 6eadc7374c2b2b914fb576fe2f353ee3c0e5ba80..a74148fc8c1f5c66c5172819cb21ae5c4f46b5c5 100644 (file)
 #include <stdarg.h>
 #endif
 
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
 #ifdef ZTS
 #define YY_DECL int ZendFlexLexer::lex_scan(zval *zendlval CLS_DC)
 #else
@@ -176,8 +180,6 @@ ZEND_API void zend_close_file_handle(zend_file_handle *file_handle)
 ZEND_API inline int open_file_for_scanning(zend_file_handle *file_handle CLS_DC)
 {
 #ifndef ZTS
-       YY_BUFFER_STATE buffer_state = YY_CURRENT_BUFFER;
-
        switch (file_handle->type) {
                case ZEND_HANDLE_FILENAME:
                        file_handle->handle.fp = zend_fopen(file_handle->filename);
@@ -247,10 +249,12 @@ ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count,
        zend_op_array *retval=NULL;
        zend_file_handle *file_handle;
        int i;
+       int compiler_result;
 
        init_op_array(op_array, INITIAL_OP_ARRAY_SIZE);
        save_lexical_state(&original_lex_state CLS_CC);
 
+       retval = op_array; /* success oriented */
        for (i=0; i<file_count; i++) {
                file_handle = va_arg(files, zend_file_handle *);
                if (!file_handle) {
@@ -265,17 +269,18 @@ ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count,
                        break;
                } else {
                        CG(active_op_array) = op_array;
-                       if (zendparse(CLS_C)==1) {
+                       compiler_result = zendparse(CLS_C);
+                       zend_close_file_handle(file_handle);
+                       restore_lexical_state(&original_lex_state CLS_CC);
+                       CG(active_op_array) = original_active_op_array;
+                       if (compiler_result==1) { /* parser error */
+                               CG(unclean_shutdown) = 1;
                                retval = NULL;
                                break;
-                       } else {
-                               zend_close_file_handle(file_handle);
-                               restore_lexical_state(&original_lex_state CLS_CC);
-                               CG(active_op_array) = original_active_op_array;
-                               retval = op_array;
                        }
                }
        }
+
        if (retval) {
                pass_two(op_array);
                if (mark_as_ref) {
@@ -335,7 +340,12 @@ zend_op_array *compile_string(zval *source_string CLS_DC)
        zend_op_array *original_active_op_array = CG(active_op_array);
        zend_op_array *retval;
        zval tmp;
+       int compiler_result;
 
+       if (source_string->value.str.len==0) {
+               efree(op_array);
+               return NULL;
+       }
        tmp = *source_string;
        zval_copy_ctor(&tmp);
        convert_to_string(&tmp);
@@ -355,19 +365,20 @@ zend_op_array *compile_string(zval *source_string CLS_DC)
 #else
                CG(ZFL)->BeginState(IN_SCRIPTING);
 #endif
-               if (zendparse(CLS_C)==1) {
+               compiler_result = zendparse(CLS_C);
+               restore_lexical_state(&original_lex_state CLS_CC);
+               CG(active_op_array) = original_active_op_array;
+               
+               if (compiler_result==1) {
+                       CG(unclean_shutdown)=1;
                        retval = NULL;
                } else {
                        pass_two(op_array);
                        pass_include_eval(op_array);
-                       restore_lexical_state(&original_lex_state CLS_CC);
-                       CG(active_op_array) = original_active_op_array;
                        retval = op_array;
                }
        }
-
        zval_dtor(&tmp);
-
        return retval;
 }
 
@@ -392,7 +403,9 @@ int require_file(zend_file_handle *file_handle CLS_DC)
                zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename);
                return FAILURE;
        }
-       zendparse(CLS_C);
+       if (zendparse(CLS_C)==1) {
+               CG(unclean_shutdown) = 1;
+       }
        zend_close_file_handle(file_handle);
        restore_lexical_state(&original_lex_state CLS_CC);
        return SUCCESS;
index 64a6b3926e8d01a52738ebb232eb5186eaf5fc91..bb4d1ee2aacef2259a9266c4306844c8ffd8372a 100644 (file)
@@ -66,6 +66,7 @@ void init_compiler(CLS_D ELS_DC)
        CG(handle_op_arrays) = 1;
        zend_hash_apply(&module_registry, (int (*)(void *)) module_registry_request_startup);
        init_resource_list(ELS_C);
+       CG(unclean_shutdown) = 0;
 }
 
 
index 73622e582df991b61df6f4c2f33e810ce9c59ad4..a2036ac5435894a0c7021b9a09a73e5bf0524a24 100644 (file)
@@ -146,6 +146,7 @@ struct _zend_compiler_globals {
        unsigned char extended_info;    /* generate extension information for debugger/profiler */
        unsigned char handle_op_arrays; /* run op_arrays through op_array handlers */
 
+       unsigned char unclean_shutdown;
 #ifdef ZTS
 #ifdef __cplusplus
        ZendFlexLexer *ZFL;
index 0fc0b8cbcd014a8179462eb706495f1f9aa7c358..e80fac449bc06d473a6cac9d14d4491c5b62bb9e 100644 (file)
@@ -138,13 +138,13 @@ ZEND_API void zend_highlight(zend_syntax_highlighter_ini *syntax_highlighter_ini
 
                if (token.type == IS_STRING) {
                        switch (token_type) {
-                       case T_OPEN_TAG:
-                       case T_CLOSE_TAG:
-                       case T_WHITESPACE:
-                               break;
-                       default:
-                               efree(token.value.str.val);
-                               break;
+                               case T_OPEN_TAG:
+                               case T_CLOSE_TAG:
+                               case T_WHITESPACE:
+                                       break;
+                               default:
+                                       efree(token.value.str.val);
+                                       break;
                        }
                }
                token.type = 0;