]> granicus.if.org Git - php/commitdiff
Added test cases for CV optimization patch
authorDmitry Stogov <dmitry@php.net>
Tue, 5 Oct 2004 06:53:39 +0000 (06:53 +0000)
committerDmitry Stogov <dmitry@php.net>
Tue, 5 Oct 2004 06:53:39 +0000 (06:53 +0000)
13 files changed:
Zend/tests/unset.inc [new file with mode: 0644]
Zend/tests/unset_cv01.phpt [new file with mode: 0644]
Zend/tests/unset_cv02.phpt [new file with mode: 0644]
Zend/tests/unset_cv03.phpt [new file with mode: 0644]
Zend/tests/unset_cv04.phpt [new file with mode: 0644]
Zend/tests/unset_cv05.phpt [new file with mode: 0644]
Zend/tests/unset_cv06.phpt [new file with mode: 0644]
Zend/tests/unset_cv07.phpt [new file with mode: 0644]
Zend/tests/unset_cv08.phpt [new file with mode: 0644]
Zend/tests/unset_cv09.phpt [new file with mode: 0644]
Zend/tests/unset_cv10.phpt [new file with mode: 0644]
Zend/zend_execute_API.c
Zend/zend_vm_handlers.h

diff --git a/Zend/tests/unset.inc b/Zend/tests/unset.inc
new file mode 100644 (file)
index 0000000..12f02dc
--- /dev/null
@@ -0,0 +1,3 @@
+<?php
+unset($x)
+?>
diff --git a/Zend/tests/unset_cv01.phpt b/Zend/tests/unset_cv01.phpt
new file mode 100644 (file)
index 0000000..99af118
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+unset() CV 1 (unset() global variable)
+--FILE--
+<?php
+$x = "ok\n";
+echo $x;
+unset($x);
+echo $x;
+?>
+--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 (file)
index 0000000..cb24753
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+unset() CV 2 (unset() global variable in $GLOBALS)
+--FILE--
+<?php
+$x = "ok\n";
+echo $x;
+unset($GLOBALS["x"]);
+echo $x;
+?>
+--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 (file)
index 0000000..221abe2
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+unset() CV 3 (unset() global variable in included file)
+--FILE--
+<?php
+$x = "ok\n";
+echo $x;
+include "unset.inc";
+echo $x;
+?>
+--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 (file)
index 0000000..5044cb1
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+unset() CV 4 (unset() local variable in included file)
+--FILE--
+<?php
+function f() {
+  $x = "ok\n";
+  echo $x;
+  include "unset.inc";
+  echo $x;
+}
+f();
+?>
+--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 (file)
index 0000000..fc8b5c8
--- /dev/null
@@ -0,0 +1,20 @@
+--TEST--
+unset() CV 5 (indirect unset() of global variable in session_start())
+--SKIPIF--
+<?php include('../../ext/session/tests/skipif.inc'); ?>
+--FILE--
+<?php
+$HTTP_SESSION_VARS = "ok\n";
+echo $HTTP_SESSION_VARS;
+session_start();
+echo $HTTP_SESSION_VARS;
+echo "\nok\n";
+?>
+--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 (file)
index 0000000..1d0d5cd
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--
+unset() CV 6 (indirect unset() of global variable in session_unset())
+--SKIPIF--
+<?php include('../../ext/session/tests/skipif.inc'); ?>
+--FILE--
+<?php
+$x = "1\n";
+session_start();
+echo $x;
+session_register('x');
+$_SESSION['x'] = "2\n";
+echo $x;
+session_unset();
+echo $x;
+echo "ok\n";
+?>
+--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 (file)
index 0000000..e828915
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+unset() CV 7 (indirect unset() of global variable in import_request_variables())
+--GET--
+x=2
+--FILE--
+<?php
+$x = "1\n";
+echo $x;
+import_request_variables("g");
+echo $x;
+echo "\nok\n";
+?>
+--EXPECT--
+1
+2
+ok
diff --git a/Zend/tests/unset_cv08.phpt b/Zend/tests/unset_cv08.phpt
new file mode 100644 (file)
index 0000000..f1b61bf
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+unset() CV 8 (unset() of global variable in array_unique($GLOBALS))
+--FILE--
+<?php
+$a = "ok\n";
+$b = "ok\n";
+array_unique($GLOBALS);
+echo $a;
+echo $b;
+echo "ok\n";
+?>
+--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 (file)
index 0000000..a5407ad
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+unset() CV 9 (unset() of global variable in array_pop($GLOBALS))
+--FILE--
+<?php
+$x = "ok\n";
+echo array_pop($GLOBALS);
+echo $x;
+echo "ok\n";
+?>
+--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 (file)
index 0000000..0eb4192
--- /dev/null
@@ -0,0 +1,18 @@
+--TEST--
+unset() CV 10 (unset() of global variable in ArrayObject::offsetUnset($GLOBALS))
+--SKIPIF--
+<?php if (!extension_loaded("spl")) print "skip"; ?>
+--FILE--
+<?php
+$a = new ArrayObject($GLOBALS);
+$x = "ok\n";
+echo $x;
+$a->offsetUnset('x');
+echo $x;
+echo "ok\n";
+?>
+--EXPECTF--
+ok
+
+Notice: Undefined variable: x in %sunset_cv10.php on line %d
+ok
index 274ea4ed51c194d3ecbbb24567ae62f18609a455..d33fb0b635bda2bf895a10ca3968223523ce71a6 100644 (file)
@@ -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;
 }
index adbb7178d4da72a2485772a273a85ef5ce293bc6..dc8a1f1899e321f36c9248d41406fcf077a5d32b 100644 (file)
@@ -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;