Hi,

The fix recently incorporated in PHP 5.2.2 for __HALT_COMPILER(); needs
to be MFB.  Until today, I didn't have the time to get it working, but
attached is the patch.  It is also available at
http://chiaraquartet.net/halt_compiler_php6.patch.txt

Greg

P.S. don't prepend www. or you'll get redirected to the chiara quartet
website, which although pretty cool looking, has no patches to HEAD
anywhere to be found.
? halt_compiler_php6.patch.txt
Index: Zend/zend_compile.c
===================================================================
RCS file: /repository/ZendEngine2/zend_compile.c,v
retrieving revision 1.744
diff -u -r1.744 zend_compile.c
--- Zend/zend_compile.c 3 Apr 2007 06:32:59 -0000       1.744
+++ Zend/zend_compile.c 28 May 2007 05:47:16 -0000
@@ -3329,6 +3329,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)
Index: Zend/zend_compile.h
===================================================================
RCS file: /repository/ZendEngine2/zend_compile.h,v
retrieving revision 1.356
diff -u -r1.356 zend_compile.h
--- Zend/zend_compile.h 8 Mar 2007 17:30:28 -0000       1.356
+++ Zend/zend_compile.h 28 May 2007 05:47:17 -0000
@@ -457,6 +457,7 @@
 void zend_do_begin_class_declaration(znode *class_token, znode *class_name, 
znode *parent_class_name TSRMLS_DC);
 void zend_do_end_class_declaration(znode *class_token, znode *parent_token 
TSRMLS_DC);
 void zend_do_declare_property(znode *var_name, znode *value, zend_uint 
access_type TSRMLS_DC);
+void zend_do_halt_compiler_register(TSRMLS_D);
 void zend_do_declare_implicit_property(TSRMLS_D);
 void zend_do_declare_class_constant(znode *var_name, znode *value TSRMLS_DC);
 
Index: Zend/zend_constants.c
===================================================================
RCS file: /repository/ZendEngine2/zend_constants.c,v
retrieving revision 1.90
diff -u -r1.90 zend_constants.c
--- Zend/zend_constants.c       1 Jan 2007 09:29:20 -0000       1.90
+++ Zend/zend_constants.c       28 May 2007 05:47:17 -0000
@@ -347,7 +347,27 @@
                                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.s, name_len) == 
0) {
+                               char *cfilename;
+                               zstr haltname;
+                               int len, clen;
+                               cfilename = 
zend_get_executed_filename(TSRMLS_C);
+                               clen = strlen(cfilename);
+                               /* check for __COMPILER_HALT_OFFSET__ */
+                               zend_mangle_property_name(&haltname.s, &len, 
haltoff,
+                                       sizeof("__COMPILER_HALT_OFFSET__") - 1, 
cfilename, clen, 0);
+                               if (zend_u_hash_find(EG(zend_constants), 
IS_STRING, haltname, len+1, (void **) &c) == SUCCESS) {
+                                       retval=1;
+                               } else {
+                                       retval=0;
+                               }
+                               pefree(haltname.s, 0);
+                       } else {
+                               retval=0;
+                       }
                }
                efree(lookup_name.v);
        }
@@ -373,6 +393,7 @@
        zstr lookup_name;
        zstr name;
        int ret = SUCCESS;
+       static char haltoff[] = "__COMPILER_HALT_OFFSET__";
 
 #if 0
        printf("Registering constant for module %d\n", c->module_number);
@@ -388,6 +409,13 @@
                lookup_name = NULL_ZSTR;
        }
 
