Skip to content

Commit 6f795fe

Browse files
committed
Generate class entries for a few iterators
1 parent d358740 commit 6f795fe

16 files changed

+148
-60
lines changed

Zend/zend_generators.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,17 +1228,11 @@ zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *ob
12281228

12291229
void zend_register_generator_ce(void) /* {{{ */
12301230
{
1231-
zend_class_entry ce;
1232-
1233-
INIT_CLASS_ENTRY(ce, "Generator", class_Generator_methods);
1234-
zend_ce_generator = zend_register_internal_class(&ce);
1235-
zend_ce_generator->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
1231+
zend_ce_generator = register_class_Generator(zend_ce_iterator);
12361232
zend_ce_generator->create_object = zend_generator_create;
12371233
zend_ce_generator->serialize = zend_class_serialize_deny;
12381234
zend_ce_generator->unserialize = zend_class_unserialize_deny;
1239-
12401235
/* get_iterator has to be assigned *after* implementing the interface */
1241-
zend_class_implements(zend_ce_generator, 1, zend_ce_iterator);
12421236
zend_ce_generator->get_iterator = zend_generator_get_iterator;
12431237

12441238
memcpy(&zend_generator_handlers, &std_object_handlers, sizeof(zend_object_handlers));
@@ -1248,7 +1242,6 @@ void zend_register_generator_ce(void) /* {{{ */
12481242
zend_generator_handlers.clone_obj = NULL;
12491243
zend_generator_handlers.get_constructor = zend_generator_get_constructor;
12501244

1251-
INIT_CLASS_ENTRY(ce, "ClosedGeneratorException", NULL);
1252-
zend_ce_ClosedGeneratorException = zend_register_internal_class_ex(&ce, zend_ce_exception);
1245+
zend_ce_ClosedGeneratorException = register_class_ClosedGeneratorException(zend_ce_exception);
12531246
}
12541247
/* }}} */

Zend/zend_generators.stub.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
<?php
22

3-
/** @generate-function-entries */
3+
/**
4+
* @generate-function-entries
5+
* @generate-class-entries
6+
*/
47

8+
/** @strict-properties */
59
final class Generator implements Iterator
610
{
711
public function rewind(): void {}
@@ -20,3 +24,7 @@ public function throw(Throwable $exception): mixed {}
2024

2125
public function getReturn(): mixed {}
2226
}
27+
28+
class ClosedGeneratorException extends Exception
29+
{
30+
}

Zend/zend_generators_arginfo.h

Lines changed: 29 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: 18d2bb68729ff622a5c0c124a8822f7ee882c2ec */
2+
* Stub hash: 9d6c2801abbb78d402efb2b2ccdd5242438bd6a1 */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Generator_rewind, 0, 0, IS_VOID, 0)
55
ZEND_END_ARG_INFO()
@@ -46,3 +46,31 @@ static const zend_function_entry class_Generator_methods[] = {
4646
ZEND_ME(Generator, getReturn, arginfo_class_Generator_getReturn, ZEND_ACC_PUBLIC)
4747
ZEND_FE_END
4848
};
49+
50+
51+
static const zend_function_entry class_ClosedGeneratorException_methods[] = {
52+
ZEND_FE_END
53+
};
54+
55+
zend_class_entry *register_class_Generator(zend_class_entry *class_entry_Iterator)
56+
{
57+
zend_class_entry ce, *class_entry;
58+
59+
INIT_CLASS_ENTRY(ce, "Generator", class_Generator_methods);
60+
class_entry = zend_register_internal_class_ex(&ce, NULL);
61+
class_entry->ce_flags |= ZEND_ACC_FINAL|ZEND_ACC_NO_DYNAMIC_PROPERTIES;
62+
zend_class_implements(class_entry, 1, class_entry_Iterator);
63+
64+
return class_entry;
65+
}
66+
67+
zend_class_entry *register_class_ClosedGeneratorException(zend_class_entry *class_entry_Exception)
68+
{
69+
zend_class_entry ce, *class_entry;
70+
71+
INIT_CLASS_ENTRY(ce, "ClosedGeneratorException", class_ClosedGeneratorException_methods);
72+
class_entry = zend_register_internal_class_ex(&ce, class_entry_Exception);
73+
74+
return class_entry;
75+
}
76+

build/gen_stub.php

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,14 +1009,15 @@ public function getRegistration(): string
10091009
$code .= "\tclass_entry->ce_flags |= " . $this->getFlagsAsString() . ";\n";
10101010
}
10111011

1012-
foreach ($this->implements as $implements) {
1013-
$code .= "\tzend_class_implements(class_entry, 1, class_entry_" . implode("_", $implements->parts) . ");\n";
1014-
}
1012+
$implements = array_map(
1013+
function (Name $item) {
1014+
return "class_entry_" . implode("_", $item->parts);
1015+
},
1016+
$this->type === "interface" ? $this->extends : $this->implements
1017+
);
10151018

