cvs: ZendEngine2 / .cvsignore FlexLexer.h Makefile.am Zend.m4 configure.in flex.skl zend.c zend_compile.c zend_compile.h zend_globals.h zend_globals_macros.h zend_highlight.c zend_ini_parser.y zend_ini_scanner.h zend_ini_scanner.l zend_language_scanner.h zend_language_scanner.l zend_stack.c zend_stream.c zend_stream.h zend_strtod.c zend_vm_def.h zend_vm_execute.h /tests bug38779.phpt bug42767.phpt
[email protected] ("Scott MacVicar")
| Newsgroups | php.zend-engine.cvs |
|---|---|
| Message-ID | <cvsscottmac1206541382@cvsserver> |
scottmac Wed Mar 26 14:23:02 2008 UTC
Removed files:
/ZendEngine2 FlexLexer.h flex.skl
Modified files:
/ZendEngine2 .cvsignore Makefile.am Zend.m4 configure.in zend.c
zend_compile.c zend_compile.h zend_globals.h
zend_globals_macros.h zend_highlight.c
zend_ini_parser.y zend_ini_scanner.h
zend_ini_scanner.l zend_language_scanner.h
zend_language_scanner.l zend_stack.c zend_stream.c
zend_stream.h zend_strtod.c zend_vm_def.h
zend_vm_execute.h
/ZendEngine2/tests bug38779.phpt bug42767.phpt
Log:
MFB 5.3: Rewrite scanner to be based on re2c instead of flex
There are still changes in regards to parsing of Unicode encoded scripts to come.
scottmac-20080326142302.txt
(text/plain, 74.5 KB)
http://cvs.php.net/viewvc.cgi/ZendEngine2/.cvsignore?r1=1.13&r2=1.14&diff_format=u
Index: ZendEngine2/.cvsignore
diff -u ZendEngine2/.cvsignore:1.13 ZendEngine2/.cvsignore:1.14
--- ZendEngine2/.cvsignore:1.13 Sun Oct 10 16:09:31 2004
+++ ZendEngine2/.cvsignore Wed Mar 26 14:23:01 2008
@@ -8,7 +8,7 @@
zend_language_parser.output
zend_language_parser.h
zend_language_scanner.c
-zend_language_scanner_cc.cc
+zend_language_scanner_defs.h
.deps
ylwrap
zend_config.h
@@ -33,14 +33,12 @@
zend_ini_parser.c
zend_ini_parser.h
zend_ini_scanner.c
+zend_ini_scanner_defs.h
zend-scanner.c
zend-parser.output
zend-parser.c
zend-parser.h
zend-scanner-cc.cc
-zend_ini_scanner_cc.cc
-zend_language_scanner.cpp
-zend_ini_scanner.cpp
*.plg
*.opt
*.ncb
http://cvs.php.net/viewvc.cgi/ZendEngine2/Makefile.am?r1=1.61&r2=1.62&diff_format=u
Index: ZendEngine2/Makefile.am
diff -u ZendEngine2/Makefile.am:1.61 ZendEngine2/Makefile.am:1.62
--- ZendEngine2/Makefile.am:1.61 Tue Dec 5 08:08:33 2006
+++ ZendEngine2/Makefile.am Wed Mar 26 14:23:01 2008
@@ -31,7 +31,7 @@
# Language parser/scanner rules
zend_language_scanner.c: $(srcdir)/zend_language_scanner.l
- $(LEX) -Pzend -S$(srcdir)/flex.skl -o$@ -i $(srcdir)/zend_language_scanner.l
+ $(RE2C) $(RE2C_FLAGS) --case-inverted -cbdFt $(srcdir)/zend_language_scanner_defs.h -o$@ $(srcdir)/zend_language_scanner.l
zend_language_parser.h: zend_language_parser.c
zend_language_parser.c: $(srcdir)/zend_language_parser.y
@@ -43,7 +43,7 @@
$(YACC) -p ini_ -v -d $(srcdir)/zend_ini_parser.y -o zend_ini_parser.c
zend_ini_scanner.c: $(srcdir)/zend_ini_scanner.l
- $(LEX) -Pini_ -S$(srcdir)/flex.skl -o$@ -i $(srcdir)/zend_ini_scanner.l
+ $(RE2C) $(RE2C_FLAGS) --case-inverted -cbdFt $(srcdir)/zend_ini_scanner_defs.h -o$@ $(srcdir)/zend_ini_scanner.l
zend_ini_parser.h: zend_ini_parser.c
http://cvs.php.net/viewvc.cgi/ZendEngine2/Zend.m4?r1=1.66&r2=1.67&diff_format=u
Index: ZendEngine2/Zend.m4
diff -u ZendEngine2/Zend.m4:1.66 ZendEngine2/Zend.m4:1.67
--- ZendEngine2/Zend.m4:1.66 Wed Mar 19 16:37:48 2008
+++ ZendEngine2/Zend.m4 Wed Mar 26 14:23:01 2008
@@ -1,5 +1,5 @@
dnl
-dnl $Id: Zend.m4,v 1.66 2008/03/19 16:37:48 rasmus Exp $
+dnl $Id: Zend.m4,v 1.67 2008/03/26 14:23:01 scottmac Exp $
dnl
dnl This file contains Zend specific autoconf functions.
dnl
@@ -31,7 +31,6 @@
AC_REQUIRE([AC_PROG_YACC])
AC_REQUIRE([AC_PROG_CC])
AC_REQUIRE([AC_PROG_CC_C_O])
-AC_REQUIRE([AC_PROG_LEX])
AC_REQUIRE([AC_HEADER_STDC])
LIBZEND_BISON_CHECK
http://cvs.php.net/viewvc.cgi/ZendEngine2/configure.in?r1=1.36&r2=1.37&diff_format=u
Index: ZendEngine2/configure.in
diff -u ZendEngine2/configure.in:1.36 ZendEngine2/configure.in:1.37
--- ZendEngine2/configure.in:1.36 Sat Jan 22 20:28:17 2005
+++ ZendEngine2/configure.in Wed Mar 26 14:23:01 2008
@@ -1,4 +1,4 @@
-dnl $Id: configure.in,v 1.36 2005/01/22 20:28:17 sniper Exp $
+dnl $Id: configure.in,v 1.37 2008/03/26 14:23:01 scottmac Exp $
dnl Process this file with autoconf to produce a configure script.
AC_INIT(zend.c)
@@ -7,7 +7,6 @@
AM_SANITY_CHECK
AM_MAINTAINER_MODE
AC_PROG_CC
-AM_PROG_LEX
AM_PROG_CC_STDC
ZEND_VERSION=$VERSION
AC_ZEND_C_BIGENDIAN
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend.c?r1=1.411&r2=1.412&diff_format=u
Index: ZendEngine2/zend.c
diff -u ZendEngine2/zend.c:1.411 ZendEngine2/zend.c:1.412
--- ZendEngine2/zend.c:1.411 Wed Mar 19 16:37:48 2008
+++ ZendEngine2/zend.c Wed Mar 26 14:23:01 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend.c,v 1.411 2008/03/19 16:37:48 rasmus Exp $ */
+/* $Id: zend.c,v 1.412 2008/03/26 14:23:01 scottmac Exp $ */
#include "zend.h"
#include "zend_extensions.h"
@@ -928,19 +928,15 @@
#include <floatingpoint.h>
#endif
-static void scanner_globals_ctor(zend_scanner_globals *scanner_globals_p TSRMLS_DC) /* {{{ */
+static void ini_scanner_globals_ctor(zend_ini_scanner_globals *scanner_globals_p TSRMLS_DC) /* {{{ */
{
- scanner_globals_p->c_buf_p = (char *) 0;
- scanner_globals_p->init = 1;
- scanner_globals_p->start = 0;
- scanner_globals_p->current_buffer = NULL;
- scanner_globals_p->yy_in = NULL;
- scanner_globals_p->yy_out = NULL;
- scanner_globals_p->_yy_more_flag = 0;
- scanner_globals_p->_yy_more_len = 0;
- scanner_globals_p->yy_start_stack_ptr = 0;
- scanner_globals_p->yy_start_stack_depth = 0;
- scanner_globals_p->yy_start_stack = 0;
+ memset(scanner_globals_p, 0, sizeof(*scanner_globals_p));
+}
+/* }}} */
+
+static void php_scanner_globals_ctor(zend_php_scanner_globals *scanner_globals_p TSRMLS_DC) /* {{{ */
+{
+ memset(scanner_globals_p, 0, sizeof(*scanner_globals_p));
}
/* }}} */
@@ -1022,8 +1018,8 @@
extern ZEND_API ts_rsrc_id language_scanner_globals_id;
extern ZEND_API ts_rsrc_id unicode_globals_id;
#else
- extern zend_scanner_globals ini_scanner_globals;
- extern zend_scanner_globals language_scanner_globals;
+ extern zend_ini_scanner_globals ini_scanner_globals;
+ extern zend_php_scanner_globals language_scanner_globals;
extern zend_unicode_globals unicode_globals;
#endif
TSRMLS_FETCH();
@@ -1104,8 +1100,8 @@
ts_allocate_id(&unicode_globals_id, sizeof(zend_unicode_globals), (ts_allocate_ctor) unicode_globals_ctor, (ts_allocate_dtor) unicode_globals_dtor);
ts_allocate_id(&compiler_globals_id, sizeof(zend_compiler_globals), (ts_allocate_ctor) compiler_globals_ctor, (ts_allocate_dtor) compiler_globals_dtor);
ts_allocate_id(&executor_globals_id, sizeof(zend_executor_globals), (ts_allocate_ctor) executor_globals_ctor, (ts_allocate_dtor) executor_globals_dtor);
- ts_allocate_id(&language_scanner_globals_id, sizeof(zend_scanner_globals), (ts_allocate_ctor) scanner_globals_ctor, NULL);
- ts_allocate_id(&ini_scanner_globals_id, sizeof(zend_scanner_globals), (ts_allocate_ctor) scanner_globals_ctor, NULL);
+ ts_allocate_id(&language_scanner_globals_id, sizeof(zend_php_scanner_globals), (ts_allocate_ctor) php_scanner_globals_ctor, NULL);
+ ts_allocate_id(&ini_scanner_globals_id, sizeof(zend_ini_scanner_globals), (ts_allocate_ctor) ini_scanner_globals_ctor, NULL);
compiler_globals = ts_resource(compiler_globals_id);
executor_globals = ts_resource(executor_globals_id);
tsrm_ls = ts_resource_ex(0, NULL);
@@ -1123,8 +1119,8 @@
*executor_globals->zend_constants = *GLOBAL_CONSTANTS_TABLE;
#else
unicode_globals_ctor(&unicode_globals TSRMLS_CC);
- scanner_globals_ctor(&ini_scanner_globals TSRMLS_CC);
- scanner_globals_ctor(&language_scanner_globals TSRMLS_CC);
+ ini_scanner_globals_ctor(&ini_scanner_globals TSRMLS_CC);
+ php_scanner_globals_ctor(&language_scanner_globals TSRMLS_CC);
zend_set_default_compile_time_values(TSRMLS_C);
EG(user_error_handler) = NULL;
EG(user_exception_handler) = NULL;
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.c?r1=1.816&r2=1.817&diff_format=u
Index: ZendEngine2/zend_compile.c
diff -u ZendEngine2/zend_compile.c:1.816 ZendEngine2/zend_compile.c:1.817
--- ZendEngine2/zend_compile.c:1.816 Sat Mar 22 19:10:20 2008
+++ ZendEngine2/zend_compile.c Wed Mar 26 14:23:01 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_compile.c,v 1.816 2008/03/22 19:10:20 felipe Exp $ */
+/* $Id: zend_compile.c,v 1.817 2008/03/26 14:23:01 scottmac Exp $ */
#include <zend_language_parser.h>
#include "zend.h"
@@ -87,7 +87,7 @@
char *filename;
uint filename_length;
- char_pos_len = zend_sprintf(char_pos_buf, "%p", LANG_SCNG(_yy_last_accepting_cpos));
+ char_pos_len = zend_sprintf(char_pos_buf, "%p", LANG_SCNG(yy_text));
if (CG(active_op_array)->filename) {
filename = CG(active_op_array)->filename;
} else {
@@ -169,6 +169,14 @@
}
/* }}} */
+ZEND_API void file_handle_dtor(zend_file_handle *fh) /* {{{ */
+{
+ TSRMLS_FETCH();
+
+ zend_file_handle_dtor(fh TSRMLS_CC);
+}
+/* }}} */
+
void init_compiler(TSRMLS_D) /* {{{ */
{
CG(auto_globals_cache) = emalloc(sizeof(zval**) * zend_hash_num_elements(CG(auto_globals)));
@@ -177,7 +185,7 @@
zend_init_rsrc_list(TSRMLS_C);
zend_hash_init(&CG(filenames_table), 5, NULL, (dtor_func_t) free_estring, 0);
zend_hash_init(&CG(script_encodings_table), 5, NULL, (dtor_func_t) free_estring, 0);
- zend_llist_init(&CG(open_files), sizeof(zend_file_handle), (void (*)(void *)) zend_file_handle_dtor, 0);
+ zend_llist_init(&CG(open_files), sizeof(zend_file_handle), (void (*)(void *)) file_handle_dtor, 0);
CG(unclean_shutdown) = 0;
}
/* }}} */
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.h?r1=1.377&r2=1.378&diff_format=u
Index: ZendEngine2/zend_compile.h
diff -u ZendEngine2/zend_compile.h:1.377 ZendEngine2/zend_compile.h:1.378
--- ZendEngine2/zend_compile.h:1.377 Sat Mar 22 19:10:20 2008
+++ ZendEngine2/zend_compile.h Wed Mar 26 14:23:01 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_compile.h,v 1.377 2008/03/22 19:10:20 felipe Exp $ */
+/* $Id: zend_compile.h,v 1.378 2008/03/26 14:23:01 scottmac Exp $ */
#ifndef ZEND_COMPILE_H
#define ZEND_COMPILE_H
@@ -554,7 +554,6 @@
ZEND_API void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_size TSRMLS_DC);
ZEND_API void destroy_op_array(zend_op_array *op_array TSRMLS_DC);
ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle TSRMLS_DC);
-ZEND_API void zend_file_handle_dtor(zend_file_handle *fh);
ZEND_API int zend_cleanup_class_data(zend_class_entry **pce TSRMLS_DC);
ZEND_API int zend_cleanup_function_data(zend_function *function TSRMLS_DC);
ZEND_API int zend_cleanup_function_data_full(zend_function *function TSRMLS_DC);
@@ -694,14 +693,6 @@
#define ZEND_CT (1<<0)
#define ZEND_RT (1<<1)
-
-#define ZEND_HANDLE_FILENAME 0
-#define ZEND_HANDLE_FD 1
-#define ZEND_HANDLE_FP 2
-#define ZEND_HANDLE_STDIOSTREAM 3
-#define ZEND_HANDLE_FSTREAM 4
-#define ZEND_HANDLE_STREAM 5
-
#define ZEND_FETCH_STANDARD 0
#define ZEND_FETCH_ADD_LOCK (1<<0)
#define ZEND_FETCH_MAKE_REF (1<<1)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_globals.h?r1=1.177&r2=1.178&diff_format=u
Index: ZendEngine2/zend_globals.h
diff -u ZendEngine2/zend_globals.h:1.177 ZendEngine2/zend_globals.h:1.178
--- ZendEngine2/zend_globals.h:1.177 Wed Mar 19 16:37:48 2008
+++ ZendEngine2/zend_globals.h Wed Mar 26 14:23:01 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_globals.h,v 1.177 2008/03/19 16:37:48 rasmus Exp $ */
+/* $Id: zend_globals.h,v 1.178 2008/03/26 14:23:01 scottmac Exp $ */
#ifndef ZEND_GLOBALS_H
#define ZEND_GLOBALS_H
@@ -243,37 +243,45 @@
void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};
-struct _zend_scanner_globals {
+struct _zend_ini_scanner_globals {
zend_file_handle *yy_in;
zend_file_handle *yy_out;
- int yy_leng;
- char *yy_text;
- struct yy_buffer_state *current_buffer;
- char *c_buf_p;
- int init;
- int start;
+
+ unsigned int yy_leng;
+ unsigned char *yy_start;
+ unsigned char *yy_text;
+ unsigned char *yy_cursor;
+ unsigned char *yy_marker;
+ unsigned char *yy_limit;
+ int yy_state;
+ zend_stack state_stack;
+ char *filename;
int lineno;
- char _yy_hold_char;
- int yy_n_chars;
- int _yy_did_buffer_switch_on_eof;
- int _yy_last_accepting_state; /* Must be of the same type as yy_state_type,
- * if for whatever reason it's no longer int!
- */
- char *_yy_last_accepting_cpos;
- int _yy_more_flag;
- int _yy_more_len;
- int yy_start_stack_ptr;
- int yy_start_stack_depth;
- int *yy_start_stack;
+
+ /* Modes are: ZEND_INI_SCANNER_NORMAL, ZEND_INI_SCANNER_RAW */
+ int scanner_mode;
+};
+
+struct _zend_php_scanner_globals {
+ zend_file_handle *yy_in;
+ zend_file_handle *yy_out;
+
+ unsigned int yy_leng;
+ unsigned char *yy_start;
+ unsigned char *yy_text;
+ unsigned char *yy_cursor;
+ unsigned char *yy_marker;
+ unsigned char *yy_limit;
+ int yy_state;
+ zend_stack state_stack;
+
+ zend_llist used_state_stacks;
UConverter *input_conv; /* converter for flex input */
UConverter *output_conv; /* converter for data from flex output */
zend_bool encoding_checked;
char* rest_str;
int rest_len;
-
- /* For ini scanner. Modes are: ZEND_INI_SCANNER_NORMAL, ZEND_INI_SCANNER_RAW */
- int scanner_mode;
};
struct _zend_unicode_globals {
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_globals_macros.h?r1=1.29&r2=1.30&diff_format=u
Index: ZendEngine2/zend_globals_macros.h
diff -u ZendEngine2/zend_globals_macros.h:1.29 ZendEngine2/zend_globals_macros.h:1.30
--- ZendEngine2/zend_globals_macros.h:1.29 Mon Dec 31 07:12:06 2007
+++ ZendEngine2/zend_globals_macros.h Wed Mar 26 14:23:01 2008
@@ -17,14 +17,15 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_globals_macros.h,v 1.29 2007/12/31 07:12:06 sebastian Exp $ */
+/* $Id: zend_globals_macros.h,v 1.30 2008/03/26 14:23:01 scottmac Exp $ */
#ifndef ZEND_GLOBALS_MACROS_H
#define ZEND_GLOBALS_MACROS_H
typedef struct _zend_compiler_globals zend_compiler_globals;
typedef struct _zend_executor_globals zend_executor_globals;
-typedef struct _zend_scanner_globals zend_scanner_globals;
+typedef struct _zend_php_scanner_globals zend_php_scanner_globals;
+typedef struct _zend_ini_scanner_globals zend_ini_scanner_globals;
typedef struct _zend_unicode_globals zend_unicode_globals;
BEGIN_EXTERN_C()
@@ -50,21 +51,21 @@
/* Language Scanner */
#ifdef ZTS
-# define LANG_SCNG(v) TSRMG(language_scanner_globals_id, zend_scanner_globals *, v)
+# define LANG_SCNG(v) TSRMG(language_scanner_globals_id, zend_php_scanner_globals *, v)
extern ZEND_API ts_rsrc_id language_scanner_globals_id;
#else
# define LANG_SCNG(v) (language_scanner_globals.v)
-extern ZEND_API zend_scanner_globals language_scanner_globals;
+extern ZEND_API zend_php_scanner_globals language_scanner_globals;
#endif
/* INI Scanner */
#ifdef ZTS
-# define INI_SCNG(v) TSRMG(ini_scanner_globals_id, zend_scanner_globals *, v)
+# define INI_SCNG(v) TSRMG(ini_scanner_globals_id, zend_ini_scanner_globals *, v)
extern ZEND_API ts_rsrc_id ini_scanner_globals_id;
#else
# define INI_SCNG(v) (ini_scanner_globals.v)
-extern ZEND_API zend_scanner_globals ini_scanner_globals;
+extern ZEND_API zend_ini_scanner_globals ini_scanner_globals;
#endif
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_highlight.c?r1=1.62&r2=1.63&diff_format=u
Index: ZendEngine2/zend_highlight.c
diff -u ZendEngine2/zend_highlight.c:1.62 ZendEngine2/zend_highlight.c:1.63
--- ZendEngine2/zend_highlight.c:1.62 Tue Feb 12 09:28:17 2008
+++ ZendEngine2/zend_highlight.c Wed Mar 26 14:23:01 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_highlight.c,v 1.62 2008/02/12 09:28:17 dmitry Exp $ */
+/* $Id: zend_highlight.c,v 1.63 2008/03/26 14:23:01 scottmac Exp $ */
#include "zend.h"
#include <zend_language_parser.h>
@@ -163,7 +163,7 @@
}
/* handler for trailing comments, see bug #42767 */
- if (LANG_SCNG(yy_leng) && LANG_SCNG(_yy_more_len)) {
+ if (LANG_SCNG(yy_leng) && LANG_SCNG(yy_text) < LANG_SCNG(yy_limit)) {
if (last_color != syntax_highlighter_ini->highlight_comment) {
if (last_color != syntax_highlighter_ini->highlight_html) {
zend_printf("</span>");
@@ -172,7 +172,7 @@
zend_printf("<span style=\"color: %s\">", syntax_highlighter_ini->highlight_comment);
}
}
- zend_html_puts(LANG_SCNG(yy_text), LANG_SCNG(_yy_more_len) TSRMLS_CC);
+ zend_html_puts(LANG_SCNG(yy_text), (LANG_SCNG(yy_limit) - LANG_SCNG(yy_text)) TSRMLS_CC);
}
if (last_color != syntax_highlighter_ini->highlight_html) {
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_ini_parser.y?r1=1.50&r2=1.51&diff_format=u
Index: ZendEngine2/zend_ini_parser.y
diff -u ZendEngine2/zend_ini_parser.y:1.50 ZendEngine2/zend_ini_parser.y:1.51
--- ZendEngine2/zend_ini_parser.y:1.50 Mon Feb 4 20:45:15 2008
+++ ZendEngine2/zend_ini_parser.y Wed Mar 26 14:23:01 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_ini_parser.y,v 1.50 2008/02/04 20:45:15 jani Exp $ */
+/* $Id: zend_ini_parser.y,v 1.51 2008/03/26 14:23:01 scottmac Exp $ */
#define DEBUG_CFG_PARSER 0
@@ -204,7 +204,7 @@
CG(ini_parser_unbuffered_errors) = unbuffered_errors;
retval = ini_parse(TSRMLS_C);
- zend_ini_close_file(fh TSRMLS_CC);
+ zend_file_handle_dtor(fh TSRMLS_CC);
shutdown_ini_scanner(TSRMLS_C);
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_ini_scanner.h?r1=1.19&r2=1.20&diff_format=u
Index: ZendEngine2/zend_ini_scanner.h
diff -u ZendEngine2/zend_ini_scanner.h:1.19 ZendEngine2/zend_ini_scanner.h:1.20
--- ZendEngine2/zend_ini_scanner.h:1.19 Mon Dec 31 07:12:07 2007
+++ ZendEngine2/zend_ini_scanner.h Wed Mar 26 14:23:01 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_ini_scanner.h,v 1.19 2007/12/31 07:12:07 sebastian Exp $ */
+/* $Id: zend_ini_scanner.h,v 1.20 2008/03/26 14:23:01 scottmac Exp $ */
#ifndef _ZEND_INI_SCANNER_H
#define _ZEND_INI_SCANNER_H
@@ -31,7 +31,6 @@
char *zend_ini_scanner_get_filename(TSRMLS_D);
int zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode TSRMLS_DC);
int zend_ini_prepare_string_for_scanning(char *str, int scanner_mode TSRMLS_DC);
-void zend_ini_close_file(zend_file_handle *fh TSRMLS_DC);
int ini_lex(zval *ini_lval TSRMLS_DC);
void shutdown_ini_scanner(TSRMLS_D);
END_EXTERN_C()
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_ini_scanner.l?r1=1.50&r2=1.51&diff_format=u
Index: ZendEngine2/zend_ini_scanner.l
diff -u ZendEngine2/zend_ini_scanner.l:1.50 ZendEngine2/zend_ini_scanner.l:1.51
--- ZendEngine2/zend_ini_scanner.l:1.50 Mon Feb 4 20:45:15 2008
+++ ZendEngine2/zend_ini_scanner.l Wed Mar 26 14:23:01 2008
@@ -1,4 +1,3 @@
-%{
/*
+----------------------------------------------------------------------+
| Zend Engine |
@@ -15,18 +14,41 @@
+----------------------------------------------------------------------+
| Authors: Zeev Suraski <[email protected]> |
| Jani Taskinen <[email protected]> |
+ | Marcus Boerger <[email protected]> |
+ | Nuno Lopes <[email protected]> |
+ | Scott MacVicar <[email protected]> |
+----------------------------------------------------------------------+
*/
-/* $Id: zend_ini_scanner.l,v 1.50 2008/02/04 20:45:15 jani Exp $ */
+/* $Id: zend_ini_scanner.l,v 1.51 2008/03/26 14:23:01 scottmac Exp $ */
-#define DEBUG_CFG_SCANNER 0
-#define yyleng SCNG(yy_leng)
-#define yytext SCNG(yy_text)
-#define yytext_ptr SCNG(yy_text)
-#define yyin SCNG(yy_in)
-#define yyout SCNG(yy_out)
+#if 0
+# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c)
+#else
+# define YYDEBUG(s, c)
+#endif
+
+#include "zend_ini_scanner_defs.h"
+
+#define YYCTYPE unsigned char
+#define YYFILL(n) { if (YYCURSOR >= YYLIMIT) return 0; }
+#define YYCURSOR SCNG(yy_cursor)
+#define YYLIMIT SCNG(yy_limit)
+#define YYMARKER SCNG(yy_marker)
+
+#define YYGETCONDITION() SCNG(yy_state)
+#define YYSETCONDITION(s) SCNG(yy_state) = s
+
+#define STATE(name) yyc##name
+
+/* emulate flex constructs */
+#define BEGIN(state) YYSETCONDITION(STATE(state))
+#define YYSTATE YYGETCONDITION()
+#define yytext ((char*)SCNG(yy_text))
+#define yyleng SCNG(yy_leng)
+#define yyless(x) YYCURSOR = yytext + x
+/* #define yymore() goto yymore_restart */
/* How it works (for the core ini directives):
* ===========================================
@@ -47,7 +69,7 @@
* 5. User defined ini files (like .htaccess for apache) are parsed for each request and
* stored in separate hash defined by SAPI.
*/
-
+
/* TODO: (ordered by importance :-)
* ===============================================================================
*
@@ -58,46 +80,18 @@
*
*/
-/* These are not needed when yymore() is not used */
-/*
-#define yy_last_accepting_state SCNG(_yy_last_accepting_state)
-#define yy_last_accepting_cpos SCNG(_yy_last_accepting_cpos)
-#define yy_more_flag SCNG(_yy_more_flag)
-#define yy_more_len SCNG(_yy_more_len)
-*/
-
-%}
-
-%x ST_DOUBLE_QUOTES
-%x ST_OFFSET
-%x ST_RAW
-%x ST_SECTION_RAW
-%x ST_SECTION_VALUE
-%x ST_VALUE
-%x ST_VARNAME
-%option stack
-
-%{
-
#include <errno.h>
#include "zend.h"
#include "zend_globals.h"
#include <zend_ini_parser.h>
#include "zend_ini_scanner.h"
-#define YY_DECL int ini_lex(zval *ini_lval TSRMLS_DC)
-
-#define YY_INPUT(buf, result, max_size) \
- if ( ((result = zend_stream_read(yyin, buf, max_size TSRMLS_CC)) == 0) \
- && zend_stream_ferror( yyin TSRMLS_CC) ) \
- YY_FATAL_ERROR( "input in flex scanner failed" );
-
/* Globals Macros */
#define SCNG INI_SCNG
#ifdef ZTS
ZEND_API ts_rsrc_id ini_scanner_globals_id;
#else
-ZEND_API zend_scanner_globals ini_scanner_globals;
+ZEND_API zend_ini_scanner_globals ini_scanner_globals;
#endif
/* Eat trailing whitespace + extra char */
@@ -110,7 +104,6 @@
yytext[yyleng - 1] == ' ') \
) { \
yyleng--; \
- yytext[yyleng]=0; \
}
/* Eat trailing whitespace */
@@ -127,7 +120,30 @@
return type; \
}
-static char *ini_filename;
+static void _yy_push_state(int new_state TSRMLS_DC)
+{
+ zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int));
+ YYSETCONDITION(new_state);
+}
+
+#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm)
+
+static void yy_pop_state(TSRMLS_D)
+{
+ int *stack_state;
+ zend_stack_top(&SCNG(state_stack), (void **) &stack_state);
+ YYSETCONDITION(*stack_state);
+ zend_stack_del_top(&SCNG(state_stack));
+}
+
+static void yy_scan_buffer(char *str, unsigned int len TSRMLS_DC)
+{
+ YYCURSOR = (YYCTYPE*)str;
+ SCNG(yy_start) = YYCURSOR;
+ YYLIMIT = YYCURSOR + len;
+}
+
+#define ini_filename SCNG(filename)
/* {{{ init_ini_scanner()
*/
@@ -135,9 +151,8 @@
{
SCNG(lineno) = 1;
SCNG(scanner_mode) = ZEND_INI_SCANNER_NORMAL;
- SCNG(yy_start_stack_ptr) = 0;
- SCNG(yy_start_stack_depth) = 0;
- SCNG(current_buffer) = NULL;
+ zend_stack_init(&SCNG(state_stack));
+ BEGIN(INITIAL);
}
/* }}} */
@@ -145,11 +160,7 @@
*/
void shutdown_ini_scanner(TSRMLS_D)
{
- if (SCNG(yy_start_stack)) {
- yy_flex_free(SCNG(yy_start_stack));
- SCNG(yy_start_stack) = NULL;
- }
- yy_delete_buffer(SCNG(current_buffer) TSRMLS_CC);
+ zend_stack_destroy(&SCNG(state_stack));
if (ini_filename) {
free(ini_filename);
}
@@ -176,14 +187,17 @@
*/
int zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode TSRMLS_DC)
{
- if (FAILURE == zend_stream_fixup(fh TSRMLS_CC)) {
+ char *buf;
+ size_t size;
+
+ if (zend_stream_fixup(fh, &buf, &size TSRMLS_CC) == FAILURE) {
return FAILURE;
}
init_ini_scanner(TSRMLS_C);
SCNG(scanner_mode) = scanner_mode;
- yyin = fh;
- yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE TSRMLS_CC) TSRMLS_CC);
+ SCNG(yy_in) = fh;
+ yy_scan_buffer(buf, size TSRMLS_CC);
ini_filename = zend_strndup(fh->filename, strlen(fh->filename));
return SUCCESS;
}
@@ -197,21 +211,13 @@
init_ini_scanner(TSRMLS_C);
SCNG(scanner_mode) = scanner_mode;
- yyin = NULL;
- yy_scan_buffer(str, len + 2 TSRMLS_CC);
+ SCNG(yy_in) = NULL;
+ yy_scan_buffer(str, len TSRMLS_CC);
ini_filename = NULL;
return SUCCESS;
}
/* }}} */
-/* {{{ zend_ini_close_file()
-*/
-void zend_ini_close_file(zend_file_handle *fh TSRMLS_DC)
-{
- zend_stream_close(fh);
-}
-/* }}} */
-
/* {{{ zend_ini_escape_string()
*/
static void zend_ini_escape_string(zval *lval, char *str, int len, char quote_type TSRMLS_DC)
@@ -272,8 +278,23 @@
}
/* }}} */
-%}
+int ini_lex(zval *ini_lval TSRMLS_DC)
+{
+restart:
+ SCNG(yy_text) = YYCURSOR;
+
+/* yymore_restart: */
+ /* detect EOF */
+ if (YYCURSOR >= YYLIMIT) {
+ if (YYSTATE == STATE(ST_VALUE) || YYSTATE == STATE(ST_RAW)) {
+ BEGIN(INITIAL);
+ return 0;
+ }
+ return 0;
+ }
+/*!re2c
+re2c:yyfill:check = 0;
LNUM [0-9]+
DNUM ([0-9]*[\.][0-9]+)|([0-9]+[\.][0-9]*)
NUMBER [-]?{LNUM}|{DNUM}
@@ -292,20 +313,12 @@
RAW_VALUE_CHARS [^=\n\r;]
/* Allow using ${foobar} in sections, quoted strings and values */
-LITERAL_DOLLAR ("$"([^a-zA-Z0-9{]|("\\"{ANY_CHAR})))
-VALUE_CHARS ([^$= \t\n\r;&|~()!"']|{LITERAL_DOLLAR})
+LITERAL_DOLLAR ("$"([^a-zA-Z0-9{\000]|("\\"{ANY_CHAR})))
+VALUE_CHARS ([^$= \t\n\r;&|~()!"'\000]|{LITERAL_DOLLAR})
SECTION_VALUE_CHARS ([^$\n\r;"'\]\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
DOUBLE_QUOTES_CHARS ([^$"\\]|("\\"{ANY_CHAR})|{LITERAL_DOLLAR})
-/* " */
-
-%option nounput
-%option noyywrap
-%option noyylineno
-%option noyy_top_state
-%option never-interactive
-
-%%
++<!*> := yyleng = YYCURSOR - SCNG(yy_text);
<INITIAL>"[" { /* Section start */
/* Enter section data lookup state */
@@ -320,9 +333,8 @@
<ST_VALUE,ST_SECTION_VALUE,ST_OFFSET>"'"{SINGLE_QUOTED_CHARS}+"'" { /* Raw string */
/* Eat leading and trailing single quotes */
if (yytext[0] == '\'' && yytext[yyleng - 1] == '\'') {
- yytext++;
+ SCNG(yy_text)++;
yyleng = yyleng - 2;
- yytext[yyleng] = 0;
}
RETURN_TOKEN(TC_RAW, yytext, yyleng);
}
@@ -339,7 +351,7 @@
/* Enter offset lookup state */
yy_push_state(ST_OFFSET TSRMLS_CC);
-
+
RETURN_TOKEN(TC_OFFSET, yytext, yyleng);
}
@@ -374,7 +386,7 @@
RETURN_TOKEN(TC_LABEL, yytext, yyleng);
}
-<INITIAL>{TABS_AND_SPACES}*[=]{TABS_AND_SPACES}* { /* Start option value */
+<INITIAL>{TABS_AND_SPACES}*[=]{TABS_AND_SPACES}* { /* Start option value */
if (SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW) {
yy_push_state(ST_RAW TSRMLS_CC);
} else {
@@ -386,9 +398,9 @@
<ST_RAW>{RAW_VALUE_CHARS}+ { /* Raw value, only used when SCNG(scanner_mode) == ZEND_INI_SCANNER_RAW. */
/* Eat leading and trailing double quotes */
if (yytext[0] == '"' && yytext[yyleng - 1] == '"') {
- yytext++;
+ SCNG(yy_text)++;
yyleng = yyleng - 2;
- yytext[yyleng] = 0;
+ yytext[yyleng] = 0;
}
RETURN_TOKEN(TC_RAW, yytext, yyleng);
}
@@ -420,7 +432,7 @@
}
<ST_VALUE>[=] { /* Make = used in option value to trigger error */
- yyless(yyleng - 1);
+ yyless(0);
BEGIN(INITIAL);
return END_OF_LINE;
}
@@ -454,6 +466,7 @@
<INITIAL,ST_RAW>{TABS_AND_SPACES}+ {
/* eat whitespace */
+ goto restart;
}
<INITIAL>{TABS_AND_SPACES}*{NEWLINE} {
@@ -467,52 +480,14 @@
return END_OF_LINE;
}
-<ST_VALUE,ST_RAW><<EOF>> { /* End of option value (if EOF is reached before EOL */
+<ST_VALUE,ST_RAW>[^] { /* End of option value (if EOF is reached before EOL) */
BEGIN(INITIAL);
- return END_OF_LINE;
+ return 0;
}
-<<EOF>> {
-#if DEBUG_CFG_SCANNER
- while (YYSTATE != INITIAL) {
- switch (YYSTATE) {
- case INITIAL:
- break;
-
- case ST_DOUBLE_QUOTES:
- fprintf(stderr, "ERROR: Unterminated ini option value double quotes\n");
- break;
-
- case ST_OFFSET:
- fprintf(stderr, "ERROR: Unterminated ini option offset\n");
- break;
-
- case ST_RAW:
- fprintf(stderr, "ERROR: Unterminated raw ini option value\n");
- break;
-
- case ST_SECTION_RAW:
- fprintf(stderr, "ERROR: Unterminated raw ini section value\n");
- break;
-
- case ST_SECTION_VALUE:
- fprintf(stderr, "ERROR: Unterminated ini section value\n");
- break;
-
- case ST_VALUE:
- fprintf(stderr, "ERROR: Unterminated ini option value\n");
- break;
-
- case ST_VARNAME:
- fprintf(stderr, "ERROR: Unterminated ini variable\n");
- break;
-
- default:
- fprintf(stderr, "BUG: Unknown state (%d)\n", YYSTATE);
- break;
- }
- yy_pop_state(TSRMLS_C);
- }
-#endif
- yyterminate();
+<*>[^] {
+ return 0;
+}
+
+*/
}
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_scanner.h?r1=1.25&r2=1.26&diff_format=u
Index: ZendEngine2/zend_language_scanner.h
diff -u ZendEngine2/zend_language_scanner.h:1.25 ZendEngine2/zend_language_scanner.h:1.26
--- ZendEngine2/zend_language_scanner.h:1.25 Mon Dec 31 07:12:07 2007
+++ ZendEngine2/zend_language_scanner.h Wed Mar 26 14:23:01 2008
@@ -17,14 +17,21 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_language_scanner.h,v 1.25 2007/12/31 07:12:07 sebastian Exp $ */
+/* $Id: zend_language_scanner.h,v 1.26 2008/03/26 14:23:01 scottmac Exp $ */
#ifndef ZEND_SCANNER_H
#define ZEND_SCANNER_H
typedef struct _zend_lex_state {
- YY_BUFFER_STATE buffer_state;
- int state;
+ unsigned int yy_leng;
+ unsigned char *yy_start;
+ unsigned char *yy_text;
+ unsigned char *yy_cursor;
+ unsigned char *yy_marker;
+ unsigned char *yy_limit;
+ int yy_state;
+ zend_stack state_stack;
+
zend_file_handle *in;
uint lineno;
char *filename;
@@ -38,7 +45,6 @@
} zend_lex_state;
-void zend_fatal_scanner_error(char *);
BEGIN_EXTERN_C()
int zend_compare_file_handles(zend_file_handle *fh1, zend_file_handle *fh2);
ZEND_API void zend_save_lexical_state(zend_lex_state *lex_state TSRMLS_DC);
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_scanner.l?r1=1.178&r2=1.179&diff_format=u
Index: ZendEngine2/zend_language_scanner.l
diff -u ZendEngine2/zend_language_scanner.l:1.178 ZendEngine2/zend_language_scanner.l:1.179
--- ZendEngine2/zend_language_scanner.l:1.178 Tue Feb 12 09:28:17 2008
+++ ZendEngine2/zend_language_scanner.l Wed Mar 26 14:23:02 2008
@@ -1,5 +1,3 @@
-%{
-
/*
+----------------------------------------------------------------------+
| Zend Engine |
@@ -14,43 +12,24 @@
| obtain it through the world-wide-web, please send a note to |
| [email protected] so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
- | Authors: Andi Gutmans <[email protected]> |
+ | Authors: Marcus Boerger <[email protected]> |
+ | Nuno Lopes <[email protected]> |
+ | Scott MacVicar <[email protected]> |
+ | Flex version authors: |
+ | Andi Gutmans <[email protected]> |
| Zeev Suraski <[email protected]> |
+----------------------------------------------------------------------+
*/
-/* $Id: zend_language_scanner.l,v 1.178 2008/02/12 09:28:17 dmitry Exp $ */
+/* $Id: zend_language_scanner.l,v 1.179 2008/03/26 14:23:02 scottmac Exp $ */
-#define yyleng SCNG(yy_leng)
-#define yytext SCNG(yy_text)
-#define yytext_ptr SCNG(yy_text)
-#define yyin SCNG(yy_in)
-#define yyout SCNG(yy_out)
-#define yy_last_accepting_state SCNG(_yy_last_accepting_state)
-#define yy_last_accepting_cpos SCNG(_yy_last_accepting_cpos)
-#define yy_more_flag SCNG(_yy_more_flag)
-#define yy_more_len SCNG(_yy_more_len)
-
-%}
-
-%x ST_IN_SCRIPTING
-%x ST_DOUBLE_QUOTES
-%x ST_BACKQUOTE
-%x ST_HEREDOC
-%x ST_START_HEREDOC
-%x ST_END_HEREDOC
-%x ST_NOWDOC
-%x ST_START_NOWDOC
-%x ST_END_NOWDOC
-%x ST_LOOKING_FOR_PROPERTY
-%x ST_LOOKING_FOR_VARNAME
-%x ST_VAR_OFFSET
-%x ST_COMMENT
-%x ST_DOC_COMMENT
-%x ST_ONE_LINE_COMMENT
-%option stack
+#if 0
+# define YYDEBUG(s, c) printf("state: %d char: %c\n", s, c)
+#else
+# define YYDEBUG(s, c)
+#endif
-%{
+#include "zend_language_scanner_defs.h"
#include <errno.h>
#include "zend.h"
@@ -68,6 +47,25 @@
#include "tsrm_virtual_cwd.h"
#include "tsrm_config_common.h"
+#define YYCTYPE unsigned char
+#define YYFILL(n) { if (YYCURSOR >= YYLIMIT) return 0; }
+#define YYCURSOR SCNG(yy_cursor)
+#define YYLIMIT SCNG(yy_limit)
+#define YYMARKER SCNG(yy_marker)
+
+#define YYGETCONDITION() SCNG(yy_state)
+#define YYSETCONDITION(s) SCNG(yy_state) = s
+
+#define STATE(name) yyc##name
+
+/* emulate flex constructs */
+#define BEGIN(state) YYSETCONDITION(STATE(state))
+#define YYSTATE YYGETCONDITION()
+#define yytext ((char*)SCNG(yy_text))
+#define yyleng SCNG(yy_leng)
+#define yyless(x) YYCURSOR = yytext + x
+#define yymore() goto yymore_restart
+
#ifdef HAVE_STDARG_H
# include <stdarg.h>
#endif
@@ -76,31 +74,19 @@
# include <unistd.h>
#endif
-#define YY_DECL int lex_scan(zval *zendlval TSRMLS_DC)
-
-#define ECHO { ZEND_WRITE( yytext, yyleng ); }
-
-#ifdef ZTS
-# define MY_INPUT yyinput
-#else
-# define MY_INPUT input
-#endif
-
-
/* Globals Macros */
#define SCNG LANG_SCNG
#ifdef ZTS
ZEND_API ts_rsrc_id language_scanner_globals_id;
#else
-ZEND_API zend_scanner_globals language_scanner_globals;
+ZEND_API zend_php_scanner_globals language_scanner_globals;
#endif
+/*
#define YY_INPUT(buf, result, max_size) \
- if ( ((result = zend_unicode_yyinput(yyin, buf, max_size TSRMLS_CC)) == 0) \
- && zend_stream_ferror( yyin TSRMLS_CC) ) \
+ if ( ((result = zend_unicode_yyinput(yyin, buf, max_size TSRMLS_CC)) == 0)) \
YY_FATAL_ERROR( "input in flex scanner failed" );
-
-#define YY_FATAL_ERROR zend_fatal_scanner_error
+*/
#define HANDLE_NEWLINES(s, l) \
do { \
@@ -121,32 +107,50 @@
} \
}
-
#define ZEND_IS_OCT(c) ((c)>='0' && (c)<='7')
#define ZEND_IS_HEX(c) (((c)>='0' && (c)<='9') || ((c)>='a' && (c)<='f') || ((c)>='A' && (c)<='F'))
+BEGIN_EXTERN_C()
+
+static void _yy_push_state(int new_state TSRMLS_DC)
+ {
+ zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int));
+ YYSETCONDITION(new_state);
+}
-void zend_fatal_scanner_error(char *message)
+#define yy_push_state(state_and_tsrm) _yy_push_state(yyc##state_and_tsrm)
+
+static void yy_pop_state(TSRMLS_D)
{
- zend_error(E_COMPILE_ERROR, "%s", message);
+ int *stack_state;
+ zend_stack_top(&SCNG(state_stack), (void **) &stack_state);
+ YYSETCONDITION(*stack_state);
+ zend_stack_del_top(&SCNG(state_stack));
}
-BEGIN_EXTERN_C()
+static void yy_scan_buffer(char *str, unsigned int len TSRMLS_DC)
+{
+ YYCURSOR = (YYCTYPE*)str;
+ SCNG(yy_start) = YYCURSOR;
+ YYLIMIT = YYCURSOR + len;
+ }
+
void startup_scanner(TSRMLS_D)
{
CG(heredoc) = NULL;
CG(heredoc_len) = 0;
CG(doc_comment) = NULL_ZSTR;
CG(doc_comment_len) = 0;
- SCNG(yy_start_stack_ptr) = 0;
- SCNG(yy_start_stack_depth) = 0;
- SCNG(current_buffer) = NULL;
SCNG(input_conv) = NULL;
SCNG(output_conv) = NULL;
SCNG(encoding_checked) = 0;
SCNG(rest_str) = NULL;
SCNG(rest_len) = 0;
+
+ zend_llist_init(&SCNG(used_state_stacks), sizeof(zend_stack), (llist_dtor_func_t) zend_stack_destroy, 0);
+ zend_stack_init(&SCNG(state_stack));
+ zend_llist_add_element(&SCNG(used_state_stacks), &SCNG(state_stack));
}
@@ -156,10 +160,7 @@
efree(CG(heredoc));
CG(heredoc_len)=0;
}
- if (SCNG(yy_start_stack)) {
- yy_flex_free(SCNG(yy_start_stack));
- SCNG(yy_start_stack) = NULL;
- }
+ zend_llist_destroy(&SCNG(used_state_stacks));
RESET_DOC_COMMENT();
if (SCNG(input_conv)) {
@@ -177,14 +178,27 @@
}
SCNG(rest_len) = 0;
}
-END_EXTERN_C()
+static int compare_stacks(zend_stack *stack1, zend_stack *stack2)
+{
+ return (stack1 == stack2);
+}
ZEND_API void zend_save_lexical_state(zend_lex_state *lex_state TSRMLS_DC)
{
- memcpy(&lex_state->buffer_state, &YY_CURRENT_BUFFER, sizeof(YY_BUFFER_STATE));
+ lex_state->yy_leng = SCNG(yy_leng);
+ lex_state->yy_start = SCNG(yy_start);
+ lex_state->yy_text = SCNG(yy_text);
+ lex_state->yy_cursor = SCNG(yy_cursor);
+ lex_state->yy_marker = SCNG(yy_marker);
+ lex_state->yy_limit = SCNG(yy_limit);
+
+ lex_state->state_stack = SCNG(state_stack);
+ zend_stack_init(&SCNG(state_stack));
+ zend_llist_add_element(&SCNG(used_state_stacks), &SCNG(state_stack));
+
lex_state->in = SCNG(yy_in);
- lex_state->state = YYSTATE;
+ lex_state->yy_state = YYSTATE;
lex_state->filename = zend_get_compiled_filename(TSRMLS_C);
lex_state->lineno = CG(zend_lineno);
@@ -202,17 +216,18 @@
ZEND_API void zend_restore_lexical_state(zend_lex_state *lex_state TSRMLS_DC)
{
- YY_BUFFER_STATE original_buffer_state = YY_CURRENT_BUFFER;
+ SCNG(yy_leng) = lex_state->yy_leng;
+ SCNG(yy_start) = lex_state->yy_start;
+ SCNG(yy_text) = lex_state->yy_text;
+ SCNG(yy_cursor) = lex_state->yy_cursor;
+ SCNG(yy_marker) = lex_state->yy_marker;
+ SCNG(yy_limit) = lex_state->yy_limit;
- if (lex_state->buffer_state) {
- yy_switch_to_buffer(lex_state->buffer_state TSRMLS_CC);
- } else {
- YY_CURRENT_BUFFER = NULL;
- }
+ zend_llist_del_element(&SCNG(used_state_stacks), &SCNG(state_stack), (int (*)(void *, void *)) compare_stacks);
+ SCNG(state_stack) = lex_state->state_stack;
- yy_delete_buffer(original_buffer_state TSRMLS_CC);
SCNG(yy_in) = lex_state->in;
- BEGIN(lex_state->state);
+ YYSETCONDITION(lex_state->yy_state);
CG(zend_lineno) = lex_state->lineno;
zend_restore_compiled_filename(lex_state->filename TSRMLS_CC);
zend_restore_compiled_script_encoding(lex_state->script_encoding TSRMLS_CC);
@@ -233,57 +248,6 @@
SCNG(rest_len) = lex_state->rest_len;
}
-
-BEGIN_EXTERN_C()
-
-
-ZEND_API void zend_file_handle_dtor(zend_file_handle *fh)
-{
- TSRMLS_FETCH();
-
- switch (fh->type) {
- case ZEND_HANDLE_FP:
- fclose(fh->handle.fp);
- break;
- case ZEND_HANDLE_STREAM:
- if (fh->handle.stream.closer) {
- fh->handle.stream.closer(fh->handle.stream.handle TSRMLS_CC);
- }
- break;
- case ZEND_HANDLE_FILENAME:
- /* We're only supposed to get here when destructing the used_files hash,
- * which doesn't really contain open files, but references to their names/paths
- */
- break;
- }
- if (fh->opened_path) {
- efree(fh->opened_path);
- fh->opened_path = NULL;
- }
- if (fh->free_filename && fh->filename) {
- efree(fh->filename);
- fh->filename = NULL;
- }
-}
-
-
-int zend_compare_file_handles(zend_file_handle *fh1, zend_file_handle *fh2)
-{
- if (fh1->type != fh2->type) {
- return 0;
- }
- switch (fh1->type) {
- case ZEND_HANDLE_FP:
- return fh1->handle.fp==fh2->handle.fp;
- break;
- case ZEND_HANDLE_STREAM:
- return fh1->handle.stream.handle == fh2->handle.stream.handle;
- break;
- }
- return 0;
-}
-
-
ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle TSRMLS_DC)
{
zend_llist_del_element(&CG(open_files), file_handle, (int (*)(void *, void *)) zend_compare_file_handles);
@@ -556,6 +520,7 @@
if (zend_set_converter_encoding(&SCNG(input_conv), encoding) == FAILURE) {
return FAILURE;
}
+#ifdef scottmac_0
if (run_time) {
/* Convert rest of the buffer to unicode.runtime_encoding. */
YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
@@ -590,6 +555,7 @@
b->yy_ch_buf[b->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
b->yy_ch_buf[b->yy_n_chars+1] = YY_END_OF_BUFFER_CHAR;
}
+#endif
encoding = "UTF-8";
}
return zend_set_converter_encoding(&SCNG(output_conv), encoding);
@@ -622,6 +588,7 @@
int c = '*';
const char *src = buf;
+#ifdef scottmac_0
/* Look of we have rest from previous call */
if (SCNG(rest_str)) {
if (len >= SCNG(rest_len)) {
@@ -637,18 +604,9 @@
SCNG(rest_len) -= len;
}
} else {
- if (file_handle->handle.stream.interactive) {
- for (n = 0; n < sizeof(buf) && (c = zend_stream_getc(yyin TSRMLS_CC)) != EOF && c != '\n'; ++n) {
- buf[n] = (char)c;
- }
- if (c == '\n') {
- buf[n++] = (char) c;
- }
- } else {
- n = zend_stream_read(file_handle, buf, len TSRMLS_CC);
- }
+ n = zend_stream_read(file_handle, buf, len TSRMLS_CC);
}
-
+#endif
/* Don't make any conversions if unicode=off */
if (!UG(unicode)) {
return n;
@@ -709,20 +667,34 @@
ZEND_API int open_file_for_scanning(zend_file_handle *file_handle TSRMLS_DC)
{
- char *file_path=NULL;
+ char *file_path=NULL, *buf;
UErrorCode status = U_ZERO_ERROR;
+ size_t size;
- if (FAILURE == zend_stream_fixup(file_handle TSRMLS_CC)) {
+ if (zend_stream_fixup(file_handle, &buf, &size TSRMLS_CC) == FAILURE) {
return FAILURE;
}
zend_llist_add_element(&CG(open_files), file_handle);
+ if (file_handle->handle.stream.handle >= (void*)file_handle && file_handle->handle.stream.handle <= (void*)(file_handle+1)) {
+ zend_file_handle *fh = (zend_file_handle*)zend_llist_get_last(&CG(open_files));
+ size_t diff = (char*)file_handle->handle.stream.handle - (char*)file_handle;
+ fh->handle.stream.handle = (void*)(((char*)fh) + diff);
+ file_handle->handle.stream.handle = fh->handle.stream.handle;
+ }
+
/* Reset the scanner for scanning the new file */
SCNG(yy_in) = file_handle;
zend_prepare_scanner_converters(ucnv_getName(ZEND_U_CONVERTER(UG(script_encoding_conv)), &status), 0 TSRMLS_CC);
- yy_switch_to_buffer(yy_create_buffer(SCNG(yy_in), YY_BUF_SIZE TSRMLS_CC) TSRMLS_CC);
+
+ if (size != -1) {
+ /* Re-encode for Unicode if needed */
+ yy_scan_buffer(buf, size TSRMLS_CC);
+ } else {
+ zend_error_noreturn(E_COMPILE_ERROR, "zend_stream_mmap() failed");
+ }
BEGIN(INITIAL);
@@ -869,7 +841,8 @@
SCNG(yy_in)=NULL;
zend_prepare_scanner_converters(encoding, 0 TSRMLS_CC);
- yy_scan_buffer(Z_STRVAL_P(str), Z_STRLEN_P(str)+2 TSRMLS_CC);
+ /* Re-encode for Unicode if needed */
+ yy_scan_buffer(Z_STRVAL_P(str), Z_STRLEN_P(str) TSRMLS_CC);
zend_set_compiled_filename(filename TSRMLS_CC);
zend_set_compiled_script_encoding((char*)ucnv_getName(SCNG(output_conv), &status) TSRMLS_CC);
@@ -881,15 +854,7 @@
ZEND_API int zend_get_scanned_file_offset(TSRMLS_D)
{
- if (yyin) {
- int offset_in_buffer = (yy_c_buf_p - (YY_CURRENT_BUFFER)->yy_ch_buf);
- int read_bytes = SCNG(yy_n_chars);
- int offset_from_the_end = read_bytes - offset_in_buffer;
-
- return zend_stream_ftell(yyin TSRMLS_CC) - offset_from_the_end;
- } else {
- return -1;
- }
+ return SCNG(yy_cursor) - SCNG(yy_start);
}
@@ -924,7 +889,7 @@
retval = NULL;
} else {
zend_bool orig_interactive = CG(interactive);
-
+
CG(interactive) = 0;
init_op_array(op_array, ZEND_EVAL_CODE, INITIAL_OP_ARRAY_SIZE TSRMLS_CC);
CG(interactive) = orig_interactive;
@@ -1349,17 +1314,34 @@
*t = 0;
}
-%}
+int lex_scan(zval *zendlval TSRMLS_DC)
+{
+restart:
+ SCNG(yy_text) = YYCURSOR;
+
+yymore_restart:
+
+ /* detect EOF */
+ if (YYCURSOR >= YYLIMIT) {
+ /* special case */
+ if (YYSTATE == STATE(ST_COMMENT) || YYSTATE == STATE(ST_DOC_COMMENT)) {
+ zend_error(E_COMPILE_WARNING,"Unterminated comment starting line %d", CG(comment_start_line));
+ }
+ return 0;
+ }
+
+/*!re2c
+re2c:yyfill:check = 0;
LNUM [0-9]+
-DNUM ([0-9]*[\.][0-9]+)|([0-9]+[\.][0-9]*)
+DNUM ([0-9]*"."[0-9]+)|([0-9]+"."[0-9]*)
EXPONENT_DNUM (({LNUM}|{DNUM})[eE][+-]?{LNUM})
HNUM "0x"[0-9a-fA-F]+
LABEL [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
WHITESPACE [ \n\r\t]+
TABS_AND_SPACES [ \t]*
TOKENS [;:,.\[\]()|^&+-/*=%!~$<>?@]
-ANY_CHAR (.|[\n])
+ANY_CHAR [^]
NEWLINE ("\r"|"\n"|"\r\n")
/*
@@ -1416,9 +1398,9 @@
NOWDOC_CHARS ({NEWLINE}*(([^a-zA-Z_\x7f-\xff\n\r][^\n\r]*)|({LABEL}[^a-zA-Z0-9_\x7f-\xff;\n\r][^\n\r]*)|({LABEL}[;][^\n\r]+)))
-%option noyylineno
-%option noyywrap
-%%
+/* compute yyleng before each rule */
+<!*> := yyleng = YYCURSOR - SCNG(yy_text);
+
<ST_IN_SCRIPTING>"exit" {
return T_EXIT;
@@ -1569,6 +1551,11 @@
return T_OBJECT_OPERATOR;
}
+<ST_LOOKING_FOR_PROPERTY>{WHITESPACE}+ {
+ /* do nothing */
+ goto restart;
+}
+
<ST_LOOKING_FOR_PROPERTY>"->" {
return T_OBJECT_OPERATOR;
}
@@ -1587,6 +1574,7 @@
<ST_LOOKING_FOR_PROPERTY>{ANY_CHAR} {
yyless(0);
yy_pop_state(TSRMLS_C);
+ goto restart;
}
<ST_IN_SCRIPTING>"::" {
@@ -1849,7 +1837,7 @@
<ST_IN_SCRIPTING>"}" {
RESET_DOC_COMMENT();
/* This is a temporary fix which is dependant on flex and it's implementation */
- if (yy_start_stack_ptr) {
+ if (!zend_stack_is_empty(&SCNG(state_stack))) {
yy_pop_state(TSRMLS_C);
}
return '}';
@@ -1873,6 +1861,7 @@
yyless(0);
yy_pop_state(TSRMLS_C);
yy_push_state(ST_IN_SCRIPTING TSRMLS_CC);
+ goto restart;
}
@@ -1918,7 +1907,7 @@
}
}
-<ST_VAR_OFFSET>0|([1-9][0-9]*) { /* Offset could be treated as a long */
+<ST_VAR_OFFSET>[0]|([1-9][0-9]*) { /* Offset could be treated as a long */
if (yyleng < MAX_LENGTH_OF_LONG - 1 || (yyleng == MAX_LENGTH_OF_LONG - 1 && strcmp(yytext, long_min_digits) < 0)) {
Z_LVAL_P(zendlval) = strtol(yytext, NULL, 10);
Z_TYPE_P(zendlval) = IS_LONG;
@@ -1943,7 +1932,7 @@
return T_DNUMBER;
}
-<ST_IN_SCRIPTING>"__CLASS__" {
+<ST_IN_SCRIPTING>'__CLASS__' {
zstr class_name = NULL_ZSTR;
if (CG(active_class_entry)) {
@@ -1958,7 +1947,7 @@
return T_CLASS_C;
}
-<ST_IN_SCRIPTING>"__FUNCTION__" {
+<ST_IN_SCRIPTING>'__FUNCTION__' {
zstr func_name = NULL_ZSTR;
if (CG(active_op_array)) {
@@ -1973,7 +1962,7 @@
return T_FUNC_C;
}
-<ST_IN_SCRIPTING>"__METHOD__" {
+<ST_IN_SCRIPTING>'__METHOD__' {
zstr class_name = CG(active_class_entry) ? CG(active_class_entry)->name : NULL_ZSTR;
zstr func_name = CG(active_op_array)? CG(active_op_array)->function_name : NULL_ZSTR;
size_t len = 0;
@@ -2022,13 +2011,13 @@
return T_METHOD_C;
}
-<ST_IN_SCRIPTING>"__LINE__" {
+<ST_IN_SCRIPTING>'__LINE__' {
Z_LVAL_P(zendlval) = CG(zend_lineno);
Z_TYPE_P(zendlval) = IS_LONG;
return T_LINE;
}
-<ST_IN_SCRIPTING>"__FILE__" {
+<ST_IN_SCRIPTING>'__FILE__' {
char *filename = zend_get_compiled_filename(TSRMLS_C);
if (!filename) {
@@ -2038,7 +2027,7 @@
return T_FILE;
}
-<ST_IN_SCRIPTING>"__DIR__" {
+<ST_IN_SCRIPTING>'__DIR__' {
char *filename = zend_get_compiled_filename(TSRMLS_C);
const size_t filename_len = strlen(filename);
char *dirname;
@@ -2065,7 +2054,7 @@
return T_DIR;
}
-<ST_IN_SCRIPTING>"__NAMESPACE__" {
+<ST_IN_SCRIPTING>'__NAMESPACE__' {
if (CG(current_namespace)) {
*zendlval = *CG(current_namespace);
zval_copy_ctor(zendlval);
@@ -2075,22 +2064,22 @@
return T_NS_C;
}
-<INITIAL>(([^<]|"<"[^?%s<]){1,400})|"<s"|"<" {
- Z_STRVAL_P(zendlval) = (char *) estrndup(yytext, yyleng);
+<INITIAL>"<script"{WHITESPACE}+"language"{WHITESPACE}*"="{WHITESPACE}*("php"|"\"php\""|"'php'"){WHITESPACE}*">" {
+ HANDLE_NEWLINES(yytext, yyleng);
+ Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */
Z_STRLEN_P(zendlval) = yyleng;
Z_TYPE_P(zendlval) = IS_STRING;
- HANDLE_NEWLINES(yytext, yyleng);
- return T_INLINE_HTML;
+ BEGIN(ST_IN_SCRIPTING);
+ return T_OPEN_TAG;
}
-<INITIAL>"<?"|"<script"{WHITESPACE}+"language"{WHITESPACE}*"="{WHITESPACE}*("php"|"\"php\""|"\'php\'"){WHITESPACE}*">" {
- HANDLE_NEWLINES(yytext, yyleng);
- if (CG(short_tags) || yyleng>2) { /* yyleng>2 means it's not <? but <script> */
+<INITIAL>"<%=" {
+ if (CG(asp_tags)) {
Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */
Z_STRLEN_P(zendlval) = yyleng;
Z_TYPE_P(zendlval) = IS_STRING;
BEGIN(ST_IN_SCRIPTING);
- return T_OPEN_TAG;
+ return T_OPEN_TAG_WITH_ECHO;
} else {
Z_STRVAL_P(zendlval) = (char *) estrndup(yytext, yyleng);
Z_STRLEN_P(zendlval) = yyleng;
@@ -2100,8 +2089,8 @@
}
-<INITIAL>"<%="|"<?=" {
- if ((yytext[1]=='%' && CG(asp_tags)) || (yytext[1]=='?' && CG(short_tags))) {
+<INITIAL>"<?=" {
+ if (CG(short_tags)) {
Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */
Z_STRLEN_P(zendlval) = yyleng;
Z_TYPE_P(zendlval) = IS_STRING;
@@ -2141,25 +2130,71 @@
return T_OPEN_TAG;
}
-<ST_IN_SCRIPTING,ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE,ST_VAR_OFFSET>"$"{LABEL} {
- if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) {
- return 0;
+
+<INITIAL>"<?" {
+ HANDLE_NEWLINES(yytext, yyleng);
+ if (CG(short_tags)) {
+ Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */
+ Z_STRLEN_P(zendlval) = yyleng;
+ Z_TYPE_P(zendlval) = IS_STRING;
+ BEGIN(ST_IN_SCRIPTING);
+ return T_OPEN_TAG;
+ } else {
+ Z_STRVAL_P(zendlval) = (char *) estrndup(yytext, yyleng);
+ Z_STRLEN_P(zendlval) = yyleng;
+ Z_TYPE_P(zendlval) = IS_STRING;
+ return T_INLINE_HTML;
}
- if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) {
- return 0;
+}
+
+<INITIAL>"#".+ {NEWLINE} {
+ if ((YYCTYPE*)yytext == SCNG(yy_start)) {
+ /* ignore first line when it's started with a # */
+ goto restart;
+ } else {
+ goto inline_char_handler;
}
- return T_VARIABLE;
}
-%{
+<INITIAL>{ANY_CHAR} {
+
+ while (1) {
+ YYCTYPE *ptr = memchr(YYCURSOR, '<', YYLIMIT - YYCURSOR);
+
+ if (ptr == NULL) {
+ YYCURSOR = YYLIMIT;
+ yyleng = YYCURSOR - SCNG(yy_text);
+ break;
+
+ } else {
+ YYCURSOR = ptr + 1;
+
+ /* if it can be an opening tag, stop */
+ if (ptr < YYLIMIT && (*YYCURSOR == '?' || *YYCURSOR == '%')) {
+ --YYCURSOR;
+ yyleng = YYCURSOR - SCNG(yy_text);
+ break;
+ }
+ }
+ }
+
+inline_char_handler:
+
+ Z_STRVAL_P(zendlval) = (char *) estrndup(yytext, yyleng);
+ Z_STRLEN_P(zendlval) = yyleng;
+ Z_TYPE_P(zendlval) = IS_STRING;
+ HANDLE_NEWLINES(yytext, yyleng);
+ return T_INLINE_HTML;
+}
+
/* Make sure a label character follows "->", otherwise there is no property
* and "->" will be taken literally
- */ %}
+ */
<ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE>"$"{LABEL}"->"[a-zA-Z_\x7f-\xff] {
yyless(yyleng - 3);
yy_push_state(ST_LOOKING_FOR_PROPERTY TSRMLS_CC);
- if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) {
+ if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-4), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) {
return 0;
}
if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) {
@@ -2168,13 +2203,22 @@
return T_VARIABLE;
}
-%{
/* A [ always designates a variable offset, regardless of what follows
- */ %}
+ */
<ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE>"$"{LABEL}"[" {
yyless(yyleng - 1);
yy_push_state(ST_VAR_OFFSET TSRMLS_CC);
+ if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-2), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) {
+ return 0;
+ }
+ if (UG(unicode) && !zend_check_and_normalize_identifier(zendlval)) {
+ return 0;
+ }
+ return T_VARIABLE;
+}
+
+<ST_IN_SCRIPTING,ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE,ST_VAR_OFFSET>"$"{LABEL} {
if (!zend_copy_scanner_string(zendlval, (yytext+1), (yyleng-1), UG(unicode)?IS_UNICODE:IS_STRING, SCNG(output_conv) TSRMLS_CC)) {
return 0;
}
@@ -2270,7 +2314,8 @@
Z_STRVAL_P(zendlval) = yytext; /* no copying - intentional */
Z_STRLEN_P(zendlval) = yyleng-2;
Z_TYPE_P(zendlval) = IS_STRING;
- yyless(yyleng-2);
+ yyleng -= 2;
+ yyless(yyleng);
BEGIN(ST_IN_SCRIPTING);
return T_COMMENT;
} else {
@@ -2342,9 +2387,8 @@
}
-%{
/* ("{"*|"$"*) handles { or $ at the end of a string (or the entire contents)
- */ %}
+ */
<ST_IN_SCRIPTING>(["]{DOUBLE_QUOTES_CHARS}*("{"*|"$"*)["]) {
if (UG(unicode)) {
return zend_scan_unicode_escape_string(zendlval, yytext+1, yyleng-2, 0x22 /*'"'*/, T_CONSTANT_ENCAPSED_STRING TSRMLS_CC);
@@ -2426,6 +2470,7 @@
<ST_START_HEREDOC>{ANY_CHAR} {
yyless(0);
BEGIN(ST_HEREDOC);
+ goto restart;
}
<ST_START_HEREDOC>{LABEL}";"?[\n\r] {
@@ -2445,18 +2490,17 @@
BEGIN(ST_IN_SCRIPTING);
return T_END_HEREDOC;
} else {
- yymore();
BEGIN(ST_HEREDOC);
+ yymore();
}
}
-%{
/* Match everything up to and including a possible ending label, so if the label
* doesn't match, it's kept with the rest of the string
*
* {HEREDOC_NEWLINE}+ handles the case of more than one newline sequence that
* couldn't be matched with HEREDOC_CHARS, because of the following label
- */ %}
+ */
<ST_HEREDOC>{HEREDOC_CHARS}*{HEREDOC_NEWLINE}+{LABEL}";"?[\n\r] {
char *end = yytext + yyleng - 1;
@@ -2477,7 +2521,7 @@
/* Subtract the remaining label length. yyleng must include newline
* before label, for zend_highlight/strip, tokenizer, etc. */
- yyleng -= CG(heredoc_len) - 1;
+ yyleng = yyleng - CG(heredoc_len) - 1;
CG(increment_lineno) = 1; /* For newline before label */
BEGIN(ST_END_HEREDOC);
@@ -2499,7 +2543,7 @@
<ST_END_HEREDOC>{ANY_CHAR} {
Z_STRVAL_P(zendlval) = CG(heredoc);
Z_STRLEN_P(zendlval) = CG(heredoc_len);
- yytext = Z_STRVAL_P(zendlval);
+ SCNG(yy_text) = Z_STRVAL_P(zendlval);
yyleng = Z_STRLEN_P(zendlval);
CG(heredoc) = NULL;
CG(heredoc_len) = 0;
@@ -2525,15 +2569,15 @@
}
}
-%{
/* "{"{2,}|"$"{2,} handles { before "{$" or literal $ before a variable or "${"
* (("{"+|"$"+)["]) handles { or $ at the end of a string
*
* Same for backquotes and heredocs, except the second case doesn't apply to
* heredocs. yyless(yyleng - 1) is used to correct taking one character too many
- */ %}
+ */
<ST_DOUBLE_QUOTES>{DOUBLE_QUOTES_CHARS}*("{"{2,}|"$"{2,}|(("{"+|"$"+)["])) {
yyless(yyleng - 1);
+ if (yytext[yyleng-1] == '"') --yyleng;
if (CG(literal_type) == IS_UNICODE) {
return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0x22 /*'"'*/, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC);
@@ -2565,14 +2609,13 @@
}
-%{
/* ({HEREDOC_NEWLINE}+({LABEL}";"?)?)? handles the possible case of newline
* sequences, possibly followed by a label, that couldn't be matched with
* HEREDOC_CHARS because of a following variable or "{$"
*
* This doesn't affect real ending labels, as they are followed by a newline,
* which will result in a longer match for the correct rule if present
- */ %}
+ */
<ST_HEREDOC>{HEREDOC_CHARS}*({HEREDOC_NEWLINE}+({LABEL}";"?)?)? {
if (CG(literal_type) == IS_UNICODE) {
return zend_scan_unicode_escape_string(zendlval, yytext, yyleng, 0, T_ENCAPSED_AND_WHITESPACE TSRMLS_CC);
@@ -2594,9 +2637,8 @@
}
-%{
/* BEGIN nowdoc */
-%}
+
<ST_IN_SCRIPTING>b?"<<<"{TABS_AND_SPACES}[']{LABEL}[']{NEWLINE} {
int bprefix = (yytext[0] != '<') ? 1 : 0;
char *s;
@@ -2619,6 +2661,7 @@
<ST_START_NOWDOC>{ANY_CHAR} {
yyless(0);
BEGIN(ST_NOWDOC);
+ goto restart;
}
<ST_START_NOWDOC>{LABEL}";"?[\r\n] {
@@ -2639,9 +2682,9 @@
}
return T_ENCAPSED_AND_WHITESPACE;
} else {
+ BEGIN(ST_NOWDOC);
yyless(label_len);
yymore();
- BEGIN(ST_NOWDOC);
}
}
@@ -2665,7 +2708,7 @@
/* Subtract the remaining label length. yyleng must include newline
* before label, for zend_highlight/strip, tokenizer, etc. */
- yyleng -= CG(heredoc_len) - 1;
+ yyleng = yyleng - CG(heredoc_len) - 1;
CG(increment_lineno) = 1; /* For newline before label */
BEGIN(ST_END_NOWDOC);
@@ -2686,16 +2729,15 @@
<ST_END_NOWDOC>{ANY_CHAR} {
Z_STRVAL_P(zendlval) = CG(heredoc);
Z_STRLEN_P(zendlval) = CG(heredoc_len);
- yytext = CG(heredoc);
+ SCNG(yy_text) = CG(heredoc);
yyleng = CG(heredoc_len);
CG(heredoc) = NULL;
CG(heredoc_len) = 0;
BEGIN(ST_IN_SCRIPTING);
return T_END_NOWDOC;
}
-%{
+
/* END nowdoc */
-%}
<ST_DOUBLE_QUOTES>["] {
BEGIN(ST_IN_SCRIPTING);
@@ -2709,13 +2751,10 @@
}
-<ST_COMMENT,ST_DOC_COMMENT><<EOF>> {
- zend_error(E_COMPILE_WARNING,"Unterminated comment starting line %d", CG(comment_start_line));
- return 0;
-}
-
-
-
<ST_IN_SCRIPTING,ST_VAR_OFFSET>{ANY_CHAR} {
zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE);
+ goto restart;
+}
+
+*/
}
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_stack.c?r1=1.21&r2=1.22&diff_format=u
Index: ZendEngine2/zend_stack.c
diff -u ZendEngine2/zend_stack.c:1.21 ZendEngine2/zend_stack.c:1.22
--- ZendEngine2/zend_stack.c:1.21 Mon Dec 31 07:12:07 2007
+++ ZendEngine2/zend_stack.c Wed Mar 26 14:23:02 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_stack.c,v 1.21 2007/12/31 07:12:07 sebastian Exp $ */
+/* $Id: zend_stack.c,v 1.22 2008/03/26 14:23:02 scottmac Exp $ */
#include "zend.h"
#include "zend_stack.h"
@@ -95,15 +95,16 @@
ZEND_API int zend_stack_destroy(zend_stack *stack) /* {{{ */
{
- register int i;
-
- for (i = 0; i < stack->top; i++) {
- efree(stack->elements[i]);
- }
+ int i;
if (stack->elements) {
+ for (i = 0; i < stack->top; i++) {
+ efree(stack->elements[i]);
+ }
+
efree(stack->elements);
}
+
return SUCCESS;
}
/* }}} */
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_stream.c?r1=1.18&r2=1.19&diff_format=u
Index: ZendEngine2/zend_stream.c
diff -u ZendEngine2/zend_stream.c:1.18 ZendEngine2/zend_stream.c:1.19
--- ZendEngine2/zend_stream.c:1.18 Mon Dec 31 07:12:07 2007
+++ ZendEngine2/zend_stream.c Wed Mar 26 14:23:02 2008
@@ -13,15 +13,24 @@
| [email protected] so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Wez Furlong <[email protected]> |
+ | Scott MacVicar <[email protected]> |
+ | Nuno Lopes <[email protected]> |
+ | Marcus Boerger <[email protected]> |
+----------------------------------------------------------------------+
*/
-/* $Id: zend_stream.c,v 1.18 2007/12/31 07:12:07 sebastian Exp $ */
+/* $Id: zend_stream.c,v 1.19 2008/03/26 14:23:02 scottmac Exp $ */
#include "zend.h"
#include "zend_compile.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#if HAVE_SYS_MMAN_H
+# include <sys/mman.h>
+#endif
+
ZEND_DLIMPORT int isatty(int fd);
static size_t zend_stream_stdio_reader(void *handle, char *buf, size_t len TSRMLS_DC) /* {{{ */
@@ -32,17 +41,67 @@
static void zend_stream_stdio_closer(void *handle TSRMLS_DC) /* {{{ */
{
- if ((FILE*)handle != stdin)
+ if (handle && (FILE*)handle != stdin) {
fclose((FILE*)handle);
+ }
}
/* }}} */
-static long zend_stream_stdio_fteller(void *handle TSRMLS_DC) /* {{{ */
+static size_t zend_stream_stdio_fsizer(void *handle TSRMLS_DC) /* {{{ */
{
- return ftell((FILE*) handle);
+ struct stat buf;
+ if (handle && fstat(fileno((FILE*)handle), &buf) == 0) {
+ return buf.st_size;
+ }
+ return 0;
}
/* }}} */
+static void zend_stream_unmap(zend_stream *stream TSRMLS_DC) { /* {{{ */
+#if HAVE_MMAP
+ if (stream->mmap.map) {
+ munmap(stream->mmap.map, stream->mmap.len);
+ } else
+#endif
+ if (stream->mmap.buf) {
+ efree(stream->mmap.buf);
+ }
+ stream->mmap.len = 0;
+ stream->mmap.pos = 0;
+ stream->mmap.map = 0;
+ stream->mmap.buf = 0;
+ stream->handle = stream->mmap.old_handle;
+} /* }}} */
+
+static void zend_stream_mmap_closer(zend_stream *stream TSRMLS_DC) /* {{{ */
+{
+ zend_stream_unmap(stream TSRMLS_CC);
+ if (stream->mmap.old_closer && stream->handle) {
+ stream->mmap.old_closer(stream->handle TSRMLS_CC);
+ }
+} /* }}} */
+
+static inline int zend_stream_is_mmap(zend_file_handle *file_handle) { /* {{{ */
+ return file_handle->type == ZEND_HANDLE_MAPPED;
+} /* }}} */
+
+static size_t zend_stream_fsize(zend_file_handle *file_handle TSRMLS_DC) /* {{{ */
+{
+ struct stat buf;
+
+ if (zend_stream_is_mmap(file_handle)) {
+ return file_handle->handle.stream.mmap.len;
+ }
+ if (file_handle->type == ZEND_HANDLE_STREAM || file_handle->type == ZEND_HANDLE_MAPPED) {
+ return file_handle->handle.stream.fsizer(file_handle->handle.stream.handle TSRMLS_CC);
+ }
+ if (file_handle->handle.fp && fstat(fileno(file_handle->handle.fp), &buf) == 0) {
+ return buf.st_size;
+ }
+
+ return -1;
+} /* }}} */
+
ZEND_API int zend_stream_open(const char *filename, zend_file_handle *handle TSRMLS_DC) /* {{{ */
{
if (zend_stream_open_function) {
@@ -53,56 +112,25 @@
handle->handle.fp = zend_fopen(filename, &handle->opened_path);
handle->filename = (char *)filename;
handle->free_filename = 0;
+ memset(&handle->handle.stream.mmap, 0, sizeof(zend_mmap));
return (handle->handle.fp) ? SUCCESS : FAILURE;
}
/* }}} */
-ZEND_API int zend_stream_fixup(zend_file_handle *file_handle TSRMLS_DC) /* {{{ */
+ZEND_API int zend_stream_getc(zend_file_handle *file_handle TSRMLS_DC) /* {{{ */
{
- switch (file_handle->type) {
- case ZEND_HANDLE_FILENAME:
- if (FAILURE == zend_stream_open(file_handle->filename, file_handle TSRMLS_CC)) {
- return FAILURE;
- }
- break;
-
- case ZEND_HANDLE_FD:
- file_handle->handle.fp = fdopen(file_handle->handle.fd, "rb");
- file_handle->type = ZEND_HANDLE_FP;
- break;
-
- case ZEND_HANDLE_FP:
- file_handle->handle.fp = file_handle->handle.fp;
- break;
-
- case ZEND_HANDLE_STREAM:
- /* nothing to do */
- return SUCCESS;
-
- default:
- return FAILURE;
- }
- if (file_handle->type == ZEND_HANDLE_FP) {
- if (!file_handle->handle.fp) {
- return FAILURE;
- }
-
- /* make compatible with stream */
- file_handle->handle.stream.handle = file_handle->handle.fp;
- file_handle->handle.stream.reader = zend_stream_stdio_reader;
- file_handle->handle.stream.closer = zend_stream_stdio_closer;
- file_handle->handle.stream.fteller = zend_stream_stdio_fteller;
-
- file_handle->handle.stream.interactive = isatty(fileno((FILE *)file_handle->handle.stream.handle));
+ char buf;
+ if (file_handle->handle.stream.reader(file_handle->handle.stream.handle, &buf, sizeof(buf) TSRMLS_CC)) {
+ return (int)buf;
}
- return SUCCESS;
+ return EOF;
}
/* }}} */
-ZEND_API size_t zend_stream_read(zend_file_handle *file_handle, char *buf, size_t len TSRMLS_DC) /* {{{ */
+static size_t zend_stream_read(zend_file_handle *file_handle, char *buf, size_t len TSRMLS_DC) /* {{{ */
{
- if (file_handle->handle.stream.interactive) {
+ if (!zend_stream_is_mmap(file_handle) && file_handle->handle.stream.isatty) {
int c = '*';
size_t n;
@@ -112,13 +140,15 @@
Ascii value 4 is actually EOT character which is not defined anywhere in the LibC
or else we can use instead of hardcoded 4.
*/
- for ( n = 0; n < len && (c = zend_stream_getc( file_handle TSRMLS_CC)) != EOF && c != 4 && c != '\n'; ++n )
+ for (n = 0; n < len && (c = zend_stream_getc(file_handle TSRMLS_CC)) != EOF && c != 4 && c != '\n'; ++n) {
#else
- for ( n = 0; n < len && (c = zend_stream_getc( file_handle TSRMLS_CC)) != EOF && c != '\n'; ++n )
+ for (n = 0; n < len && (c = zend_stream_getc(file_handle TSRMLS_CC)) != EOF && c != '\n'; ++n) {
#endif
- buf[n] = (char) c;
- if ( c == '\n' )
- buf[n++] = (char) c;
+ buf[n] = (char)c;
+ }
+ if (c == '\n') {
+ buf[n++] = (char)c;
+ }
return n;
}
@@ -126,26 +156,171 @@
}
/* }}} */
-ZEND_API int zend_stream_getc(zend_file_handle *file_handle TSRMLS_DC) /* {{{ */
+ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t *len TSRMLS_DC) /* {{{ */
{
- char buf;
+ size_t size;
+ zend_stream_type old_type;
- if (file_handle->handle.stream.reader(file_handle->handle.stream.handle, &buf, sizeof(buf) TSRMLS_CC)) {
- return (int)buf;
+ if (file_handle->type == ZEND_HANDLE_FILENAME) {
+ if (zend_stream_open(file_handle->filename, file_handle TSRMLS_CC) == FAILURE) {
+ return FAILURE;
+ }
}
- return EOF;
+
+ switch (file_handle->type) {
+ case ZEND_HANDLE_FD:
+ file_handle->type = ZEND_HANDLE_FP;
+ file_handle->handle.fp = fdopen(file_handle->handle.fd, "rb");
+ /* no break; */
+ case ZEND_HANDLE_FP:
+ if (!file_handle->handle.fp) {
+ return FAILURE;
+ }
+ memset(&file_handle->handle.stream.mmap, 0, sizeof(zend_mmap));
+ file_handle->handle.stream.isatty = isatty(fileno((FILE *)file_handle->handle.stream.handle)) ? 1 : 0;
+ file_handle->handle.stream.reader = (zend_stream_reader_t)zend_stream_stdio_reader;
+ file_handle->handle.stream.closer = (zend_stream_closer_t)zend_stream_stdio_closer;
+ file_handle->handle.stream.fsizer = (zend_stream_fsizer_t)zend_stream_stdio_fsizer;
+ memset(&file_handle->handle.stream.mmap, 0, sizeof(file_handle->handle.stream.mmap));
+ /* no break; */
+ case ZEND_HANDLE_STREAM:
+ /* nothing to do */
+ break;
+
+ case ZEND_HANDLE_MAPPED:
+ file_handle->handle.stream.mmap.pos = 0;
+ *buf = file_handle->handle.stream.mmap.buf;
+ *len = file_handle->handle.stream.mmap.len;
+ return SUCCESS;
+
+ default:
+ return FAILURE;
+ }
+
+ size = zend_stream_fsize(file_handle TSRMLS_CC);
+ if (size == (size_t)-1) {
+ return FAILURE;
+ }
+
+ old_type = file_handle->type;
+ file_handle->type = ZEND_HANDLE_STREAM; /* we might still be _FP but we need fsize() work */
+
+ if (old_type == ZEND_HANDLE_FP && !file_handle->handle.stream.isatty && size) {
+#if HAVE_MMAP
+ if (file_handle->handle.fp && size) {
+ /* *buf[size] is zeroed automatically by the kernel */
+ *buf = mmap(0, size + ZEND_MMAP_AHEAD, PROT_READ, MAP_PRIVATE, fileno(file_handle->handle.fp), 0);
+ if (*buf != MAP_FAILED) {
+ file_handle->handle.stream.mmap.len = size;
+ file_handle->handle.stream.mmap.map = *buf;
+ file_handle->handle.stream.mmap.buf = *buf;
+ goto return_mapped;
+ }
+ }
+#endif
+ file_handle->handle.stream.mmap.map = 0;
+ file_handle->handle.stream.mmap.buf = *buf = safe_emalloc(1, size, ZEND_MMAP_AHEAD);
+ file_handle->handle.stream.mmap.len = zend_stream_read(file_handle, *buf, size TSRMLS_CC);
+ } else {
+ size_t read, remain = 4*1024;
+ *buf = emalloc(remain);
+ size = 0;
+
+ while ((read = zend_stream_read(file_handle, *buf + size, remain TSRMLS_CC)) > 0) {
+ size += read;
+ remain -= read;
+
+ if (remain == 0) {
+ *buf = safe_erealloc(*buf, size, 2, 0);
+ remain = size;
+ }
+ }
+ file_handle->handle.stream.mmap.map = 0;
+ file_handle->handle.stream.mmap.buf = *buf;
+ file_handle->handle.stream.mmap.len = size;
+ if (size && remain < ZEND_MMAP_AHEAD) {
+ *buf = safe_erealloc(*buf, size, 1, ZEND_MMAP_AHEAD);
+ }
+ }
+
+ if (file_handle->handle.stream.mmap.len == 0) {
+ *buf = erealloc(*buf, ZEND_MMAP_AHEAD);
+ file_handle->handle.stream.mmap.buf = *buf;
+ }
+
+ if (ZEND_MMAP_AHEAD) {
+ memset(file_handle->handle.stream.mmap.buf + file_handle->handle.stream.mmap.len, 0, ZEND_MMAP_AHEAD);
+ }
+
+return_mapped:
+ file_handle->type = ZEND_HANDLE_MAPPED;
+ file_handle->handle.stream.mmap.pos = 0;
+ file_handle->handle.stream.mmap.old_handle = file_handle->handle.stream.handle;
+ file_handle->handle.stream.mmap.old_closer = file_handle->handle.stream.closer;
+ file_handle->handle.stream.handle = &file_handle->handle.stream;
+ file_handle->handle.stream.closer = (zend_stream_closer_t)zend_stream_mmap_closer;
+
+ *buf = file_handle->handle.stream.mmap.buf;
+ *len = file_handle->handle.stream.mmap.len;
+
+ return SUCCESS;
}
/* }}} */
-ZEND_API int zend_stream_ferror(zend_file_handle *file_handle TSRMLS_DC) /* {{{ */
-{
- return 0;
+ZEND_API void zend_file_handle_dtor(zend_file_handle *fh TSRMLS_DC) /* {{{ */
+ {
+ switch (fh->type) {
+ case ZEND_HANDLE_FD:
+ /* nothing to do */
+ break;
+ case ZEND_HANDLE_FP:
+ fclose(fh->handle.fp);
+ break;
+ case ZEND_HANDLE_STREAM:
+ case ZEND_HANDLE_MAPPED:
+ if (fh->handle.stream.closer && fh->handle.stream.handle) {
+ fh->handle.stream.closer(fh->handle.stream.handle TSRMLS_CC);
+ }
+ fh->handle.stream.handle = NULL;
+ break;
+ case ZEND_HANDLE_FILENAME:
+ /* We're only supposed to get here when destructing the used_files hash,
+ * which doesn't really contain open files, but references to their names/paths
+ */
+ break;
+ }
+ if (fh->opened_path) {
+ efree(fh->opened_path);
+ fh->opened_path = NULL;
+ }
+ if (fh->free_filename && fh->filename) {
+ efree(fh->filename);
+ fh->filename = NULL;
+ }
}
/* }}} */
-ZEND_API long zend_stream_ftell(zend_file_handle *file_handle TSRMLS_DC) /* {{{ */
-{
- return file_handle->handle.stream.fteller(file_handle->handle.stream.handle TSRMLS_CC);
+ZEND_API int zend_compare_file_handles(zend_file_handle *fh1, zend_file_handle *fh2) /* {{{ */
+ {
+ if (fh1->type != fh2->type) {
+ return 0;
+ }
+ switch (fh1->type) {
+ case ZEND_HANDLE_FD:
+ return fh1->handle.fd == fh2->handle.fd;
+ case ZEND_HANDLE_FP:
+ return fh1->handle.fp == fh2->handle.fp;
+ case ZEND_HANDLE_STREAM:
+ return fh1->handle.stream.handle == fh2->handle.stream.handle;
+ case ZEND_HANDLE_MAPPED:
+ return (fh1->handle.stream.handle == &fh1->handle.stream &&
+ fh2->handle.stream.handle == &fh2->handle.stream &&
+ fh1->handle.stream.mmap.old_handle == fh2->handle.stream.mmap.old_handle)
+ || fh1->handle.stream.handle == fh2->handle.stream.handle;
+ default:
+ return 0;
+ }
+ return 0;
}
/* }}} */
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_stream.h?r1=1.12&r2=1.13&diff_format=u
Index: ZendEngine2/zend_stream.h
diff -u ZendEngine2/zend_stream.h:1.12 ZendEngine2/zend_stream.h:1.13
--- ZendEngine2/zend_stream.h:1.12 Mon Dec 31 07:12:07 2007
+++ ZendEngine2/zend_stream.h Wed Mar 26 14:23:02 2008
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_stream.h,v 1.12 2007/12/31 07:12:07 sebastian Exp $ */
+/* $Id: zend_stream.h,v 1.13 2008/03/26 14:23:02 scottmac Exp $ */
#ifndef ZEND_STREAM_H
#define ZEND_STREAM_H
@@ -25,39 +25,55 @@
* These functions are private to the engine.
* */
-typedef size_t (*zend_stream_reader_t)(void *handle, char *buf, size_t len TSRMLS_DC);
-typedef void (*zend_stream_closer_t)(void *handle TSRMLS_DC);
-typedef long (*zend_stream_fteller_t)(void *handle TSRMLS_DC);
+typedef size_t (*zend_stream_fsizer_t)(void* handle TSRMLS_DC);
+typedef size_t (*zend_stream_reader_t)(void* handle, char *buf, size_t len TSRMLS_DC);
+typedef void (*zend_stream_closer_t)(void* handle TSRMLS_DC);
+
+#define ZEND_MMAP_AHEAD 32
+
+typedef enum {
+ ZEND_HANDLE_FILENAME,
+ ZEND_HANDLE_FD,
+ ZEND_HANDLE_FP,
+ ZEND_HANDLE_STREAM,
+ ZEND_HANDLE_MAPPED,
+} zend_stream_type;
+
+typedef struct _zend_mmap {
+ size_t len;
+ size_t pos;
+ void *map;
+ char *buf;
+ void *old_handle;
+ zend_stream_closer_t old_closer;
+} zend_mmap;
typedef struct _zend_stream {
- void *handle;
- zend_stream_reader_t reader;
- zend_stream_closer_t closer;
- zend_stream_fteller_t fteller;
- int interactive;
+ void *handle;
+ int isatty;
+ zend_mmap mmap;
+ zend_stream_reader_t reader;
+ zend_stream_fsizer_t fsizer;
+ zend_stream_closer_t closer;
} zend_stream;
typedef struct _zend_file_handle {
- zend_uchar type;
- char *filename;
- char *opened_path;
+ zend_stream_type type;
+ char *filename;
+ char *opened_path;
union {
- int fd;
- FILE *fp;
- zend_stream stream;
+ int fd;
+ FILE *fp;
+ zend_stream stream;
} handle;
zend_bool free_filename;
} zend_file_handle;
BEGIN_EXTERN_C()
ZEND_API int zend_stream_open(const char *filename, zend_file_handle *handle TSRMLS_DC);
-ZEND_API int zend_stream_ferror(zend_file_handle *file_handle TSRMLS_DC);
-ZEND_API int zend_stream_getc(zend_file_handle *file_handle TSRMLS_DC);
-ZEND_API size_t zend_stream_read(zend_file_handle *file_handle, char *buf, size_t len TSRMLS_DC);
-ZEND_API long zend_stream_ftell(zend_file_handle *file_handle TSRMLS_DC);
-ZEND_API int zend_stream_fixup(zend_file_handle *file_handle TSRMLS_DC);
+ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t *len TSRMLS_DC);
+ZEND_API void zend_file_handle_dtor(zend_file_handle *fh TSRMLS_DC);
+ZEND_API int zend_compare_file_handles(zend_file_handle *fh1, zend_file_handle *fh2);
END_EXTERN_C()
-#define zend_stream_close(handle) zend_file_handle_dtor((handle))
-
#endif
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_strtod.c?r1=1.36&r2=1.37&diff_format=u
Index: ZendEngine2/zend_strtod.c
diff -u ZendEngine2/zend_strtod.c:1.36 ZendEngine2/zend_strtod.c:1.37
--- ZendEngine2/zend_strtod.c:1.36 Thu Nov 22 13:33:53 2007
+++ ZendEngine2/zend_strtod.c Wed Mar 26 14:23:02 2008
@@ -89,7 +89,7 @@
* directly -- and assumed always to succeed.
*/
-/* $Id: zend_strtod.c,v 1.36 2007/11/22 13:33:53 dmitry Exp $ */
+/* $Id: zend_strtod.c,v 1.37 2008/03/26 14:23:02 scottmac Exp $ */
#include <zend.h>
#include <unicode/utypes.h>
@@ -2730,7 +2730,7 @@
s++;
while ((c = *s++)) {
- if (c > '7') {
+ if (c < '0' || c > '7') {
/* break and return the current value if the number is not well-formed
* that's what Linux strtol() does
*/
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.221&r2=1.222&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.221 ZendEngine2/zend_vm_def.h:1.222
--- ZendEngine2/zend_vm_def.h:1.221 Tue Mar 18 08:36:49 2008
+++ ZendEngine2/zend_vm_def.h Wed Mar 26 14:23:02 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_vm_def.h,v 1.221 2008/03/18 08:36:49 dmitry Exp $ */
+/* $Id: zend_vm_def.h,v 1.222 2008/03/26 14:23:02 scottmac Exp $ */
/* If you change this file, please regenerate the zend_vm_execute.h and
* zend_vm_opcodes.h files by running:
@@ -3176,7 +3176,7 @@
new_op_array = zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
zend_destroy_file_handle(&file_handle TSRMLS_CC);
} else {
- zend_file_handle_dtor(&file_handle);
+ zend_file_handle_dtor(&file_handle TSRMLS_CC);
failure_retval=1;
}
} else {
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.225&r2=1.226&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.225 ZendEngine2/zend_vm_execute.h:1.226
--- ZendEngine2/zend_vm_execute.h:1.225 Tue Mar 18 08:36:49 2008
+++ ZendEngine2/zend_vm_execute.h Wed Mar 26 14:23:02 2008
@@ -1730,7 +1730,7 @@
new_op_array = zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
zend_destroy_file_handle(&file_handle TSRMLS_CC);
} else {
- zend_file_handle_dtor(&file_handle);
+ zend_file_handle_dtor(&file_handle TSRMLS_CC);
failure_retval=1;
}
} else {
@@ -5037,7 +5037,7 @@
new_op_array = zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
zend_destroy_file_handle(&file_handle TSRMLS_CC);
} else {
- zend_file_handle_dtor(&file_handle);
+ zend_file_handle_dtor(&file_handle TSRMLS_CC);
failure_retval=1;
}
} else {
@@ -8378,7 +8378,7 @@
new_op_array = zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
zend_destroy_file_handle(&file_handle TSRMLS_CC);
} else {
- zend_file_handle_dtor(&file_handle);
+ zend_file_handle_dtor(&file_handle TSRMLS_CC);
failure_retval=1;
}
} else {
@@ -22634,7 +22634,7 @@
new_op_array = zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
zend_destroy_file_handle(&file_handle TSRMLS_CC);
} else {
- zend_file_handle_dtor(&file_handle);
+ zend_file_handle_dtor(&file_handle TSRMLS_CC);
failure_retval=1;
}
} else {
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug38779.phpt?r1=1.4&r2=1.5&diff_format=u
Index: ZendEngine2/tests/bug38779.phpt
diff -u ZendEngine2/tests/bug38779.phpt:1.4 ZendEngine2/tests/bug38779.phpt:1.5
--- ZendEngine2/tests/bug38779.phpt:1.4 Fri Feb 2 10:55:23 2007
+++ ZendEngine2/tests/bug38779.phpt Wed Mar 26 14:23:02 2008
@@ -21,6 +21,9 @@
function stream_eof() {
return $this->position >= strlen($this->data);
}
+ function stream_stat() {
+ return array('size' => strlen($this->data));
+ }
}
stream_wrapper_register('Loader', 'Loader');
require 'Loader://qqq.php';
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug42767.phpt?r1=1.2&r2=1.3&diff_format=u
Index: ZendEngine2/tests/bug42767.phpt
diff -u ZendEngine2/tests/bug42767.phpt:1.2 ZendEngine2/tests/bug42767.phpt:1.3
--- ZendEngine2/tests/bug42767.phpt:1.2 Wed Sep 26 15:46:28 2007
+++ ZendEngine2/tests/bug42767.phpt Wed Mar 26 14:23:02 2008
@@ -1,5 +1,12 @@
--TEST--
Bug #42767 (highlight_string() truncates trailing comments)
+--INI--
+highlight.string = #DD0000
+highlight.comment = #FF8000
+highlight.keyword = #007700
+highlight.bg = #FFFFFF
+highlight.default = #0000BB
+highlight.html = #000000
--FILE--
<?php
highlight_string('<?php /*some comment..');