Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Expose ReflectionParameter::isPromoted()
  • Loading branch information
nikic committed Jun 5, 2020
commit 34c0b66c5815cc5a5de147a6b0afce0d9b8f8ab1
4 changes: 3 additions & 1 deletion Zend/zend_compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -5894,7 +5894,9 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32_t fall
zend_alloc_cache_slots(zend_type_get_num_classes(arg_info->type));
}

ZEND_TYPE_FULL_MASK(arg_info->type) |= _ZEND_ARG_INFO_FLAGS(is_ref, is_variadic);
uint32_t arg_info_flags = _ZEND_ARG_INFO_FLAGS(is_ref, is_variadic)
| (visibility ? _ZEND_IS_PROMOTED_BIT : 0);
ZEND_TYPE_FULL_MASK(arg_info->type) |= arg_info_flags;
if (opcode == ZEND_RECV) {
opline->op2.num = type_ast ?
ZEND_TYPE_FULL_MASK(arg_info->type) : MAY_BE_ANY;
Expand Down
3 changes: 3 additions & 0 deletions Zend/zend_compile.h
Original file line number Diff line number Diff line change
Expand Up @@ -941,10 +941,13 @@ ZEND_API zend_string *zend_type_to_string(zend_type type);
/* The send mode and is_variadic flag are stored as part of zend_type */
#define _ZEND_SEND_MODE_SHIFT _ZEND_TYPE_EXTRA_FLAGS_SHIFT
#define _ZEND_IS_VARIADIC_BIT (1 << (_ZEND_TYPE_EXTRA_FLAGS_SHIFT + 2))
#define _ZEND_IS_PROMOTED_BIT (1 << (_ZEND_TYPE_EXTRA_FLAGS_SHIFT + 3))
#define ZEND_ARG_SEND_MODE(arg_info) \
((ZEND_TYPE_FULL_MASK((arg_info)->type) >> _ZEND_SEND_MODE_SHIFT) & 3)
#define ZEND_ARG_IS_VARIADIC(arg_info) \
((ZEND_TYPE_FULL_MASK((arg_info)->type) & _ZEND_IS_VARIADIC_BIT) != 0)
#define ZEND_ARG_IS_PROMOTED(arg_info) \
((ZEND_TYPE_FULL_MASK((arg_info)->type) & _ZEND_IS_PROMOTED_BIT) != 0)

#define ZEND_DIM_IS (1 << 0) /* isset fetch needed for null coalesce */
#define ZEND_DIM_ALTERNATIVE_SYNTAX (1 << 1) /* deprecated curly brace usage */
Expand Down
16 changes: 16 additions & 0 deletions ext/reflection/php_reflection.c
Original file line number Diff line number Diff line change
Expand Up @@ -2870,6 +2870,22 @@ ZEND_METHOD(ReflectionParameter, isVariadic)
}
/* }}} */

/* {{{ proto public bool ReflectionParameter::isPromoted()
Returns this constructor parameter has been promoted to a property */
ZEND_METHOD(ReflectionParameter, isPromoted)
{
reflection_object *intern;
parameter_reference *param;

if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
}
GET_REFLECTION_OBJECT_PTR(param);

RETVAL_BOOL(ZEND_ARG_IS_PROMOTED(param->arg_info));
}
/* }}} */

/* {{{ proto public bool ReflectionType::allowsNull()
Returns whether parameter MAY be null */
ZEND_METHOD(ReflectionType, allowsNull)
Expand Down
2 changes: 2 additions & 0 deletions ext/reflection/php_reflection.stub.php
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,8 @@ public function getDefaultValueConstantName() {}
/** @return bool */
public function isVariadic() {}

public function isPromoted(): bool {}

/** @return ReflectionAttribute[] */
public function getAttributes(?string $name = null, int $flags = 0): array {}
}
Expand Down
4 changes: 4 additions & 0 deletions ext/reflection/php_reflection_arginfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,8 @@ ZEND_END_ARG_INFO()

