From 3f35c6a6cc69bc3054fad4a7031ea780baed8945 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 5 Oct 2004 06:53:39 +0000 Subject: [PATCH] Added test cases for CV optimization patch --- Zend/tests/unset.inc | 3 +++ Zend/tests/unset_cv01.phpt | 13 +++++++++++++ Zend/tests/unset_cv02.phpt | 13 +++++++++++++ Zend/tests/unset_cv03.phpt | 13 +++++++++++++ Zend/tests/unset_cv04.phpt | 16 ++++++++++++++++ Zend/tests/unset_cv05.phpt | 20 ++++++++++++++++++++ Zend/tests/unset_cv06.phpt | 22 ++++++++++++++++++++++ Zend/tests/unset_cv07.phpt | 16 ++++++++++++++++ Zend/tests/unset_cv08.phpt | 16 ++++++++++++++++ Zend/tests/unset_cv09.phpt | 14 ++++++++++++++ Zend/tests/unset_cv10.phpt | 18 ++++++++++++++++++ Zend/zend_execute_API.c | 8 +++++--- Zend/zend_vm_handlers.h | 10 ++++++++-- 13 files changed, 177 insertions(+), 5 deletions(-) create mode 100644 Zend/tests/unset.inc create mode 100644 Zend/tests/unset_cv01.phpt create mode 100644 Zend/tests/unset_cv02.phpt create mode 100644 Zend/tests/unset_cv03.phpt create mode 100644 Zend/tests/unset_cv04.phpt create mode 100644 Zend/tests/unset_cv05.phpt create mode 100644 Zend/tests/unset_cv06.phpt create mode 100644 Zend/tests/unset_cv07.phpt create mode 100644 Zend/tests/unset_cv08.phpt create mode 100644 Zend/tests/unset_cv09.phpt create mode 100644 Zend/tests/unset_cv10.phpt diff --git a/Zend/tests/unset.inc b/Zend/tests/unset.inc new file mode 100644 index 0000000000..12f02dc0af --- /dev/null +++ b/Zend/tests/unset.inc @@ -0,0 +1,3 @@ + diff --git a/Zend/tests/unset_cv01.phpt b/Zend/tests/unset_cv01.phpt new file mode 100644 index 0000000000..99af118d10 --- /dev/null +++ b/Zend/tests/unset_cv01.phpt @@ -0,0 +1,13 @@ +--TEST-- +unset() CV 1 (unset() global variable) +--FILE-- + +--EXPECTF-- +ok + +Notice: Undefined variable: x in %sunset_cv01.php on line %d diff --git a/Zend/tests/unset_cv02.phpt b/Zend/tests/unset_cv02.phpt new file mode 100644 index 0000000000..cb2475350c --- /dev/null +++ b/Zend/tests/unset_cv02.phpt @@ -0,0 +1,13 @@ +--TEST-- +unset() CV 2 (unset() global variable in $GLOBALS) +--FILE-- + +--EXPECTF-- +ok + +Notice: Undefined variable: x in %sunset_cv02.php on line %d diff --git a/Zend/tests/unset_cv03.phpt b/Zend/tests/unset_cv03.phpt new file mode 100644 index 0000000000..221abe2d88 --- /dev/null +++ b/Zend/tests/unset_cv03.phpt @@ -0,0 +1,13 @@ +--TEST-- +unset() CV 3 (unset() global variable in included file) +--FILE-- + +--EXPECTF-- +ok + +Notice: Undefined variable: x in %sunset_cv03.php on line %d diff --git a/Zend/tests/unset_cv04.phpt b/Zend/tests/unset_cv04.phpt new file mode 100644 index 0000000000..5044cb1c8d --- /dev/null +++ b/Zend/tests/unset_cv04.phpt @@ -0,0 +1,16 @@ +--TEST-- +unset() CV 4 (unset() local variable in included file) +--FILE-- + +--EXPECTF-- +ok + +Notice: Undefined variable: x in %sunset_cv04.php on line %d diff --git a/Zend/tests/unset_cv05.phpt b/Zend/tests/unset_cv05.phpt new file mode 100644 index 0000000000..fc8b5c8d60 --- /dev/null +++ b/Zend/tests/unset_cv05.phpt @@ -0,0 +1,20 @@ +--TEST-- +unset() CV 5 (indirect unset() of global variable in session_start()) +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +ok + +Warning: session_start(): Cannot send session cookie - headers already sent by (output started at %sunset_cv05.php on line %d + +Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at %sunset_cv05.php:%d) in %sunset_cv05.php on line %d +Array +ok diff --git a/Zend/tests/unset_cv06.phpt b/Zend/tests/unset_cv06.phpt new file mode 100644 index 0000000000..1d0d5cdd44 --- /dev/null +++ b/Zend/tests/unset_cv06.phpt @@ -0,0 +1,22 @@ +--TEST-- +unset() CV 6 (indirect unset() of global variable in session_unset()) +--SKIPIF-- + +--FILE-- + +--EXPECTF-- +1 +2 + +Notice: Undefined variable: x in %sunset_cv06.php on line %d +ok diff --git a/Zend/tests/unset_cv07.phpt b/Zend/tests/unset_cv07.phpt new file mode 100644 index 0000000000..e828915dab --- /dev/null +++ b/Zend/tests/unset_cv07.phpt @@ -0,0 +1,16 @@ +--TEST-- +unset() CV 7 (indirect unset() of global variable in import_request_variables()) +--GET-- +x=2 +--FILE-- + +--EXPECT-- +1 +2 +ok diff --git a/Zend/tests/unset_cv08.phpt b/Zend/tests/unset_cv08.phpt new file mode 100644 index 0000000000..f1b61bf827 --- /dev/null +++ b/Zend/tests/unset_cv08.phpt @@ -0,0 +1,16 @@ +--TEST-- +unset() CV 8 (unset() of global variable in array_unique($GLOBALS)) +--FILE-- + +--EXPECTF-- +ok + +Notice: Undefined variable: b in %sunset_cv08.php on line %d +ok diff --git a/Zend/tests/unset_cv09.phpt b/Zend/tests/unset_cv09.phpt new file mode 100644 index 0000000000..a5407ad64e --- /dev/null +++ b/Zend/tests/unset_cv09.phpt @@ -0,0 +1,14 @@ +--TEST-- +unset() CV 9 (unset() of global variable in array_pop($GLOBALS)) +--FILE-- + +--EXPECTF-- +ok + +Notice: Undefined variable: x in %sunset_cv09.php on line %d +ok diff --git a/Zend/tests/unset_cv10.phpt b/Zend/tests/unset_cv10.phpt new file mode 100644 index 0000000000..0eb41922c5 --- /dev/null +++ b/Zend/tests/unset_cv10.phpt @@ -0,0 +1,18 @@ +--TEST-- +unset() CV 10 (unset() of global variable in ArrayObject::offsetUnset($GLOBALS)) +--SKIPIF-- + +--FILE-- +offsetUnset('x'); +echo $x; +echo "ok\n"; +?> +--EXPECTF-- +ok + +Notice: Undefined variable: x in %sunset_cv10.php on line %d +ok diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 274ea4ed51..d33fb0b635 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -1346,13 +1346,15 @@ void zend_verify_abstract_class(zend_class_entry *ce TSRMLS_DC) ZEND_API int zend_delete_global_variable(char *name, int name_len TSRMLS_DC) { zend_execute_data *ex; + ulong hash_value = zend_inline_hash_func(name, name_len+1); - if (zend_symtable_del(&EG(symbol_table), name, name_len+1) == SUCCESS) { + if (zend_hash_quick_exists(&EG(symbol_table), name, name_len+1, hash_value)) { for (ex = EG(current_execute_data); ex; ex = ex->prev_execute_data) { if (ex->symbol_table == &EG(symbol_table)) { int i; for (i = 0; i < ex->op_array->last_var; i++) { - if (ex->op_array->vars[i].name_len == name_len && + if (ex->op_array->vars[i].hash_value == hash_value && + ex->op_array->vars[i].name_len == name_len && !memcmp(ex->op_array->vars[i].name, name, name_len)) { ex->CVs[i] = NULL; break; @@ -1360,7 +1362,7 @@ ZEND_API int zend_delete_global_variable(char *name, int name_len TSRMLS_DC) } } } - return SUCCESS; + return zend_hash_del(&EG(symbol_table), name, name_len+1); } return FAILURE; } diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h index adbb7178d4..dc8a1f1899 100644 --- a/Zend/zend_vm_handlers.h +++ b/Zend/zend_vm_handlers.h @@ -3206,11 +3206,14 @@ ZEND_VM_HANDLER(ZEND_UNSET_VAR) 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) { 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; for (i = 0; i < ex->op_array->last_var; i++) { - if (ex->op_array->vars[i].name_len == varname->value.str.len && + if (ex->op_array->vars[i].hash_value == hash_value && + ex->op_array->vars[i].name_len == varname->value.str.len && !memcmp(ex->op_array->vars[i].name, varname->value.str.val, varname->value.str.len)) { ex->CVs[i] = NULL; break; @@ -3285,12 +3288,15 @@ ZEND_VM_HANDLER(ZEND_UNSET_DIM_OBJ) if (zend_symtable_del(ht, offset->value.str.val, offset->value.str.len+1) == SUCCESS && ht == &EG(symbol_table)) { zend_execute_data *ex; + ulong hash_value = zend_inline_hash_func(offset->value.str.val, offset->value.str.len+1); + for (ex = EXECUTE_DATA; ex; ex = ex->prev_execute_data) { if (ex->symbol_table == ht) { int i; for (i = 0; i < ex->op_array->last_var; i++) { - if (ex->op_array->vars[i].name_len == offset->value.str.len && + if (ex->op_array->vars[i].hash_value == hash_value && + ex->op_array->vars[i].name_len == offset->value.str.len && !memcmp(ex->op_array->vars[i].name, offset->value.str.val, offset->value.str.len)) { ex->CVs[i] = NULL; break; -- 2.40.0