Skip to content

Commit 54d8c55

Browse files
committed
isPartial, drop use of abstract, add flag for partial
1 parent 85ca63e commit 54d8c55

File tree

7 files changed

+39
-10
lines changed

7 files changed

+39
-10
lines changed

Zend/tests/partial_function/type-check.phpt

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ print $r->getReturnType() . PHP_EOL;
4141
1
4242
int
4343
int
44-
Function [ <user> abstract function volume ] {
44+
Function [ <user> partial function volume ] {
4545
@@ %s %d - %d
4646

4747
- Parameters [1] {

Zend/zend_closures.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ static bool zend_valid_closure_binding(
7575
zend_function *func = &closure->func;
7676
bool is_fake_closure = (func->common.fn_flags & ZEND_ACC_FAKE_CLOSURE) != 0;
7777

78-
if (func->common.fn_flags & ZEND_ACC_ABSTRACT) {
78+
if (func->common.fn_flags & ZEND_ACC_PARTIAL) {
7979
zend_error(E_WARNING, "Cannot bind an instance to a partial Closure");
8080
return 0;
8181
}
@@ -435,7 +435,7 @@ ZEND_API zval* zend_get_closure_this_ptr(zval *obj) /* {{{ */
435435
{
436436
zend_closure *closure = (zend_closure *)Z_OBJ_P(obj);
437437

438-
if (closure->func.common.fn_flags & ZEND_ACC_ABSTRACT) {
438+
if (closure->func.common.fn_flags & ZEND_ACC_PARTIAL) {
439439
return NULL;
440440
}
441441

Zend/zend_compile.h

+3
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,9 @@ typedef struct _zend_oparray_context {
357357
/* method flag used by Closure::__invoke() (int only) | | | */
358358
#define ZEND_ACC_USER_ARG_INFO (1 << 26) /* | X | | */
359359
/* | | | */
360+
/* flag used by partial application (int only) | | | */
361+
#define ZEND_ACC_PARTIAL (1 << 27) /* | X | | */
362+
/* | | | */
360363
/* trampoline is permanent | | | */
361364
#define ZEND_ACC_TRAMPOLINE_PERMANENT (1 << 29) /* | X | | */
362365
/* | | | */

Zend/zend_partial.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ static zend_object_handlers zend_partial_handlers;
3838
static zend_always_inline zend_object* zend_partial_this(zend_object *object) {
3939
while (object && instanceof_function(object->ce, zend_ce_closure)) {
4040
zend_partial *ptr = (zend_partial*) object;
41-
if (!(ptr->prototype.common.fn_flags & ZEND_ACC_ABSTRACT)) {
41+
if (!(ptr->prototype.common.fn_flags & ZEND_ACC_PARTIAL)) {
4242
break;
4343
}
4444
if (Z_TYPE(ptr->This) == IS_OBJECT) {
@@ -62,7 +62,7 @@ static zend_always_inline zend_partial* zend_partial_parent(zval *This) {
6262

6363
zend_partial *ptr = (zend_partial*) Z_OBJ_P(This);
6464

65-
if (!(ptr->prototype.common.fn_flags & ZEND_ACC_ABSTRACT)) {
65+
if (!(ptr->prototype.common.fn_flags & ZEND_ACC_PARTIAL)) {
6666
return NULL;
6767
}
6868

@@ -114,7 +114,7 @@ static zend_always_inline void zend_partial_prototype_u(zend_partial *partial, z
114114
arg++;
115115
}
116116

117-
partial->prototype.common.fn_flags |= ZEND_ACC_ABSTRACT;
117+
partial->prototype.common.fn_flags |= ZEND_ACC_PARTIAL;
118118

119119
if (partial->prototype.common.fn_flags & ZEND_ACC_VARIADIC &&
120120
partial->prototype.common.num_args > 0) {
@@ -167,7 +167,7 @@ static zend_always_inline void zend_partial_prototype_i(zend_partial *partial, z
167167
arg++;
168168
}
169169

170-
partial->prototype.common.fn_flags |= ZEND_ACC_ABSTRACT;
170+
partial->prototype.common.fn_flags |= ZEND_ACC_PARTIAL;
171171

172172
if (partial->prototype.common.fn_flags & ZEND_ACC_VARIADIC &&
173173
partial->prototype.common.num_args > 0) {

ext/reflection/php_reflection.c

+21-2
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,9 @@ static void _function_string(smart_str *str, zend_function *fptr, zend_class_ent
803803
if (fptr->common.fn_flags & ZEND_ACC_ABSTRACT) {
804804
smart_str_appends(str, "abstract ");
805805
}
806+
if (fptr->common.fn_flags & ZEND_ACC_PARTIAL) {
807+
smart_str_appends(str, "partial ");
808+
}
806809
if (fptr->common.fn_flags & ZEND_ACC_FINAL) {
807810
smart_str_appends(str, "final ");
808811
}
@@ -1569,7 +1572,9 @@ ZEND_METHOD(ReflectionFunction, __construct)
15691572
zval_ptr_dtor(reflection_prop_name(object));
15701573
}
15711574

1572-
ZVAL_STR_COPY(reflection_prop_name(object), fptr->common.function_name);
1575+
if (fptr->common.function_name) {
1576+
ZVAL_STR_COPY(reflection_prop_name(object), fptr->common.function_name);
1577+
}
15731578
intern->ptr = fptr;
15741579
intern->ref_type = REF_TYPE_FUNCTION;
15751580
if (closure_obj) {
@@ -1622,7 +1627,21 @@ ZEND_METHOD(ReflectionFunctionAbstract, isClosure)
16221627
RETURN_THROWS();
16231628
}
16241629
GET_REFLECTION_OBJECT_PTR(fptr);
1625-
RETURN_BOOL(fptr->common.fn_flags & ZEND_ACC_CLOSURE);
1630+
RETURN_BOOL(fptr->common.fn_flags & (ZEND_ACC_CLOSURE|ZEND_ACC_PARTIAL));
1631+
}
1632+
/* }}} */
1633+
1634+
/* {{{ Returns whether this is a partial closure */
1635+
ZEND_METHOD(ReflectionFunctionAbstract, isPartial)
1636+
{
1637+
reflection_object *intern;
1638+
zend_function *fptr;
1639+
1640+
if (zend_parse_parameters_none() == FAILURE) {
1641+
RETURN_THROWS();
1642+
}
1643+
GET_REFLECTION_OBJECT_PTR(fptr);
1644+
RETURN_BOOL(fptr->common.fn_flags & ZEND_ACC_PARTIAL);
16261645
}
16271646
/* }}} */
16281647

ext/reflection/php_reflection.stub.php

+3
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ public function inNamespace() {}
2929
/** @return bool */
3030
public function isClosure() {}
3131

32+
/** @return bool */
33+
public function isPartial() {}
34+
3235
/** @return bool */
3336
public function isDeprecated() {}
3437

ext/reflection/php_reflection_arginfo.h

+5-1
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: 47ac64b027cdeb0e9996147277f79fa9d6b876bd */
2+
* Stub hash: 4045473013d5e31db023746ead0ea491eb551f7e */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Reflection_getModifierNames, 0, 0, 1)
55
ZEND_ARG_TYPE_INFO(0, modifiers, IS_LONG, 0)
@@ -13,6 +13,8 @@ ZEND_END_ARG_INFO()
1313

1414
#define arginfo_class_ReflectionFunctionAbstract_isClosure arginfo_class_ReflectionFunctionAbstract_inNamespace
1515

16+
#define arginfo_class_ReflectionFunctionAbstract_isPartial arginfo_class_ReflectionFunctionAbstract_inNamespace
17+
1618
#define arginfo_class_ReflectionFunctionAbstract_isDeprecated arginfo_class_ReflectionFunctionAbstract_inNamespace
1719

1820
#define arginfo_class_ReflectionFunctionAbstract_isInternal arginfo_class_ReflectionFunctionAbstract_inNamespace
@@ -546,6 +548,7 @@ ZEND_METHOD(Reflection, getModifierNames);
546548
ZEND_METHOD(ReflectionClass, __clone);
547549
ZEND_METHOD(ReflectionFunctionAbstract, inNamespace);
548550
ZEND_METHOD(ReflectionFunctionAbstract, isClosure);
551+
ZEND_METHOD(ReflectionFunctionAbstract, isPartial);
549552
ZEND_METHOD(ReflectionFunctionAbstract, isDeprecated);
550553
ZEND_METHOD(ReflectionFunctionAbstract, isInternal);
551554
ZEND_METHOD(ReflectionFunctionAbstract, isUserDefined);
@@ -782,6 +785,7 @@ static const zend_function_entry class_ReflectionFunctionAbstract_methods[] = {
782785
ZEND_MALIAS(ReflectionClass, __clone, __clone, arginfo_class_ReflectionFunctionAbstract___clone, ZEND_ACC_PRIVATE)
783786
ZEND_ME(ReflectionFunctionAbstract, inNamespace, arginfo_class_ReflectionFunctionAbstract_inNamespace, ZEND_ACC_PUBLIC)
784787
ZEND_ME(ReflectionFunctionAbstract, isClosure, arginfo_class_ReflectionFunctionAbstract_isClosure, ZEND_ACC_PUBLIC)
788+
ZEND_ME(ReflectionFunctionAbstract, isPartial, arginfo_class_ReflectionFunctionAbstract_isPartial, ZEND_ACC_PUBLIC)
785789
ZEND_ME(ReflectionFunctionAbstract, isDeprecated, arginfo_class_ReflectionFunctionAbstract_isDeprecated, ZEND_ACC_PUBLIC)
786790
ZEND_ME(ReflectionFunctionAbstract, isInternal, arginfo_class_ReflectionFunctionAbstract_isInternal, ZEND_ACC_PUBLIC)
787791
ZEND_ME(ReflectionFunctionAbstract, isUserDefined, arginfo_class_ReflectionFunctionAbstract_isUserDefined, ZEND_ACC_PUBLIC)

0 commit comments

Comments
 (0)