#define arginfo_class_ReflectionParameter_isVariadic arginfo_class_ReflectionFunctionAbstract___clone

#define arginfo_class_ReflectionParameter_isPromoted arginfo_class_ReflectionProperty_isPromoted

#define arginfo_class_ReflectionParameter_getAttributes arginfo_class_ReflectionFunctionAbstract_getAttributes

#define arginfo_class_ReflectionType___clone arginfo_class_ReflectionFunctionAbstract___clone
Expand Down Expand Up @@ -647,6 +649,7 @@ ZEND_METHOD(ReflectionParameter, getDefaultValue);
ZEND_METHOD(ReflectionParameter, isDefaultValueConstant);
ZEND_METHOD(ReflectionParameter, getDefaultValueConstantName);
ZEND_METHOD(ReflectionParameter, isVariadic);
ZEND_METHOD(ReflectionParameter, isPromoted);
ZEND_METHOD(ReflectionParameter, getAttributes);
ZEND_METHOD(ReflectionType, allowsNull);
ZEND_METHOD(ReflectionType, __toString);
Expand Down Expand Up @@ -907,6 +910,7 @@ static const zend_function_entry class_ReflectionParameter_methods[] = {
ZEND_ME(ReflectionParameter, isDefaultValueConstant, arginfo_class_ReflectionParameter_isDefaultValueConstant, ZEND_ACC_PUBLIC)
ZEND_ME(ReflectionParameter, getDefaultValueConstantName, arginfo_class_ReflectionParameter_getDefaultValueConstantName, ZEND_ACC_PUBLIC)
ZEND_ME(ReflectionParameter, isVariadic, arginfo_class_ReflectionParameter_isVariadic, ZEND_ACC_PUBLIC)
ZEND_ME(ReflectionParameter, isPromoted, arginfo_class_ReflectionParameter_isPromoted, ZEND_ACC_PUBLIC)
ZEND_ME(ReflectionParameter, getAttributes, arginfo_class_ReflectionParameter_getAttributes, ZEND_ACC_PUBLIC)
ZEND_FE_END
};
Expand Down
27 changes: 22 additions & 5 deletions ext/reflection/tests/constructor_promotion.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ Using Reflection on promoted properties
<?php

class Test {
public $z;
public function __construct(
public int $x,
/** @SomeAnnotation() */
public string $y = "123"
public string $y = "123",
string $z = "abc",
) {}
}

Expand All @@ -17,11 +19,20 @@ echo $rc, "\n";
$y = $rc->getProperty('y');
var_dump($y->isPromoted());
var_dump($y->getDocComment());
$z = $rc->getProperty('z');
var_dump($z->isPromoted());

echo "\n";

$rp = new ReflectionParameter([Test::class, '__construct'], 'y');
var_dump($rp->isPromoted());
$rp = new ReflectionParameter([Test::class, '__construct'], 'z');
var_dump($rp->isPromoted());

?>
--EXPECTF--
Class [ <user> class Test ] {
@@ %s 3-9
@@ %s 3-11

- Constants [0] {
}
Expand All @@ -32,22 +43,28 @@ Class [ <user> class Test ] {
- Static methods [0] {
}

- Properties [2] {
- Properties [3] {
Property [ public $z = NULL ]
Property [ public int $x ]
Property [ public string $y ]
}

- Methods [1] {
Method [ <user, ctor> public method __construct ] {
@@ %s 4 - 8
@@ %s 5 - 10

- Parameters [2] {
- Parameters [3] {
Parameter #0 [ <required> int $x ]
Parameter #1 [ <optional> string $y = '123' ]
Parameter #2 [ <optional> string $z = 'abc' ]
}
}
}
}

bool(true)
string(24) "/** @SomeAnnotation() */"
bool(false)

bool(true)
bool(false)