Skip to content

Commit 1d397fc

Browse files
authored
date: Add php_date_time_duration_create() in a new time_duration.h (#24072)
1 parent b527e1b commit 1d397fc

5 files changed

Lines changed: 63 additions & 32 deletions

File tree

‎UPGRADING.INTERNALS‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ PHP 8.7 INTERNALS UPGRADE NOTES
6262
3. Module changes
6363
========================
6464

65+
- Date:
66+
. Added php_date_time_duration_create() to create Time\Duration objects
67+
without going through the userland API.
68+
6569
- MySQLi:
6670
. Removed the reverse API. The mysqlnd_reverse_api.h header, the
6771
MYSQLND_REVERSE_API struct and the functions zval_to_mysqlnd(),

‎ext/date/php_time.h‎

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,11 @@
1717
# define PHP_DATE_TIME_H
1818

1919
# include "php.h"
20-
# include "lib/timelib.h"
2120

22-
typedef struct php_date_time_duration {
23-
timelib_duration duration;
24-
zend_object std;
25-
} php_date_time_duration;
26-
27-
# define php_date_time_duration_from_obj(obj) ZEND_CONTAINER_OF(obj, php_date_time_duration, std)
28-
29-
# define Z_DATE_TIME_DURATION_P(zv) php_date_time_duration_from_obj(Z_OBJ_P((zv)))
30-
31-
# define Z_PARAM_DATE_TIME_DURATION(d) { \
32-
zend_object *__##d; \
33-
Z_PARAM_OBJ_OF_CLASS(__##d, php_date_ce_time_duration); \
34-
d = php_date_time_duration_from_obj(__##d); \
35-
}
36-
37-
# define Z_PARAM_DATE_TIME_DURATION_OR_NULL(d) { \
38-
zend_object *__##d; \
39-
Z_PARAM_OBJ_OF_CLASS_OR_NULL(__##d, php_date_ce_time_duration); \
40-
d = __##d ? php_date_time_duration_from_obj(__##d) : NULL; \
41-
}
21+
PHP_MINIT_FUNCTION(date_time);
4222

43-
PHPAPI extern zend_class_entry *php_date_ce_time_duration;
4423
PHPAPI extern zend_class_entry *php_date_ce_time_timeexception;
4524

46-
PHP_MINIT_FUNCTION(date_time);
25+
# include "time_duration.h"
4726

4827
#endif /* PHP_DATE_TIME_H */

‎ext/date/time_duration.c‎

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include "php_date.h"
2020
#include "php_time.h"
21+
#include "time_duration.h"
2122

2223
#define NANOS_IN_SEC 1000000000
2324
#define NANOS_IN_MICRO 1000
@@ -113,7 +114,7 @@ ZEND_ATTRIBUTE_NODISCARD static inline zend_result sync_properties(php_date_time
113114
return SUCCESS;
114115
}
115116

116-
ZEND_ATTRIBUTE_NODISCARD static zend_result create_duration(zval *target, zend_ulong seconds, zend_ulong nanoseconds)
117+
ZEND_ATTRIBUTE_NODISCARD PHPAPI zend_result php_date_time_duration_create(zval *target, zend_ulong seconds, zend_ulong nanoseconds)
117118
{
118119
ZEND_ASSERT(nanoseconds < NANOS_IN_SEC);
119120

@@ -217,7 +218,7 @@ PHP_METHOD(Time_Duration, fromSeconds)
217218
RETURN_THROWS();
218219
}
219220

220-
if (create_duration(return_value, seconds, nanoseconds) == FAILURE) {
221+
if (php_date_time_duration_create(return_value, seconds, nanoseconds) == FAILURE) {
221222
RETURN_THROWS();
222223
}
223224
}
@@ -233,7 +234,7 @@ PHP_METHOD(Time_Duration, fromNanoseconds)
233234
zend_ulong seconds = nanoseconds / NANOS_IN_SEC;
234235
nanoseconds %= NANOS_IN_SEC;
235236

236-
if (create_duration(return_value, seconds, nanoseconds) == FAILURE) {
237+
if (php_date_time_duration_create(return_value, seconds, nanoseconds) == FAILURE) {
237238
RETURN_THROWS();
238239
}
239240
}
@@ -249,7 +250,7 @@ PHP_METHOD(Time_Duration, fromMicroseconds)
249250
zend_ulong seconds = microseconds / MICROS_IN_SEC;
250251
zend_ulong nanoseconds = (microseconds % MICROS_IN_SEC) * NANOS_IN_MICRO;
251252

252-
if (create_duration(return_value, seconds, nanoseconds) == FAILURE) {
253+
if (php_date_time_duration_create(return_value, seconds, nanoseconds) == FAILURE) {
253254
RETURN_THROWS();
254255
}
255256
}
@@ -265,7 +266,7 @@ PHP_METHOD(Time_Duration, fromMilliseconds)
265266
zend_ulong seconds = milliseconds / MILLIS_IN_SEC;
266267
zend_ulong nanoseconds = (milliseconds % MILLIS_IN_SEC) * NANOS_IN_MILLI;
267268

268-
if (create_duration(return_value, seconds, nanoseconds) == FAILURE) {
269+
if (php_date_time_duration_create(return_value, seconds, nanoseconds) == FAILURE) {
269270
RETURN_THROWS();
270271
}
271272
}
@@ -283,7 +284,7 @@ PHP_METHOD(Time_Duration, fromMinutes)
283284
RETURN_THROWS();
284285
}
285286

286-
if (create_duration(return_value, minutes * 60, /* nanoseconds */ 0) == FAILURE) {
287+
if (php_date_time_duration_create(return_value, minutes * 60, /* nanoseconds */ 0) == FAILURE) {
287288
RETURN_THROWS();
288289
}
289290
}
@@ -301,7 +302,7 @@ PHP_METHOD(Time_Duration, fromHours)
301302
RETURN_THROWS();
302303
}
303304