+       if (EG(in_execution) && lookup_name_len == 
sizeof("__COMPILER_HALT_OFFSET__") && memcmp(haltoff, name.s, lookup_name_len) 
== 0) {
+               zend_error(E_NOTICE,"Constant %R already defined", type, name);
+               if (lookup_name.v) {
+                       efree(lookup_name.v);
+               }
+               ret = FAILURE;
+       }
        if (zend_u_hash_add(EG(zend_constants), type, name, lookup_name_len, 
(void *) c, sizeof(zend_constant), NULL)==FAILURE) {
                zend_error(E_NOTICE,"Constant %R already defined", type, name);
                free(c->name.v);
Index: Zend/zend_language_parser.y
===================================================================
RCS file: /repository/ZendEngine2/zend_language_parser.y,v
retrieving revision 1.180
diff -u -r1.180 zend_language_parser.y
--- Zend/zend_language_parser.y 8 Mar 2007 17:30:28 -0000       1.180
+++ Zend/zend_language_parser.y 28 May 2007 05:47:18 -0000
@@ -165,7 +165,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; }
 ;
 
 
Index: tests/lang/halt_compiler1.phpt
===================================================================
RCS file: tests/lang/halt_compiler1.phpt
diff -N tests/lang/halt_compiler1.phpt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ tests/lang/halt_compiler1.phpt      28 May 2007 05:47:26 -0000
@@ -0,0 +1,8 @@
+--TEST--
+__HALT_COMPILER();
+--FILE--
+<?php echo 'test'; var_dump(__COMPILER_HALT_OFFSET__); __HALT_COMPILER();
+?>
+===DONE===
+--EXPECT--
+testint(73)
\ No newline at end of file
Index: tests/lang/halt_compiler2.phpt
===================================================================
RCS file: tests/lang/halt_compiler2.phpt
diff -N tests/lang/halt_compiler2.phpt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ tests/lang/halt_compiler2.phpt      28 May 2007 05:47:26 -0000
@@ -0,0 +1,23 @@
+--TEST--
+__HALT_COMPILER(); 2 files
+--FILE--
+<?php
+$text = "<?php echo 'test'; var_dump(__COMPILER_HALT_OFFSET__); 
__HALT_COMPILER(); ?>
+hi there";
+file_put_contents(dirname(__FILE__) . '/test1.php', $text);
+$text = "<?php echo 'test2'; var_dump(__COMPILER_HALT_OFFSET__); 
__HALT_COMPILER(); ?>
+hi there 2";
+file_put_contents(dirname(__FILE__) . '/test2.php', $text);
+include dirname(__FILE__) . '/test1.php';
+include dirname(__FILE__) . '/test2.php';
+?>
+==DONE==
+--CLEAN--
+<?php
+unlink(dirname(__FILE__) . '/test1.php');
+unlink(dirname(__FILE__) . '/test2.php');
+?>
+--EXPECT--
+testint(73)
+test2int(74)
+==DONE==
\ No newline at end of file
Index: tests/lang/halt_compiler3.phpt
===================================================================
RCS file: tests/lang/halt_compiler3.phpt
diff -N tests/lang/halt_compiler3.phpt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ tests/lang/halt_compiler3.phpt      28 May 2007 05:47:26 -0000
@@ -0,0 +1,10 @@
+--TEST--
+__HALT_COMPILER(); bad define() of __COMPILER_HALT_OFFSET__ 1
+--FILE--
+<?php
+define ('__COMPILER_HALT_OFFSET__', 1);
+?>
+==DONE==
+--EXPECTF--
+Notice: Constant __COMPILER_HALT_OFFSET__ already defined in %s on line %d
+==DONE==
\ No newline at end of file
Index: tests/lang/halt_compiler4.phpt
===================================================================
RCS file: tests/lang/halt_compiler4.phpt
diff -N tests/lang/halt_compiler4.phpt
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ tests/lang/halt_compiler4.phpt      28 May 2007 05:47:26 -0000
@@ -0,0 +1,10 @@
+--TEST--
+__HALT_COMPILER(); bad define() of __COMPILER_HALT_OFFSET__ 2
+--FILE--
+<?php
+define ('__COMPILER_HALT_OFFSET__', 1);
+__HALT_COMPILER();
+?>
+==DONE==
+--EXPECTF--
+Notice: Constant __COMPILER_HALT_OFFSET__ already defined in %s on line %d
\ No newline at end of file

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to