cvs: ZendEngine2(PHP_5_2) / zend_compile.c zend_compile.h zend_constants.c zend_language_parser.y /tests halt_compiler1.phpt halt_compiler2.phpt
halt_compiler3.phpt halt_compiler4.phpt

From: Date: Wed, 04 Apr 2007 00:42:42 +0000
Subject: cvs: ZendEngine2(PHP_5_2) / zend_compile.c zend_compile.h zend_constants.c zend_language_parser.y /tests halt_compiler1.phpt halt_compiler2.phpt
halt_compiler3.phpt halt_compiler4.phpt
Groups: php.zend-engine.cvs 
Request: Send a blank email to php-zend-engine-cvs+get-5710@lists.php.net to get a copy of this message
iliaa Wed Apr 4 00:42:42 2007 UTC Added files: (Branch: PHP_5_2) /ZendEngine2/tests halt_compiler1.phpt halt_compiler2.phpt halt_compiler3.phpt halt_compiler4.phpt Modified files: /ZendEngine2 zend_compile.c zend_compile.h zend_constants.c zend_language_parser.y Log: Addres limitation of __HALT_COMPILER() that allowed only one instance per request. # Patch by Greg Beaver http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.c?r1=1.647.2.27.2.33&r2=1.647.2.27.2.34&diff_format=u Index: ZendEngine2/zend_compile.c diff -u ZendEngine2/zend_compile.c:1.647.2.27.2.33 ZendEngine2/zend_compile.c:1.647.2.27.2.34 --- ZendEngine2/zend_compile.c:1.647.2.27.2.33 Fri Mar 23 12:46:16 2007 +++ ZendEngine2/zend_compile.c Wed Apr 4 00:42:42 2007 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.c,v 1.647.2.27.2.33 2007/03/23 12:46:16 dmitry Exp $ */ +/* $Id: zend_compile.c,v 1.647.2.27.2.34 2007/04/04 00:42:42 iliaa Exp $ */ #include <zend_language_parser.h> #include "zend.h" @@ -3101,7 +3101,18 @@ zend_llist_add_element(fetch_list_ptr, &opline); } - +void zend_do_halt_compiler_register(TSRMLS_D) +{ + char *name, *cfilename; + char haltoff[] = "__COMPILER_HALT_OFFSET__"; + int len, clen; + cfilename = zend_get_compiled_filename(TSRMLS_C); + clen = strlen(cfilename); + zend_mangle_property_name(&name, &len, haltoff, + sizeof("__COMPILER_HALT_OFFSET__") - 1, cfilename, clen, 0); + zend_register_long_constant(name, len+1, zend_get_scanned_file_offset(TSRMLS_C), CONST_CS, 0 TSRMLS_CC); + pefree(name, 0); +} void zend_do_declare_implicit_property(TSRMLS_D) { http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.h?r1=1.316.2.8.2.10&r2=1.316.2.8.2.11&diff_format=u Index: ZendEngine2/zend_compile.h diff -u ZendEngine2/zend_compile.h:1.316.2.8.2.10 ZendEngine2/zend_compile.h:1.316.2.8.2.11 --- ZendEngine2/zend_compile.h:1.316.2.8.2.10 Thu Feb 15 10:38:28 2007 +++ ZendEngine2/zend_compile.h Wed Apr 4 00:42:42 2007 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_compile.h,v 1.316.2.8.2.10 2007/02/15 10:38:28 dmitry Exp $ */ +/* $Id: zend_compile.h,v 1.316.2.8.2.11 2007/04/04 00:42:42 iliaa Exp $ */ #ifndef ZEND_COMPILE_H #define ZEND_COMPILE_H @@ -450,6 +450,7 @@ void zend_do_fetch_property(znode *result, znode *object, znode *property TSRMLS_DC); +void zend_do_halt_compiler_register(TSRMLS_D); void zend_do_push_object(znode *object TSRMLS_DC); void zend_do_pop_object(znode *object TSRMLS_DC); http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_constants.c?r1=1.71.2.5.2.4&r2=1.71.2.5.2.5&diff_format=u Index: ZendEngine2/zend_constants.c diff -u ZendEngine2/zend_constants.c:1.71.2.5.2.4 ZendEngine2/zend_constants.c:1.71.2.5.2.5 --- ZendEngine2/zend_constants.c:1.71.2.5.2.4 Mon Jan 1 09:35:46 2007 +++ ZendEngine2/zend_constants.c Wed Apr 4 00:42:42 2007 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_constants.c,v 1.71.2.5.2.4 2007/01/01 09:35:46 sebastian Exp $ */ +/* $Id: zend_constants.c,v 1.71.2.5.2.5 2007/04/04 00:42:42 iliaa Exp $ */ #include "zend.h" #include "zend_constants.h" @@ -274,10 +274,10 @@ *result = **ret_constant; zval_copy_ctor(result); } - + return retval; } - + if (zend_hash_find(EG(zend_constants), name, name_len+1, (void **) &c) == FAILURE) { lookup_name = estrndup(name, name_len); zend_str_tolower(lookup_name, name_len); @@ -287,7 +287,26 @@ retval=0; } } else { - retval=0; + char haltoff[] = "__COMPILER_HALT_OFFSET__"; + if (!EG(in_execution)) { + retval = 0; + } else if (name_len == sizeof("__COMPILER_HALT_OFFSET__") - 1 && memcmp(haltoff, name, name_len) == 0) { + char *cfilename, *haltname; + int len, clen; + cfilename = zend_get_executed_filename(TSRMLS_C); + clen = strlen(cfilename); + /* check for __COMPILER_HALT_OFFSET__ */ + zend_mangle_property_name(&haltname, &len, haltoff, + sizeof("__COMPILER_HALT_OFFSET__") - 1, cfilename, clen, 0); + if (zend_hash_find(EG(zend_constants), haltname, len+1, (void **) &c) == SUCCESS) { + retval = 1; + } else { + retval=0; + } + pefree(haltname, 0); + } else { + retval = 0; + } } efree(lookup_name); } @@ -326,7 +345,8 @@ name = c->name; } - if (zend_hash_add(EG(zend_constants), name, c->name_len, (void *) c, sizeof(zend_constant), NULL)==FAILURE) { + if ((strncmp(name, "__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__") - 1) == 0) || + zend_hash_add(EG(zend_constants), name, c->name_len, (void *) c, sizeof(zend_constant), NULL)==FAILURE) { zend_error(E_NOTICE,"Constant %s already defined", name); free(c->name); if (!(c->flags & CONST_PERSISTENT)) { http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_parser.y?r1=1.160.2.4.2.3&r2=1.160.2.4.2.4&diff_format=u Index: ZendEngine2/zend_language_parser.y diff -u ZendEngine2/zend_language_parser.y:1.160.2.4.2.3 ZendEngine2/zend_language_parser.y:1.160.2.4.2.4 --- ZendEngine2/zend_language_parser.y:1.160.2.4.2.3 Wed Jan 10 15:58:07 2007 +++ ZendEngine2/zend_language_parser.y Wed Apr 4 00:42:42 2007 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend_language_parser.y,v 1.160.2.4.2.3 2007/01/10 15:58:07 dmitry Exp $ */ +/* $Id: zend_language_parser.y,v 1.160.2.4.2.4 2007/04/04 00:42:42 iliaa Exp $ */ /* * LALR shift/reduce conflicts and how they are resolved: @@ -162,7 +162,7 @@ statement | function_declaration_statement { zend_do_early_binding(TSRMLS_C); } | class_declaration_statement { zend_do_early_binding(TSRMLS_C); } - | T_HALT_COMPILER '(' ')' ';' { zval c; if (zend_get_constant("__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__") - 1, &c TSRMLS_CC)) { zval_dtor(&c); zend_error(E_COMPILE_ERROR, "__HALT_COMPILER() can only be used once per request"); } else { REGISTER_MAIN_LONG_CONSTANT("__COMPILER_HALT_OFFSET__", zend_get_scanned_file_offset(TSRMLS_C), CONST_CS); } YYACCEPT; } + | T_HALT_COMPILER '(' ')' ';' { zend_do_halt_compiler_register(TSRMLS_C); YYACCEPT; } ; http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/halt_compiler1.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/halt_compiler1.phpt +++ ZendEngine2/tests/halt_compiler1.phpt http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/halt_compiler2.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/halt_compiler2.phpt +++ ZendEngine2/tests/halt_compiler2.phpt http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/halt_compiler3.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/halt_compiler3.phpt +++ ZendEngine2/tests/halt_compiler3.phpt http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/halt_compiler4.phpt?view=markup&rev=1.1 Index: ZendEngine2/tests/halt_compiler4.phpt +++ ZendEngine2/tests/halt_compiler4.phpt

« previous php.zend-engine.cvs (#5710) next »