304-
if (create_duration(return_value, hours * 3600, /* nanoseconds */ 0) == FAILURE) {
305+
if (php_date_time_duration_create(return_value, hours * 3600, /* nanoseconds */ 0) == FAILURE) {
305306
RETURN_THROWS();
306307
}
307308
}
@@ -359,7 +360,7 @@ PHP_METHOD(Time_Duration, absolute)
359360
RETURN_COPY(ZEND_THIS);
360361
}
361362

362-
if (create_duration(return_value, original->duration.seconds, original->duration.nanoseconds) == FAILURE) {
363+
if (php_date_time_duration_create(return_value, original->duration.seconds, original->duration.nanoseconds) == FAILURE) {
363364
RETURN_THROWS();
364365
}
365366
}

‎ext/date/time_duration.h‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
+----------------------------------------------------------------------+
3+
| Copyright © The PHP Group and Contributors. |
4+
+----------------------------------------------------------------------+
5+
| This source file is subject to the Modified BSD License that is |
6+
| bundled with this package in the file LICENSE, and is available |
7+
| through the World Wide Web at <https://www.php.net/license/>. |
8+
| |
9+
| SPDX-License-Identifier: BSD-3-Clause |
10+
+----------------------------------------------------------------------+
11+
| Authors: Derick Rethans <derick@derickrethans.nl> |
12+
| Tim Düsterhus <timwolla@php.net> |
13+
+----------------------------------------------------------------------+
14+
*/
15+
16+
#ifndef PHP_DATE_TIME_DURATION_H
17+
# define PHP_DATE_TIME_DURATION_H
18+
19+
# include "php.h"
20+
# include "lib/timelib.h"
21+
22+
PHPAPI extern zend_class_entry *php_date_ce_time_duration;
23+
24+
typedef struct php_date_time_duration {
25+
timelib_duration duration;
26+
zend_object std;
27+
} php_date_time_duration;
28+
29+
# define php_date_time_duration_from_obj(obj) ZEND_CONTAINER_OF(obj, php_date_time_duration, std)
30+
31+
# define Z_DATE_TIME_DURATION_P(zv) php_date_time_duration_from_obj(Z_OBJ_P((zv)))
32+
33+
# define Z_PARAM_DATE_TIME_DURATION(d) { \
34+
zend_object *__##d; \
35+
Z_PARAM_OBJ_OF_CLASS(__##d, php_date_ce_time_duration); \
36+
d = php_date_time_duration_from_obj(__##d); \
37+
}
38+
39+
# define Z_PARAM_DATE_TIME_DURATION_OR_NULL(d) { \
40+
zend_object *__##d; \
41+
Z_PARAM_OBJ_OF_CLASS_OR_NULL(__##d, php_date_ce_time_duration); \
42+
d = __##d ? php_date_time_duration_from_obj(__##d) : NULL; \
43+
}
44+
45+
ZEND_ATTRIBUTE_NODISCARD PHPAPI zend_result php_date_time_duration_create(zval *target, zend_ulong seconds, zend_ulong nanoseconds);
46+
47+
#endif /* PHP_DATE_TIME_DURATION_H */

‎ext/standard/io_poll.c‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
#include "io_poll.h"
2121
#include "io_poll_arginfo.h"
2222
#include "io_poll_decl.h"
23-
#include "ext/date/php_time.h"
23+
#include "ext/date/time_duration.h"
2424

2525
/* Class entries */
2626
static zend_class_entry *php_io_poll_backend_class_entry;

0 commit comments

Comments
 (0)