Skip to content

Commit cad6653

Browse files
committed
Generate class entries from stubs for ldap, libxml, mbstring and mysqli
Closes GH-6684
1 parent 8b4ae72 commit cad6653

File tree

11 files changed

+471
-85
lines changed

11 files changed

+471
-85
lines changed

build/gen_stub.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1114,10 +1114,11 @@ private function initializeValue(string $type, $value, bool $isTyped): string
11141114
break;
11151115

11161116
case "string":
1117-
if (empty($value)) {
1117+
if ($value === "") {
11181118
$code .= "\tZVAL_EMPTY_STRING(&$zvalName);\n";
11191119
} else {
1120-
$code .= "\tZVAL_STRING(&$zvalName, \"$value\");\n";
1120+
$code .= "\tzend_string *{$zvalName}_str = zend_string_init(\"$value\", sizeof(\"$value\") - 1, 1);\n";
1121+
$code .= "\tZVAL_STR(&$zvalName, {$zvalName}_str);\n";
11211122
}
11221123
break;
11231124

ext/ldap/ldap.stub.php

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

3-
/** @generate-function-entries */
3+
/** @generate-class-entries */
44

55
#ifdef HAVE_ORALDAP
66
/** @return resource|false */

ext/ldap/ldap_arginfo.h

Lines changed: 1 addition & 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: 9d6315aeee2e3a1be51c05b65a960ed433bbe4ec */
2+
* Stub hash: 056fa51afdd7d40f9866ebd67837f5ddfa2c6236 */
33

44
#if defined(HAVE_ORALDAP)
55
ZEND_BEGIN_ARG_INFO_EX(arginfo_ldap_connect, 0, 0, 0)

ext/libxml/libxml.stub.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<?php
22

33
/** @generate-class-entries */
4+
45
class LibXMLError
56
{
67
public int $level;

ext/libxml/libxml_arginfo.h

Lines changed: 1 addition & 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: f07180b33955d802c40f3f52f6199605508df87b */
2+
* Stub hash: 252fdc1cd83d2d3322cc040baf2bf3c7fde29254 */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_libxml_set_streams_context, 0, 1, IS_VOID, 0)
55
ZEND_ARG_INFO(0, context)

ext/mbstring/mbstring.stub.php

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

3-
/** @generate-function-entries */
3+
/** @generate-class-entries */
44

55
function mb_language(?string $language = null): string|bool {}
66

ext/mbstring/mbstring_arginfo.h

Lines changed: 1 addition & 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: 51f0769423c046d612adf81091192165ad265456 */
2+
* Stub hash: eef196b29323ceb0a5d67703e62b11d0004c615b */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_mb_language, 0, 0, MAY_BE_STRING|MAY_BE_BOOL)
55
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, language, IS_STRING, 1, "null")

ext/mysqli/mysqli.c

