Skip to content

Commit dfb1969

Browse files
committed
Reset seen symbols when ending namespace
Previously, seen symbols were never cleaned during the compilation of a single file. This makes it impossible to use a class or function from a different namespace if such a symbol is also declared within the same file. This is inconsistent with how it would work when split into different files.
1 parent 49d0d7b commit dfb1969

File tree

3 files changed

+94
-0
lines changed

3 files changed

+94
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
--TEST--
2+
Namespace end resets seen function symbols
3+
--FILE--
4+
<?php
5+
6+
namespace {
7+
function f() {
8+
echo __FUNCTION__, "\n";
9+
}
10+
f();
11+
}
12+
13+
namespace Ns {
14+
function f() {
15+
echo __FUNCTION__, "\n";
16+
}
17+
f();
18+
}
19+
20+
namespace {
21+
use function Ns\f;
22+
f();
23+
}
24+
25+
namespace Ns {
26+
use function f;
27+
f();
28+
}
29+
30+
namespace {
31+
f();
32+
}
33+
34+
namespace Ns {
35+
f();
36+
}
37+
38+
?>
39+
--EXPECT--
40+
f
41+
Ns\f
42+
Ns\f
43+
f
44+
f
45+
Ns\f
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
--TEST--
2+
Namespace end resets seen class symbols
3+
--FILE--
4+
<?php
5+
6+
namespace {
7+
class C {}
8+
var_dump(new C);
9+
}
10+
11+
namespace Ns {
12+
class C {}
13+
var_dump(new C);
14+
}
15+
16+
namespace {
17+
use Ns\C;
18+
var_dump(new C);
19+
}
20+
21+
namespace Ns {
22+
use C;
23+
var_dump(new C);
24+
}
25+
26+
namespace {
27+
var_dump(new C);
28+
}
29+
30+
namespace Ns {
31+
var_dump(new C);
32+
}
33+
34+
?>
35+
--EXPECTF--
36+
object(C)#%d (0) {
37+
}
38+
object(Ns\C)#1 (0) {
39+
}
40+
object(Ns\C)#1 (0) {
41+
}
42+
object(C)#%d (0) {
43+
}
44+
object(C)#%d (0) {
45+
}
46+
object(Ns\C)#1 (0) {
47+
}

Zend/zend_compile.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,8 @@ static void zend_reset_import_tables(void) /* {{{ */
374374
efree(FC(imports_const));
375375
FC(imports_const) = NULL;
376376
}
377+
378+
zend_hash_clean(&FC(seen_symbols));
377379
}
378380
/* }}} */
379381

0 commit comments

Comments
 (0)