1016-
if ($this->type === "interface" && $this->extends) {
1017-
foreach ($this->extends as $extends) {
1018-
$code .= "\tzend_class_implements(class_entry, 1, class_entry_" . implode("_", $extends->parts) . ");\n";
1019-
}
1019+
if (!empty($implements)) {
1020+
$code .= "\tzend_class_implements(class_entry, " . count($implements) . ", " . implode(", ", $implements) . ");\n";
10201021
}
10211022

10221023
if ($this->alias) {

ext/intl/common/common.stub.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<?php
22

3-
/** @generate-function-entries */
3+
/**
4+
* @generate-function-entries
5+
* @generate-class-entries
6+
*/
47

58
class IntlIterator implements Iterator
69
{

ext/intl/common/common_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: cf905a693064ae31b6434e84f6c63bf7c9b804a6 */
2+
* Stub hash: 88ed89560edf65b73b27618d3dafa40d54432c2d */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_IntlIterator_current, 0, 0, 0)
55
ZEND_END_ARG_INFO()
@@ -28,3 +28,15 @@ static const zend_function_entry class_IntlIterator_methods[] = {
2828
ZEND_ME(IntlIterator, valid, arginfo_class_IntlIterator_valid, ZEND_ACC_PUBLIC)
2929
ZEND_FE_END
3030
};
31+
32+
zend_class_entry *register_class_IntlIterator(zend_class_entry *class_entry_Iterator)
33+
{
34+
zend_class_entry ce, *class_entry;
35+
36+
INIT_CLASS_ENTRY(ce, "IntlIterator", class_IntlIterator_methods);
37+
class_entry = zend_register_internal_class_ex(&ce, NULL);
38+
zend_class_implements(class_entry, 1, class_entry_Iterator);
39+
40+
return class_entry;
41+
}
42+

ext/intl/common/common_enum.cpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -286,15 +286,10 @@ PHP_METHOD(IntlIterator, valid)
286286
*/
287287
U_CFUNC void intl_register_IntlIterator_class(void)
288288
{
289-
zend_class_entry ce;
290-
291289
/* Create and register 'IntlIterator' class. */
292-
INIT_CLASS_ENTRY(ce, "IntlIterator", class_IntlIterator_methods);
293-
ce.create_object = IntlIterator_object_create;
294-
IntlIterator_ce_ptr = zend_register_internal_class(&ce);
290+
IntlIterator_ce_ptr = register_class_IntlIterator(zend_ce_iterator);
291+
IntlIterator_ce_ptr->create_object = IntlIterator_object_create;
295292
IntlIterator_ce_ptr->get_iterator = IntlIterator_get_iterator;
296-
zend_class_implements(IntlIterator_ce_ptr, 1,
297-
zend_ce_iterator);
298293

299294
memcpy(&IntlIterator_handlers, &std_object_handlers,
300295
sizeof IntlIterator_handlers);

ext/intl/resourcebundle/resourcebundle.stub.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<?php
22

3-
/** @generate-function-entries */
3+
/**
4+
* @generate-function-entries
5+
* @generate-class-entries
6+
*/
47

58
class ResourceBundle implements IteratorAggregate, Countable
69
{

ext/intl/resourcebundle/resourcebundle_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: ba5e5a57404b44d2be662e9a6b5abb1a44ccfb22 */
2+
* Stub hash: 474a5f2d63f94aaf68c92839bb343d74179111a7 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ResourceBundle___construct, 0, 0, 2)
55
ZEND_ARG_TYPE_INFO(0, locale, IS_STRING, 1)
@@ -50,3 +50,15 @@ static const zend_function_entry class_ResourceBundle_methods[] = {
5050
ZEND_ME(ResourceBundle, getIterator, arginfo_class_ResourceBundle_getIterator, ZEND_ACC_PUBLIC)
5151
ZEND_FE_END
5252
};
53+
54+
zend_class_entry *register_class_ResourceBundle(zend_class_entry *class_entry_IteratorAggregate, zend_class_entry *class_entry_Countable)
55+
{
56+
zend_class_entry ce, *class_entry;
57+
58+
INIT_CLASS_ENTRY(ce, "ResourceBundle", class_ResourceBundle_methods);
59+
class_entry = zend_register_internal_class_ex(&ce, NULL);
60+
zend_class_implements(class_entry, 2, class_entry_IteratorAggregate, class_entry_Countable);
61+
62+
return class_entry;
63+
}
64+

ext/intl/resourcebundle/resourcebundle_class.c

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -365,22 +365,15 @@ PHP_METHOD(ResourceBundle, getIterator) {
365365
*/
366366
void resourcebundle_register_class( void )
367367
{
368-
zend_class_entry ce;
369-
370-
INIT_CLASS_ENTRY( ce, "ResourceBundle", class_ResourceBundle_methods );
371-
372-
ce.create_object = ResourceBundle_object_create;
373-
ce.get_iterator = resourcebundle_get_iterator;
374-
375-
ResourceBundle_ce_ptr = zend_register_internal_class( &ce );
368+
ResourceBundle_ce_ptr = register_class_ResourceBundle(zend_ce_aggregate, zend_ce_countable);
369+
ResourceBundle_ce_ptr->create_object = ResourceBundle_object_create;
370+
ResourceBundle_ce_ptr->get_iterator = resourcebundle_get_iterator;
376371

377372
ResourceBundle_object_handlers = std_object_handlers;
378373
ResourceBundle_object_handlers.offset = XtOffsetOf(ResourceBundle_object, zend);
379374
ResourceBundle_object_handlers.clone_obj = NULL; /* ICU ResourceBundle has no clone implementation */
380375
ResourceBundle_object_handlers.free_obj = ResourceBundle_object_free;
381376
ResourceBundle_object_handlers.read_dimension = resourcebundle_array_get;
382377
ResourceBundle_object_handlers.count_elements = resourcebundle_array_count;
383-
384-
zend_class_implements(ResourceBundle_ce_ptr, 2, zend_ce_aggregate, zend_ce_countable);
385378
}
386379
/* }}} */

ext/pdo/pdo_stmt.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2562,16 +2562,11 @@ zend_object *pdo_row_new(zend_class_entry *ce)
25622562

25632563
void pdo_stmt_init(void)
25642564
{
2565-
zend_class_entry ce;
2566-
2567-
INIT_CLASS_ENTRY(ce, "PDOStatement", class_PDOStatement_methods);
2568-
pdo_dbstmt_ce = zend_register_internal_class(&ce);
2565+
pdo_dbstmt_ce = register_class_PDOStatement(zend_ce_aggregate);
25692566
pdo_dbstmt_ce->get_iterator = pdo_stmt_iter_get;
25702567
pdo_dbstmt_ce->create_object = pdo_dbstmt_new;
25712568
pdo_dbstmt_ce->serialize = zend_class_serialize_deny;
25722569
pdo_dbstmt_ce->unserialize = zend_class_unserialize_deny;
2573-
zend_class_implements(pdo_dbstmt_ce, 1, zend_ce_aggregate);
2574-
zend_declare_property_null(pdo_dbstmt_ce, "queryString", sizeof("queryString")-1, ZEND_ACC_PUBLIC);
25752570

25762571
memcpy(&pdo_dbstmt_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
25772572
pdo_dbstmt_object_handlers.offset = XtOffsetOf(pdo_stmt_t, std);
@@ -2583,9 +2578,7 @@ void pdo_stmt_init(void)
25832578
pdo_dbstmt_object_handlers.compare = dbstmt_compare;
25842579
pdo_dbstmt_object_handlers.clone_obj = NULL;
25852580

2586-
INIT_CLASS_ENTRY(ce, "PDORow", class_PDORow_methods);
2587-
pdo_row_ce = zend_register_internal_class(&ce);
2588-
pdo_row_ce->ce_flags |= ZEND_ACC_FINAL; /* when removing this a lot of handlers need to be redone */
2581+
pdo_row_ce = register_class_PDORow();
25892582
pdo_row_ce->create_object = pdo_row_new;
25902583
pdo_row_ce->serialize = zend_class_serialize_deny;
25912584
pdo_row_ce->unserialize = zend_class_unserialize_deny;

ext/pdo/pdo_stmt.stub.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<?php
22

3-
/** @generate-function-entries */
3+
/**
4+
* @generate-function-entries
5+
* @generate-class-entries
6+
*/
47

58
class PDOStatement implements IteratorAggregate
69
{

ext/pdo/pdo_stmt_arginfo.h

Lines changed: 26 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: 210a8fb9f288e3bec57da46a959207f4a230461a */
2+
* Stub hash: 2302afa184b5272007fdf81f07edc3a3e8ab84b8 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_PDOStatement_bindColumn, 0, 0, 2)
55
ZEND_ARG_TYPE_MASK(0, column, MAY_BE_STRING|MAY_BE_LONG, NULL)
@@ -134,3 +134,28 @@ static const zend_function_entry class_PDOStatement_methods[] = {
134134
static const zend_function_entry class_PDORow_methods[] = {
135135
ZEND_FE_END
136136
};
137+
138+
zend_class_entry *register_class_PDOStatement(zend_class_entry *class_entry_IteratorAggregate)
139+
{
140+
zend_class_entry ce, *class_entry;
141+
142+
INIT_CLASS_ENTRY(ce, "PDOStatement", class_PDOStatement_methods);
143+
class_entry = zend_register_internal_class_ex(&ce, NULL);
144+
zend_class_implements(class_entry, 1, class_entry_IteratorAggregate);
145+
146+
zend_declare_property_null(class_entry, "queryString", sizeof("queryString") - 1, ZEND_ACC_PUBLIC);
147+
148+
return class_entry;
149+
}
150+
151+
zend_class_entry *register_class_PDORow()
152+
{
153+
zend_class_entry ce, *class_entry;
154+
155+
INIT_CLASS_ENTRY(ce, "PDORow", class_PDORow_methods);
156+
class_entry = zend_register_internal_class_ex(&ce, NULL);
157+
class_entry->ce_flags |= ZEND_ACC_FINAL;
158+
159+
return class_entry;
160+
}
161+

ext/simplexml/simplexml.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2682,14 +2682,9 @@ ZEND_GET_MODULE(simplexml)
26822682
/* {{{ PHP_MINIT_FUNCTION(simplexml) */
26832683
PHP_MINIT_FUNCTION(simplexml)
26842684
{
2685-
zend_class_entry ce;
2686-
2687-
INIT_CLASS_ENTRY(ce, "SimpleXMLElement", class_SimpleXMLElement_methods);
2688-
sxe_class_entry = zend_register_internal_class(&ce);
2685+
sxe_class_entry = register_class_SimpleXMLElement(zend_ce_stringable, zend_ce_countable, spl_ce_RecursiveIterator);
26892686
sxe_class_entry->create_object = sxe_object_new;
26902687
sxe_class_entry->get_iterator = php_sxe_get_iterator;
2691-
zend_class_implements(sxe_class_entry, 3,
2692-
zend_ce_countable, zend_ce_stringable, spl_ce_RecursiveIterator);
26932688

26942689
memcpy(&sxe_object_handlers, &std_object_handlers, sizeof(zend_object_handlers));
26952690
sxe_object_handlers.offset = XtOffsetOf(php_sxe_object, zo);
@@ -2719,8 +2714,7 @@ PHP_MINIT_FUNCTION(simplexml)
27192714
/* TODO: Why do we have two variables for this? */
27202715
ce_SimpleXMLElement = sxe_class_entry;
27212716

2722-
INIT_CLASS_ENTRY(ce, "SimpleXMLIterator", NULL);
2723-
ce_SimpleXMLIterator = zend_register_internal_class_ex(&ce, ce_SimpleXMLElement);
2717+
ce_SimpleXMLIterator = register_class_SimpleXMLIterator(ce_SimpleXMLElement);
27242718

27252719
php_libxml_register_export(sxe_class_entry, simplexml_export_node);
27262720

ext/simplexml/simplexml.stub.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
<?php
22

3-
/** @generate-function-entries */
3+
/**
4+
* @generate-function-entries
5+
* @generate-class-entries
6+
*/
47

58
function simplexml_load_file(string $filename, ?string $class_name = SimpleXMLElement::class, int $options = 0, string $namespace_or_prefix = "", bool $is_prefix = false): SimpleXMLElement|false {}
69

ext/simplexml/simplexml_arginfo.h

Lines changed: 23 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: f8ca25a00ae1a5fed436851e88229b503c77bf31 */
2+
* Stub hash: 71a9a5aa5947f254c62889f0a7d1eb5eafc01502 */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_simplexml_load_file, 0, 1, SimpleXMLElement, MAY_BE_FALSE)
55
ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
@@ -154,3 +154,25 @@ static const zend_function_entry class_SimpleXMLElement_methods[] = {
154154
static const zend_function_entry class_SimpleXMLIterator_methods[] = {
155155
ZEND_FE_END
156156
};
157+
158+
zend_class_entry *register_class_SimpleXMLElement(zend_class_entry *class_entry_Stringable, zend_class_entry *class_entry_Countable, zend_class_entry *class_entry_RecursiveIterator)
159+
{
160+
zend_class_entry ce, *class_entry;
161+
162+
INIT_CLASS_ENTRY(ce, "SimpleXMLElement", class_SimpleXMLElement_methods);
163+
class_entry = zend_register_internal_class_ex(&ce, NULL);
164+
zend_class_implements(class_entry, 3, class_entry_Stringable, class_entry_Countable, class_entry_RecursiveIterator);
165+
166+
return class_entry;
167+
}
168+
169+
zend_class_entry *register_class_SimpleXMLIterator(zend_class_entry *class_entry_SimpleXMLElement)
170+
{
171+
zend_class_entry ce, *class_entry;
172+
173+
INIT_CLASS_ENTRY(ce, "SimpleXMLIterator", class_SimpleXMLIterator_methods);
174+
class_entry = zend_register_internal_class_ex(&ce, class_entry_SimpleXMLElement);
175+
176+
return class_entry;
177+
}
178+

0 commit comments

Comments
 (0)