Skip to content

Commit 8d471c7

Browse files
committed
update tests
1 parent b33d9c1 commit 8d471c7

20 files changed

+100
-120
lines changed

Zend/zend_compile.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,14 +1104,8 @@ static zend_string *zend_prefix_with_outer_class(zend_string *name) {
11041104

11051105
zend_string *ns = CG(active_class_entry)->name;
11061106

1107-
// If the current ns is the current name, return the ns.
1108-
// we only need to check if ns[len(ns) - len(name) + 1] == '\\' and the end of ns is name.
1109-
if (ZSTR_LEN(ns) >= ZSTR_LEN(name) && ZSTR_VAL(ns)[ZSTR_LEN(ns) - ZSTR_LEN(name) - 1] == '\\'
1110-
&& memcmp(ZSTR_VAL(ns) + ZSTR_LEN(ns) - ZSTR_LEN(name), ZSTR_VAL(name), ZSTR_LEN(name)) == 0) {
1111-
return zend_string_copy(ns);
1112-
}
1113-
1114-
return zend_concat_names(ZSTR_VAL(ns), ZSTR_LEN(ns), ZSTR_VAL(name), ZSTR_LEN(name));
1107+
// encode the orginal scope
1108+
return zend_string_concat3(ZSTR_VAL(ns), ZSTR_LEN(ns), "|", 1, ZSTR_VAL(name), ZSTR_LEN(name));
11151109
}
11161110

