Skip to content

Commit 6f04985

Browse files
committed
Add attribute parameters
1 parent 8250924 commit 6f04985

File tree

4 files changed

+150
-28
lines changed

4 files changed

+150
-28
lines changed

ext/zend_test/test.c

Lines changed: 56 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,17 @@ static ZEND_METHOD(ZendTestNS2_ZendSubNS_Foo, method)
439439
ZEND_PARSE_PARAMETERS_NONE();
440440
}
441441

442+
static ZEND_METHOD(ZendTestParameterAttribute, __construct)
443+
{
444+
zend_string *parameter;
445+
446+
ZEND_PARSE_PARAMETERS_START(1, 1)
447+
Z_PARAM_STR(parameter)
448+
ZEND_PARSE_PARAMETERS_END();
449+
450+
ZVAL_STR_COPY(OBJ_PROP_NUM(Z_OBJ_P(ZEND_THIS), 0), parameter);
451+
}
452+
442453
static ZEND_METHOD(ZendTestClassWithMethodWithParameterAttribute, no_override)
443454
{
444455
zend_string *parameter;
@@ -510,36 +521,57 @@ PHP_MINIT_FUNCTION(zend_test)
510521
zend_test_parameter_attribute = register_class_ZendTestParameterAttribute();
511522
zend_internal_attribute_register(zend_test_parameter_attribute, ZEND_ATTRIBUTE_TARGET_PARAMETER);
512523

513-
zend_add_parameter_attribute(
514-
zend_hash_str_find_ptr(CG(function_table), "zend_test_parameter_with_attribute", sizeof("zend_test_parameter_with_attribute") - 1),
515-
0,
516-
zend_test_parameter_attribute->name,
517-
0
518-
);
524+
{
525+
zend_attribute *attr;
526+
527+
attr = zend_add_parameter_attribute(
528+
zend_hash_str_find_ptr(CG(function_table), "zend_test_parameter_with_attribute", sizeof("zend_test_parameter_with_attribute") - 1),
529+
0,
530+
zend_test_parameter_attribute->name,
531+
1
532+
);
533+
534+
ZVAL_STRINGL(&attr->args[0].value, "value1", sizeof("value1") - 1);
535+
}
519536

520537
zend_test_class_with_method_with_parameter_attribute = register_class_ZendTestClassWithMethodWithParameterAttribute();
521538

522-
zend_add_parameter_attribute(
523-
zend_hash_str_find_ptr(&zend_test_class_with_method_with_parameter_attribute->function_table, "no_override", sizeof("no_override") - 1),
524-
0,
525-
zend_test_parameter_attribute->name,
526-
0
527-
);
528-
zend_add_parameter_attribute(
529-
zend_hash_str_find_ptr(&zend_test_class_with_method_with_parameter_attribute->function_table, "override", sizeof("override") - 1),
530-
0,
531-
zend_test_parameter_attribute->name,
532-
0
533-
);
539+
{
540+
zend_attribute *attr;
541+
542+
attr = zend_add_parameter_attribute(
543+
zend_hash_str_find_ptr(&zend_test_class_with_method_with_parameter_attribute->function_table, "no_override", sizeof("no_override") - 1),
544+
0,
545+
zend_test_parameter_attribute->name,
546+
1
547+
);
548+
549+
ZVAL_STRINGL(&attr->args[0].value, "value2", sizeof("value2") - 1);
550+
551+
attr = zend_add_parameter_attribute(
552+
zend_hash_str_find_ptr(&zend_test_class_with_method_with_parameter_attribute->function_table, "override", sizeof("override") - 1),
553+
0,
554+
zend_test_parameter_attribute->name,
555+
1
556+
);
557+
558+
ZVAL_STRINGL(&attr->args[0].value, "value3", sizeof("value3") - 1);
559+
}
534560

535561
zend_test_child_class_with_method_with_parameter_attribute = register_class_ZendTestChildClassWithMethodWithParameterAttribute(zend_test_class_with_method_with_parameter_attribute);
536562

537-
zend_add_parameter_attribute(
538-
zend_hash_str_find_ptr(&zend_test_child_class_with_method_with_parameter_attribute->function_table, "override", sizeof("override") - 1),
539-
0,
540-
zend_test_parameter_attribute->name,
541-
0
542-
);
563+
{
564+
zend_attribute *attr;
565+
566+
attr = zend_add_parameter_attribute(
567+
zend_hash_str_find_ptr(&zend_test_child_class_with_method_with_parameter_attribute->function_table, "override", sizeof("override") - 1),
568+
0,
569+
zend_test_parameter_attribute->name,
570+
1
571+
);
572+
573+
ZVAL_STRINGL(&attr->args[0].value, "value4", sizeof("value4") - 1);
574+
}
543575

544576
zend_test_ns_foo_class = register_class_ZendTestNS_Foo();
545577
zend_test_ns2_foo_class = register_class_ZendTestNS2_Foo();

ext/zend_test/test.stub.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,18 @@ final class ZendTestAttribute {
4646
}
4747

4848
final class ZendTestParameterAttribute {
49+
public string $parameter;
4950

51+
public function __construct(string $parameter) {}
5052
}
5153

5254
class ZendTestClassWithMethodWithParameterAttribute {
53-
final public function no_override(#[ZendTestParameterAttribute] string $parameter): int {}
54-
public function override(#[ZendTestParameterAttribute] string $parameter): int {}
55+
final public function no_override(string $parameter): int {}
56+
public function override(string $parameter): int {}
5557
}
5658

5759
class ZendTestChildClassWithMethodWithParameterAttribute extends ZendTestClassWithMethodWithParameterAttribute {
58-
public function override(#[ZendTestParameterAttribute] string $parameter): int {}
60+
public function override(string $parameter): int {}
5961
}
6062

6163
enum ZendTestUnitEnum {

ext/zend_test/test_arginfo.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 068310d46bc9f5454a2f47e6a7ff52c9ea3f0b22 */
2+
* Stub hash: af5d698b35753ac9f852688644d6844ba0914b2b */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_zend_test_array_return, 0, 0, IS_ARRAY, 0)
55
ZEND_END_ARG_INFO()
@@ -95,6 +95,10 @@ ZEND_END_ARG_INFO()
9595

9696
#define arginfo_class__ZendTestTrait_testMethod arginfo_ZendTestNS2_ZendSubNS_namespaced_func
9797

98+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ZendTestParameterAttribute___construct, 0, 0, 1)
99+
ZEND_ARG_TYPE_INFO(0, parameter, IS_STRING, 0)
100+
ZEND_END_ARG_INFO()
101+
98102
#define arginfo_class_ZendTestClassWithMethodWithParameterAttribute_no_override arginfo_zend_test_parameter_with_attribute
99103

100104
#define arginfo_class_ZendTestClassWithMethodWithParameterAttribute_override arginfo_zend_test_parameter_with_attribute
@@ -134,6 +138,7 @@ static ZEND_METHOD(_ZendTestClass, returnsStatic);
134138
static ZEND_METHOD(_ZendTestClass, returnsThrowable);
135139
static ZEND_METHOD(_ZendTestChildClass, returnsThrowable);
136140
static ZEND_METHOD(_ZendTestTrait, testMethod);
141+
static ZEND_METHOD(ZendTestParameterAttribute, __construct);
137142
static ZEND_METHOD(ZendTestClassWithMethodWithParameterAttribute, no_override);
138143
static ZEND_METHOD(ZendTestClassWithMethodWithParameterAttribute, override);
139144
static ZEND_METHOD(ZendTestChildClassWithMethodWithParameterAttribute, override);
@@ -199,6 +204,7 @@ static const zend_function_entry class_ZendTestAttribute_methods[] = {
199204

200205

201206
static const zend_function_entry class_ZendTestParameterAttribute_methods[] = {
207+
ZEND_ME(ZendTestParameterAttribute, __construct, arginfo_class_ZendTestParameterAttribute___construct, ZEND_ACC_PUBLIC)
202208
ZEND_FE_END
203209
};
204210

@@ -355,6 +361,12 @@ static zend_class_entry *register_class_ZendTestParameterAttribute(void)
355361
class_entry = zend_register_internal_class_ex(&ce, NULL);
356362
class_entry->ce_flags |= ZEND_ACC_FINAL;
357363

364+
zval property_parameter_default_value;
365+
ZVAL_UNDEF(&property_parameter_default_value);
366+
zend_string *property_parameter_name = zend_string_init("parameter", sizeof("parameter") - 1, 1);
367+
zend_declare_typed_property(class_entry, property_parameter_name, &property_parameter_default_value, ZEND_ACC_PUBLIC, NULL, (zend_type) ZEND_TYPE_INIT_MASK(MAY_BE_STRING));
368+
zend_string_release(property_parameter_name);
369+
358370
return class_entry;
359371
}
360372

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
--TEST--
2+
Verify that parameter attributes for native functions correctly support arguments.
3+
--EXTENSIONS--
4+
zend_test
5+
--FILE--
6+
<?php
7+
8+
$reflection = new ReflectionFunction("zend_test_parameter_with_attribute");
9+
$attribute = $reflection->getParameters()[0]->getAttributes()[0];
10+
var_dump($attribute->getArguments());
11+
var_dump($attribute->newInstance());
12+
13+
$reflection = new ReflectionMethod("ZendTestClassWithMethodWithParameterAttribute", "no_override");
14+
$attribute = $reflection->getParameters()[0]->getAttributes()[0];
15+
var_dump($attribute->getArguments());
16+
var_dump($attribute->newInstance());
17+
18+
$reflection = new ReflectionMethod("ZendTestClassWithMethodWithParameterAttribute", "override");
19+
$attribute = $reflection->getParameters()[0]->getAttributes()[0];
20+
var_dump($attribute->getArguments());
21+
var_dump($attribute->newInstance());
22+
23+
$reflection = new ReflectionMethod("ZendTestChildClassWithMethodWithParameterAttribute", "no_override");
24+
$attribute = $reflection->getParameters()[0]->getAttributes()[0];
25+
var_dump($attribute->getArguments());
26+
var_dump($attribute->newInstance());
27+
28+
$reflection = new ReflectionMethod("ZendTestChildClassWithMethodWithParameterAttribute", "override");
29+
var_dump($reflection->getParameters()[0]);
30+
$attribute = $reflection->getParameters()[0]->getAttributes()[0];
31+
var_dump($attribute->getArguments());
32+
var_dump($attribute->newInstance());
33+
34+
35+
?>
36+
--EXPECTF--
37+
array(1) {
38+
[0]=>
39+
string(6) "value1"
40+
}
41+
object(ZendTestParameterAttribute)#%d (1) {
42+
["parameter"]=>
43+
string(6) "value1"
44+
}
45+
array(1) {
46+
[0]=>
47+
string(6) "value2"
48+
}
49+
object(ZendTestParameterAttribute)#%d (1) {
50+
["parameter"]=>
51+
string(6) "value2"
52+
}
53+
array(1) {
54+
[0]=>
55+
string(6) "value3"
56+
}
57+
object(ZendTestParameterAttribute)#%d (1) {
58+
["parameter"]=>
59+
string(6) "value3"
60+
}
61+
array(1) {
62+
[0]=>
63+
string(6) "value2"
64+
}
65+
object(ZendTestParameterAttribute)#%d (1) {
66+
["parameter"]=>
67+
string(6) "value2"
68+
}
69+
array(1) {
70+
[0]=>
71+
string(6) "value4"
72+
}
73+
object(ZendTestParameterAttribute)#%d (1) {
74+
["parameter"]=>
75+
string(6) "value4"
76+
}

0 commit comments

Comments
 (0)