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: | Ilia Alshanetsky | 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