--- /dev/null
+<?php
+unset($x)
+?>
--- /dev/null
+--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
--- /dev/null
+--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
--- /dev/null
+--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
--- /dev/null
+--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
--- /dev/null
+--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
--- /dev/null
+--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
--- /dev/null
+--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
--- /dev/null
+--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
--- /dev/null
+--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
--- /dev/null
+--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
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;
}
}
}
- return SUCCESS;
+ return zend_hash_del(&EG(symbol_table), name, name_len+1);
}
return FAILURE;
}
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;
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;