11171111
static zend_string *zend_prefix_with_ns(zend_string *name) {

Zend/zend_execute_API.c

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,10 +1169,19 @@ ZEND_API bool zend_is_valid_class_name(zend_string *name) {
11691169
static zend_class_entry *zend_resolve_nested_class(zend_string *requested_name, uint32_t flags) {
11701170
zend_class_entry *ce = NULL;
11711171
char *separator;
1172-
zend_string *scope_name = zend_string_copy(requested_name);
1172+
zend_string *scope_name = NULL;
11731173

1174-
const char *unqualified_name = strrchr(ZSTR_VAL(scope_name), '\\');
1175-
zend_string *inner_name = zend_string_init(unqualified_name, ZSTR_LEN(scope_name) - (unqualified_name - ZSTR_VAL(scope_name)), 0);
1174+
const char *unqualified_name = strrchr(ZSTR_VAL(requested_name), '|');
1175+
if (unqualified_name == NULL) {
1176+
unqualified_name = strrchr(ZSTR_VAL(requested_name), '\\');
1177+
}
1178+
1179+
zend_string *inner_name = zend_string_init(unqualified_name + 1, ZSTR_LEN(requested_name) - (unqualified_name - ZSTR_VAL(requested_name) + 1), 0);
1180+
1181+
scope_name = zend_string_init(ZSTR_VAL(requested_name), unqualified_name - ZSTR_VAL(requested_name) + 1, 0);
1182+
scope_name->val[scope_name->len - 1] = '\\'; // todo: there is probably a better way
1183+
1184+
requested_name = zend_string_concat2(ZSTR_VAL(scope_name), ZSTR_LEN(scope_name), ZSTR_VAL(inner_name), ZSTR_LEN(inner_name));
11761185

11771186
while ((separator = strrchr(ZSTR_VAL(scope_name), '\\'))) {
11781187
const size_t outer_len = separator - ZSTR_VAL(scope_name);
@@ -1187,56 +1196,50 @@ static zend_class_entry *zend_resolve_nested_class(zend_string *requested_name,
11871196
zend_string_release(scope_name);
11881197
zend_string_release(outer_class_name);
11891198
zend_string_release(inner_name);
1199+
zend_string_release(requested_name);
11901200
return ce;
11911201
}
1202+
}
11921203

1193-
// Check if the class is in the outer scope
1194-
zend_string *outer_name = zend_string_concat2(ZSTR_VAL(outer_class_name), ZSTR_LEN(outer_class_name), ZSTR_VAL(inner_name), ZSTR_LEN(inner_name));
1195-
ce = zend_lookup_class_ex(outer_name, NULL, flags | ZEND_FETCH_CLASS_NO_INNER);
1196-
zend_string_release(outer_name);
1197-
zend_string_release(outer_class_name);
1198-
if (ce) {
1199-
zend_string_release(scope_name);
1200-
zend_string_release(inner_name);
1201-
return ce;
1202-
}
1203-
1204-
// Continue moving upwards (perhaps the inner class is further up)
1205-
zend_string *shorter_scope = zend_string_init(ZSTR_VAL(scope_name), outer_len, 0);
1204+
// Check if the class is in the outer scope
1205+
zend_string *outer_name = zend_string_concat3(ZSTR_VAL(outer_class_name), ZSTR_LEN(outer_class_name), "\\", 1, ZSTR_VAL(inner_name), ZSTR_LEN(inner_name));
1206+
ce = zend_lookup_class_ex(outer_name, NULL, flags | ZEND_FETCH_CLASS_NO_INNER);
1207+
zend_string_release(outer_name);
1208+
zend_string_release(outer_class_name);
1209+
if (ce) {
12061210
zend_string_release(scope_name);
1207-
scope_name = shorter_scope;
1208-
} else {
1209-
// Outer class isn't found: reached namespace level.
1210-
zend_string_release(scope_name);
1211-
zend_string_release(outer_class_name);
12121211
zend_string_release(inner_name);
1212+
zend_string_release(requested_name);
1213+
return ce;
1214+
}
1215+
1216+
// Continue moving upwards (perhaps the inner class is further up)
1217+
zend_string *shorter_scope = zend_string_init(ZSTR_VAL(scope_name), outer_len, 0);
1218+
zend_string_release(scope_name);
1219+
scope_name = shorter_scope;
1220+
1221+
if (!outer_ce) {
1222+
// we have reached the namespace/global scope so nothing to do here
12131223
break;
12141224
}
12151225
}
12161226

12171227
// handle the edge case where the class is in the global scope
12181228
if (separator == NULL) {
1219-
separator = strrchr(ZSTR_VAL(requested_name), '\\');
1220-
if (separator) {
1221-
zend_string_release(scope_name);
1222-
// set scope name to just the separator minus the first character
1223-
scope_name = zend_string_init(separator + 1, ZSTR_LEN(requested_name) - (separator - ZSTR_VAL(requested_name) + 1), 0);
1224-
} else {
1225-
zend_string_release(scope_name);
1226-
zend_string_release(inner_name);
1227-
return NULL;
1228-
}
1229-
ce = zend_lookup_class_ex(scope_name, NULL, flags | ZEND_FETCH_CLASS_NO_INNER);
1229+
ce = zend_lookup_class_ex(inner_name, NULL, flags | ZEND_FETCH_CLASS_NO_INNER);
12301230
zend_string_release(scope_name);
12311231
zend_string_release(inner_name);
1232+
zend_string_release(requested_name);
12321233
return ce;
12331234
}
12341235

12351236
zend_string_release(scope_name);
1236-
zend_string_release(inner_name);
12371237

12381238
// Final lookup directly at namespace/global scope
1239-
return zend_lookup_class_ex(requested_name, NULL, flags | ZEND_FETCH_CLASS_NO_INNER);
1239+
//ce = zend_lookup_class_ex(inner_name, NULL, flags | ZEND_FETCH_CLASS_NO_INNER);
1240+
zend_string_release(inner_name);
1241+
zend_string_release(requested_name);
1242+
return NULL;
12401243
}
12411244

12421245
ZEND_API zend_class_entry *zend_lookup_class_ex(zend_string *name, zend_string *key, uint32_t flags) /* {{{ */

Zend/zend_opcode.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,6 @@ ZEND_API void destroy_zend_class(zval *zv)
431431
zend_hash_release(ce->backed_enum_table);
432432
}
433433
if (ce->required_scope) {
434-
ce->required_scope->refcount--;
435434
ce->required_scope = NULL;
436435
}
437436
break;

tests/classes/inner_classes/return_types_005.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ class Outer {
77
protected class Inner {}
88

99
public static function getInner(): Inner {
10-
return new self:>Inner();
10+
return new Inner();
1111
}
1212
}
1313

tests/classes/inner_classes/simple_declaration_001.phpt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ class Outer {
99
}
1010
}
1111

