dmitry Tue Apr 29 08:15:22 2008 UTC
Modified files: (Branch: PHP_5_3)
/php-src NEWS
/ZendEngine2 zend.c zend_API.h zend_builtin_functions.c
zend_compile.c zend_execute.c zend_execute_API.c
zend_hash.h zend_object_handlers.c zend_vm_def.h
zend_vm_execute.h zend_vm_execute.skl
/php-src/ext/curl streams.c
/php-src/ext/standard array.c http_fopen_wrapper.c string.c
/php-src/ext/wddx wddx.c
/php-src/main php_variables.c
Log:
Lazy EG(active_symbol_table) initialization
http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.965.2.165&r2=1.2027.2.547.2.965.2.166&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.965.2.165 php-src/NEWS:1.2027.2.547.2.965.2.166
--- php-src/NEWS:1.2027.2.547.2.965.2.165 Mon Apr 28 22:37:31 2008
+++ php-src/NEWS Tue Apr 29 08:15:16 2008
@@ -101,6 +101,7 @@
- Added forward_static_call(_array) to complete LSB. (Mike Lively)
- Improved PHP runtime speed and memory usage:
+ . Lazy EG(active_symbol_table) initialization. (Dmitry)
. Optimized ZEND_RETURN opcode to not allocate and copy return value if it is
not used. (Dmitry)
. Replaced flex based scanner with re2c based scanner. (Marcus, Nuno, Scott)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend.c?r1=1.308.2.12.2.35.2.17&r2=1.308.2.12.2.35.2.18&diff_format=u
Index: ZendEngine2/zend.c
diff -u ZendEngine2/zend.c:1.308.2.12.2.35.2.17 ZendEngine2/zend.c:1.308.2.12.2.35.2.18
--- ZendEngine2/zend.c:1.308.2.12.2.35.2.17 Thu Apr 17 10:21:38 2008
+++ ZendEngine2/zend.c Tue Apr 29 08:15:16 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend.c,v 1.308.2.12.2.35.2.17 2008/04/17 10:21:38 dmitry Exp $ */
+/* $Id: zend.c,v 1.308.2.12.2.35.2.18 2008/04/29 08:15:16 dmitry Exp $ */
#include "zend.h"
#include "zend_extensions.h"
@@ -1071,6 +1071,9 @@
Z_LVAL_P(z_error_lineno) = error_lineno;
Z_TYPE_P(z_error_lineno) = IS_LONG;
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
Z_ARRVAL_P(z_context) = EG(active_symbol_table);
Z_TYPE_P(z_context) = IS_ARRAY;
zval_copy_ctor(z_context);
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_API.h?r1=1.207.2.8.2.8.2.9&r2=1.207.2.8.2.8.2.10&diff_format=u
Index: ZendEngine2/zend_API.h
diff -u ZendEngine2/zend_API.h:1.207.2.8.2.8.2.9 ZendEngine2/zend_API.h:1.207.2.8.2.8.2.10
--- ZendEngine2/zend_API.h:1.207.2.8.2.8.2.9 Mon Mar 10 22:02:41 2008
+++ ZendEngine2/zend_API.h Tue Apr 29 08:15:16 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_API.h,v 1.207.2.8.2.8.2.9 2008/03/10 22:02:41 felipe Exp $ */
+/* $Id: zend_API.h,v 1.207.2.8.2.8.2.10 2008/04/29 08:15:16 dmitry Exp $ */
#ifndef ZEND_API_H
#define ZEND_API_H
@@ -464,6 +464,8 @@
ZEND_API void zend_reset_all_cv(HashTable *symbol_table TSRMLS_DC);
+ZEND_API void zend_rebuild_symbol_table(TSRMLS_D);
+
#define add_method(arg, key, method) add_assoc_function((arg), (key), (method))
ZEND_API ZEND_FUNCTION(display_disabled_function);
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_builtin_functions.c?r1=1.277.2.12.2.25.2.14&r2=1.277.2.12.2.25.2.15&diff_format=u
Index: ZendEngine2/zend_builtin_functions.c
diff -u ZendEngine2/zend_builtin_functions.c:1.277.2.12.2.25.2.14 ZendEngine2/zend_builtin_functions.c:1.277.2.12.2.25.2.15
--- ZendEngine2/zend_builtin_functions.c:1.277.2.12.2.25.2.14 Mon Mar 10 22:02:41 2008
+++ ZendEngine2/zend_builtin_functions.c Tue Apr 29 08:15:16 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_builtin_functions.c,v 1.277.2.12.2.25.2.14 2008/03/10 22:02:41 felipe Exp $ */
+/* $Id: zend_builtin_functions.c,v 1.277.2.12.2.25.2.15 2008/04/29 08:15:16 dmitry Exp $ */
#include "zend.h"
#include "zend_API.h"
@@ -1485,6 +1485,10 @@
array_init(return_value);
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
+
zend_hash_copy(Z_ARRVAL_P(return_value), EG(active_symbol_table),
(copy_ctor_func_t)zval_add_ref, &tmp, sizeof(zval *));
}
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.c?r1=1.647.2.27.2.41.2.59&r2=1.647.2.27.2.41.2.60&diff_format=u
Index: ZendEngine2/zend_compile.c
diff -u ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.59 ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.60
--- ZendEngine2/zend_compile.c:1.647.2.27.2.41.2.59 Thu Apr 10 19:19:03 2008
+++ ZendEngine2/zend_compile.c Tue Apr 29 08:15:16 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.59 2008/04/10 19:19:03 nlopess Exp $ */
+/* $Id: zend_compile.c,v 1.647.2.27.2.41.2.60 2008/04/29 08:15:16 dmitry Exp $ */
#include <zend_language_parser.h>
#include "zend.h"
@@ -2178,7 +2178,9 @@
opline->opcode = ZEND_CATCH;
opline->op1 = catch_class;
/* SET_UNUSED(opline->op1); */ /* FIXME: Define IS_CLASS or something like that */
- opline->op2 = *catch_var;
+ opline->op2.op_type = IS_CV;
+ opline->op2.u.var = lookup_cv(CG(active_op_array), catch_var->u.constant.value.str.val, catch_var->u.constant.value.str.len);
+ opline->op2.u.EA.type = 0;
opline->op1.u.EA.type = 0; /* 1 means it's the last catch in the block */
try_token->u.opline_num = catch_op_number;
@@ -2529,7 +2531,7 @@
if (zend_hash_quick_find(&parent_ce->default_properties, parent_info->name, parent_info->name_length+1, parent_info->h, (void **) &pvalue) == SUCCESS) {
Z_ADDREF_PP(pvalue);
- zend_hash_del(&ce->default_properties, child_info->name, child_info->name_length+1);
+ zend_hash_quick_del(&ce->default_properties, child_info->name, child_info->name_length+1, parent_info->h);
zend_hash_quick_update(&ce->default_properties, parent_info->name, parent_info->name_length+1, parent_info->h, pvalue, sizeof(zval *), NULL);
}
}
@@ -4124,10 +4126,7 @@
if (variable->op_type == IS_CV) {
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->opcode = ZEND_UNSET_VAR;
- opline->op1.op_type = IS_CONST;
- opline->op1.u.constant.type = IS_STRING;
- opline->op1.u.constant.value.str.len = CG(active_op_array)->vars[variable->u.var].name_len;
- opline->op1.u.constant.value.str.val = estrdup(CG(active_op_array)->vars[variable->u.var].name);
+ opline->op1 = *variable;
SET_UNUSED(opline->op2);
opline->op2.u.EA.type = ZEND_FETCH_LOCAL;
SET_UNUSED(opline->result);
@@ -4161,10 +4160,7 @@
if (variable->op_type == IS_CV) {
last_op = get_next_op(CG(active_op_array) TSRMLS_CC);
last_op->opcode = ZEND_ISSET_ISEMPTY_VAR;
- last_op->op1.op_type = IS_CONST;
- last_op->op1.u.constant.type = IS_STRING;
- last_op->op1.u.constant.value.str.len = CG(active_op_array)->vars[variable->u.var].name_len;
- last_op->op1.u.constant.value.str.val = estrdup(CG(active_op_array)->vars[variable->u.var].name);
+ last_op->op1 = *variable;
SET_UNUSED(last_op->op2);
last_op->op2.u.EA.type = ZEND_FETCH_LOCAL;
last_op->result.u.var = get_temporary_variable(CG(active_op_array));
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute.c?r1=1.716.2.12.2.24.2.25&r2=1.716.2.12.2.24.2.26&diff_format=u
Index: ZendEngine2/zend_execute.c
diff -u ZendEngine2/zend_execute.c:1.716.2.12.2.24.2.25 ZendEngine2/zend_execute.c:1.716.2.12.2.24.2.26
--- ZendEngine2/zend_execute.c:1.716.2.12.2.24.2.25 Thu Apr 24 15:45:46 2008
+++ ZendEngine2/zend_execute.c Tue Apr 29 08:15:16 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_execute.c,v 1.716.2.12.2.24.2.25 2008/04/24 15:45:46 dmitry Exp $ */
+/* $Id: zend_execute.c,v 1.716.2.12.2.24.2.26 2008/04/29 08:15:16 dmitry Exp $ */
#define ZEND_INTENSIVE_DEBUGGING 0
@@ -169,14 +169,6 @@
return execute_data_ptr->CVs[var];
}
-static inline void zend_get_cv_address(zend_compiled_variable *cv, zval ***ptr, temp_variable *Ts TSRMLS_DC)
-{
- zval *new_zval = &EG(uninitialized_zval);
-
- Z_ADDREF_P(new_zval);
- zend_hash_quick_update(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, &new_zval, sizeof(zval *), (void **)ptr);
-}
-
static inline zval *_get_zval_ptr_tmp(znode *node, temp_variable *Ts, zend_free_op *should_free TSRMLS_DC)
{
return should_free->var = &T(node->u.var).tmp_var;
@@ -220,7 +212,8 @@
if (!*ptr) {
zend_compiled_variable *cv = &CV_DEF_OF(node->u.var);
- if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **)ptr)==FAILURE) {
+ if (!EG(active_symbol_table) ||
+ zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **)ptr)==FAILURE) {
switch (type) {
case BP_VAR_R:
case BP_VAR_UNSET:
@@ -233,7 +226,13 @@
zend_error(E_NOTICE, "Undefined variable: %s", cv->name);
/* break missing intentionally */
case BP_VAR_W:
- zend_get_cv_address(cv, ptr, Ts TSRMLS_CC);
+ Z_ADDREF(EG(uninitialized_zval));
+ if (!EG(active_symbol_table)) {
+ *ptr = (zval**)EG(current_execute_data)->CVs + (EG(active_op_array)->last_var + node->u.var);
+ **ptr = &EG(uninitialized_zval);
+ } else {
+ zend_hash_quick_update(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **)ptr);
+ }
break;
}
}
@@ -288,7 +287,9 @@
if (!*ptr) {
zend_compiled_variable *cv = &CV_DEF_OF(node->u.var);
- if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **)ptr)==FAILURE) {
+
+ if (!EG(active_symbol_table) ||
+ zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **)ptr)==FAILURE) {
switch (type) {
case BP_VAR_R:
case BP_VAR_UNSET:
@@ -301,7 +302,13 @@
zend_error(E_NOTICE, "Undefined variable: %s", cv->name);
/* break missing intentionally */
case BP_VAR_W:
- zend_get_cv_address(cv, ptr, Ts TSRMLS_CC);
+ Z_ADDREF(EG(uninitialized_zval));
+ if (!EG(active_symbol_table)) {
+ *ptr = (zval**)EG(current_execute_data)->CVs + (EG(active_op_array)->last_var + node->u.var);
+ **ptr = &EG(uninitialized_zval);
+ } else {
+ zend_hash_quick_update(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, &EG(uninitialized_zval_ptr), sizeof(zval *), (void **)ptr);
+ }
break;
}
}
@@ -762,6 +769,9 @@
{
switch (opline->op2.u.EA.type) {
case ZEND_FETCH_LOCAL:
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
return EG(active_symbol_table);
break;
case ZEND_FETCH_GLOBAL:
@@ -1298,11 +1308,21 @@
#define ZEND_VM_INC_OPCODE() \
EX(opline)++
-#define ZEND_VM_EXIT_FROM_EXECUTE_LOOP() \
- EG(in_execution) = EX(original_in_execution); \
- EG(current_execute_data) = EX(prev_execute_data); \
- EG(opline_ptr) = NULL; \
- zend_vm_stack_free(execute_data TSRMLS_CC);
+#define ZEND_VM_EXIT_FROM_EXECUTE_LOOP() do { \
+ EG(in_execution) = EX(original_in_execution); \
+ EG(current_execute_data) = EX(prev_execute_data); \
+ EG(opline_ptr) = NULL; \
+ if (!EG(active_symbol_table)) { \
+ int n = EX(op_array)->last_var; \
+ while (n > 0) { \
+ --n; \
+ if (EX(CVs)[n]) { \
+ zval_ptr_dtor(EX(CVs)[n]); \
+ } \
+ } \
+ } \
+ zend_vm_stack_free(execute_data TSRMLS_CC); \
+ } while (0);
#define ZEND_VM_RETURN_FROM_EXECUTE_LOOP() \
ZEND_VM_EXIT_FROM_EXECUTE_LOOP() \
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute_API.c?r1=1.331.2.20.2.24.2.35&r2=1.331.2.20.2.24.2.36&diff_format=u
Index: ZendEngine2/zend_execute_API.c
diff -u ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.35 ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.36
--- ZendEngine2/zend_execute_API.c:1.331.2.20.2.24.2.35 Fri Apr 11 09:43:27 2008
+++ ZendEngine2/zend_execute_API.c Tue Apr 29 08:15:17 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_execute_API.c,v 1.331.2.20.2.24.2.35 2008/04/11 09:43:27 dmitry Exp $ */
+/* $Id: zend_execute_API.c,v 1.331.2.20.2.24.2.36 2008/04/29 08:15:17 dmitry Exp $ */
#include <stdio.h>
#include <signal.h>
@@ -1777,12 +1777,49 @@
}
}
}
- return zend_hash_del(&EG(symbol_table), name, name_len + 1);
+ return zend_hash_quick_del(&EG(symbol_table), name, name_len + 1, hash_value);
}
return FAILURE;
}
/* }}} */
+ZEND_API void zend_rebuild_symbol_table(TSRMLS_D) /* {{{ */
+{
+ zend_uint i;
+
+ if (!EG(active_symbol_table)) {
+ if (EG(symtable_cache_ptr)>=EG(symtable_cache)) {
+ /*printf("Cache hit! Reusing %x\n", symtable_cache[symtable_cache_ptr]);*/
+ EG(active_symbol_table) = *(EG(symtable_cache_ptr)--);
+ } else {
+ ALLOC_HASHTABLE(EG(active_symbol_table));
+ zend_hash_init(EG(active_symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0);
+ /*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/
+ }
+ if (EG(current_execute_data) && EG(current_execute_data)->op_array) {
+ EG(current_execute_data)->symbol_table = EG(active_symbol_table);
+ if (EG(current_execute_data)->op_array->uses_this && EG(This)) {
+ Z_ADDREF_P(EG(This)); /* For $this pointer */
+ if (zend_hash_add(EG(active_symbol_table), "this", sizeof("this"), &EG(This), sizeof(zval *), NULL)==FAILURE) {
+ Z_DELREF_P(EG(This));
+ }
+ }
+ for (i = 0; i < EG(current_execute_data)->op_array->last_var; i++) {
+ if (EG(current_execute_data)->CVs[i]) {
+ zend_hash_quick_update(EG(active_symbol_table),
+ EG(current_execute_data)->op_array->vars[i].name,
+ EG(current_execute_data)->op_array->vars[i].name_len + 1,
+ EG(current_execute_data)->op_array->vars[i].hash_value,
+ (void**)EG(current_execute_data)->CVs[i],
+ sizeof(zval*),
+ (void**)&EG(current_execute_data)->CVs[i]);
+ }
+ }
+ }
+ }
+}
+/* }}} */
+
/*
* Local variables:
* tab-width: 4
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_hash.h?r1=1.78.2.2.2.2.2.3&r2=1.78.2.2.2.2.2.4&diff_format=u
Index: ZendEngine2/zend_hash.h
diff -u ZendEngine2/zend_hash.h:1.78.2.2.2.2.2.3 ZendEngine2/zend_hash.h:1.78.2.2.2.2.2.4
--- ZendEngine2/zend_hash.h:1.78.2.2.2.2.2.3 Tue Jan 15 09:36:05 2008
+++ ZendEngine2/zend_hash.h Tue Apr 29 08:15:17 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_hash.h,v 1.78.2.2.2.2.2.3 2008/01/15 09:36:05 tony2001 Exp $ */
+/* $Id: zend_hash.h,v 1.78.2.2.2.2.2.4 2008/04/29 08:15:17 dmitry Exp $ */
#ifndef ZEND_HASH_H
#define ZEND_HASH_H
@@ -35,6 +35,7 @@
#define HASH_DEL_KEY 0
#define HASH_DEL_INDEX 1
+#define HASH_DEL_KEY_QUICK 2
typedef ulong (*hash_func_t)(const char *arKey, uint nKeyLength);
typedef int (*compare_func_t)(const void *, const void * TSRMLS_DC);
@@ -147,6 +148,8 @@
ZEND_API int zend_hash_del_key_or_index(HashTable *ht, const char *arKey, uint nKeyLength, ulong h, int flag);
#define zend_hash_del(ht, arKey, nKeyLength) \
zend_hash_del_key_or_index(ht, arKey, nKeyLength, 0, HASH_DEL_KEY)
+#define zend_hash_quick_del(ht, arKey, nKeyLength, h) \
+ zend_hash_del_key_or_index(ht, arKey, nKeyLength, h, HASH_DEL_KEY_QUICK)
#define zend_hash_index_del(ht, h) \
zend_hash_del_key_or_index(ht, NULL, 0, h, HASH_DEL_INDEX)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_object_handlers.c?r1=1.135.2.6.2.22.2.13&r2=1.135.2.6.2.22.2.14&diff_format=u
Index: ZendEngine2/zend_object_handlers.c
diff -u ZendEngine2/zend_object_handlers.c:1.135.2.6.2.22.2.13 ZendEngine2/zend_object_handlers.c:1.135.2.6.2.22.2.14
--- ZendEngine2/zend_object_handlers.c:1.135.2.6.2.22.2.13 Mon Mar 17 14:54:42 2008
+++ ZendEngine2/zend_object_handlers.c Tue Apr 29 08:15:17 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_object_handlers.c,v 1.135.2.6.2.22.2.13 2008/03/17 14:54:42 tony2001 Exp $ */
+/* $Id: zend_object_handlers.c,v 1.135.2.6.2.22.2.14 2008/04/29 08:15:17 dmitry Exp $ */
#include "zend.h"
#include "zend_globals.h"
@@ -612,7 +612,7 @@
property_info = zend_get_property_info(zobj->ce, member, (zobj->ce->__unset != NULL) TSRMLS_CC);
- if (!property_info || zend_hash_del(zobj->properties, property_info->name, property_info->name_length+1) == FAILURE) {
+ if (!property_info || zend_hash_quick_del(zobj->properties, property_info->name, property_info->name_length+1, property_info->h) == FAILURE) {
zend_guard *guard;
if (zobj->ce->__unset &&
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.59.2.29.2.48.2.49&r2=1.59.2.29.2.48.2.50&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.49 ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.50
--- ZendEngine2/zend_vm_def.h:1.59.2.29.2.48.2.49 Thu Apr 24 15:45:46 2008
+++ ZendEngine2/zend_vm_def.h Tue Apr 29 08:15:17 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.49 2008/04/24 15:45:46 dmitry Exp $ */
+/* $Id: zend_vm_def.h,v 1.59.2.29.2.48.2.50 2008/04/29 08:15:17 dmitry Exp $ */
/* If you change this file, please regenerate the zend_vm_execute.h and
* zend_vm_opcodes.h files by running:
@@ -2150,15 +2150,7 @@
} else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
zval **original_return_value = EG(return_value_ptr_ptr);
- if (EG(symtable_cache_ptr)>=EG(symtable_cache)) {
- /*printf("Cache hit! Reusing %x\n", symtable_cache[symtable_cache_ptr]);*/
- EG(active_symbol_table) = *(EG(symtable_cache_ptr)--);
- } else {
- ALLOC_HASHTABLE(EG(active_symbol_table));
- zend_hash_init(EG(active_symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0);
- /*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/
- }
-
+ EG(active_symbol_table) = NULL;
EG(active_op_array) = &EX(function_state).function->op_array;
EG(return_value_ptr_ptr) = NULL;
if (RETURN_VALUE_USED(opline)) {
@@ -2173,14 +2165,16 @@
EG(opline_ptr) = &EX(opline);
EG(active_op_array) = EX(op_array);
EG(return_value_ptr_ptr)=original_return_value;
- if (EG(symtable_cache_ptr)>=EG(symtable_cache_limit)) {
- zend_hash_destroy(EG(active_symbol_table));
- FREE_HASHTABLE(EG(active_symbol_table));
- } else {
- /* clean before putting into the cache, since clean
- could call dtors, which could use cached hash */
- zend_hash_clean(EG(active_symbol_table));
- *(++EG(symtable_cache_ptr)) = EG(active_symbol_table);
+ if (EG(active_symbol_table)) {
+ if (EG(symtable_cache_ptr)>=EG(symtable_cache_limit)) {
+ zend_hash_destroy(EG(active_symbol_table));
+ FREE_HASHTABLE(EG(active_symbol_table));
+ } else {
+ /* clean before putting into the cache, since clean
+ could call dtors, which could use cached hash */
+ zend_hash_clean(EG(active_symbol_table));
+ *(++EG(symtable_cache_ptr)) = EG(active_symbol_table);
+ }
}
EG(active_symbol_table) = EX(symbol_table);
} else { /* ZEND_OVERLOADED_FUNCTION */
@@ -2364,7 +2358,7 @@
ZEND_VM_NEXT_OPCODE();
}
-ZEND_VM_HANDLER(107, ZEND_CATCH, ANY, ANY)
+ZEND_VM_HANDLER(107, ZEND_CATCH, ANY, CV)
{
zend_op *opline = EX(opline);
zend_class_entry *ce;
@@ -2386,8 +2380,17 @@
}
}
- zend_hash_update(EG(active_symbol_table), opline->op2.u.constant.value.str.val,
- opline->op2.u.constant.value.str.len+1, &EG(exception), sizeof(zval *), (void **) NULL);
+ if (!EG(active_symbol_table)) {
+ if (EX(CVs)[opline->op2.u.var]) {
+ zval_ptr_dtor(EX(CVs)[opline->op2.u.var]);
+ }
+ EX(CVs)[opline->op2.u.var] = (zval**)EX(CVs) + (EX(op_array)->last_var + opline->op2.u.var);
+ *EX(CVs)[opline->op2.u.var] = EG(exception);
+ } else {
+ zend_compiled_variable *cv = &CV_DEF_OF(opline->op2.u.var);
+ zend_hash_quick_update(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value,
+ &EG(exception), sizeof(zval *), NULL);
+ }
EG(exception) = NULL;
ZEND_VM_NEXT_OPCODE();
}
@@ -3105,6 +3108,10 @@
EX(function_state).function = (zend_function *) new_op_array;
EX(object) = NULL;
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
+
zend_execute(new_op_array TSRMLS_CC);
EX(function_state).function = saved_function;
@@ -3146,6 +3153,36 @@
HashTable *target_symbol_table;
zend_free_op free_op1;
+ if (OP1_TYPE == IS_CV) {
+ if (EG(active_symbol_table)) {
+ zend_execute_data *ex = EX(prev_execute_data);
+ zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
+
+ if (zend_hash_quick_del(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value) == SUCCESS) {
+ while (ex && ex->symbol_table == EG(active_symbol_table)) {
+ int i;
+
+ if (ex->op_array) {
+ for (i = 0; i < ex->op_array->last_var; i++) {
+ if (ex->op_array->vars[i].hash_value == cv->hash_value &&
+ ex->op_array->vars[i].name_len == cv->name_len &&
+ !memcmp(ex->op_array->vars[i].name, cv->name, cv->name_len)) {
+ ex->CVs[i] = NULL;
+ break;
+ }
+ }
+ }
+ ex = ex->prev_execute_data;
+ }
+ }
+ EX(CVs)[opline->op1.u.var] = NULL;
+ } else if (EX(CVs)[opline->op1.u.var]) {
+ zval_ptr_dtor(EX(CVs)[opline->op1.u.var]);
+ EX(CVs)[opline->op1.u.var] = NULL;
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+
varname = GET_OP1_ZVAL_PTR(BP_VAR_R);
if (Z_TYPE_P(varname) != IS_STRING) {
@@ -3153,17 +3190,18 @@
zval_copy_ctor(&tmp);
convert_to_string(&tmp);
varname = &tmp;
- } else if (OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) {
+ } else if (OP1_TYPE == IS_VAR) {
Z_ADDREF_P(varname);
}
if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);
} else {
+ ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
+
target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
- if (zend_hash_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1) == SUCCESS) {
+ if (zend_hash_quick_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value) == SUCCESS) {
zend_execute_data *ex = EXECUTE_DATA;
- ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
do {
int i;
@@ -3185,7 +3223,7 @@
if (varname == &tmp) {
zval_dtor(&tmp);
- } else if (OP1_TYPE == IS_CV || OP1_TYPE == IS_VAR) {
+ } else if (OP1_TYPE == IS_VAR) {
zval_ptr_dtor(&varname);
}
FREE_OP1();
@@ -3619,29 +3657,49 @@
ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, ANY)
{
zend_op *opline = EX(opline);
- zend_free_op free_op1;
- zval tmp, *varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
zval **value;
zend_bool isset = 1;
- HashTable *target_symbol_table;
- if (Z_TYPE_P(varname) != IS_STRING) {
- tmp = *varname;
- zval_copy_ctor(&tmp);
- convert_to_string(&tmp);
- varname = &tmp;
- }
+ if (OP1_TYPE == IS_CV) {
+ if (EX(CVs)[opline->op1.u.var]) {
+ value = EX(CVs)[opline->op1.u.var];
+ } else if (EG(active_symbol_table)) {
+ zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
- if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
- value = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1 TSRMLS_CC);
- if (!value) {
+ if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
+ isset = 0;
+ }
+ } else {
isset = 0;
}
} else {
- target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
- if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
- isset = 0;
+ HashTable *target_symbol_table;
+ zend_free_op free_op1;
+ zval tmp, *varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
+
+ if (Z_TYPE_P(varname) != IS_STRING) {
+ tmp = *varname;
+ zval_copy_ctor(&tmp);
+ convert_to_string(&tmp);
+ varname = &tmp;
}
+
+ if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
+ value = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1 TSRMLS_CC);
+ if (!value) {
+ isset = 0;
+ }
+ } else {
+ target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
+ if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
+ isset = 0;
+ }
+ }
+
+ if (varname == &tmp) {
+ zval_dtor(&tmp);
+ }
+ FREE_OP1();
}
Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
@@ -3663,11 +3721,6 @@
break;
}
- if (varname == &tmp) {
- zval_dtor(&tmp);
- }
- FREE_OP1();
-
ZEND_VM_NEXT_OPCODE();
}
@@ -4024,10 +4077,8 @@
int catched = 0;
zval restored_error_reporting;
- void **stack_frame = (void**)execute_data +
- (sizeof(zend_execute_data) +
- sizeof(zval**) * EX(op_array)->last_var +
- sizeof(temp_variable) * EX(op_array)->T) / sizeof(void*);
+ void **stack_frame = (void**)EX(Ts) +
+ (sizeof(temp_variable) * EX(op_array)->T) / sizeof(void*);
while (zend_vm_stack_top(TSRMLS_C) != stack_frame) {
zval *stack_zval_p = zend_vm_stack_pop(TSRMLS_C);
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.62.2.30.2.49.2.48&r2=1.62.2.30.2.49.2.49&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.48 ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.49
--- ZendEngine2/zend_vm_execute.h:1.62.2.30.2.49.2.48 Thu Apr 24 15:45:46 2008
+++ ZendEngine2/zend_vm_execute.h Tue Apr 29 08:15:18 2008
@@ -46,12 +46,12 @@
/* Initialize execute_data */
execute_data = (zend_execute_data *)zend_vm_stack_alloc(
sizeof(zend_execute_data) +
- sizeof(zval**) * op_array->last_var +
+ sizeof(zval**) * op_array->last_var * (EG(active_symbol_table) ? 1 : 2) +
sizeof(temp_variable) * op_array->T TSRMLS_CC);
EX(CVs) = (zval***)((char*)execute_data + sizeof(zend_execute_data));
memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var);
- EX(Ts) = (temp_variable *)(EX(CVs) + op_array->last_var);
+ EX(Ts) = (temp_variable *)(EX(CVs) + op_array->last_var * (EG(active_symbol_table) ? 1 : 2));
EX(fbc) = NULL;
EX(called_scope) = NULL;
EX(object) = NULL;
@@ -69,7 +69,7 @@
ZEND_VM_SET_OPCODE(op_array->opcodes);
}
- if (op_array->uses_this && EG(This)) {
+ if (op_array->uses_this && EG(This) && EG(active_symbol_table)) {
Z_ADDREF_P(EG(This)); /* For $this pointer */
if (zend_hash_add(EG(active_symbol_table), "this", sizeof("this"), &EG(This), sizeof(zval *), NULL)==FAILURE) {
Z_DELREF_P(EG(This));
@@ -197,15 +197,7 @@
} else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
zval **original_return_value = EG(return_value_ptr_ptr);
- if (EG(symtable_cache_ptr)>=EG(symtable_cache)) {
- /*printf("Cache hit! Reusing %x\n", symtable_cache[symtable_cache_ptr]);*/
- EG(active_symbol_table) = *(EG(symtable_cache_ptr)--);
- } else {
- ALLOC_HASHTABLE(EG(active_symbol_table));
- zend_hash_init(EG(active_symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0);
- /*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/
- }
-
+ EG(active_symbol_table) = NULL;
EG(active_op_array) = &EX(function_state).function->op_array;
EG(return_value_ptr_ptr) = NULL;
if (RETURN_VALUE_USED(opline)) {
@@ -220,14 +212,16 @@
EG(opline_ptr) = &EX(opline);
EG(active_op_array) = EX(op_array);
EG(return_value_ptr_ptr)=original_return_value;
- if (EG(symtable_cache_ptr)>=EG(symtable_cache_limit)) {
- zend_hash_destroy(EG(active_symbol_table));
- FREE_HASHTABLE(EG(active_symbol_table));
- } else {
- /* clean before putting into the cache, since clean
- could call dtors, which could use cached hash */
- zend_hash_clean(EG(active_symbol_table));
- *(++EG(symtable_cache_ptr)) = EG(active_symbol_table);
+ if (EG(active_symbol_table)) {
+ if (EG(symtable_cache_ptr)>=EG(symtable_cache_limit)) {
+ zend_hash_destroy(EG(active_symbol_table));
+ FREE_HASHTABLE(EG(active_symbol_table));
+ } else {
+ /* clean before putting into the cache, since clean
+ could call dtors, which could use cached hash */
+ zend_hash_clean(EG(active_symbol_table));
+ *(++EG(symtable_cache_ptr)) = EG(active_symbol_table);
+ }
}
EG(active_symbol_table) = EX(symbol_table);
} else { /* ZEND_OVERLOADED_FUNCTION */
@@ -296,34 +290,6 @@
return zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
}
-static int ZEND_CATCH_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
-{
- zend_op *opline = EX(opline);
- zend_class_entry *ce;
-
- /* Check whether an exception has been thrown, if not, jump over code */
- if (EG(exception) == NULL) {
- ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
- ZEND_VM_CONTINUE(); /* CHECK_ME */
- }
- ce = Z_OBJCE_P(EG(exception));
- if (ce != EX_T(opline->op1.u.var).class_entry) {
- if (!instanceof_function(ce, EX_T(opline->op1.u.var).class_entry TSRMLS_CC)) {
- if (opline->op1.u.EA.type) {
- zend_throw_exception_internal(NULL TSRMLS_CC);
- ZEND_VM_NEXT_OPCODE();
- }
- ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
- ZEND_VM_CONTINUE(); /* CHECK_ME */
- }
- }
-
- zend_hash_update(EG(active_symbol_table), opline->op2.u.constant.value.str.val,
- opline->op2.u.constant.value.str.len+1, &EG(exception), sizeof(zval *), (void **) NULL);
- EG(exception) = NULL;
- ZEND_VM_NEXT_OPCODE();
-}
-
static int ZEND_RECV_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
@@ -504,10 +470,8 @@
int catched = 0;
zval restored_error_reporting;
- void **stack_frame = (void**)execute_data +
- (sizeof(zend_execute_data) +
- sizeof(zval**) * EX(op_array)->last_var +
- sizeof(temp_variable) * EX(op_array)->T) / sizeof(void*);
+ void **stack_frame = (void**)EX(Ts) +
+ (sizeof(temp_variable) * EX(op_array)->T) / sizeof(void*);
while (zend_vm_stack_top(TSRMLS_C) != stack_frame) {
zval *stack_zval_p = zend_vm_stack_pop(TSRMLS_C);
@@ -1076,6 +1040,43 @@
}
+static int ZEND_CATCH_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
+{
+ zend_op *opline = EX(opline);
+ zend_class_entry *ce;
+
+ /* Check whether an exception has been thrown, if not, jump over code */
+ if (EG(exception) == NULL) {
+ ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
+ ZEND_VM_CONTINUE(); /* CHECK_ME */
+ }
+ ce = Z_OBJCE_P(EG(exception));
+ if (ce != EX_T(opline->op1.u.var).class_entry) {
+ if (!instanceof_function(ce, EX_T(opline->op1.u.var).class_entry TSRMLS_CC)) {
+ if (opline->op1.u.EA.type) {
+ zend_throw_exception_internal(NULL TSRMLS_CC);
+ ZEND_VM_NEXT_OPCODE();
+ }
+ ZEND_VM_SET_OPCODE(&EX(op_array)->opcodes[opline->extended_value]);
+ ZEND_VM_CONTINUE(); /* CHECK_ME */
+ }
+ }
+
+ if (!EG(active_symbol_table)) {
+ if (EX(CVs)[opline->op2.u.var]) {
+ zval_ptr_dtor(EX(CVs)[opline->op2.u.var]);
+ }
+ EX(CVs)[opline->op2.u.var] = (zval**)EX(CVs) + (EX(op_array)->last_var + opline->op2.u.var);
+ *EX(CVs)[opline->op2.u.var] = EG(exception);
+ } else {
+ zend_compiled_variable *cv = &CV_DEF_OF(opline->op2.u.var);
+ zend_hash_quick_update(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value,
+ &EG(exception), sizeof(zval *), NULL);
+ }
+ EG(exception) = NULL;
+ ZEND_VM_NEXT_OPCODE();
+}
+
static int ZEND_BRK_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
@@ -1727,6 +1728,10 @@
EX(function_state).function = (zend_function *) new_op_array;
EX(object) = NULL;
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
+
zend_execute(new_op_array TSRMLS_CC);
EX(function_state).function = saved_function;
@@ -1768,6 +1773,36 @@
HashTable *target_symbol_table;
+ if (IS_CONST == IS_CV) {
+ if (EG(active_symbol_table)) {
+ zend_execute_data *ex = EX(prev_execute_data);
+ zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
+
+ if (zend_hash_quick_del(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value) == SUCCESS) {
+ while (ex && ex->symbol_table == EG(active_symbol_table)) {
+ int i;
+
+ if (ex->op_array) {
+ for (i = 0; i < ex->op_array->last_var; i++) {
+ if (ex->op_array->vars[i].hash_value == cv->hash_value &&
+ ex->op_array->vars[i].name_len == cv->name_len &&
+ !memcmp(ex->op_array->vars[i].name, cv->name, cv->name_len)) {
+ ex->CVs[i] = NULL;
+ break;
+ }
+ }
+ }
+ ex = ex->prev_execute_data;
+ }
+ }
+ EX(CVs)[opline->op1.u.var] = NULL;
+ } else if (EX(CVs)[opline->op1.u.var]) {
+ zval_ptr_dtor(EX(CVs)[opline->op1.u.var]);
+ EX(CVs)[opline->op1.u.var] = NULL;
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+
varname = &opline->op1.u.constant;
if (Z_TYPE_P(varname) != IS_STRING) {
@@ -1775,17 +1810,18 @@
zval_copy_ctor(&tmp);
convert_to_string(&tmp);
varname = &tmp;
- } else if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ } else if (IS_CONST == IS_VAR) {
Z_ADDREF_P(varname);
}
if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);
} else {
+ ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
+
target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
- if (zend_hash_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1) == SUCCESS) {
+ if (zend_hash_quick_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value) == SUCCESS) {
zend_execute_data *ex = execute_data;
- ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
do {
int i;
@@ -1807,7 +1843,7 @@
if (varname == &tmp) {
zval_dtor(&tmp);
- } else if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ } else if (IS_CONST == IS_VAR) {
zval_ptr_dtor(&varname);
}
@@ -1969,29 +2005,49 @@
static int ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
-
- zval tmp, *varname = &opline->op1.u.constant;
zval **value;
zend_bool isset = 1;
- HashTable *target_symbol_table;
- if (Z_TYPE_P(varname) != IS_STRING) {
- tmp = *varname;
- zval_copy_ctor(&tmp);
- convert_to_string(&tmp);
- varname = &tmp;
- }
+ if (IS_CONST == IS_CV) {
+ if (EX(CVs)[opline->op1.u.var]) {
+ value = EX(CVs)[opline->op1.u.var];
+ } else if (EG(active_symbol_table)) {
+ zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
- if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
- value = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1 TSRMLS_CC);
- if (!value) {
+ if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
+ isset = 0;
+ }
+ } else {
isset = 0;
}
} else {
- target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
- if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
- isset = 0;
+ HashTable *target_symbol_table;
+
+ zval tmp, *varname = &opline->op1.u.constant;
+
+ if (Z_TYPE_P(varname) != IS_STRING) {
+ tmp = *varname;
+ zval_copy_ctor(&tmp);
+ convert_to_string(&tmp);
+ varname = &tmp;
}
+
+ if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
+ value = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1 TSRMLS_CC);
+ if (!value) {
+ isset = 0;
+ }
+ } else {
+ target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
+ if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
+ isset = 0;
+ }
+ }
+
+ if (varname == &tmp) {
+ zval_dtor(&tmp);
+ }
+
}
Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
@@ -2013,10 +2069,6 @@
break;
}
- if (varname == &tmp) {
- zval_dtor(&tmp);
- }
-
ZEND_VM_NEXT_OPCODE();
}
@@ -4896,6 +4948,10 @@
EX(function_state).function = (zend_function *) new_op_array;
EX(object) = NULL;
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
+
zend_execute(new_op_array TSRMLS_CC);
EX(function_state).function = saved_function;
@@ -4937,6 +4993,36 @@
HashTable *target_symbol_table;
zend_free_op free_op1;
+ if (IS_TMP_VAR == IS_CV) {
+ if (EG(active_symbol_table)) {
+ zend_execute_data *ex = EX(prev_execute_data);
+ zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
+
+ if (zend_hash_quick_del(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value) == SUCCESS) {
+ while (ex && ex->symbol_table == EG(active_symbol_table)) {
+ int i;
+
+ if (ex->op_array) {
+ for (i = 0; i < ex->op_array->last_var; i++) {
+ if (ex->op_array->vars[i].hash_value == cv->hash_value &&
+ ex->op_array->vars[i].name_len == cv->name_len &&
+ !memcmp(ex->op_array->vars[i].name, cv->name, cv->name_len)) {
+ ex->CVs[i] = NULL;
+ break;
+ }
+ }
+ }
+ ex = ex->prev_execute_data;
+ }
+ }
+ EX(CVs)[opline->op1.u.var] = NULL;
+ } else if (EX(CVs)[opline->op1.u.var]) {
+ zval_ptr_dtor(EX(CVs)[opline->op1.u.var]);
+ EX(CVs)[opline->op1.u.var] = NULL;
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+
varname = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
if (Z_TYPE_P(varname) != IS_STRING) {
@@ -4944,17 +5030,18 @@
zval_copy_ctor(&tmp);
convert_to_string(&tmp);
varname = &tmp;
- } else if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
+ } else if (IS_TMP_VAR == IS_VAR) {
Z_ADDREF_P(varname);
}
if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);
} else {
+ ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
+
target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
- if (zend_hash_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1) == SUCCESS) {
+ if (zend_hash_quick_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value) == SUCCESS) {
zend_execute_data *ex = execute_data;
- ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
do {
int i;
@@ -4976,7 +5063,7 @@
if (varname == &tmp) {
zval_dtor(&tmp);
- } else if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
+ } else if (IS_TMP_VAR == IS_VAR) {
zval_ptr_dtor(&varname);
}
zval_dtor(free_op1.var);
@@ -5138,29 +5225,49 @@
static int ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zend_free_op free_op1;
- zval tmp, *varname = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
zval **value;
zend_bool isset = 1;
- HashTable *target_symbol_table;
- if (Z_TYPE_P(varname) != IS_STRING) {
- tmp = *varname;
- zval_copy_ctor(&tmp);
- convert_to_string(&tmp);
- varname = &tmp;
- }
+ if (IS_TMP_VAR == IS_CV) {
+ if (EX(CVs)[opline->op1.u.var]) {
+ value = EX(CVs)[opline->op1.u.var];
+ } else if (EG(active_symbol_table)) {
+ zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
- if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
- value = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1 TSRMLS_CC);
- if (!value) {
+ if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
+ isset = 0;
+ }
+ } else {
isset = 0;
}
} else {
- target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
- if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
- isset = 0;
+ HashTable *target_symbol_table;
+ zend_free_op free_op1;
+ zval tmp, *varname = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+
+ if (Z_TYPE_P(varname) != IS_STRING) {
+ tmp = *varname;
+ zval_copy_ctor(&tmp);
+ convert_to_string(&tmp);
+ varname = &tmp;
+ }
+
+ if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
+ value = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1 TSRMLS_CC);
+ if (!value) {
+ isset = 0;
+ }
+ } else {
+ target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
+ if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
+ isset = 0;
+ }
+ }
+
+ if (varname == &tmp) {
+ zval_dtor(&tmp);
}
+ zval_dtor(free_op1.var);
}
Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
@@ -5182,11 +5289,6 @@
break;
}
- if (varname == &tmp) {
- zval_dtor(&tmp);
- }
- zval_dtor(free_op1.var);
-
ZEND_VM_NEXT_OPCODE();
}
@@ -8096,6 +8198,10 @@
EX(function_state).function = (zend_function *) new_op_array;
EX(object) = NULL;
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
+
zend_execute(new_op_array TSRMLS_CC);
EX(function_state).function = saved_function;
@@ -8137,6 +8243,36 @@
HashTable *target_symbol_table;
zend_free_op free_op1;
+ if (IS_VAR == IS_CV) {
+ if (EG(active_symbol_table)) {
+ zend_execute_data *ex = EX(prev_execute_data);
+ zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
+
+ if (zend_hash_quick_del(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value) == SUCCESS) {
+ while (ex && ex->symbol_table == EG(active_symbol_table)) {
+ int i;
+
+ if (ex->op_array) {
+ for (i = 0; i < ex->op_array->last_var; i++) {
+ if (ex->op_array->vars[i].hash_value == cv->hash_value &&
+ ex->op_array->vars[i].name_len == cv->name_len &&
+ !memcmp(ex->op_array->vars[i].name, cv->name, cv->name_len)) {
+ ex->CVs[i] = NULL;
+ break;
+ }
+ }
+ }
+ ex = ex->prev_execute_data;
+ }
+ }
+ EX(CVs)[opline->op1.u.var] = NULL;
+ } else if (EX(CVs)[opline->op1.u.var]) {
+ zval_ptr_dtor(EX(CVs)[opline->op1.u.var]);
+ EX(CVs)[opline->op1.u.var] = NULL;
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+
varname = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
if (Z_TYPE_P(varname) != IS_STRING) {
@@ -8144,17 +8280,18 @@
zval_copy_ctor(&tmp);
convert_to_string(&tmp);
varname = &tmp;
- } else if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ } else if (IS_VAR == IS_VAR) {
Z_ADDREF_P(varname);
}
if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);
} else {
+ ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
+
target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
- if (zend_hash_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1) == SUCCESS) {
+ if (zend_hash_quick_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value) == SUCCESS) {
zend_execute_data *ex = execute_data;
- ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
do {
int i;
@@ -8176,7 +8313,7 @@
if (varname == &tmp) {
zval_dtor(&tmp);
- } else if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ } else if (IS_VAR == IS_VAR) {
zval_ptr_dtor(&varname);
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
@@ -8484,29 +8621,49 @@
static int ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
- zend_free_op free_op1;
- zval tmp, *varname = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
zval **value;
zend_bool isset = 1;
- HashTable *target_symbol_table;
- if (Z_TYPE_P(varname) != IS_STRING) {
- tmp = *varname;
- zval_copy_ctor(&tmp);
- convert_to_string(&tmp);
- varname = &tmp;
- }
+ if (IS_VAR == IS_CV) {
+ if (EX(CVs)[opline->op1.u.var]) {
+ value = EX(CVs)[opline->op1.u.var];
+ } else if (EG(active_symbol_table)) {
+ zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
- if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
- value = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1 TSRMLS_CC);
- if (!value) {
+ if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
+ isset = 0;
+ }
+ } else {
isset = 0;
}
} else {
- target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
- if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
- isset = 0;
+ HashTable *target_symbol_table;
+ zend_free_op free_op1;
+ zval tmp, *varname = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+
+ if (Z_TYPE_P(varname) != IS_STRING) {
+ tmp = *varname;
+ zval_copy_ctor(&tmp);
+ convert_to_string(&tmp);
+ varname = &tmp;
+ }
+
+ if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
+ value = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1 TSRMLS_CC);
+ if (!value) {
+ isset = 0;
+ }
+ } else {
+ target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
+ if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
+ isset = 0;
+ }
+ }
+
+ if (varname == &tmp) {
+ zval_dtor(&tmp);
}
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
}
Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
@@ -8528,11 +8685,6 @@
break;
}
- if (varname == &tmp) {
- zval_dtor(&tmp);
- }
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
-
ZEND_VM_NEXT_OPCODE();
}
@@ -21760,6 +21912,10 @@
EX(function_state).function = (zend_function *) new_op_array;
EX(object) = NULL;
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
+
zend_execute(new_op_array TSRMLS_CC);
EX(function_state).function = saved_function;
@@ -21801,6 +21957,36 @@
HashTable *target_symbol_table;
+ if (IS_CV == IS_CV) {
+ if (EG(active_symbol_table)) {
+ zend_execute_data *ex = EX(prev_execute_data);
+ zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
+
+ if (zend_hash_quick_del(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value) == SUCCESS) {
+ while (ex && ex->symbol_table == EG(active_symbol_table)) {
+ int i;
+
+ if (ex->op_array) {
+ for (i = 0; i < ex->op_array->last_var; i++) {
+ if (ex->op_array->vars[i].hash_value == cv->hash_value &&
+ ex->op_array->vars[i].name_len == cv->name_len &&
+ !memcmp(ex->op_array->vars[i].name, cv->name, cv->name_len)) {
+ ex->CVs[i] = NULL;
+ break;
+ }
+ }
+ }
+ ex = ex->prev_execute_data;
+ }
+ }
+ EX(CVs)[opline->op1.u.var] = NULL;
+ } else if (EX(CVs)[opline->op1.u.var]) {
+ zval_ptr_dtor(EX(CVs)[opline->op1.u.var]);
+ EX(CVs)[opline->op1.u.var] = NULL;
+ }
+ ZEND_VM_NEXT_OPCODE();
+ }
+
varname = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
if (Z_TYPE_P(varname) != IS_STRING) {
@@ -21808,17 +21994,18 @@
zval_copy_ctor(&tmp);
convert_to_string(&tmp);
varname = &tmp;
- } else if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ } else if (IS_CV == IS_VAR) {
Z_ADDREF_P(varname);
}
if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
zend_std_unset_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname) TSRMLS_CC);
} else {
+ ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
+
target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
- if (zend_hash_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1) == SUCCESS) {
+ if (zend_hash_quick_del(target_symbol_table, varname->value.str.val, varname->value.str.len+1, hash_value) == SUCCESS) {
zend_execute_data *ex = execute_data;
- ulong hash_value = zend_inline_hash_func(varname->value.str.val, varname->value.str.len+1);
do {
int i;
@@ -21840,7 +22027,7 @@
if (varname == &tmp) {
zval_dtor(&tmp);
- } else if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ } else if (IS_CV == IS_VAR) {
zval_ptr_dtor(&varname);
}
@@ -22002,29 +22189,49 @@
static int ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
zend_op *opline = EX(opline);
-
- zval tmp, *varname = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC);
zval **value;
zend_bool isset = 1;
- HashTable *target_symbol_table;
- if (Z_TYPE_P(varname) != IS_STRING) {
- tmp = *varname;
- zval_copy_ctor(&tmp);
- convert_to_string(&tmp);
- varname = &tmp;
- }
+ if (IS_CV == IS_CV) {
+ if (EX(CVs)[opline->op1.u.var]) {
+ value = EX(CVs)[opline->op1.u.var];
+ } else if (EG(active_symbol_table)) {
+ zend_compiled_variable *cv = &CV_DEF_OF(opline->op1.u.var);
- if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
- value = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1 TSRMLS_CC);
- if (!value) {
+ if (zend_hash_quick_find(EG(active_symbol_table), cv->name, cv->name_len+1, cv->hash_value, (void **) &value) == FAILURE) {
+ isset = 0;
+ }
+ } else {
isset = 0;
}
} else {
- target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
- if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
- isset = 0;
+ HashTable *target_symbol_table;
+
+ zval tmp, *varname = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_IS TSRMLS_CC);
+
+ if (Z_TYPE_P(varname) != IS_STRING) {
+ tmp = *varname;
+ zval_copy_ctor(&tmp);
+ convert_to_string(&tmp);
+ varname = &tmp;
}
+
+ if (opline->op2.u.EA.type == ZEND_FETCH_STATIC_MEMBER) {
+ value = zend_std_get_static_property(EX_T(opline->op2.u.var).class_entry, Z_STRVAL_P(varname), Z_STRLEN_P(varname), 1 TSRMLS_CC);
+ if (!value) {
+ isset = 0;
+ }
+ } else {
+ target_symbol_table = zend_get_target_symbol_table(opline, EX(Ts), BP_VAR_IS, varname TSRMLS_CC);
+ if (zend_hash_find(target_symbol_table, varname->value.str.val, varname->value.str.len+1, (void **) &value) == FAILURE) {
+ isset = 0;
+ }
+ }
+
+ if (varname == &tmp) {
+ zval_dtor(&tmp);
+ }
+
}
Z_TYPE(EX_T(opline->result.u.var).tmp_var) = IS_BOOL;
@@ -22046,10 +22253,6 @@
break;
}
- if (varname == &tmp) {
- zval_dtor(&tmp);
- }
-
ZEND_VM_NEXT_OPCODE();
}
@@ -31985,31 +32188,31 @@
ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER,
ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER,
ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
- ZEND_CATCH_SPEC_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_CATCH_SPEC_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_CATCH_SPEC_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_CATCH_SPEC_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_CATCH_SPEC_CV_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_NULL_HANDLER,
+ ZEND_CATCH_SPEC_CV_HANDLER,
ZEND_THROW_SPEC_CONST_HANDLER,
ZEND_THROW_SPEC_CONST_HANDLER,
ZEND_THROW_SPEC_CONST_HANDLER,
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.skl?r1=1.2.2.2.2.1.2.6&r2=1.2.2.2.2.1.2.7&diff_format=u
Index: ZendEngine2/zend_vm_execute.skl
diff -u ZendEngine2/zend_vm_execute.skl:1.2.2.2.2.1.2.6 ZendEngine2/zend_vm_execute.skl:1.2.2.2.2.1.2.7
--- ZendEngine2/zend_vm_execute.skl:1.2.2.2.2.1.2.6 Thu Jan 24 09:41:39 2008
+++ ZendEngine2/zend_vm_execute.skl Tue Apr 29 08:15:20 2008
@@ -14,12 +14,12 @@
/* Initialize execute_data */
execute_data = (zend_execute_data *)zend_vm_stack_alloc(
sizeof(zend_execute_data) +
- sizeof(zval**) * op_array->last_var +
+ sizeof(zval**) * op_array->last_var * (EG(active_symbol_table) ? 1 : 2) +
sizeof(temp_variable) * op_array->T TSRMLS_CC);
EX(CVs) = (zval***)((char*)execute_data + sizeof(zend_execute_data));
memset(EX(CVs), 0, sizeof(zval**) * op_array->last_var);
- EX(Ts) = (temp_variable *)(EX(CVs) + op_array->last_var);
+ EX(Ts) = (temp_variable *)(EX(CVs) + op_array->last_var * (EG(active_symbol_table) ? 1 : 2));
EX(fbc) = NULL;
EX(called_scope) = NULL;
EX(object) = NULL;
@@ -37,7 +37,7 @@
ZEND_VM_SET_OPCODE(op_array->opcodes);
}
- if (op_array->uses_this && EG(This)) {
+ if (op_array->uses_this && EG(This) && EG(active_symbol_table)) {
Z_ADDREF_P(EG(This)); /* For $this pointer */
if (zend_hash_add(EG(active_symbol_table), "this", sizeof("this"), &EG(This), sizeof(zval *), NULL)==FAILURE) {
Z_DELREF_P(EG(This));
http://cvs.php.net/viewvc.cgi/php-src/ext/curl/streams.c?r1=1.14.2.2.2.11.2.1&r2=1.14.2.2.2.11.2.2&diff_format=u
Index: php-src/ext/curl/streams.c
diff -u php-src/ext/curl/streams.c:1.14.2.2.2.11.2.1 php-src/ext/curl/streams.c:1.14.2.2.2.11.2.2
--- php-src/ext/curl/streams.c:1.14.2.2.2.11.2.1 Mon Dec 31 07:17:06 2007
+++ php-src/ext/curl/streams.c Tue Apr 29 08:15:20 2008
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: streams.c,v 1.14.2.2.2.11.2.1 2007/12/31 07:17:06 sebastian Exp $ */
+/* $Id: streams.c,v 1.14.2.2.2.11.2.2 2008/04/29 08:15:20 dmitry Exp $ */
/* This file implements cURL based wrappers.
* NOTE: If you are implementing your own streams that are intended to
@@ -64,6 +64,9 @@
if (curlstream->readbuffer.writepos == 0) {
zval *sym;
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
MAKE_STD_ZVAL(sym);
*sym = *curlstream->headers;
zval_copy_ctor(sym);
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/array.c?r1=1.308.2.21.2.37.2.27&r2=1.308.2.21.2.37.2.28&diff_format=u
Index: php-src/ext/standard/array.c
diff -u php-src/ext/standard/array.c:1.308.2.21.2.37.2.27 php-src/ext/standard/array.c:1.308.2.21.2.37.2.28
--- php-src/ext/standard/array.c:1.308.2.21.2.37.2.27 Wed Mar 12 19:18:42 2008
+++ php-src/ext/standard/array.c Tue Apr 29 08:15:20 2008
@@ -21,7 +21,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: array.c,v 1.308.2.21.2.37.2.27 2008/03/12 19:18:42 felipe Exp $ */
+/* $Id: array.c,v 1.308.2.21.2.37.2.28 2008/04/29 08:15:20 dmitry Exp $ */
#include "php.h"
#include "php_ini.h"
@@ -1331,6 +1331,10 @@
}
}
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
+
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(var_array), &pos);
while (zend_hash_get_current_data_ex(Z_ARRVAL_P(var_array), (void **)&entry, &pos) == SUCCESS) {
zval final_name;
@@ -1493,6 +1497,10 @@
WRONG_PARAM_COUNT;
}
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
+
array_init(return_value);
for (i=0; i<ZEND_NUM_ARGS(); i++) {
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/http_fopen_wrapper.c?r1=1.99.2.12.2.9.2.6&r2=1.99.2.12.2.9.2.7&diff_format=u
Index: php-src/ext/standard/http_fopen_wrapper.c
diff -u php-src/ext/standard/http_fopen_wrapper.c:1.99.2.12.2.9.2.6 php-src/ext/standard/http_fopen_wrapper.c:1.99.2.12.2.9.2.7
--- php-src/ext/standard/http_fopen_wrapper.c:1.99.2.12.2.9.2.6 Sun Apr 6 15:21:24 2008
+++ php-src/ext/standard/http_fopen_wrapper.c Tue Apr 29 08:15:20 2008
@@ -19,7 +19,7 @@
| Sara Golemon <[email protected]> |
+----------------------------------------------------------------------+
*/
-/* $Id: http_fopen_wrapper.c,v 1.99.2.12.2.9.2.6 2008/04/06 15:21:24 iliaa Exp $ */
+/* $Id: http_fopen_wrapper.c,v 1.99.2.12.2.9.2.7 2008/04/29 08:15:20 dmitry Exp $ */
#include "php.h"
#include "php_globals.h"
@@ -494,6 +494,10 @@
location[0] = '\0';
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
+
if (header_init) {
zval *tmp;
MAKE_STD_ZVAL(tmp);
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/string.c?r1=1.445.2.14.2.69.2.19&r2=1.445.2.14.2.69.2.20&diff_format=u
Index: php-src/ext/standard/string.c
diff -u php-src/ext/standard/string.c:1.445.2.14.2.69.2.19 php-src/ext/standard/string.c:1.445.2.14.2.69.2.20
--- php-src/ext/standard/string.c:1.445.2.14.2.69.2.19 Mon Mar 10 22:12:36 2008
+++ php-src/ext/standard/string.c Tue Apr 29 08:15:20 2008
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: string.c,v 1.445.2.14.2.69.2.19 2008/03/10 22:12:36 felipe Exp $ */
+/* $Id: string.c,v 1.445.2.14.2.69.2.20 2008/04/29 08:15:20 dmitry Exp $ */
/* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
@@ -4178,8 +4178,11 @@
if (argCount == 1) {
zval tmp;
- Z_ARRVAL(tmp) = EG(active_symbol_table);
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
+ Z_ARRVAL(tmp) = EG(active_symbol_table);
sapi_module.treat_data(PARSE_STRING, res, &tmp TSRMLS_CC);
} else {
/* Clear out the array that was passed in. */
http://cvs.php.net/viewvc.cgi/php-src/ext/wddx/wddx.c?r1=1.119.2.10.2.17.2.4&r2=1.119.2.10.2.17.2.5&diff_format=u
Index: php-src/ext/wddx/wddx.c
diff -u php-src/ext/wddx/wddx.c:1.119.2.10.2.17.2.4 php-src/ext/wddx/wddx.c:1.119.2.10.2.17.2.5
--- php-src/ext/wddx/wddx.c:1.119.2.10.2.17.2.4 Sun Jan 20 15:33:24 2008
+++ php-src/ext/wddx/wddx.c Tue Apr 29 08:15:20 2008
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: wddx.c,v 1.119.2.10.2.17.2.4 2008/01/20 15:33:24 iliaa Exp $ */
+/* $Id: wddx.c,v 1.119.2.10.2.17.2.5 2008/04/29 08:15:20 dmitry Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -659,6 +659,9 @@
if (Z_TYPE_P(name_var) == IS_STRING)
{
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
if (zend_hash_find(EG(active_symbol_table), Z_STRVAL_P(name_var),
Z_STRLEN_P(name_var)+1, (void**)&val) != FAILURE) {
php_wddx_serialize_var(packet, *val, Z_STRVAL_P(name_var), Z_STRLEN_P(name_var) TSRMLS_CC);
http://cvs.php.net/viewvc.cgi/php-src/main/php_variables.c?r1=1.104.2.10.2.11.2.4&r2=1.104.2.10.2.11.2.5&diff_format=u
Index: php-src/main/php_variables.c
diff -u php-src/main/php_variables.c:1.104.2.10.2.11.2.4 php-src/main/php_variables.c:1.104.2.10.2.11.2.5
--- php-src/main/php_variables.c:1.104.2.10.2.11.2.4 Wed Mar 12 20:24:45 2008
+++ php-src/main/php_variables.c Tue Apr 29 08:15:20 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_variables.c,v 1.104.2.10.2.11.2.4 2008/03/12 20:24:45 stas Exp $ */
+/* $Id: php_variables.c,v 1.104.2.10.2.11.2.5 2008/04/29 08:15:20 dmitry Exp $ */
#include <stdio.h>
#include "php.h"
@@ -72,6 +72,9 @@
if (track_vars_array) {
symtable1 = Z_ARRVAL_P(track_vars_array);
} else if (PG(register_globals)) {
+ if (!EG(active_symbol_table)) {
+ zend_rebuild_symbol_table(TSRMLS_C);
+ }
symtable1 = EG(active_symbol_table);
}
if (!symtable1) {