cvs: ZendEngine2 / zend.c zend_compile.c zend_compile.h
| From: | Zeev Suraski | Date: | Sun, 02 Mar 2003 10:04:54 +0000 |
| Subject: | cvs: ZendEngine2 / zend.c zend_compile.c zend_compile.h | ||
| Groups: | php.zend-engine.cvs | ||
| Request: | Send a blank email to php-zend-engine-cvs+get-982@lists.php.net to get a copy of this message | ||
zeev Sun Mar 2 05:04:54 2003 EDT
Modified files:
/ZendEngine2 zend.c zend_compile.c zend_compile.h
Log:
Add infrastructure for JIT initialization of auto globals
Index: ZendEngine2/zend.c
diff -u ZendEngine2/zend.c:1.213 ZendEngine2/zend.c:1.214
--- ZendEngine2/zend.c:1.213 Tue Feb 18 04:37:53 2003
+++ ZendEngine2/zend.c Sun Mar 2 05:04:53 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend.c,v 1.213 2003/02/18 09:37:53 wez Exp $ */
+/* $Id: zend.c,v 1.214 2003/03/02 10:04:53 zeev Exp $ */
#include "zend.h"
#include "zend_extensions.h"
@@ -417,7 +417,7 @@
compiler_globals->auto_globals = (HashTable *) malloc(sizeof(HashTable));
zend_hash_init_ex(compiler_globals->auto_globals, 8, NULL, NULL, 1, 0);
- zend_hash_copy(compiler_globals->auto_globals, global_auto_globals_table, NULL, NULL,
sizeof(void *) /* empty element */);
+ zend_hash_copy(compiler_globals->auto_globals, global_auto_globals_table, NULL, NULL,
sizeof(zend_auto_global) /* empty element */);
}
@@ -573,7 +573,7 @@
#ifdef ZTS
zend_hash_init_ex(GLOBAL_CONSTANTS_TABLE, 20, NULL, ZEND_CONSTANT_DTOR, 1, 0);
- zend_hash_init_ex(GLOBAL_AUTO_GLOBALS_TABLE, 8, NULL, NULL, 1, 0);
+ zend_hash_init_ex(GLOBAL_AUTO_GLOBALS_TABLE, 8, NULL, (dtor_func_t) zend_auto_global_dtor, 1, 0);
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);
@@ -590,7 +590,7 @@
zend_hash_destroy(executor_globals->zend_constants);
*executor_globals->zend_constants = *GLOBAL_CONSTANTS_TABLE;
#else
- zend_hash_init_ex(CG(auto_globals), 8, NULL, NULL, 1, 0);
+ zend_hash_init_ex(CG(auto_globals), 8, NULL, (dtor_func_t) zend_auto_global_dtor, 1, 0);
scanner_globals_ctor(&ini_scanner_globals TSRMLS_CC);
scanner_globals_ctor(&language_scanner_globals TSRMLS_CC);
zend_startup_constants();
@@ -600,6 +600,7 @@
#endif
register_standard_class(TSRMLS_C);
zend_register_standard_constants(TSRMLS_C);
+ zend_register_auto_global("GLOBALS", sizeof("GLOBALS")-1, NULL TSRMLS_CC);
#ifndef ZTS
zend_init_rsrc_plist(TSRMLS_C);
Index: ZendEngine2/zend_compile.c
diff -u ZendEngine2/zend_compile.c:1.377 ZendEngine2/zend_compile.c:1.378
--- ZendEngine2/zend_compile.c:1.377 Sat Mar 1 14:08:41 2003
+++ ZendEngine2/zend_compile.c Sun Mar 2 05:04:53 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_compile.c,v 1.377 2003/03/01 19:08:41 zeev Exp $ */
+/* $Id: zend_compile.c,v 1.378 2003/03/02 10:04:53 zeev Exp $ */
#include "zend_language_parser.h"
#include "zend.h"
@@ -58,6 +58,13 @@
}
+int zend_auto_global_arm(zend_auto_global *auto_global TSRMLS_DC)
+{
+ auto_global->armed = (auto_global->auto_global_callback ? 1 : 0);
+ return 0;
+}
+
+
static void init_compiler_declarables(TSRMLS_D)
{
CG(declarables).ticks.type = IS_LONG;
@@ -84,8 +91,8 @@
CG(start_lineno) = 0;
init_compiler_declarables(TSRMLS_C);
CG(throw_list) = NULL;
- zend_register_auto_global("GLOBALS", sizeof("GLOBALS")-1 TSRMLS_CC);
CG(in_clone_method) = 0;
+ zend_hash_apply(CG(auto_globals), (apply_func_t) zend_auto_global_arm TSRMLS_CC);
}
@@ -277,8 +284,13 @@
opline_ptr->op2.u.EA.type = ZEND_FETCH_LOCAL;
if (varname->op_type == IS_CONST && varname->u.constant.type == IS_STRING) {
- if (zend_hash_exists(CG(auto_globals), varname->u.constant.value.str.val,
varname->u.constant.value.str.len+1)) {
+ zend_auto_global *auto_global;
+
+ if (zend_hash_find(CG(auto_globals), varname->u.constant.value.str.val,
varname->u.constant.value.str.len+1, (void **) &auto_global)==SUCCESS) {
opline_ptr->op2.u.EA.type = ZEND_FETCH_GLOBAL;
+ if (auto_global->armed) {
+ auto_global->armed = auto_global->auto_global_callback(auto_global->name,
auto_global->name_len TSRMLS_CC);
+ }
} else {
/* if (CG(active_op_array)->static_variables &&
zend_hash_exists(CG(active_op_array)->static_variables, varname->u.constant.value.str.val,
varname->u.constant.value.str.len+1)) {
opline_ptr->op2.u.EA.type = ZEND_FETCH_STATIC;
@@ -3152,9 +3164,20 @@
}
-int zend_register_auto_global(char *name, uint name_len TSRMLS_DC)
+void zend_auto_global_dtor(zend_auto_global *auto_global)
+{
+ free(auto_global->name);
+}
+
+int zend_register_auto_global(char *name, uint name_len, zend_auto_global_callback
auto_global_callback TSRMLS_DC)
{
- return zend_hash_add_empty_element(CG(auto_globals), name, name_len+1);
+ zend_auto_global auto_global;
+
+ auto_global.name = zend_strndup(name, name_len);
+ auto_global.name_len = name_len;
+ auto_global.auto_global_callback = auto_global_callback;
+
+ return zend_hash_add(CG(auto_globals), name, name_len+1, &auto_global,
sizeof(zend_auto_global), NULL);
}
Index: ZendEngine2/zend_compile.h
diff -u ZendEngine2/zend_compile.h:1.216 ZendEngine2/zend_compile.h:1.217
--- ZendEngine2/zend_compile.h:1.216 Mon Feb 24 07:05:55 2003
+++ ZendEngine2/zend_compile.h Sun Mar 2 05:04:53 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_compile.h,v 1.216 2003/02/24 12:05:55 zeev Exp $ */
+/* $Id: zend_compile.h,v 1.217 2003/03/02 10:04:53 zeev Exp $ */
#ifndef ZEND_COMPILE_H
#define ZEND_COMPILE_H
@@ -462,8 +462,16 @@
ZEND_API char *zend_make_compiled_string_description(char *name TSRMLS_DC);
void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify_handlers TSRMLS_DC);
+typedef zend_bool (*zend_auto_global_callback)(char *name, uint name_len TSRMLS_DC);
+typedef struct _zend_auto_global {
+ char *name;
+ uint name_len;
+ zend_auto_global_callback auto_global_callback;
+ zend_bool armed;
+} zend_auto_global;
-int zend_register_auto_global(char *name, uint name_len TSRMLS_DC);
+void zend_auto_global_dtor(zend_auto_global *auto_global);
+int zend_register_auto_global(char *name, uint name_len, zend_auto_global_callback
auto_global_callback TSRMLS_DC);
int zendlex(znode *zendlval TSRMLS_DC);