12-
var_dump(class_exists('Outer:>Middle'));
13-
var_dump(class_exists('Outer:>Middle:>Inner'));
14-
var_dump(class_exists(Outer:>Middle::class));
15-
var_dump(class_exists(Outer:>Middle:>Inner::class));
12+
var_dump(class_exists('Outer\Middle'));
13+
var_dump(class_exists('Outer\Middle\Inner'));
14+
var_dump(class_exists(Outer\Middle::class));
15+
var_dump(class_exists(Outer\Middle\Inner::class));
1616
?>
1717
--EXPECT--
1818
bool(true)

tests/classes/inner_classes/simple_declaration_003.phpt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class Outer {
1414
}
1515
}
1616
}
17-
new Outer:>Middle:>Inner()->test();
17+
new Outer\Middle\Inner()->test();
1818
?>
1919
--EXPECT--
20-
Foo\Outer:>Middle:>Inner
20+
Foo\Outer\Middle\Inner

tests/classes/inner_classes/simple_declaration_004.phpt

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@ scope resolution access
66
class Outer {
77
public class Middle {
88
}
9-
public static function testSelf(): self:>Middle {
10-
return new self:>Middle();
9+
public static function testSelf(): Middle {
10+
return new Middle();
1111
}
1212
}
1313

1414
class Outer2 extends Outer {
15-
public class Middle extends parent:>Middle {
15+
public class Middle extends Outer\Middle {
1616
}
1717

18-
public static function testParent(): parent:>Middle {
19-
return new parent:>Middle();
18+
public static function testParent(): Outer\Middle {
19+
return new Outer\Middle();
2020
}
2121

22-
public static function testSelf(): self:>Middle {
23-
return new self:>Middle();
22+
public static function testSelf(): Middle {
23+
return new Middle();
2424
}
2525
}
2626

@@ -31,11 +31,11 @@ var_dump(Outer2::testSelf());
3131

3232
?>
3333
--EXPECT--
34-
object(Outer:>Middle)#1 (0) {
34+
object(Outer\Middle)#1 (0) {
3535
}
36-
object(Outer:>Middle)#1 (0) {
36+
object(Outer\Middle)#1 (0) {
3737
}
38-
object(Outer2:>Middle)#1 (0) {
38+
object(Outer2\Middle)#1 (0) {
3939
}
40-
object(Outer2:>Middle)#1 (0) {
40+
object(Outer2\Middle)#1 (0) {
4141
}

tests/classes/inner_classes/static_resolution.phpt

Lines changed: 0 additions & 16 deletions
This file was deleted.

tests/classes/inner_classes/static_variables.phpt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@ class Outer {
1414
}
1515
}
1616

17-
var_dump(Outer:>Middle::class);
18-
var_dump(Outer:>Middle::FOO);
19-
var_dump(Outer:>Middle::$bar);
20-
var_dump(Outer:>Middle:>Inner::class);
21-
var_dump(Outer:>Middle:>Inner::FOO);
22-
var_dump(Outer:>Middle:>Inner::$bar);
17+
var_dump(Outer\Middle::class);
18+
var_dump(Outer\Middle::FOO);
19+
var_dump(Outer\Middle::$bar);
20+
var_dump(Outer\Middle\Inner::class);
21+
var_dump(Outer\Middle\Inner::FOO);
22+
var_dump(Outer\Middle\Inner::$bar);
2323
?>
2424
--EXPECT--
25-
string(13) "Outer:>Middle"
25+
string(12) "Outer\Middle"
2626
string(3) "foo"
2727
int(42)
28-
string(20) "Outer:>Middle:>Inner"
28+
string(18) "Outer\Middle\Inner"
2929
string(3) "foo"
3030
int(42)

tests/classes/inner_classes/trait_usage.phpt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,18 @@ trait Outer {
77
class Inner {}
88
}
99

10-
var_dump(new Outer:>Inner());
10+
var_dump(new Outer\Inner());
1111

1212
class Foo {
1313
use Outer;
1414
}
1515

16-
var_dump(class_exists(Outer:>Inner::class));
17-
var_dump(class_exists(Foo:>Inner::class));
16+
var_dump(class_exists(Outer\Inner::class));
17+
var_dump(class_exists(Foo\Inner::class));
1818

1919
?>
2020
--EXPECT--
21-
object(Outer:>Inner)#1 (0) {
21+
object(Outer\Inner)#1 (0) {
2222
}
2323
bool(true)
2424
bool(false)

tests/classes/inner_classes/visibility_001.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ outer class visibility
55

