Skip to content

Commit b8b7060

Browse files
committed
gen_stub: fix invalid C variable name for namespaced types in union/intersection type list
When generating a union or intersection type list with multiple class types, the variable holding each zend_string* was declared using toVarEscapedName() (backslashes replaced by underscores), but the subsequent ZEND_TYPE_INIT_CLASS() reference used toEscapedName() (backslashes escaped as \\), producing an invalid C identifier.
1 parent e60f880 commit b8b7060

File tree

7 files changed

+136
-8
lines changed

7 files changed

+136
-8
lines changed

build/gen_stub.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2375,8 +2375,8 @@ protected function getTypeCode(string $variableLikeName, string &$code): string
23752375
$code .= "\t{$variableLikeType}_{$variableLikeName}_type_list->num_types = $classTypeCount;\n";
23762376

23772377
foreach ($arginfoType->classTypes as $k => $classType) {
2378-
$escapedClassName = $classType->toEscapedName();
2379-
$code .= "\t{$variableLikeType}_{$variableLikeName}_type_list->types[$k] = (zend_type) ZEND_TYPE_INIT_CLASS({$variableLikeType}_{$variableLikeName}_class_{$escapedClassName}, 0, 0);\n";
2378+
$varEscapedClassName = $classType->toVarEscapedName();
2379+
$code .= "\t{$variableLikeType}_{$variableLikeName}_type_list->types[$k] = (zend_type) ZEND_TYPE_INIT_CLASS({$variableLikeType}_{$variableLikeName}_class_{$varEscapedClassName}, 0, 0);\n";
23802380
}
23812381

23822382
$typeMaskCode = $this->type->toArginfoType()->toTypeMask();

ext/zend_test/test.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,10 @@ static zend_class_entry *zend_test_ns_foo_class;
7070
static zend_class_entry *zend_test_ns_unlikely_compile_error_class;
7171
static zend_class_entry *zend_test_ns_not_unlikely_compile_error_class;
7272
static zend_class_entry *zend_test_ns2_foo_class;
73+
static zend_class_entry *zend_test_ns2_foo_with_intersection_prop_class;
7374
static zend_class_entry *zend_test_ns2_ns_foo_class;
75+
static zend_class_entry *zend_test_ns2_ns_bar_class;
76+
static zend_class_entry *zend_test_ns2_ns_baz_class;
7477
static zend_class_entry *zend_test_unit_enum;
7578
static zend_class_entry *zend_test_string_enum;
7679
static zend_class_entry *zend_test_int_enum;
@@ -1573,6 +1576,9 @@ PHP_MINIT_FUNCTION(zend_test)
15731576
zend_test_ns_not_unlikely_compile_error_class = register_class_ZendTestNS_NotUnlikelyCompileError();
15741577
zend_test_ns2_foo_class = register_class_ZendTestNS2_Foo();
15751578
zend_test_ns2_ns_foo_class = register_class_ZendTestNS2_ZendSubNS_Foo();
1579+
zend_test_ns2_ns_bar_class = register_class_ZendTestNS2_ZendSubNS_Bar();
1580+
zend_test_ns2_ns_baz_class = register_class_ZendTestNS2_ZendSubNS_Baz();
1581+
zend_test_ns2_foo_with_intersection_prop_class = register_class_ZendTestNS2_FooWithIntersectionProp();
15761582

15771583
zend_test_unit_enum = register_class_ZendTestUnitEnum();
15781584
zend_test_string_enum = register_class_ZendTestStringEnum();

ext/zend_test/test.stub.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,10 @@ class Foo {
387387
public function method(): void {}
388388
}
389389

390+
class FooWithIntersectionProp {
391+
public ZendSubNS\Bar&ZendSubNS\Baz $prop;
392+
}
393+
390394
function namespaced_func(): bool {}
391395

392396
/** @deprecated */
@@ -411,6 +415,10 @@ class Foo {
411415
public function method(): void {}
412416
}
413417

418+
interface Bar {}
419+
420+
interface Baz {}
421+
414422
function namespaced_func(): bool {}
415423

416424
/** @deprecated */

ext/zend_test/test_arginfo.h

Lines changed: 48 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/zend_test/test_decl.h

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/zend_test/test_legacy_arginfo.h

Lines changed: 41 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
gen_stub.php: intersection type property with namespaced classes
3+
--EXTENSIONS--
4+
zend_test
5+
--FILE--
6+
<?php
7+
8+
$rp = new ReflectionProperty(ZendTestNS2\FooWithIntersectionProp::class, 'prop');
9+
$type = $rp->getType();
10+
11+
var_dump($type instanceof ReflectionIntersectionType);
12+
13+
foreach ($type->getTypes() as $t) {
14+
var_dump($t->getName());
15+
var_dump($t->allowsNull());
16+
var_dump($t->isBuiltin());
17+
}
18+
19+
?>
20+
--EXPECT--
21+
bool(true)
22+
string(25) "ZendTestNS2\ZendSubNS\Bar"
23+
bool(false)
24+
bool(false)
25+
string(25) "ZendTestNS2\ZendSubNS\Baz"
26+
bool(false)
27+
bool(false)

0 commit comments

Comments
 (0)