]> granicus.if.org Git - php/commitdiff
- Fix newly introduced problem reported by Sam Ruby
authorZeev Suraski <zeev@php.net>
Wed, 15 Mar 2000 17:32:29 +0000 (17:32 +0000)
committerZeev Suraski <zeev@php.net>
Wed, 15 Mar 2000 17:32:29 +0000 (17:32 +0000)
Zend/zend-scanner.l
Zend/zend.h
Zend/zend_execute.c

index 538a85e2ffccc3f76e5094f9bd3d2a0418e476c2..5e214e13e6c2ffce282402216a64f30401a21bf7 100644 (file)
@@ -334,12 +334,13 @@ ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count,
        zend_op_array *op_array = (zend_op_array *) emalloc(sizeof(zend_op_array));
        zend_op_array *original_active_op_array = CG(active_op_array);
        zend_op_array *retval=NULL;
-       zend_file_handle *file_handle;
        int i;
        int compiler_result;
        int compiled_files=0;
+       int last_file=0;
        znode retval_znode;
        zend_bool original_in_compilation = CG(in_compilation);
+       zend_file_handle **file_handles = (zend_file_handle **) do_alloca(file_count * sizeof(zend_file_handle *));
 
        retval_znode.op_type = IS_CONST;
        retval_znode.u.constant.type = IS_LONG;
@@ -351,19 +352,26 @@ ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count,
        save_lexical_state(&original_lex_state CLS_CC);
 
        retval = op_array; /* success oriented */
+
+       for (i=0; i<file_count; i++) {
+               file_handles[i] = va_arg(files, zend_file_handle *);
+               if (file_handles[i]) {
+                       last_file = i;
+               }
+       }
+
        for (i=0; i<file_count; i++) {
-               file_handle = va_arg(files, zend_file_handle *);
-               if (!file_handle) {
+               if (!file_handles[i]) {
                        continue;
                }
-               if (open_file_for_scanning(file_handle CLS_CC)==FAILURE) {
-                       zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename);
+               if (open_file_for_scanning(file_handles[i] CLS_CC)==FAILURE) {
+                       zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handles[i]->filename);
                } else {
                        CG(in_compilation) = 1;
                        CG(active_op_array) = op_array;
                        compiler_result = zendparse(CLS_C);
-                       zend_close_file_handle(file_handle CLS_CC);
-                       if (i == file_count-1) {
+                       zend_close_file_handle(file_handles[i] CLS_CC);
+                       if (i == last_file) {
                                do_return(&retval_znode, 0 CLS_CC);
                        }
                        restore_lexical_state(&original_lex_state CLS_CC);
@@ -391,6 +399,7 @@ ZEND_API zend_op_array *v_compile_files(int mark_as_ref CLS_DC, int file_count,
                        retval = NULL;
                }
        }
+       free_alloca(file_handles);
        return retval;
 }
 
index aac08cc05787ba3e0bda14a823d478f180446616..614d8614f7ae80c51a2f25fe7dfa1a37695afdfc 100644 (file)
 # define ZEND_EXTENSIONS_SUPPORT       0
 #endif
 
+#if (HAVE_ALLOCA || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS) && defined(ZEND_WIN32))
+#      define do_alloca(p) alloca(p)
+#      define free_alloca(p)
+#else
+#      define do_alloca(p)             emalloc(p)
+#      define free_alloca(p)   efree(p)
+#endif
+
 #if ZEND_DEBUG
 #define ZEND_FILE_LINE_D                               char *__zend_filename, uint __zend_lineno
 #define ZEND_FILE_LINE_DC                              , ZEND_FILE_LINE_D
index e726736e9d090027cf644637008e55f84881a002..44dab2b10c6e389fa2ae502dc3862e48c0c7319b 100644 (file)
@@ -966,15 +966,6 @@ static int zend_check_symbol(zval **pz)
 #define CHECK_SYMBOL_TABLES()
 #endif
 
-
-#if (HAVE_ALLOCA || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS) && defined(ZEND_WIN32))
-#      define do_alloca(p) alloca(p)
-#      define free_alloca(p)
-#else
-#      define do_alloca(p)             emalloc(p)
-#      define free_alloca(p)   efree(p)
-#endif
-
 #define NEXT_OPCODE()          \
        CHECK_SYMBOL_TABLES()   \
        opline++;                               \