Lines changed: 19 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -530,8 +530,6 @@ static PHP_GINIT_FUNCTION(mysqli)
530530
/* {{{ PHP_MINIT_FUNCTION */
531531
PHP_MINIT_FUNCTION(mysqli)
532532
{
533-
zend_class_entry *ce,cex;
534-
535533
REGISTER_INI_ENTRIES();
536534
#ifndef MYSQLI_USE_MYSQLND
537535
if (mysql_server_init(0, NULL, NULL)) {
@@ -564,86 +562,38 @@ PHP_MINIT_FUNCTION(mysqli)
564562
le_pmysqli = zend_register_list_destructors_ex(NULL, php_mysqli_dtor,
565563
"MySqli persistent connection", module_number);
566564

567-
INIT_CLASS_ENTRY(cex, "mysqli_sql_exception", class_mysqli_sql_exception_methods);
568-
mysqli_exception_class_entry = zend_register_internal_class_ex(&cex, spl_ce_RuntimeException);
569-
mysqli_exception_class_entry->ce_flags |= ZEND_ACC_FINAL;
570-
zend_declare_property_long(mysqli_exception_class_entry, "code", sizeof("code")-1, 0, ZEND_ACC_PROTECTED);
571-
zend_declare_property_string(mysqli_exception_class_entry, "sqlstate", sizeof("sqlstate")-1, "00000", ZEND_ACC_PROTECTED);
565+
mysqli_exception_class_entry = register_class_mysqli_sql_exception(spl_ce_RuntimeException);
572566

573-
REGISTER_MYSQLI_CLASS_ENTRY("mysqli_driver", mysqli_driver_class_entry, class_mysqli_driver_methods);
574-
ce = mysqli_driver_class_entry;
567+
mysqli_driver_class_entry = register_class_mysqli_driver();
568+
mysqli_driver_class_entry->create_object = mysqli_objects_new;
575569
zend_hash_init(&mysqli_driver_properties, 0, NULL, free_prop_handler, 1);
576570
MYSQLI_ADD_PROPERTIES(&mysqli_driver_properties, mysqli_driver_property_entries);
577-
zend_declare_property_null(ce, "client_info", sizeof("client_info") - 1, ZEND_ACC_PUBLIC);
578-
zend_declare_property_null(ce, "client_version", sizeof("client_version") - 1, ZEND_ACC_PUBLIC);
579-
zend_declare_property_null(ce, "driver_version", sizeof("driver_version") - 1, ZEND_ACC_PUBLIC);
580-
zend_declare_property_null(ce, "reconnect", sizeof("reconnect") - 1, ZEND_ACC_PUBLIC);
581-
zend_declare_property_null(ce, "report_mode", sizeof("report_mode") - 1, ZEND_ACC_PUBLIC);
582-
ce->ce_flags |= ZEND_ACC_FINAL;
583-
zend_hash_add_ptr(&classes, ce->name, &mysqli_driver_properties);
584-
585-
REGISTER_MYSQLI_CLASS_ENTRY("mysqli", mysqli_link_class_entry, class_mysqli_methods);
586-
ce = mysqli_link_class_entry;
571+
zend_hash_add_ptr(&classes, mysqli_driver_class_entry->name, &mysqli_driver_properties);
572+
573+
mysqli_link_class_entry = register_class_mysqli();
574+
mysqli_link_class_entry->create_object = mysqli_objects_new;
587575
zend_hash_init(&mysqli_link_properties, 0, NULL, free_prop_handler, 1);
588576
MYSQLI_ADD_PROPERTIES(&mysqli_link_properties, mysqli_link_property_entries);
589-
zend_declare_property_null(ce, "affected_rows", sizeof("affected_rows") - 1, ZEND_ACC_PUBLIC);
590-
zend_declare_property_null(ce, "client_info", sizeof("client_info") - 1, ZEND_ACC_PUBLIC);
591-
zend_declare_property_null(ce, "client_version", sizeof("client_version") - 1, ZEND_ACC_PUBLIC);
592-
zend_declare_property_null(ce, "connect_errno", sizeof("connect_errno") - 1, ZEND_ACC_PUBLIC);
593-
zend_declare_property_null(ce, "connect_error", sizeof("connect_error") - 1, ZEND_ACC_PUBLIC);
594-
zend_declare_property_null(ce, "errno", sizeof("errno") - 1, ZEND_ACC_PUBLIC);
595-
zend_declare_property_null(ce, "error", sizeof("error") - 1, ZEND_ACC_PUBLIC);
596-
zend_declare_property_null(ce, "error_list", sizeof("error_list") - 1, ZEND_ACC_PUBLIC);
597-
zend_declare_property_null(ce, "field_count", sizeof("field_count") - 1, ZEND_ACC_PUBLIC);
598-
zend_declare_property_null(ce, "host_info", sizeof("host_info") - 1, ZEND_ACC_PUBLIC);
599-
zend_declare_property_null(ce, "info", sizeof("info") - 1, ZEND_ACC_PUBLIC);
600-
zend_declare_property_null(ce, "insert_id", sizeof("insert_id") - 1, ZEND_ACC_PUBLIC);
601-
zend_declare_property_null(ce, "server_info", sizeof("server_info") - 1, ZEND_ACC_PUBLIC);
602-
zend_declare_property_null(ce, "server_version", sizeof("server_version") - 1, ZEND_ACC_PUBLIC);
603-
zend_declare_property_null(ce, "sqlstate", sizeof("sqlstate") - 1, ZEND_ACC_PUBLIC);
604-
zend_declare_property_null(ce, "protocol_version", sizeof("protocol_version") - 1, ZEND_ACC_PUBLIC);
605-
zend_declare_property_null(ce, "thread_id", sizeof("thread_id") - 1, ZEND_ACC_PUBLIC);
606-
zend_declare_property_null(ce, "warning_count", sizeof("warning_count") - 1, ZEND_ACC_PUBLIC);
607-
zend_hash_add_ptr(&classes, ce->name, &mysqli_link_properties);
608-
609-
REGISTER_MYSQLI_CLASS_ENTRY("mysqli_warning", mysqli_warning_class_entry, class_mysqli_warning_methods);
610-
ce = mysqli_warning_class_entry;
611-
ce->ce_flags |= ZEND_ACC_FINAL;
577+
zend_hash_add_ptr(&classes, mysqli_link_class_entry->name, &mysqli_link_properties);
578+
579+
mysqli_warning_class_entry = register_class_mysqli_warning();
580+
mysqli_warning_class_entry->create_object = mysqli_objects_new;
612581
zend_hash_init(&mysqli_warning_properties, 0, NULL, free_prop_handler, 1);
613582
MYSQLI_ADD_PROPERTIES(&mysqli_warning_properties, mysqli_warning_property_entries);
614-
zend_declare_property_null(ce, "message", sizeof("message") - 1, ZEND_ACC_PUBLIC);
615-
zend_declare_property_null(ce, "sqlstate", sizeof("sqlstate") - 1, ZEND_ACC_PUBLIC);
616-
zend_declare_property_null(ce, "errno", sizeof("errno") - 1, ZEND_ACC_PUBLIC);
617-
zend_hash_add_ptr(&classes, ce->name, &mysqli_warning_properties);
583+
zend_hash_add_ptr(&classes, mysqli_warning_class_entry->name, &mysqli_warning_properties);
618584

619-
REGISTER_MYSQLI_CLASS_ENTRY("mysqli_result", mysqli_result_class_entry, class_mysqli_result_methods);
620-
ce = mysqli_result_class_entry;
585+
mysqli_result_class_entry = register_class_mysqli_result(zend_ce_aggregate);
586+
mysqli_result_class_entry->create_object = mysqli_objects_new;
587+
mysqli_result_class_entry->get_iterator = php_mysqli_result_get_iterator;
621588
zend_hash_init(&mysqli_result_properties, 0, NULL, free_prop_handler, 1);
622589
MYSQLI_ADD_PROPERTIES(&mysqli_result_properties, mysqli_result_property_entries);
623-
zend_declare_property_null(ce, "current_field", sizeof("current_field") - 1,ZEND_ACC_PUBLIC);
624-
zend_declare_property_null(ce, "field_count", sizeof("field_count") - 1, ZEND_ACC_PUBLIC);
625-
zend_declare_property_null(ce, "lengths", sizeof("lengths") - 1, ZEND_ACC_PUBLIC);
626-
zend_declare_property_null(ce, "num_rows", sizeof("num_rows") - 1, ZEND_ACC_PUBLIC);
627-
zend_declare_property_null(ce, "type", sizeof("type") - 1, ZEND_ACC_PUBLIC);
628-
mysqli_result_class_entry->get_iterator = php_mysqli_result_get_iterator;
629-
zend_class_implements(mysqli_result_class_entry, 1, zend_ce_aggregate);
630-
zend_hash_add_ptr(&classes, ce->name, &mysqli_result_properties);
590+
zend_hash_add_ptr(&classes, mysqli_result_class_entry->name, &mysqli_result_properties);
631591

632-
REGISTER_MYSQLI_CLASS_ENTRY("mysqli_stmt", mysqli_stmt_class_entry, class_mysqli_stmt_methods);
633-
ce = mysqli_stmt_class_entry;
592+
mysqli_stmt_class_entry = register_class_mysqli_stmt();
593+
mysqli_stmt_class_entry->create_object = mysqli_objects_new;
634594
zend_hash_init(&mysqli_stmt_properties, 0, NULL, free_prop_handler, 1);
635595
MYSQLI_ADD_PROPERTIES(&mysqli_stmt_properties, mysqli_stmt_property_entries);
636-
zend_declare_property_null(ce, "affected_rows", sizeof("affected_rows") - 1, ZEND_ACC_PUBLIC);
637-
zend_declare_property_null(ce, "insert_id", sizeof("insert_id") - 1, ZEND_ACC_PUBLIC);
638-
zend_declare_property_null(ce, "num_rows", sizeof("num_rows") - 1, ZEND_ACC_PUBLIC);
639-
zend_declare_property_null(ce, "param_count", sizeof("param_count") - 1, ZEND_ACC_PUBLIC);
640-
zend_declare_property_null(ce, "field_count", sizeof("field_count") - 1, ZEND_ACC_PUBLIC);
641-
zend_declare_property_null(ce, "errno", sizeof("errno") - 1, ZEND_ACC_PUBLIC);
642-
zend_declare_property_null(ce, "error", sizeof("error") - 1, ZEND_ACC_PUBLIC);
643-
zend_declare_property_null(ce, "error_list", sizeof("error_list") - 1, ZEND_ACC_PUBLIC);
644-
zend_declare_property_null(ce, "sqlstate", sizeof("sqlstate") - 1, ZEND_ACC_PUBLIC);
645-
zend_declare_property_null(ce, "id", sizeof("id") - 1, ZEND_ACC_PUBLIC);
646-
zend_hash_add_ptr(&classes, ce->name, &mysqli_stmt_properties);
596+
zend_hash_add_ptr(&classes, mysqli_stmt_class_entry->name, &mysqli_stmt_properties);
647597

648598
/* mysqli_options */
649599
REGISTER_LONG_CONSTANT("MYSQLI_READ_DEFAULT_GROUP", MYSQL_READ_DEFAULT_GROUP, CONST_CS | CONST_PERSISTENT);

ext/mysqli/mysqli.stub.php

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

3-
/** @generate-function-entries */
3+
/** @generate-class-entries */
44

55
final class mysqli_driver
66
{
7+
/** @var string|null */
8+
public $client_info;
9+
10+
/** @var int|null */
11+
public $client_version;
12+
13+
/** @var int|null */
14+
public $driver_version;
15+
16+
/** @var bool|null */
17+
public $reconnect;
18+
19+
/** @var int|null */
20+
public $report_mode;
721
}
822

923
class mysqli
1024
{
25+
/** @var int|string|null */
26+
public $affected_rows;
27+
28+
/** @var string|null */
29+
public $client_info;
30+
31+
/** @var string|null */
32+
public $client_version;
33+
34+
/** @var int|null */
35+
public $connect_errno;
36+
37+
/** @var string|null */
38+
public $connect_error;
39+
40+
/** @var int|string|null */
41+
public $errno;
42+
43+
/** @var string|null */
44+
public $error;
45+
46+
/** @var array|null */
47+
public $error_list;
48+
49+
/** @var int|null */
50+
public $field_count;
51+
52+
/** @var string|null */
53+
public $host_info;
54+
55+
/** @var string|null */
56+
public $info;
57+
58+
/** @var int|string|null */
59+
public $insert_id;
60+
61+
/** @var string|null */
62+
public $server_info;
63+
64+
/** @var int|string|null */
65+
public $server_version;
66+
67+
/** @var string|null */
68+
public $sqlstate;
69+
70+
/** @var int|string|null */
71+
public $protocol_version;
72+
73+
/** @var int|string|null */
74+
public $thread_id;
75+
76+
/** @var int|string|null */
77+
public $warning_count;
78+
1179
public function __construct(
1280
?string $hostname = null,
1381
?string $username = null,
@@ -302,6 +370,21 @@ public function refresh(int $flags) {}
302370

303371
class mysqli_result implements IteratorAggregate
304372
{
373+
/** @var int|string|null */
374+
public $current_field;
375+
376+
/** @var int|string|null */
377+
public $field_count;
378+
379+
/** @var array|null */
380+
public $lengths;
381+
382+
/** @var int|string|null */
383+
public $num_rows;
384+
385+
/** @var int|null */
386+
public $type;
387+
305388
public function __construct(mysqli $mysql, int $result_mode = MYSQLI_STORE_RESULT) {}
306389

307390
/**
@@ -387,6 +470,36 @@ public function getIterator(): Iterator;
387470

388471
class mysqli_stmt
389472
{
473+
/** @var int|string|null */
474+
public $affected_rows;
475+
476+
/** @var int|string|null */
477+
public $insert_id;
478+
479+
/** @var int|string|null */
480+
public $num_rows;
481+
482+
/** @var int|string|null */
483+
public $param_count;
484+
485+
/** @var int|string|null */
486+
public $field_count;
487+
488+
/** @var int|string|null */
489+
public $errno;
490+
491+
/** @var string|null */
492+
public $error;
493+
494+
/** @var array|null */
495+
public $error_list;
496+
497+
/** @var string|null */
498+
public $sqlstate;
499+
500+
/** @var int|null */
501+
public $id;
502+
390503
public function __construct(mysqli $mysql, ?string $query = null) {}
391504

392505
/**
@@ -510,13 +623,24 @@ public function get_result() {}
510623

511624
final class mysqli_warning
512625
{
626+
/** @var string|null */
627+
public $message;
628+
629+
/** @var string|null */
630+
public $sqlstate;
631+
632+
/** @var int|null */
633+
public $errno;
634+
513635
private function __construct() {}
514636

515637
public function next(): bool {}
516638
}
517639

518640
final class mysqli_sql_exception extends RuntimeException
519641
{
642+
/** @var string */
643+
protected $sqlstate = "00000";
520644
}
521645

522646
function mysqli_affected_rows(mysqli $mysql): int|string {}

0 commit comments

Comments
 (0)