Skip to content

Commit 0a81330

Browse files
authored
Use zend_enum_fetch_case_id() for poll API (GH-22367)
1 parent c02b5dc commit 0a81330

5 files changed

Lines changed: 38 additions & 42 deletions

File tree

ext/standard/io_poll.c

Lines changed: 2 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -85,26 +85,7 @@ static inline void php_io_poll_throw_failed_operation(
8585
/* Event enum to bit mask mapping */
8686
static uint32_t php_io_poll_event_enum_to_bit(zend_object *event_enum)
8787
{
88-
zval *case_name = zend_enum_fetch_case_name(event_enum);
89-
const char *name = Z_STRVAL_P(case_name);
90-
91-
if (strcmp(name, "Read") == 0) {
92-
return PHP_POLL_READ;
93-
} else if (strcmp(name, "Write") == 0) {
94-
return PHP_POLL_WRITE;
95-
} else if (strcmp(name, "Error") == 0) {
96-
return PHP_POLL_ERROR;
97-
} else if (strcmp(name, "HangUp") == 0) {
98-
return PHP_POLL_HUP;
99-
} else if (strcmp(name, "ReadHangUp") == 0) {
100-
return PHP_POLL_RDHUP;
101-
} else if (strcmp(name, "OneShot") == 0) {
102-
return PHP_POLL_ONESHOT;
103-
} else if (strcmp(name, "EdgeTriggered") == 0) {
104-
return PHP_POLL_ET;
105-
}
106-
107-
return 0;
88+
return 1 << (zend_enum_fetch_case_id(event_enum) - 1);
10889
}
10990

11091
static uint32_t php_io_poll_event_enums_to_events(zval *event_enums)
@@ -179,24 +160,7 @@ static zend_result php_io_poll_events_to_event_enums(uint32_t events, zval *even
179160
/* Backend enum name to backend type mapping */
180161
static php_poll_backend_type php_io_poll_backend_enum_to_type(zend_object *backend_enum)
181162
{
182-
zval *case_name = zend_enum_fetch_case_name(backend_enum);
183-
const char *name = Z_STRVAL_P(case_name);
184-
185-
if (strcmp(name, "Auto") == 0) {
186-
return PHP_POLL_BACKEND_AUTO;
187-
} else if (strcmp(name, "Poll") == 0) {
188-
return PHP_POLL_BACKEND_POLL;
189-
} else if (strcmp(name, "Epoll") == 0) {
190-
return PHP_POLL_BACKEND_EPOLL;
191-
} else if (strcmp(name, "Kqueue") == 0) {
192-
return PHP_POLL_BACKEND_KQUEUE;
193-
} else if (strcmp(name, "EventPorts") == 0) {
194-
return PHP_POLL_BACKEND_EVENTPORT;
195-
} else if (strcmp(name, "WSAPoll") == 0) {
196-
return PHP_POLL_BACKEND_WSAPOLL;
197-
}
198-
199-
return PHP_POLL_BACKEND_AUTO;
163+
return zend_enum_fetch_case_id(backend_enum) - 2;
200164
}
201165

202166
static const char *php_io_poll_backend_type_to_name(php_poll_backend_type type)

ext/standard/io_poll.stub.php

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

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

58
namespace Io {
69
class IoException extends \Exception {}
710
}
811

912
namespace Io\Poll {
1013

14+
// Keep in sync with main/php_poll.h!
1115
enum Backend
1216
{
1317
case Auto;
@@ -25,6 +29,7 @@ public function isAvailable(): bool {}
2529
public function supportsEdgeTriggering(): bool {}
2630
}
2731

32+
// Keep in sync with main/php_poll.h!
2833
enum Event {
2934
case Read;
3035
case Write;

ext/standard/io_poll_arginfo.h

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

ext/standard/io_poll_decl.h

Lines changed: 26 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

main/php_poll.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
/* clang-format off */
2626

27-
/* Event types */
27+
/* Event types. Keep in sync with io_poll.stub.php! */
2828
#define PHP_POLL_READ 0x01
2929
#define PHP_POLL_WRITE 0x02
3030
#define PHP_POLL_ERROR 0x04
@@ -37,7 +37,7 @@
3737
#define PHP_POLL_FLAG_PERSISTENT 0x01
3838
#define PHP_POLL_FLAG_RAW_EVENTS 0x02
3939

40-
/* Poll backend types */
40+
/* Poll backend types. Keep in sync with io_poll.stub.php! */
4141
typedef enum {
4242
PHP_POLL_BACKEND_AUTO = -1,
4343
PHP_POLL_BACKEND_POLL = 0,

0 commit comments

Comments
 (0)