Skip to content

Commit 8a87206

Browse files
authored
reflection: Add ReflectionGenerator::isClosed() (#14358)
* reflection: Add `ReflectionGenerator::isClosed()` see #14167 (comment) * Fix test expectation * Drop `{{{` / `}}}` comments around `ReflectionGenerator::isClosed()`
1 parent f90a32c commit 8a87206

File tree

8 files changed

+111
-3
lines changed

8 files changed

+111
-3
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ PHP NEWS
215215
(nielsdos)
216216
. Make ReflectionGenerator::getFunction() legal after generator termination.
217217
(timwolla)
218+
. Added ReflectionGenerator::isClosed(). (timwolla)
218219

219220
- SimpleXML:
220221
. Fixed bug GH-12192 (SimpleXML infinite loop when getName() is called

UPGRADING

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ PHP 8.4 UPGRADE NOTES
286286
now returns the attached doc comments.
287287
. ReflectionConstant was introduced.
288288
. ReflectionClassConstant::isDeprecated() was introduced.
289+
. ReflectionGenerator::isClosed() was introduced.
289290

290291
- Standard:
291292
. stream_bucket_make_writeable() and stream_bucket_new() will now return a

ext/reflection/php_reflection.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2271,7 +2271,7 @@ ZEND_METHOD(ReflectionGenerator, __construct)
22712271

22722272
#define REFLECTION_CHECK_VALID_GENERATOR(ex) \
22732273
if (!ex) { \
2274-
_DO_THROW("Cannot fetch information from a terminated Generator"); \
2274+
_DO_THROW("Cannot fetch information from a closed Generator"); \
22752275
RETURN_THROWS(); \
22762276
}
22772277

@@ -2403,6 +2403,18 @@ ZEND_METHOD(ReflectionGenerator, getExecutingGenerator)
24032403
}
24042404
/* }}} */
24052405

2406+
ZEND_METHOD(ReflectionGenerator, isClosed)
2407+
{
2408+
zend_generator *generator = (zend_generator *) Z_OBJ(Z_REFLECTION_P(ZEND_THIS)->obj);
2409+
zend_execute_data *ex = generator->execute_data;
2410+
2411+
if (zend_parse_parameters_none() == FAILURE) {
2412+
RETURN_THROWS();
2413+
}
2414+
2415+
RETURN_BOOL(ex == NULL);
2416+
}
2417+
24062418
/* {{{ Constructor. Throws an Exception in case the given method does not exist */
24072419
ZEND_METHOD(ReflectionParameter, __construct)
24082420
{

ext/reflection/php_reflection.stub.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ public function getThis(): ?object {}
163163

164164
/** @tentative-return-type */
165165
public function getExecutingGenerator(): Generator {}
166+
167+
public function isClosed(): bool {}
166168
}
167169

168170
class ReflectionMethod extends ReflectionFunctionAbstract

ext/reflection/php_reflection_arginfo.h

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

ext/reflection/tests/027.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@ try {
1919
}
2020
?>
2121
--EXPECT--
22-
Cannot fetch information from a terminated Generator
22+
Cannot fetch information from a closed Generator
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
--TEST--
2+
ReflectionGenerator::isClosed
3+
--FILE--
4+
<?php
5+
6+
function empty_generator() {
7+
return;
8+
yield;
9+
}
10+
11+
$gens = [
12+
(function() {
13+
yield;
14+
})(),
15+
empty_generator(),
16+
];
17+
18+
foreach ($gens as $gen) {
19+
$ref = new ReflectionGenerator($gen);
20+
var_dump($ref->getExecutingLine());
21+
var_dump($ref->isClosed());
22+
var_dump($ref->getExecutingLine());
23+
foreach ($gen as $dummy);
24+
var_dump($ref->isClosed());
25+
try {
26+
var_dump($ref->getExecutingLine());
27+
} catch (\Exception $e) {
28+
echo $e->getMessage(), PHP_EOL;
29+
}
30+
31+
echo PHP_EOL;
32+
}
33+
34+
?>
35+
--EXPECTF--
36+
int(10)
37+
bool(false)
38+
int(10)
39+
bool(true)
40+
Cannot fetch information from a closed Generator
41+
42+
int(4)
43+
bool(false)
44+
int(4)
45+
bool(true)
46+
Cannot fetch information from a closed Generator
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
--TEST--
2+
ReflectionGenerator::isClosed: ->valid() terminates an empty generator.
3+
--FILE--
4+
<?php
5+
6+
function empty_generator() {
7+
return;
8+
yield;
9+
}
10+
11+
$gens = [
12+
(function() {
13+
yield;
14+
})(),
15+
empty_generator(),
16+
];
17+
18+
foreach ($gens as $gen) {
19+
$ref = new ReflectionGenerator($gen);
20+
var_dump($ref->isClosed());
21+
var_dump($gen->valid());
22+
var_dump($ref->isClosed());
23+
try {
24+
var_dump($ref->getExecutingLine());
25+
} catch (\Exception $e) {
26+
echo $e->getMessage(), PHP_EOL;
27+
}
28+
29+
echo PHP_EOL;
30+
}
31+
32+
?>
33+
--EXPECTF--
34+
bool(false)
35+
bool(true)
36+
bool(false)
37+
int(11)
38+
39+
bool(false)
40+
bool(false)
41+
bool(true)
42+
Cannot fetch information from a closed Generator

0 commit comments

Comments
 (0)