66
class Outer {
77
private class Inner {}
8-
public Outer:>Inner $illegal;
8+
public Outer\Inner $illegal;
99

1010
public function test(): void {
11-
$this->illegal = new Outer:>Inner();
11+
$this->illegal = new Inner();
1212
}
1313
}
1414

@@ -18,7 +18,7 @@ $x->test();
1818
var_dump($x);
1919
?>
2020
--EXPECTF--
21-
Fatal error: Uncaught TypeError: Cannot assign private Outer:>Inner to higher visibile property Outer::illegal in %s:%d
21+
Fatal error: Uncaught TypeError: Cannot assign private Outer\Inner to higher visibile property Outer::illegal in %s:%d
2222
Stack trace:
2323
#0 %s(%d): Outer->test()
2424
#1 {main}

tests/classes/inner_classes/visibility_002.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ class Outer {
99
$i->illegal = $this;
1010
}
1111
}
12-
private Outer:>Inner $illegal;
12+
private Inner $illegal;
1313

1414
public function test(): void {
15-
new Outer:>Inner()->test($this);
15+
new Inner()->test($this);
1616
}
1717
}
1818

@@ -25,6 +25,6 @@ var_dump($x);
2525
--EXPECT--
2626
object(Outer)#1 (1) {
2727
["illegal":"Outer":private]=>
28-
object(Outer:>Inner)#2 (0) {
28+
object(Outer\Inner)#2 (0) {
2929
}
3030
}

tests/classes/inner_classes/visibility_003.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ class Outer {
99
$i->illegal = $this;
1010
}
1111
}
12-
private Outer:>Inner $illegal;
12+
private Inner $illegal;
1313

1414
public function test(): void {
15-
new Outer:>Inner()->test($this);
15+
new Inner()->test($this);
1616
}
1717
}
1818

@@ -25,6 +25,6 @@ var_dump($x);
2525
--EXPECT--
2626
object(Outer)#1 (1) {
2727
["illegal":"Outer":private]=>
28-
object(Outer:>Inner)#2 (0) {
28+
object(Outer\Inner)#2 (0) {
2929
}
3030
}

tests/classes/inner_classes/visibility_004.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ outer class visibility
55

66
class Outer {
77
protected class Inner {}
8-
public Outer:>Inner $illegal;
8+
public Inner $illegal;
99

1010
public function test(): void {
11-
$this->illegal = new Outer:>Inner();
11+
$this->illegal = new Inner();
1212
}
1313
}
1414

@@ -18,7 +18,7 @@ $x->test();
1818
var_dump($x);
1919
?>
2020
--EXPECTF--
21-
Fatal error: Uncaught TypeError: Cannot assign protected Outer:>Inner to higher visibile property Outer::illegal in %s:%d
21+
Fatal error: Uncaught TypeError: Cannot assign protected Outer\Inner to higher visibile property Outer::illegal in %s:%d
2222
Stack trace:
2323
#0 %s(%d): Outer->test()
2424
#1 {main}

tests/classes/inner_classes/visibility_005.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ class Outer {
1313
}
1414
class Inner {
1515
public function test() {
16-
Outer:>Middle::test();
16+
Middle::test();
1717
$t = new Outer();
1818
$t->test();
1919
}
2020
}
2121
}
2222
}
23-
new Outer:>Middle:>Inner()->test();
23+
new Outer\Middle\Inner()->test();
2424
?>
2525
--EXPECT--
26-
Outer:>Middle::test
26+
Outer\Middle::test
2727
Outer::test

tests/classes/inner_classes/visibility_006.phpt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ class Outer {
1818
}
1919
}
2020
}
21-
new Outer:>Middle:>Inner()->testit();
21+
new Outer\Middle\Inner()->testit();
2222
?>
2323
--EXPECTF--
24-
Fatal error: Uncaught Error: Call to undefined method Outer:>Middle:>Inner::test() in %s:%d
24+
Fatal error: Uncaught Error: Call to undefined method Outer\Middle\Inner::test() in %s:%d
2525
Stack trace:
26-
#0 %s(%d): Outer:>Middle:>Inner->testit()
26+
#0 %s(%d): Outer\Middle\Inner->testit()
2727
#1 {main}
2828
thrown in %s on line %d

0 commit comments

Comments
 (0)