Skip to content

Commit 7ba9788

Browse files
authored
ext/intl: Refactor internal callable handling for UConverter (php#16749)
1 parent 573ad05 commit 7ba9788

File tree

1 file changed

+22
-38
lines changed

1 file changed

+22
-38
lines changed

ext/intl/converter/converter.c

Lines changed: 22 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727

2828
typedef struct _php_converter_object {
2929
UConverter *src, *dest;
30-
zend_fcall_info to_cb, from_cb;
3130
zend_fcall_info_cache to_cache, from_cache;
3231
intl_error error;
3332
zend_object obj;
@@ -230,13 +229,9 @@ static void php_converter_to_u_callback(const void *context,
230229
ZVAL_LONG(&zargs[3], *pErrorCode);
231230
ZVAL_MAKE_REF(&zargs[3]);
232231

233-
objval->to_cb.param_count = 4;
234-
objval->to_cb.params = zargs;
235-
objval->to_cb.retval = &retval;
236-
if (zend_call_function(&(objval->to_cb), &(objval->to_cache)) == FAILURE) {
237-
/* Unlikely */
238-
php_converter_throw_failure(objval, U_INTERNAL_PROGRAM_ERROR, "Unexpected failure calling toUCallback()");
239-
} else if (!Z_ISUNDEF(retval)) {
232+
zend_call_known_fcc(&objval->to_cache, &retval, 4, zargs, NULL);
233+
/* When no exception is thrown */
234+
if (EXPECTED(!Z_ISUNDEF(retval))) {
240235
php_converter_append_toUnicode_target(&retval, args, objval);
241236
zval_ptr_dtor(&retval);
242237
}
@@ -297,11 +292,10 @@ static void php_converter_from_u_callback(const void *context,
297292
php_converter_object *objval = (php_converter_object*)context;
298293
zval retval;
299294
zval zargs[4];
300-
int i;
301295

302296
ZVAL_LONG(&zargs[0], reason);
303297
array_init(&zargs[1]);
304-
i = 0;
298+
int i = 0;
305299
while (i < length) {
306300
UChar32 c;
307301
U16_NEXT(codeUnits, i, length, c);
@@ -311,13 +305,9 @@ static void php_converter_from_u_callback(const void *context,
311305
ZVAL_LONG(&zargs[3], *pErrorCode);
312306
ZVAL_MAKE_REF(&zargs[3]);
313307

314-
objval->from_cb.param_count = 4;
315-
objval->from_cb.params = zargs;
316-
objval->from_cb.retval = &retval;
317-
if (zend_call_function(&(objval->from_cb), &(objval->from_cache)) == FAILURE) {
318-
/* Unlikely */
319-
php_converter_throw_failure(objval, U_INTERNAL_PROGRAM_ERROR, "Unexpected failure calling fromUCallback()");
320-
} else if (!Z_ISUNDEF(retval)) {
308+
zend_call_known_fcc(&objval->from_cache, &retval, 4, zargs, NULL);
309+
/* When no exception is thrown */
310+
if (EXPECTED(!Z_ISUNDEF(retval))) {
321311
php_converter_append_fromUnicode_target(&retval, args, objval);
322312
zval_ptr_dtor(&retval);
323313
}
@@ -503,26 +493,20 @@ PHP_METHOD(UConverter, getDestinationType) {
503493
/* }}} */
504494

505495
/* {{{ php_converter_resolve_callback */
506-
static void php_converter_resolve_callback(zval *zobj,
507-
php_converter_object *objval,
508-
const char *callback_name,
509-
zend_fcall_info *finfo,
510-
zend_fcall_info_cache *fcache) {
511-
char *errstr = NULL;
512-
zval caller;
496+
static void php_converter_resolve_callback(
497+
zend_fcall_info_cache *fcc,
498+
zend_object *obj,
499+
const char *callback_name,
500+
size_t callback_name_len
501+
) {
502+
zend_function *fn = zend_hash_str_find_ptr_lc(&obj->ce->function_table, callback_name, callback_name_len);
503+
ZEND_ASSERT(fn != NULL);
513504

514-
array_init(&caller);
515-
Z_ADDREF_P(zobj);
516-
add_index_zval(&caller, 0, zobj);
517-
add_index_string(&caller, 1, callback_name);
518-
if (zend_fcall_info_init(&caller, 0, finfo, fcache, NULL, &errstr) == FAILURE) {
519-
php_converter_throw_failure(objval, U_INTERNAL_PROGRAM_ERROR, "Error setting converter callback: %s", errstr);
520-
}
521-
zend_array_destroy(Z_ARR(caller));
522-
ZVAL_UNDEF(&finfo->function_name);
523-
if (errstr) {
524-
efree(errstr);
525-
}
505+
fcc->function_handler = fn;
506+
fcc->object = obj;
507+
fcc->called_scope = obj->ce;
508+
fcc->calling_scope = NULL;
509+
fcc->closure = NULL;
526510
}
527511
/* }}} */
528512

@@ -544,8 +528,8 @@ PHP_METHOD(UConverter, __construct) {
544528

545529
php_converter_set_encoding(objval, &(objval->src), src, src_len );
546530
php_converter_set_encoding(objval, &(objval->dest), dest, dest_len);
547-
php_converter_resolve_callback(ZEND_THIS, objval, "toUCallback", &(objval->to_cb), &(objval->to_cache));
548-
php_converter_resolve_callback(ZEND_THIS, objval, "fromUCallback", &(objval->from_cb), &(objval->from_cache));
531+
php_converter_resolve_callback(&objval->to_cache, Z_OBJ_P(ZEND_THIS), ZEND_STRL("toUCallback"));
532+
php_converter_resolve_callback(&objval->from_cache, Z_OBJ_P(ZEND_THIS), ZEND_STRL("fromUCallback"));
549533
}
550534
/* }}} */
551535

0 commit comments

Comments
 (0)