From 17a9c009fda2dd2762787c825803267a531acb20 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Tue, 5 May 2020 12:12:01 +0200 Subject: [PATCH 01/10] convert enchant resources to objects --- ext/enchant/CREDITS | 2 +- ext/enchant/enchant.c | 303 ++++++++++-------- ext/enchant/enchant.stub.php | 86 ++--- ext/enchant/enchant_arginfo.h | 52 +-- ext/enchant/php_enchant.h | 6 +- ext/enchant/tests/broker_dict_exists.phpt | 2 +- ext/enchant/tests/broker_free.phpt | 4 +- ext/enchant/tests/broker_free_01.phpt | 4 +- ext/enchant/tests/broker_free_02.phpt | 4 +- ext/enchant/tests/broker_free_dict.phpt | 4 +- ext/enchant/tests/broker_get_error.phpt | 4 +- ext/enchant/tests/broker_init.phpt | 4 +- ext/enchant/tests/broker_list_dicts.phpt | 2 +- ext/enchant/tests/broker_request_dict.phpt | 4 +- ext/enchant/tests/broker_request_dict_01.phpt | 4 +- .../tests/broker_request_pwl_dict.phpt | 6 +- ext/enchant/tests/broker_set_ordering.phpt | 4 +- ext/enchant/tests/bug13181.phpt | 19 +- ext/enchant/tests/bug53070.phpt | 2 +- ext/enchant/tests/dict_add_to_personal.phpt | 4 +- ext/enchant/tests/dict_add_to_session.phpt | 4 +- ext/enchant/tests/dict_check.phpt | 4 +- ext/enchant/tests/dict_describe.phpt | 4 +- ext/enchant/tests/dict_get_error.phpt | 4 +- ext/enchant/tests/dict_is_in_session.phpt | 4 +- ext/enchant/tests/dict_quick_check.phpt | 2 +- ext/enchant/tests/dict_quick_check_01.phpt | 4 +- ext/enchant/tests/dict_store_replacement.phpt | 4 +- ext/enchant/tests/dict_suggest.phpt | 4 +- .../tests/enchant_broker_set_dict_path.phpt | 4 +- 30 files changed, 291 insertions(+), 267 deletions(-) diff --git a/ext/enchant/CREDITS b/ext/enchant/CREDITS index 481febbfc286b..770725fd442ce 100644 --- a/ext/enchant/CREDITS +++ b/ext/enchant/CREDITS @@ -1,2 +1,2 @@ enchant -Pierre-Alain Joye, Ilia Alshanetsky +Pierre-Alain Joye, Ilia Alshanetsky, Remi Collet diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index 1c43323f95e7e..408f01d42688b 100644 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -2,10 +2,10 @@ +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ - | This source file is subject to version 3.0 of the PHP license, | + | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/3_0.txt. | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | @@ -22,38 +22,71 @@ #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" +#include "Zend/zend_interfaces.h" #include #include "php_enchant.h" #include "enchant_arginfo.h" -typedef EnchantBroker * EnchantBrokerPtr; -typedef struct _broker_struct enchant_broker; -typedef struct _dict_struct enchant_dict; - -typedef enchant_broker * enchant_brokerPtr; -typedef enchant_dict * enchant_dictPtr; - typedef struct _broker_struct { - EnchantBroker *pbroker; - enchant_dict **dict; - unsigned int dictcnt; - zend_resource *rsrc; -} _enchant_broker; + EnchantBroker *pbroker; + int nb_dict; + zend_object std; +} enchant_broker; typedef struct _dict_struct { - unsigned int id; - EnchantDict *pdict; - enchant_broker *pbroker; - zend_resource *rsrc; -} _enchant_dict; + EnchantDict *pdict; + zval zbroker; + zend_object std; +} enchant_dict; + +zend_class_entry *enchant_broker_ce; +static zend_object_handlers enchant_broker_handlers; + +static inline enchant_broker *enchant_broker_from_obj(zend_object *obj) { + return (enchant_broker *)((char *)(obj) - XtOffsetOf(enchant_broker, std)); +} + +#define Z_ENCHANT_BROKER_P(zv) enchant_broker_from_obj(Z_OBJ_P(zv)) + +static zend_object *enchant_broker_create_object(zend_class_entry *class_type) { + enchant_broker *intern = zend_object_alloc(sizeof(enchant_broker), class_type); + + zend_object_std_init(&intern->std, class_type); + object_properties_init(&intern->std, class_type); + intern->std.handlers = &enchant_broker_handlers; + + return &intern->std; +} +static zend_function *enchant_broker_get_constructor(zend_object *object) { + zend_throw_error(NULL, "Cannot directly construct EnchantBroker, use enchant_broker_init() instead"); + return NULL; +} + +zend_class_entry *enchant_dict_ce; +static zend_object_handlers enchant_dict_handlers; + +static inline enchant_dict *enchant_dict_from_obj(zend_object *obj) { + return (enchant_dict *)((char *)(obj) - XtOffsetOf(enchant_dict, std)); +} + +#define Z_ENCHANT_DICT_P(zv) enchant_dict_from_obj(Z_OBJ_P(zv)) + +static zend_object *enchant_dict_create_object(zend_class_entry *class_type) { + enchant_dict *intern = zend_object_alloc(sizeof(enchant_dict), class_type); + + zend_object_std_init(&intern->std, class_type); + object_properties_init(&intern->std, class_type); + intern->std.handlers = &enchant_dict_handlers; + + return &intern->std; +} -/* True global resources - no need for thread safety here */ -static int le_enchant_broker; -static int le_enchant_dict; +static zend_function *enchant_dict_get_constructor(zend_object *object) { + zend_throw_error(NULL, "Cannot directly construct EnchantBroker, use enchant_broker_request_dict() instead"); + return NULL; +} -/* If you declare any globals in php_enchant.h uncomment this:*/ -/*ZEND_DECLARE_MODULE_GLOBALS(enchant)*/ #define PHP_ENCHANT_MYSPELL 1 #define PHP_ENCHANT_ISPELL 2 @@ -138,52 +171,32 @@ static void php_enchant_list_dicts_fn( const char * const lang_tag, } /* }}} */ -static void php_enchant_broker_free(zend_resource *rsrc) /* {{{ */ -{ - if (rsrc->ptr) { - enchant_broker *broker = (enchant_broker *)rsrc->ptr; - if (broker) { - if (broker->pbroker) { - if (broker->dictcnt && broker->dict) { - if (broker->dict) { - int total; - total = broker->dictcnt-1; - do { - if (broker->dict[total]) { - enchant_dict *pdict = broker->dict[total]; - broker->dict[total] = NULL; - zend_list_free(pdict->rsrc); - efree(pdict); - } - total--; - } while (total>=0); - } - efree(broker->dict); - broker->dict = NULL; - } - enchant_broker_free(broker->pbroker); - } - efree(broker); +static void php_enchant_broker_free(zend_object *object) /* {{{ */ +{ + enchant_broker *broker = enchant_broker_from_obj(object); + + if (broker) { + if (broker->pbroker) { /* may have been freed by enchant_broker_free */ + enchant_broker_free(broker->pbroker); } } } /* }}} */ -static void php_enchant_dict_free(zend_resource *rsrc) /* {{{ */ +static void php_enchant_dict_free(zend_object *object) /* {{{ */ { - if (rsrc->ptr) { - enchant_dict *pdict = (enchant_dict *)rsrc->ptr; - if (pdict) { - enchant_broker *pbroker = pdict->pbroker; + enchant_dict *dict = enchant_dict_from_obj(object); - if (pdict->pdict && pbroker) { - enchant_broker_free_dict(pbroker->pbroker, pdict->pdict); - } + if (dict) { + if (dict->pdict) { /* may have been freed by enchant_broker_free_dict */ + enchant_broker *broker = Z_ENCHANT_BROKER_P(&dict->zbroker); - pbroker->dict[pdict->id] = NULL; - efree(pdict); - zend_list_delete(pbroker->rsrc); + if (broker && broker->pbroker) { + enchant_broker_free_dict(broker->pbroker, dict->pdict); + broker->nb_dict--; + zval_ptr_dtor(&dict->zbroker); + } } } } @@ -193,8 +206,34 @@ static void php_enchant_dict_free(zend_resource *rsrc) /* {{{ */ */ PHP_MINIT_FUNCTION(enchant) { - le_enchant_broker = zend_register_list_destructors_ex(php_enchant_broker_free, NULL, "enchant_broker", module_number); - le_enchant_dict = zend_register_list_destructors_ex(php_enchant_dict_free, NULL, "enchant_dict", module_number); + zend_class_entry bce, dce; + + INIT_CLASS_ENTRY(bce, "EnchantBroker", class_EnchantBroker_methods); + enchant_broker_ce = zend_register_internal_class(&bce); + enchant_broker_ce->ce_flags |= ZEND_ACC_FINAL; + enchant_broker_ce->create_object = enchant_broker_create_object; + enchant_broker_ce->serialize = zend_class_serialize_deny; + enchant_broker_ce->unserialize = zend_class_unserialize_deny; + + memcpy(&enchant_broker_handlers, &std_object_handlers, sizeof(zend_object_handlers)); + enchant_broker_handlers.offset = XtOffsetOf(enchant_broker, std); + enchant_broker_handlers.free_obj = php_enchant_broker_free; + enchant_broker_handlers.get_constructor = enchant_broker_get_constructor; + enchant_broker_handlers.clone_obj = NULL; + + INIT_CLASS_ENTRY(dce, "EnchantDict", class_EnchantDict_methods); + enchant_dict_ce = zend_register_internal_class(&dce); + enchant_dict_ce->ce_flags |= ZEND_ACC_FINAL; + enchant_dict_ce->create_object = enchant_dict_create_object; + enchant_dict_ce->serialize = zend_class_serialize_deny; + enchant_dict_ce->unserialize = zend_class_unserialize_deny; + + memcpy(&enchant_dict_handlers, &std_object_handlers, sizeof(zend_object_handlers)); + enchant_dict_handlers.offset = XtOffsetOf(enchant_dict, std); + enchant_dict_handlers.free_obj = php_enchant_dict_free; + enchant_dict_handlers.get_constructor = enchant_dict_get_constructor; + enchant_dict_handlers.clone_obj = NULL; + REGISTER_LONG_CONSTANT("ENCHANT_MYSPELL", PHP_ENCHANT_MYSPELL, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("ENCHANT_ISPELL", PHP_ENCHANT_ISPELL, CONST_CS | CONST_PERSISTENT); #ifdef HAVE_ENCHANT_GET_VERSION @@ -245,16 +284,16 @@ PHP_MINFO_FUNCTION(enchant) /* }}} */ #define PHP_ENCHANT_GET_BROKER \ - pbroker = (enchant_broker *)zend_fetch_resource(Z_RES_P(broker), "enchant_broker", le_enchant_broker); \ + pbroker = Z_ENCHANT_BROKER_P(broker); \ if (!pbroker || !pbroker->pbroker) { \ - php_error_docref(NULL, E_WARNING, "Resource broker invalid"); \ + php_error_docref(NULL, E_WARNING, "Invalid EnchantBroker object"); \ RETURN_FALSE; \ } #define PHP_ENCHANT_GET_DICT \ - pdict = (enchant_dict *)zend_fetch_resource(Z_RES_P(dict), "enchant_dict", le_enchant_dict); \ + pdict = Z_ENCHANT_DICT_P(dict); \ if (!pdict || !pdict->pdict) { \ - php_error_docref(NULL, E_WARNING, "Invalid dictionary resource."); \ + php_error_docref(NULL, E_WARNING, "Invalid EnchantDict object"); \ RETURN_FALSE; \ } @@ -270,14 +309,11 @@ PHP_FUNCTION(enchant_broker_init) } pbroker = enchant_broker_init(); - if (pbroker) { - broker = (enchant_broker *) emalloc(sizeof(enchant_broker)); + object_init_ex(return_value, enchant_broker_ce); + broker = Z_ENCHANT_BROKER_P(return_value); broker->pbroker = pbroker; - broker->dict = NULL; - broker->dictcnt = 0; - broker->rsrc = zend_register_resource(broker, le_enchant_broker); - RETURN_RES(broker->rsrc); + broker->nb_dict = 0; } else { RETURN_FALSE; } @@ -291,12 +327,19 @@ PHP_FUNCTION(enchant_broker_free) zval *broker; enchant_broker *pbroker; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &broker) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &broker, enchant_broker_ce) == FAILURE) { RETURN_THROWS(); } PHP_ENCHANT_GET_BROKER; - zend_list_close(Z_RES_P(broker)); + if (pbroker->nb_dict > 0) { + php_error_docref(NULL, E_WARNING, "Cannot free EnchantBroker object with open EnchantDict objects"); + RETURN_FALSE; + } + if (pbroker->pbroker) { + enchant_broker_free(pbroker->pbroker); + pbroker->pbroker = NULL; + } RETURN_TRUE; } /* }}} */ @@ -309,7 +352,7 @@ PHP_FUNCTION(enchant_broker_get_error) enchant_broker *pbroker; const char *msg; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &broker) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &broker, enchant_broker_ce) == FAILURE) { RETURN_THROWS(); } @@ -334,7 +377,7 @@ PHP_FUNCTION(enchant_broker_set_dict_path) char *value; size_t value_len; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rls", &broker, &dict_type, &value, &value_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ols", &broker, enchant_broker_ce, &dict_type, &value, &value_len) == FAILURE) { RETURN_THROWS(); } @@ -373,7 +416,7 @@ PHP_FUNCTION(enchant_broker_get_dict_path) zend_long dict_type; char *value; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &broker, &dict_type) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Ol", &broker, enchant_broker_ce, &dict_type) == FAILURE) { RETURN_THROWS(); } @@ -428,7 +471,7 @@ PHP_FUNCTION(enchant_broker_list_dicts) zval *broker; enchant_broker *pbroker; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &broker) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &broker, enchant_broker_ce) == FAILURE) { RETURN_THROWS(); } @@ -446,12 +489,11 @@ PHP_FUNCTION(enchant_broker_request_dict) zval *broker; enchant_broker *pbroker; enchant_dict *dict; - EnchantDict *d; + EnchantDict *pdict; char *tag; size_t taglen; - int pos; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &broker, &tag, &taglen) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &broker, enchant_broker_ce, &tag, &taglen) == FAILURE) { RETURN_THROWS(); } @@ -462,25 +504,14 @@ PHP_FUNCTION(enchant_broker_request_dict) RETURN_FALSE; } - d = enchant_broker_request_dict(pbroker->pbroker, (const char *)tag); - if (d) { - pos = pbroker->dictcnt++; - if (pbroker->dictcnt) { - pbroker->dict = (enchant_dict **)erealloc(pbroker->dict, sizeof(enchant_dict *) * pbroker->dictcnt); - } else { - pbroker->dict = (enchant_dict **)emalloc(sizeof(enchant_dict *)); - pos = 0; - } - - dict = pbroker->dict[pos] = (enchant_dict *)emalloc(sizeof(enchant_dict)); - dict->id = pos; - dict->pbroker = pbroker; - dict->pdict = d; - pbroker->dict[pos] = dict; + pdict = enchant_broker_request_dict(pbroker->pbroker, (const char *)tag); + if (pdict) { + pbroker->nb_dict++; - dict->rsrc = zend_register_resource(dict, le_enchant_dict); - GC_ADDREF(pbroker->rsrc); - RETURN_RES(dict->rsrc); + object_init_ex(return_value, enchant_dict_ce); + dict = Z_ENCHANT_DICT_P(return_value); + dict->pdict =pdict; + ZVAL_COPY(&dict->zbroker, broker); } else { RETURN_FALSE; } @@ -494,12 +525,11 @@ PHP_FUNCTION(enchant_broker_request_pwl_dict) zval *broker; enchant_broker *pbroker; enchant_dict *dict; - EnchantDict *d; - char *pwl; + EnchantDict *pdict; + const char *pwl; size_t pwllen; - int pos; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rp", &broker, &pwl, &pwllen) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Op", &broker, enchant_broker_ce, &pwl, &pwllen) == FAILURE) { RETURN_THROWS(); } @@ -509,25 +539,14 @@ PHP_FUNCTION(enchant_broker_request_pwl_dict) PHP_ENCHANT_GET_BROKER; - d = enchant_broker_request_pwl_dict(pbroker->pbroker, (const char *)pwl); - if (d) { - pos = pbroker->dictcnt++; - if (pbroker->dictcnt) { - pbroker->dict = (enchant_dict **)erealloc(pbroker->dict, sizeof(enchant_dict *) * pbroker->dictcnt); - } else { - pbroker->dict = (enchant_dict **)emalloc(sizeof(enchant_dict *)); - pos = 0; - } - - dict = pbroker->dict[pos] = (enchant_dict *)emalloc(sizeof(enchant_dict)); - dict->id = pos; - dict->pbroker = pbroker; - dict->pdict = d; - pbroker->dict[pos] = dict; + pdict = enchant_broker_request_pwl_dict(pbroker->pbroker, pwl); + if (pdict) { + pbroker->nb_dict++; - dict->rsrc = zend_register_resource(dict, le_enchant_dict); - GC_ADDREF(pbroker->rsrc); - RETURN_RES(dict->rsrc); + object_init_ex(return_value, enchant_dict_ce); + dict = Z_ENCHANT_DICT_P(return_value); + dict->pdict = pdict; + ZVAL_COPY(&dict->zbroker, broker); } else { RETURN_FALSE; } @@ -541,13 +560,23 @@ PHP_FUNCTION(enchant_broker_free_dict) zval *dict; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &dict) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &dict, enchant_dict_ce) == FAILURE) { RETURN_THROWS(); } PHP_ENCHANT_GET_DICT; - zend_list_close(Z_RES_P(dict)); + if (pdict->pdict) { + enchant_broker *broker = Z_ENCHANT_BROKER_P(&pdict->zbroker); + + if (broker && broker->pbroker) { + enchant_broker_free_dict(broker->pbroker, pdict->pdict); + broker->nb_dict--; + zval_ptr_dtor(&pdict->zbroker); + } + pdict->pdict = NULL; + } + RETURN_TRUE; } /* }}} */ @@ -561,7 +590,7 @@ PHP_FUNCTION(enchant_broker_dict_exists) size_t taglen; enchant_broker * pbroker; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &broker, &tag, &taglen) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &broker, enchant_broker_ce, &tag, &taglen) == FAILURE) { RETURN_THROWS(); } @@ -587,7 +616,7 @@ PHP_FUNCTION(enchant_broker_set_ordering) size_t ptaglen; enchant_broker * pbroker; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rss", &broker, &ptag, &ptaglen, &pordering, &porderinglen) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oss", &broker, enchant_broker_ce, &ptag, &ptaglen, &pordering, &porderinglen) == FAILURE) { RETURN_THROWS(); } @@ -606,7 +635,7 @@ PHP_FUNCTION(enchant_broker_describe) zval *broker; enchant_broker * pbroker; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &broker) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &broker, enchant_broker_ce) == FAILURE) { RETURN_THROWS(); } @@ -626,7 +655,7 @@ PHP_FUNCTION(enchant_dict_quick_check) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|z", &dict, &word, &wordlen, &sugg) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os|z", &dict, enchant_dict_ce, &word, &wordlen, &sugg) == FAILURE) { RETURN_THROWS(); } @@ -672,7 +701,7 @@ PHP_FUNCTION(enchant_dict_check) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &dict, &word, &wordlen) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { RETURN_THROWS(); } @@ -693,7 +722,7 @@ PHP_FUNCTION(enchant_dict_suggest) enchant_dict *pdict; size_t n_sugg; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &dict, &word, &wordlen) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { RETURN_THROWS(); } @@ -722,7 +751,7 @@ PHP_FUNCTION(enchant_dict_add) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &dict, &word, &wordlen) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { RETURN_THROWS(); } @@ -741,7 +770,7 @@ PHP_FUNCTION(enchant_dict_add_to_session) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &dict, &word, &wordlen) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { RETURN_THROWS(); } @@ -760,7 +789,7 @@ PHP_FUNCTION(enchant_dict_is_added) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs", &dict, &word, &wordlen) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { RETURN_THROWS(); } @@ -783,7 +812,7 @@ PHP_FUNCTION(enchant_dict_store_replacement) enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rss", &dict, &mis, &mislen, &cor, &corlen) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oss", &dict, enchant_dict_ce, &mis, &mislen, &cor, &corlen) == FAILURE) { RETURN_THROWS(); } @@ -801,7 +830,7 @@ PHP_FUNCTION(enchant_dict_get_error) enchant_dict *pdict; const char *msg; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &dict) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &dict, enchant_dict_ce) == FAILURE) { RETURN_THROWS(); } @@ -823,7 +852,7 @@ PHP_FUNCTION(enchant_dict_describe) zval *dict; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &dict) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &dict, enchant_dict_ce) == FAILURE) { RETURN_THROWS(); } diff --git a/ext/enchant/enchant.stub.php b/ext/enchant/enchant.stub.php index f235ff59ba9f4..130cd8368e23e 100644 --- a/ext/enchant/enchant.stub.php +++ b/ext/enchant/enchant.stub.php @@ -2,94 +2,72 @@ /** @generate-function-entries */ -/** @return resource|false */ -function enchant_broker_init() {} +final class EnchantBroker +{ +} -/** @param resource $broker */ -function enchant_broker_free($broker): bool {} +final class EnchantDict +{ +} -/** -* @param resource $broker -* @return string|false -*/ -function enchant_broker_get_error($broker) {} +function enchant_broker_init(): EnchantBroker|false {} + +function enchant_broker_free(EnchantBroker $broker): bool {} + +function enchant_broker_get_error(EnchantBroker $broker): string|false {} /** -* @param resource $broker * @deprecated */ -function enchant_broker_set_dict_path($broker, int $name, string $value): bool {} +function enchant_broker_set_dict_path(EnchantBroker $broker, int $name, string $value): bool {} /** -* @param resource $broker * @deprecated */ -function enchant_broker_get_dict_path($broker, int $name): string|false {} +function enchant_broker_get_dict_path(EnchantBroker$broker, int $name): string|false {} -/** @param resource $broker */ -function enchant_broker_list_dicts($broker): array {} +function enchant_broker_list_dicts(EnchantBroker$broker): array {} -/** - * @param resource $broker - * @return resource|false - */ -function enchant_broker_request_dict($broker, string $tag) {} +function enchant_broker_request_dict(EnchantBroker$broker, string $tag): EnchantDict|false {} -/** - * @param resource $broker - * @return resource|false - */ -function enchant_broker_request_pwl_dict($broker, string $filename) {} +function enchant_broker_request_pwl_dict(EnchantBroker $broker, string $filename): EnchantDict|false {} -/** @param resource $dict */ -function enchant_broker_free_dict($dict): bool {} +function enchant_broker_free_dict(EnchantDict $dict): bool {} -/** @param resource $broker */ -function enchant_broker_dict_exists($broker, string $tag): bool {} +function enchant_broker_dict_exists(EnchantBroker $broker, string $tag): bool {} -/** @param resource $broker */ -function enchant_broker_set_ordering($broker, string $tag, string $ordering): bool {} +function enchant_broker_set_ordering(EnchantBroker $broker, string $tag, string $ordering): bool {} -/** @param resource $broker */ -function enchant_broker_describe($broker): array {} +function enchant_broker_describe(EnchantBroker $broker): array {} -/** @param resource $dict */ -function enchant_dict_quick_check($dict, string $word, &$suggestions = null): bool {} +function enchant_dict_quick_check(EnchantDict $dict, string $word, &$suggestions = null): bool {} -/** @param resource $dict */ -function enchant_dict_check($dict, string $word): bool {} +function enchant_dict_check(EnchantDict $dict, string $word): bool {} -/** @param resource $dict */ -function enchant_dict_suggest($dict, string $word): ?array {} +function enchant_dict_suggest(EnchantDict $dict, string $word): ?array {} -/** @param resource $dict */ -function enchant_dict_add($dict, string $word): void {} +function enchant_dict_add(EnchantDict $dict, string $word): void {} /** -* @param resource $dict * @alias enchant_dict_add * @deprecated */ -function enchant_dict_add_to_personal($dict, string $word): void {} +function enchant_dict_add_to_personal(EnchantDict $dict, string $word): void {} -/** @param resource $dict */ -function enchant_dict_add_to_session($dict, string $word): void {} +function enchant_dict_add_to_session(EnchantDict $dict, string $word): void {} -/** @param resource $dict */ -function enchant_dict_is_added($dict, string $word): bool {} +function enchant_dict_is_added(EnchantDict $dict, string $word): bool {} /** * @param resource $dict * @alias enchant_dict_is_added * @deprecated */ -function enchant_dict_is_in_session($dict, string $word): bool {} +function enchant_dict_is_in_session(EnchantDict $dict, string $word): bool {} + +function enchant_dict_store_replacement(EnchantDict $dict, string $mis, string $cor): void {} -/** @param resource $dict */ -function enchant_dict_store_replacement($dict, string $mis, string $cor): void {} +function enchant_dict_get_error(EnchantDict $dict): string|false {} -/** @param resource $dict */ -function enchant_dict_get_error($dict): string|false {} +function enchant_dict_describe(EnchantDict $dict): array {} -/** @param resource $dict */ -function enchant_dict_describe($dict): array {} diff --git a/ext/enchant/enchant_arginfo.h b/ext/enchant/enchant_arginfo.h index b0906d9a3dfdc..af72d0e1ed304 100644 --- a/ext/enchant/enchant_arginfo.h +++ b/ext/enchant/enchant_arginfo.h @@ -1,52 +1,52 @@ /* This is a generated file, edit the .stub.php file instead. */ -ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_broker_init, 0, 0, 0) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_enchant_broker_init, 0, 0, EnchantBroker, MAY_BE_FALSE) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_broker_free, 0, 1, _IS_BOOL, 0) - ZEND_ARG_INFO(0, broker) + ZEND_ARG_OBJ_INFO(0, broker, EnchantBroker, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_broker_get_error, 0, 0, 1) - ZEND_ARG_INFO(0, broker) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_enchant_broker_get_error, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) + ZEND_ARG_OBJ_INFO(0, broker, EnchantBroker, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_broker_set_dict_path, 0, 3, _IS_BOOL, 0) - ZEND_ARG_INFO(0, broker) + ZEND_ARG_OBJ_INFO(0, broker, EnchantBroker, 0) ZEND_ARG_TYPE_INFO(0, name, IS_LONG, 0) ZEND_ARG_TYPE_INFO(0, value, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_enchant_broker_get_dict_path, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) - ZEND_ARG_INFO(0, broker) + ZEND_ARG_OBJ_INFO(0, broker, EnchantBroker, 0) ZEND_ARG_TYPE_INFO(0, name, IS_LONG, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_broker_list_dicts, 0, 1, IS_ARRAY, 0) - ZEND_ARG_INFO(0, broker) + ZEND_ARG_OBJ_INFO(0, broker, EnchantBroker, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_broker_request_dict, 0, 0, 2) - ZEND_ARG_INFO(0, broker) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_enchant_broker_request_dict, 0, 2, EnchantDict, MAY_BE_FALSE) + ZEND_ARG_OBJ_INFO(0, broker, EnchantBroker, 0) ZEND_ARG_TYPE_INFO(0, tag, IS_STRING, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_broker_request_pwl_dict, 0, 0, 2) - ZEND_ARG_INFO(0, broker) +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_enchant_broker_request_pwl_dict, 0, 2, EnchantDict, MAY_BE_FALSE) + ZEND_ARG_OBJ_INFO(0, broker, EnchantBroker, 0) ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_broker_free_dict, 0, 1, _IS_BOOL, 0) - ZEND_ARG_INFO(0, dict) + ZEND_ARG_OBJ_INFO(0, dict, EnchantDict, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_broker_dict_exists, 0, 2, _IS_BOOL, 0) - ZEND_ARG_INFO(0, broker) + ZEND_ARG_OBJ_INFO(0, broker, EnchantBroker, 0) ZEND_ARG_TYPE_INFO(0, tag, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_broker_set_ordering, 0, 3, _IS_BOOL, 0) - ZEND_ARG_INFO(0, broker) + ZEND_ARG_OBJ_INFO(0, broker, EnchantBroker, 0) ZEND_ARG_TYPE_INFO(0, tag, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, ordering, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -54,23 +54,23 @@ ZEND_END_ARG_INFO() #define arginfo_enchant_broker_describe arginfo_enchant_broker_list_dicts ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_dict_quick_check, 0, 2, _IS_BOOL, 0) - ZEND_ARG_INFO(0, dict) + ZEND_ARG_OBJ_INFO(0, dict, EnchantDict, 0) ZEND_ARG_TYPE_INFO(0, word, IS_STRING, 0) ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, suggestions, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_dict_check, 0, 2, _IS_BOOL, 0) - ZEND_ARG_INFO(0, dict) + ZEND_ARG_OBJ_INFO(0, dict, EnchantDict, 0) ZEND_ARG_TYPE_INFO(0, word, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_dict_suggest, 0, 2, IS_ARRAY, 1) - ZEND_ARG_INFO(0, dict) + ZEND_ARG_OBJ_INFO(0, dict, EnchantDict, 0) ZEND_ARG_TYPE_INFO(0, word, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_dict_add, 0, 2, IS_VOID, 0) - ZEND_ARG_INFO(0, dict) + ZEND_ARG_OBJ_INFO(0, dict, EnchantDict, 0) ZEND_ARG_TYPE_INFO(0, word, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -83,17 +83,17 @@ ZEND_END_ARG_INFO() #define arginfo_enchant_dict_is_in_session arginfo_enchant_dict_check ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_dict_store_replacement, 0, 3, IS_VOID, 0) - ZEND_ARG_INFO(0, dict) + ZEND_ARG_OBJ_INFO(0, dict, EnchantDict, 0) ZEND_ARG_TYPE_INFO(0, mis, IS_STRING, 0) ZEND_ARG_TYPE_INFO(0, cor, IS_STRING, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_enchant_dict_get_error, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) - ZEND_ARG_INFO(0, dict) + ZEND_ARG_OBJ_INFO(0, dict, EnchantDict, 0) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_dict_describe, 0, 1, IS_ARRAY, 0) - ZEND_ARG_INFO(0, dict) + ZEND_ARG_OBJ_INFO(0, dict, EnchantDict, 0) ZEND_END_ARG_INFO() @@ -146,3 +146,13 @@ static const zend_function_entry ext_functions[] = { ZEND_FE(enchant_dict_describe, arginfo_enchant_dict_describe) ZEND_FE_END }; + + +static const zend_function_entry class_EnchantBroker_methods[] = { + ZEND_FE_END +}; + + +static const zend_function_entry class_EnchantDict_methods[] = { + ZEND_FE_END +}; diff --git a/ext/enchant/php_enchant.h b/ext/enchant/php_enchant.h index 3c2b8d3c47b85..431deb82060c0 100644 --- a/ext/enchant/php_enchant.h +++ b/ext/enchant/php_enchant.h @@ -2,10 +2,10 @@ +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ - | This source file is subject to version 3.0 of the PHP license, | + | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | - | available at through the world-wide-web at | - | http://www.php.net/license/3_0.txt. | + | available through the world-wide-web at the following url: | + | http://www.php.net/license/3_01.txt. | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | diff --git a/ext/enchant/tests/broker_dict_exists.phpt b/ext/enchant/tests/broker_dict_exists.phpt index 3033c10e57f4e..fff2155da1a55 100644 --- a/ext/enchant/tests/broker_dict_exists.phpt +++ b/ext/enchant/tests/broker_dict_exists.phpt @@ -5,7 +5,7 @@ marcosptf - --SKIPIF-- --FILE-- diff --git a/ext/enchant/tests/broker_free.phpt b/ext/enchant/tests/broker_free.phpt index 6964895962d35..15dd5c625c971 100644 --- a/ext/enchant/tests/broker_free.phpt +++ b/ext/enchant/tests/broker_free.phpt @@ -5,12 +5,12 @@ marcosptf - --SKIPIF-- --FILE-- --SKIPIF-- --FILE-- --SKIPIF-- --FILE-- @@ -14,7 +14,7 @@ $broker = enchant_broker_init(); $dicts = enchant_broker_list_dicts($broker); $newWord = array("iLoveJava","iLoveJavascript","iLoveRuby","iLovePerl","iLoveAwk","iLoveC"); -if (is_resource($broker)) { +if (is_object($broker)) { echo("OK\n"); $requestDict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']); diff --git a/ext/enchant/tests/broker_free_dict.phpt b/ext/enchant/tests/broker_free_dict.phpt index 7b37cde6a4d41..9d85cf8b30da6 100644 --- a/ext/enchant/tests/broker_free_dict.phpt +++ b/ext/enchant/tests/broker_free_dict.phpt @@ -5,7 +5,7 @@ marcosptf - --SKIPIF-- --FILE-- @@ -13,7 +13,7 @@ if(!is_array(enchant_broker_list_dicts(enchant_broker_init()))) {die("skip, no d $broker = enchant_broker_init(); $dicts = enchant_broker_list_dicts($broker); $newWord = "iLoveJava"; -if (is_resource($broker)) { +if (is_object($broker)) { echo("OK\n"); $requestDict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']); diff --git a/ext/enchant/tests/broker_get_error.phpt b/ext/enchant/tests/broker_get_error.phpt index 93f6130c249f4..ca568306a67cc 100644 --- a/ext/enchant/tests/broker_get_error.phpt +++ b/ext/enchant/tests/broker_get_error.phpt @@ -5,12 +5,12 @@ marcosptf - --SKIPIF-- --FILE-- --SKIPIF-- --FILE-- --SKIPIF-- --FILE-- @@ -17,7 +17,7 @@ if (is_array($dicts)) { if (count($dicts)) { $dict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']); - if (is_resource($dict)) { + if (is_object($dict)) { echo "OK\n"; } else { echo "fail to request " . $dicts[0]['lang_tag']; diff --git a/ext/enchant/tests/broker_request_dict_01.phpt b/ext/enchant/tests/broker_request_dict_01.phpt index 2c2905c959313..fad527c4c46e1 100644 --- a/ext/enchant/tests/broker_request_dict_01.phpt +++ b/ext/enchant/tests/broker_request_dict_01.phpt @@ -5,7 +5,7 @@ marcosptf - --SKIPIF-- --FILE-- @@ -15,7 +15,7 @@ $dicts = enchant_broker_list_dicts($broker); if (is_array($dicts)) { $dict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']); - if (is_resource($dict)) { + if (is_object($dict)) { echo("OK\n"); } else { echo("fail to request " . $dicts[0]['lang_tag']); diff --git a/ext/enchant/tests/broker_request_pwl_dict.phpt b/ext/enchant/tests/broker_request_pwl_dict.phpt index a8beadba6c37f..605a019db0efa 100644 --- a/ext/enchant/tests/broker_request_pwl_dict.phpt +++ b/ext/enchant/tests/broker_request_pwl_dict.phpt @@ -5,18 +5,18 @@ marcosptf - --SKIPIF-- --FILE-- --SKIPIF-- --FILE-- @@ -14,7 +14,7 @@ $broker = enchant_broker_init(); $dicts = enchant_broker_list_dicts($broker); $comma = ";"; -if (is_resource($broker)) { +if (is_object($broker)) { echo("OK\n"); if (enchant_broker_set_ordering($broker,$dicts[0]['lang_tag'],$comma)) { echo("OK\n"); diff --git a/ext/enchant/tests/bug13181.phpt b/ext/enchant/tests/bug13181.phpt index 881318cb339e1..b15668684d98d 100644 --- a/ext/enchant/tests/bug13181.phpt +++ b/ext/enchant/tests/bug13181.phpt @@ -52,9 +52,16 @@ $rDict = get_dict($rbroker); var_dump($rDict); ?> --EXPECTF-- -resource(%d) of type (enchant_dict) -resource(%d) of type (enchant_dict) -resource(%d) of type (enchant_broker) -resource(%d) of type (enchant_broker) -resource(%d) of type (enchant_dict) -resource(%d) of type (enchant_dict) +object(EnchantDict)#%d (0) { +} +object(EnchantDict)#%d (0) { +} +object(EnchantBroker)#%d (0) { +} +object(EnchantBroker)#%d (0) { +} +object(EnchantDict)#%d (0) { +} +object(EnchantDict)#%d (0) { +} + diff --git a/ext/enchant/tests/bug53070.phpt b/ext/enchant/tests/bug53070.phpt index c2ad05094ddf0..237a95a3f61dd 100644 --- a/ext/enchant/tests/bug53070.phpt +++ b/ext/enchant/tests/bug53070.phpt @@ -3,7 +3,7 @@ Bug #53070 (enchant_broker_get_path crashes if no path is set) --SKIPIF-- ")) die('skip libenchant v1 only'); ?> --FILE-- diff --git a/ext/enchant/tests/dict_add_to_personal.phpt b/ext/enchant/tests/dict_add_to_personal.phpt index 0c38734c5a5a2..6e914ca9cbf70 100644 --- a/ext/enchant/tests/dict_add_to_personal.phpt +++ b/ext/enchant/tests/dict_add_to_personal.phpt @@ -5,7 +5,7 @@ marcosptf - --SKIPIF-- --FILE-- @@ -14,7 +14,7 @@ $broker = enchant_broker_init(); $dicts = enchant_broker_list_dicts($broker); $newWord = "iLoveJava"; -if (is_resource($broker)) { +if (is_object($broker)) { echo("OK\n"); $requestDict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']); diff --git a/ext/enchant/tests/dict_add_to_session.phpt b/ext/enchant/tests/dict_add_to_session.phpt index 49c4769fb586f..a9692beada0ae 100644 --- a/ext/enchant/tests/dict_add_to_session.phpt +++ b/ext/enchant/tests/dict_add_to_session.phpt @@ -5,7 +5,7 @@ marcosptf - --SKIPIF-- --FILE-- @@ -14,7 +14,7 @@ $broker = enchant_broker_init(); $dicts = enchant_broker_list_dicts($broker); $newWord = "iLoveJavaScript"; -if (is_resource($broker)) { +if (is_object($broker)) { echo("OK\n"); $requestDict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']); diff --git a/ext/enchant/tests/dict_check.phpt b/ext/enchant/tests/dict_check.phpt index ac0fc6fb4b079..dc11d5d7bcc4a 100644 --- a/ext/enchant/tests/dict_check.phpt +++ b/ext/enchant/tests/dict_check.phpt @@ -5,7 +5,7 @@ marcosptf - --SKIPIF-- --FILE-- @@ -14,7 +14,7 @@ $broker = enchant_broker_init(); $dicts = enchant_broker_list_dicts($broker); $newWord = "java"; -if (is_resource($broker)) { +if (is_object($broker)) { echo("OK\n"); $requestDict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']); diff --git a/ext/enchant/tests/dict_describe.phpt b/ext/enchant/tests/dict_describe.phpt index d63cfae178e56..c8215b9d95679 100644 --- a/ext/enchant/tests/dict_describe.phpt +++ b/ext/enchant/tests/dict_describe.phpt @@ -5,7 +5,7 @@ marcosptf - --SKIPIF-- --FILE-- @@ -13,7 +13,7 @@ if (!is_array(enchant_broker_list_dicts(enchant_broker_init()))) {die("skip, no $broker = enchant_broker_init(); $dicts = enchant_broker_list_dicts($broker); -if (is_resource($broker)) { +if (is_object($broker)) { echo("OK\n"); $requestDict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']); diff --git a/ext/enchant/tests/dict_get_error.phpt b/ext/enchant/tests/dict_get_error.phpt index 340dcdd89a235..ca4ee8c138f56 100644 --- a/ext/enchant/tests/dict_get_error.phpt +++ b/ext/enchant/tests/dict_get_error.phpt @@ -5,7 +5,7 @@ marcosptf - --SKIPIF-- --FILE-- @@ -13,7 +13,7 @@ if (!is_array(enchant_broker_list_dicts(enchant_broker_init()))) {die("skip, no $broker = enchant_broker_init(); $dicts = enchant_broker_list_dicts($broker); -if (is_resource($broker)) { +if (is_object($broker)) { echo("OK\n"); $requestDict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']); diff --git a/ext/enchant/tests/dict_is_in_session.phpt b/ext/enchant/tests/dict_is_in_session.phpt index 3084fc7122cbd..c87dbec95ea18 100644 --- a/ext/enchant/tests/dict_is_in_session.phpt +++ b/ext/enchant/tests/dict_is_in_session.phpt @@ -5,7 +5,7 @@ marcosptf - --SKIPIF-- --FILE-- @@ -14,7 +14,7 @@ $broker = enchant_broker_init(); $dicts = enchant_broker_list_dicts($broker); $newWord = "aspell"; -if (is_resource($broker)) { +if (is_object($broker)) { echo("OK\n"); $requestDict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']); diff --git a/ext/enchant/tests/dict_quick_check.phpt b/ext/enchant/tests/dict_quick_check.phpt index a7196b659dda5..34db0192453c1 100644 --- a/ext/enchant/tests/dict_quick_check.phpt +++ b/ext/enchant/tests/dict_quick_check.phpt @@ -5,7 +5,7 @@ marcosptf - --SKIPIF-- --SKIPIF-- --FILE-- @@ -14,7 +14,7 @@ $broker = enchant_broker_init(); $dicts = enchant_broker_list_dicts($broker); $word = "aspell"; -if (is_resource($broker)) { +if (is_object($broker)) { echo("OK\n"); $requestDict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']); diff --git a/ext/enchant/tests/dict_store_replacement.phpt b/ext/enchant/tests/dict_store_replacement.phpt index eb01dcbc57f6b..b3a5186315415 100644 --- a/ext/enchant/tests/dict_store_replacement.phpt +++ b/ext/enchant/tests/dict_store_replacement.phpt @@ -5,7 +5,7 @@ marcosptf - --SKIPIF-- --FILE-- @@ -15,7 +15,7 @@ $dicts = enchant_broker_list_dicts($broker); $wrongWord = "sava"; $rightWord = "java"; -if (is_resource($broker)) { +if (is_object($broker)) { echo("OK\n"); $requestDict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']); diff --git a/ext/enchant/tests/dict_suggest.phpt b/ext/enchant/tests/dict_suggest.phpt index 6854eeb65b36a..49b9dae81d83b 100644 --- a/ext/enchant/tests/dict_suggest.phpt +++ b/ext/enchant/tests/dict_suggest.phpt @@ -5,7 +5,7 @@ marcosptf - --SKIPIF-- --FILE-- @@ -14,7 +14,7 @@ $broker = enchant_broker_init(); $dicts = enchant_broker_list_dicts($broker); $sugs = "soong"; -if (is_resource($broker)) { +if (is_object($broker)) { echo("OK\n"); $requestDict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']); diff --git a/ext/enchant/tests/enchant_broker_set_dict_path.phpt b/ext/enchant/tests/enchant_broker_set_dict_path.phpt index a072c2555519e..0c9da82092f54 100644 --- a/ext/enchant/tests/enchant_broker_set_dict_path.phpt +++ b/ext/enchant/tests/enchant_broker_set_dict_path.phpt @@ -6,7 +6,7 @@ marcosptf - --SKIPIF-- ")) die('skip libenchant v1 only'); ?> @@ -18,7 +18,7 @@ $backEndDictType2 = "ISPELL"; $dictTypeValue1 = 1; $dictTypeValue2 = 2; -if (is_resource($broker)) { +if (is_object($broker)) { echo("OK\n"); if (enchant_broker_set_dict_path($broker, $dictTypeValue1, $backEndDictType1)) { From 2f258fc598ea3ceda137054c8ffce031804f5e58 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Tue, 5 May 2020 14:18:55 +0200 Subject: [PATCH 02/10] deprecate enchant_broker_free* (use unset instead) --- ext/enchant/enchant.stub.php | 12 +++++++++--- ext/enchant/enchant_arginfo.h | 4 ++-- ext/enchant/tests/broker_describe.phpt | 6 +++--- ext/enchant/tests/broker_free.phpt | 4 +++- ext/enchant/tests/broker_free_01.phpt | 4 ++-- ext/enchant/tests/broker_free_02.phpt | 6 +++--- ext/enchant/tests/broker_free_dict.phpt | 4 +++- ext/enchant/tests/broker_list_dicts.phpt | 4 ++-- ext/enchant/tests/bug13181.phpt | 4 ++-- 9 files changed, 29 insertions(+), 19 deletions(-) diff --git a/ext/enchant/enchant.stub.php b/ext/enchant/enchant.stub.php index 130cd8368e23e..84d62699161fd 100644 --- a/ext/enchant/enchant.stub.php +++ b/ext/enchant/enchant.stub.php @@ -12,6 +12,9 @@ final class EnchantDict function enchant_broker_init(): EnchantBroker|false {} +/** +* @deprecated +*/ function enchant_broker_free(EnchantBroker $broker): bool {} function enchant_broker_get_error(EnchantBroker $broker): string|false {} @@ -24,14 +27,17 @@ function enchant_broker_set_dict_path(EnchantBroker $broker, int $name, string $ /** * @deprecated */ -function enchant_broker_get_dict_path(EnchantBroker$broker, int $name): string|false {} +function enchant_broker_get_dict_path(EnchantBroker $broker, int $name): string|false {} -function enchant_broker_list_dicts(EnchantBroker$broker): array {} +function enchant_broker_list_dicts(EnchantBroker $broker): array {} -function enchant_broker_request_dict(EnchantBroker$broker, string $tag): EnchantDict|false {} +function enchant_broker_request_dict(EnchantBroker $broker, string $tag): EnchantDict|false {} function enchant_broker_request_pwl_dict(EnchantBroker $broker, string $filename): EnchantDict|false {} +/** +* @deprecated +*/ function enchant_broker_free_dict(EnchantDict $dict): bool {} function enchant_broker_dict_exists(EnchantBroker $broker, string $tag): bool {} diff --git a/ext/enchant/enchant_arginfo.h b/ext/enchant/enchant_arginfo.h index af72d0e1ed304..8ef95d02a675d 100644 --- a/ext/enchant/enchant_arginfo.h +++ b/ext/enchant/enchant_arginfo.h @@ -122,14 +122,14 @@ ZEND_FUNCTION(enchant_dict_describe); static const zend_function_entry ext_functions[] = { ZEND_FE(enchant_broker_init, arginfo_enchant_broker_init) - ZEND_FE(enchant_broker_free, arginfo_enchant_broker_free) + ZEND_DEP_FE(enchant_broker_free, arginfo_enchant_broker_free) ZEND_FE(enchant_broker_get_error, arginfo_enchant_broker_get_error) ZEND_DEP_FE(enchant_broker_set_dict_path, arginfo_enchant_broker_set_dict_path) ZEND_DEP_FE(enchant_broker_get_dict_path, arginfo_enchant_broker_get_dict_path) ZEND_FE(enchant_broker_list_dicts, arginfo_enchant_broker_list_dicts) ZEND_FE(enchant_broker_request_dict, arginfo_enchant_broker_request_dict) ZEND_FE(enchant_broker_request_pwl_dict, arginfo_enchant_broker_request_pwl_dict) - ZEND_FE(enchant_broker_free_dict, arginfo_enchant_broker_free_dict) + ZEND_DEP_FE(enchant_broker_free_dict, arginfo_enchant_broker_free_dict) ZEND_FE(enchant_broker_dict_exists, arginfo_enchant_broker_dict_exists) ZEND_FE(enchant_broker_set_ordering, arginfo_enchant_broker_set_ordering) ZEND_FE(enchant_broker_describe, arginfo_enchant_broker_describe) diff --git a/ext/enchant/tests/broker_describe.phpt b/ext/enchant/tests/broker_describe.phpt index 11adb1397d562..07134ae50fa2b 100644 --- a/ext/enchant/tests/broker_describe.phpt +++ b/ext/enchant/tests/broker_describe.phpt @@ -17,12 +17,12 @@ if (!$broker) { } if (!enchant_broker_describe($broker)) { - enchant_broker_free($broker); + @enchant_broker_free($broker); echo "skip: No broker providers found\n"; } -enchant_broker_free($broker); +@enchant_broker_free($broker); ?> --FILE-- ---EXPECT-- +--EXPECTF-- OK + +Deprecated: Function enchant_broker_free() is deprecated in %s OK diff --git a/ext/enchant/tests/broker_free_01.phpt b/ext/enchant/tests/broker_free_01.phpt index 819397529ecc3..5b129a0b294a5 100644 --- a/ext/enchant/tests/broker_free_01.phpt +++ b/ext/enchant/tests/broker_free_01.phpt @@ -1,5 +1,5 @@ --TEST-- -enchant_broker_free() function +@enchant_broker_free() function --CREDITS-- marcosptf - --SKIPIF-- @@ -13,7 +13,7 @@ $broker = enchant_broker_init(); if (is_object($broker)) { echo("OK\n"); - if (enchant_broker_free($broker)) { + if (@enchant_broker_free($broker)) { echo("OK\n"); } else { echo("broker free failed\n"); diff --git a/ext/enchant/tests/broker_free_02.phpt b/ext/enchant/tests/broker_free_02.phpt index d85efbb665b7b..036ae3a2ab0da 100644 --- a/ext/enchant/tests/broker_free_02.phpt +++ b/ext/enchant/tests/broker_free_02.phpt @@ -1,5 +1,5 @@ --TEST-- -enchant_broker_free() function +@enchant_broker_free() function --CREDITS-- marcosptf - --SKIPIF-- @@ -27,10 +27,10 @@ if (is_object($broker)) { if (NULL === $AddtoPersonalDict) { var_dump($AddtoPersonalDict); - if (enchant_broker_free_dict($requestDict)) { + if (@enchant_broker_free_dict($requestDict)) { echo("OK\n"); - if (enchant_broker_free($broker)) { + if (@enchant_broker_free($broker)) { echo("OK\n"); } else { diff --git a/ext/enchant/tests/broker_free_dict.phpt b/ext/enchant/tests/broker_free_dict.phpt index 9d85cf8b30da6..20bc66e5e9790 100644 --- a/ext/enchant/tests/broker_free_dict.phpt +++ b/ext/enchant/tests/broker_free_dict.phpt @@ -44,9 +44,11 @@ if (is_object($broker)) { } echo "OK\n"; ?> ---EXPECT-- +--EXPECTF-- OK OK NULL + +Deprecated: Function enchant_broker_free_dict() is deprecated in %s OK OK diff --git a/ext/enchant/tests/broker_list_dicts.phpt b/ext/enchant/tests/broker_list_dicts.phpt index b354c58b08a6c..ad4121512c2ee 100644 --- a/ext/enchant/tests/broker_list_dicts.phpt +++ b/ext/enchant/tests/broker_list_dicts.phpt @@ -17,12 +17,12 @@ if (!$broker) { } if (!enchant_broker_list_dicts($broker)) { - enchant_broker_free($broker); + @enchant_broker_free($broker); echo "skip: No broker dicts installed\n"; } -enchant_broker_free($broker); +@enchant_broker_free($broker); ?> --FILE-- --FILE-- Date: Tue, 5 May 2020 16:07:03 +0200 Subject: [PATCH 03/10] add OO interface --- ext/enchant/enchant.c | 94 +++++++++++++++++++++++------------ ext/enchant/enchant.stub.php | 51 +++++++++++++++++++ ext/enchant/enchant_arginfo.h | 84 +++++++++++++++++++++++++++++++ 3 files changed, 198 insertions(+), 31 deletions(-) diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index 408f01d42688b..17d2d868deb88 100644 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -23,6 +23,8 @@ #include "php_ini.h" #include "ext/standard/info.h" #include "Zend/zend_interfaces.h" +#include "Zend/zend_exceptions.h" +#include "../spl/spl_exceptions.h" #include #include "php_enchant.h" #include "enchant_arginfo.h" @@ -58,11 +60,6 @@ static zend_object *enchant_broker_create_object(zend_class_entry *class_type) { return &intern->std; } -static zend_function *enchant_broker_get_constructor(zend_object *object) { - zend_throw_error(NULL, "Cannot directly construct EnchantBroker, use enchant_broker_init() instead"); - return NULL; -} - zend_class_entry *enchant_dict_ce; static zend_object_handlers enchant_dict_handlers; @@ -82,12 +79,6 @@ static zend_object *enchant_dict_create_object(zend_class_entry *class_type) { return &intern->std; } -static zend_function *enchant_dict_get_constructor(zend_object *object) { - zend_throw_error(NULL, "Cannot directly construct EnchantBroker, use enchant_broker_request_dict() instead"); - return NULL; -} - - #define PHP_ENCHANT_MYSPELL 1 #define PHP_ENCHANT_ISPELL 2 @@ -218,7 +209,6 @@ PHP_MINIT_FUNCTION(enchant) memcpy(&enchant_broker_handlers, &std_object_handlers, sizeof(zend_object_handlers)); enchant_broker_handlers.offset = XtOffsetOf(enchant_broker, std); enchant_broker_handlers.free_obj = php_enchant_broker_free; - enchant_broker_handlers.get_constructor = enchant_broker_get_constructor; enchant_broker_handlers.clone_obj = NULL; INIT_CLASS_ENTRY(dce, "EnchantDict", class_EnchantDict_methods); @@ -231,7 +221,6 @@ PHP_MINIT_FUNCTION(enchant) memcpy(&enchant_dict_handlers, &std_object_handlers, sizeof(zend_object_handlers)); enchant_dict_handlers.offset = XtOffsetOf(enchant_dict, std); enchant_dict_handlers.free_obj = php_enchant_dict_free; - enchant_dict_handlers.get_constructor = enchant_dict_get_constructor; enchant_dict_handlers.clone_obj = NULL; REGISTER_LONG_CONSTANT("ENCHANT_MYSPELL", PHP_ENCHANT_MYSPELL, CONST_CS | CONST_PERSISTENT); @@ -303,6 +292,7 @@ PHP_FUNCTION(enchant_broker_init) { enchant_broker *broker; EnchantBroker *pbroker; + zval *this = getThis(); if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -310,10 +300,16 @@ PHP_FUNCTION(enchant_broker_init) pbroker = enchant_broker_init(); if (pbroker) { - object_init_ex(return_value, enchant_broker_ce); - broker = Z_ENCHANT_BROKER_P(return_value); + if (this) { + broker = Z_ENCHANT_BROKER_P(this); + } else { + object_init_ex(return_value, enchant_broker_ce); + broker = Z_ENCHANT_BROKER_P(return_value); + } broker->pbroker = pbroker; broker->nb_dict = 0; + } else if (this) { + zend_throw_exception(spl_ce_RuntimeException, "Can't create a new EnchantBroker", 0); } else { RETURN_FALSE; } @@ -352,7 +348,7 @@ PHP_FUNCTION(enchant_broker_get_error) enchant_broker *pbroker; const char *msg; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &broker, enchant_broker_ce) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &broker, enchant_broker_ce) == FAILURE) { RETURN_THROWS(); } @@ -471,7 +467,7 @@ PHP_FUNCTION(enchant_broker_list_dicts) zval *broker; enchant_broker *pbroker; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &broker, enchant_broker_ce) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &broker, enchant_broker_ce) == FAILURE) { RETURN_THROWS(); } @@ -493,7 +489,7 @@ PHP_FUNCTION(enchant_broker_request_dict) char *tag; size_t taglen; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &broker, enchant_broker_ce, &tag, &taglen) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &broker, enchant_broker_ce, &tag, &taglen) == FAILURE) { RETURN_THROWS(); } @@ -518,6 +514,42 @@ PHP_FUNCTION(enchant_broker_request_dict) } /* }}} */ +/* {{{ proto resource EnchantDict::__construct(resource broker, string tag) + create a new dictionary using tag, the non-empty language tag you wish to request + a dictionary for ("en_US", "de_DE", ...) */ +PHP_METHOD(EnchantDict, __construct) +{ + zval *broker; + enchant_broker *pbroker; + enchant_dict *dict; + EnchantDict *pdict; + char *tag; + size_t taglen; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &broker, enchant_broker_ce, &tag, &taglen) == FAILURE) { + RETURN_THROWS(); + } + + PHP_ENCHANT_GET_BROKER; + + if (taglen == 0) { + php_error_docref(NULL, E_WARNING, "Tag cannot be empty"); + RETURN_FALSE; + } + + pdict = enchant_broker_request_dict(pbroker->pbroker, (const char *)tag); + if (pdict) { + pbroker->nb_dict++; + + dict = Z_ENCHANT_DICT_P(ZEND_THIS); + dict->pdict =pdict; + ZVAL_COPY(&dict->zbroker, broker); + } else { + zend_throw_exception(spl_ce_RuntimeException, "Can't create a new EnchantBroker", 0); + } +} +/* }}} */ + /* {{{ proto resource enchant_broker_request_pwl_dict(resource broker, string filename) creates a dictionary using a PWL file. A PWL file is personal word file one word per line. It must exist before the call.*/ PHP_FUNCTION(enchant_broker_request_pwl_dict) @@ -529,7 +561,7 @@ PHP_FUNCTION(enchant_broker_request_pwl_dict) const char *pwl; size_t pwllen; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Op", &broker, enchant_broker_ce, &pwl, &pwllen) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Op", &broker, enchant_broker_ce, &pwl, &pwllen) == FAILURE) { RETURN_THROWS(); } @@ -590,7 +622,7 @@ PHP_FUNCTION(enchant_broker_dict_exists) size_t taglen; enchant_broker * pbroker; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &broker, enchant_broker_ce, &tag, &taglen) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &broker, enchant_broker_ce, &tag, &taglen) == FAILURE) { RETURN_THROWS(); } @@ -616,7 +648,7 @@ PHP_FUNCTION(enchant_broker_set_ordering) size_t ptaglen; enchant_broker * pbroker; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oss", &broker, enchant_broker_ce, &ptag, &ptaglen, &pordering, &porderinglen) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Oss", &broker, enchant_broker_ce, &ptag, &ptaglen, &pordering, &porderinglen) == FAILURE) { RETURN_THROWS(); } @@ -635,7 +667,7 @@ PHP_FUNCTION(enchant_broker_describe) zval *broker; enchant_broker * pbroker; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &broker, enchant_broker_ce) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &broker, enchant_broker_ce) == FAILURE) { RETURN_THROWS(); } @@ -655,7 +687,7 @@ PHP_FUNCTION(enchant_dict_quick_check) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os|z", &dict, enchant_dict_ce, &word, &wordlen, &sugg) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os|z", &dict, enchant_dict_ce, &word, &wordlen, &sugg) == FAILURE) { RETURN_THROWS(); } @@ -701,7 +733,7 @@ PHP_FUNCTION(enchant_dict_check) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { RETURN_THROWS(); } @@ -722,7 +754,7 @@ PHP_FUNCTION(enchant_dict_suggest) enchant_dict *pdict; size_t n_sugg; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { RETURN_THROWS(); } @@ -751,7 +783,7 @@ PHP_FUNCTION(enchant_dict_add) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { RETURN_THROWS(); } @@ -770,7 +802,7 @@ PHP_FUNCTION(enchant_dict_add_to_session) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { RETURN_THROWS(); } @@ -789,7 +821,7 @@ PHP_FUNCTION(enchant_dict_is_added) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Os", &dict, enchant_dict_ce, &word, &wordlen) == FAILURE) { RETURN_THROWS(); } @@ -812,7 +844,7 @@ PHP_FUNCTION(enchant_dict_store_replacement) enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Oss", &dict, enchant_dict_ce, &mis, &mislen, &cor, &corlen) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "Oss", &dict, enchant_dict_ce, &mis, &mislen, &cor, &corlen) == FAILURE) { RETURN_THROWS(); } @@ -830,7 +862,7 @@ PHP_FUNCTION(enchant_dict_get_error) enchant_dict *pdict; const char *msg; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &dict, enchant_dict_ce) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &dict, enchant_dict_ce) == FAILURE) { RETURN_THROWS(); } @@ -852,7 +884,7 @@ PHP_FUNCTION(enchant_dict_describe) zval *dict; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "O", &dict, enchant_dict_ce) == FAILURE) { + if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "O", &dict, enchant_dict_ce) == FAILURE) { RETURN_THROWS(); } diff --git a/ext/enchant/enchant.stub.php b/ext/enchant/enchant.stub.php index 84d62699161fd..0a02bb4276d96 100644 --- a/ext/enchant/enchant.stub.php +++ b/ext/enchant/enchant.stub.php @@ -4,10 +4,61 @@ final class EnchantBroker { + /** @alias enchant_broker_init */ + public function __construct() {} + + /** @alias enchant_broker_get_error */ + public function getError(): string|false {} + + /** @alias enchant_broker_list_dicts */ + public function listDicts(): array {} + + /** @alias enchant_broker_request_dict */ + public function requestDict(string $tag): EnchantDict|false {} + + /** @alias enchant_broker_request_pwl_dict */ + public function requestPWL(string $filename): EnchantDict|false {} + + /** @alias enchant_broker_dict_exists */ + public function isDict(string $tag): bool {} + + /** @alias enchant_broker_set_ordering */ + public function setOrdering(string $tag, string $ordering): bool {} + + /** @alias enchant_broker_describe */ + public function describe($broker): array {} } final class EnchantDict { + public function __construct(EnchantBroker $broker, string $tag) {} + + /** @alias enchant_dict_quick_check */ + public function checkAndSuggest(string $word, &$suggestions = UNKNOWN): bool {} + + /** @alias enchant_dict_check */ + public function check(string $word): bool {} + + /** @alias enchant_dict_suggest */ + public function suggest(string $word): ?array {} + + /** @alias enchant_dict_add */ + public function add(string $word): void {} + + /** @alias enchant_dict_add_to_session */ + public function addToSession(string $word): void {} + + /** @alias enchant_dict_is_added */ + public function isAdded(string $word): bool {} + + /** @alias enchant_dict_store_replacement */ + public function storeReplacement(string $mis, string $cor): void {} + + /** @alias enchant_dict_get_error */ + public function getError(): string|false {} + + /** @alias enchant_dict_describe */ + public function describe(): array {} } function enchant_broker_init(): EnchantBroker|false {} diff --git a/ext/enchant/enchant_arginfo.h b/ext/enchant/enchant_arginfo.h index 8ef95d02a675d..d1b1f4cf1a7f8 100644 --- a/ext/enchant/enchant_arginfo.h +++ b/ext/enchant/enchant_arginfo.h @@ -96,6 +96,71 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_dict_describe, 0, 1, IS_ ZEND_ARG_OBJ_INFO(0, dict, EnchantDict, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_EnchantBroker___construct, 0, 0, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_EnchantBroker_getError, 0, 0, MAY_BE_STRING|MAY_BE_FALSE) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantBroker_listDicts, 0, 0, IS_ARRAY, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_EnchantBroker_requestDict, 0, 1, EnchantDict, MAY_BE_FALSE) + ZEND_ARG_TYPE_INFO(0, tag, IS_STRING, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_EnchantBroker_requestPWL, 0, 1, EnchantDict, MAY_BE_FALSE) + ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantBroker_isDict, 0, 1, _IS_BOOL, 0) + ZEND_ARG_TYPE_INFO(0, tag, IS_STRING, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantBroker_setOrdering, 0, 2, _IS_BOOL, 0) + ZEND_ARG_TYPE_INFO(0, tag, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, ordering, IS_STRING, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantBroker_describe, 0, 1, IS_ARRAY, 0) + ZEND_ARG_INFO(0, broker) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_EnchantDict___construct, 0, 0, 2) + ZEND_ARG_OBJ_INFO(0, broker, EnchantBroker, 0) + ZEND_ARG_TYPE_INFO(0, tag, IS_STRING, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantDict_checkAndSuggest, 0, 1, _IS_BOOL, 0) + ZEND_ARG_TYPE_INFO(0, word, IS_STRING, 0) + ZEND_ARG_INFO(1, suggestions) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantDict_check, 0, 1, _IS_BOOL, 0) + ZEND_ARG_TYPE_INFO(0, word, IS_STRING, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantDict_suggest, 0, 1, IS_ARRAY, 1) + ZEND_ARG_TYPE_INFO(0, word, IS_STRING, 0) +ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantDict_add, 0, 1, IS_VOID, 0) + ZEND_ARG_TYPE_INFO(0, word, IS_STRING, 0) +ZEND_END_ARG_INFO() + +#define arginfo_class_EnchantDict_addToSession arginfo_class_EnchantDict_add + +#define arginfo_class_EnchantDict_isAdded arginfo_class_EnchantDict_check + +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantDict_storeReplacement, 0, 2, IS_VOID, 0) + ZEND_ARG_TYPE_INFO(0, mis, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, cor, IS_STRING, 0) +ZEND_END_ARG_INFO() + +#define arginfo_class_EnchantDict_getError arginfo_class_EnchantBroker_getError + +#define arginfo_class_EnchantDict_describe arginfo_class_EnchantBroker_listDicts + ZEND_FUNCTION(enchant_broker_init); ZEND_FUNCTION(enchant_broker_free); @@ -118,6 +183,7 @@ ZEND_FUNCTION(enchant_dict_is_added); ZEND_FUNCTION(enchant_dict_store_replacement); ZEND_FUNCTION(enchant_dict_get_error); ZEND_FUNCTION(enchant_dict_describe); +ZEND_METHOD(EnchantDict, __construct); static const zend_function_entry ext_functions[] = { @@ -149,10 +215,28 @@ static const zend_function_entry ext_functions[] = { static const zend_function_entry class_EnchantBroker_methods[] = { + ZEND_ME_MAPPING(__construct, enchant_broker_init, arginfo_class_EnchantBroker___construct, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(getError, enchant_broker_get_error, arginfo_class_EnchantBroker_getError, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(listDicts, enchant_broker_list_dicts, arginfo_class_EnchantBroker_listDicts, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(requestDict, enchant_broker_request_dict, arginfo_class_EnchantBroker_requestDict, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(requestPWL, enchant_broker_request_pwl_dict, arginfo_class_EnchantBroker_requestPWL, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(isDict, enchant_broker_dict_exists, arginfo_class_EnchantBroker_isDict, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(setOrdering, enchant_broker_set_ordering, arginfo_class_EnchantBroker_setOrdering, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(describe, enchant_broker_describe, arginfo_class_EnchantBroker_describe, ZEND_ACC_PUBLIC) ZEND_FE_END }; static const zend_function_entry class_EnchantDict_methods[] = { + ZEND_ME(EnchantDict, __construct, arginfo_class_EnchantDict___construct, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(checkAndSuggest, enchant_dict_quick_check, arginfo_class_EnchantDict_checkAndSuggest, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(check, enchant_dict_check, arginfo_class_EnchantDict_check, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(suggest, enchant_dict_suggest, arginfo_class_EnchantDict_suggest, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(add, enchant_dict_add, arginfo_class_EnchantDict_add, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(addToSession, enchant_dict_add_to_session, arginfo_class_EnchantDict_addToSession, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(isAdded, enchant_dict_is_added, arginfo_class_EnchantDict_isAdded, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(storeReplacement, enchant_dict_store_replacement, arginfo_class_EnchantDict_storeReplacement, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(getError, enchant_dict_get_error, arginfo_class_EnchantDict_getError, ZEND_ACC_PUBLIC) + ZEND_ME_MAPPING(describe, enchant_dict_describe, arginfo_class_EnchantDict_describe, ZEND_ACC_PUBLIC) ZEND_FE_END }; From a92c8333fa52c027755c7d97db19931dadaa40e4 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Tue, 5 May 2020 16:49:40 +0200 Subject: [PATCH 04/10] - enchant_broker_list_dicts()` and `enchant_broker_describe()` return `null` if no broker is available - raise exception on Invalid object --- ext/enchant/enchant.c | 10 +++++----- ext/enchant/enchant.stub.php | 8 ++++---- ext/enchant/enchant_arginfo.h | 11 +++++------ 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index 17d2d868deb88..bce1648390a07 100644 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -275,15 +275,15 @@ PHP_MINFO_FUNCTION(enchant) #define PHP_ENCHANT_GET_BROKER \ pbroker = Z_ENCHANT_BROKER_P(broker); \ if (!pbroker || !pbroker->pbroker) { \ - php_error_docref(NULL, E_WARNING, "Invalid EnchantBroker object"); \ - RETURN_FALSE; \ + zend_value_error("Invalid or uninitialized EnchantBroker object"); \ + RETURN_THROWS(); \ } #define PHP_ENCHANT_GET_DICT \ pdict = Z_ENCHANT_DICT_P(dict); \ if (!pdict || !pdict->pdict) { \ - php_error_docref(NULL, E_WARNING, "Invalid EnchantDict object"); \ - RETURN_FALSE; \ + zend_value_error("Invalid or uninitialized EnchantBroker object"); \ + RETURN_THROWS(); \ } /* {{{ proto resource enchant_broker_init() @@ -545,7 +545,7 @@ PHP_METHOD(EnchantDict, __construct) dict->pdict =pdict; ZVAL_COPY(&dict->zbroker, broker); } else { - zend_throw_exception(spl_ce_RuntimeException, "Can't create a new EnchantBroker", 0); + zend_throw_exception(spl_ce_RuntimeException, "Can't create a new EnchantDict", 0); } } /* }}} */ diff --git a/ext/enchant/enchant.stub.php b/ext/enchant/enchant.stub.php index 0a02bb4276d96..1cc29dbed6292 100644 --- a/ext/enchant/enchant.stub.php +++ b/ext/enchant/enchant.stub.php @@ -11,7 +11,7 @@ public function __construct() {} public function getError(): string|false {} /** @alias enchant_broker_list_dicts */ - public function listDicts(): array {} + public function listDicts(): ?array {} /** @alias enchant_broker_request_dict */ public function requestDict(string $tag): EnchantDict|false {} @@ -26,7 +26,7 @@ public function isDict(string $tag): bool {} public function setOrdering(string $tag, string $ordering): bool {} /** @alias enchant_broker_describe */ - public function describe($broker): array {} + public function describe(): ?array {} } final class EnchantDict @@ -80,7 +80,7 @@ function enchant_broker_set_dict_path(EnchantBroker $broker, int $name, string $ */ function enchant_broker_get_dict_path(EnchantBroker $broker, int $name): string|false {} -function enchant_broker_list_dicts(EnchantBroker $broker): array {} +function enchant_broker_list_dicts(EnchantBroker $broker): ?array {} function enchant_broker_request_dict(EnchantBroker $broker, string $tag): EnchantDict|false {} @@ -95,7 +95,7 @@ function enchant_broker_dict_exists(EnchantBroker $broker, string $tag): bool {} function enchant_broker_set_ordering(EnchantBroker $broker, string $tag, string $ordering): bool {} -function enchant_broker_describe(EnchantBroker $broker): array {} +function enchant_broker_describe(EnchantBroker $broker): ?array {} function enchant_dict_quick_check(EnchantDict $dict, string $word, &$suggestions = null): bool {} diff --git a/ext/enchant/enchant_arginfo.h b/ext/enchant/enchant_arginfo.h index d1b1f4cf1a7f8..b5fe8eaa69ec5 100644 --- a/ext/enchant/enchant_arginfo.h +++ b/ext/enchant/enchant_arginfo.h @@ -22,7 +22,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_enchant_broker_get_dict_path, 0, ZEND_ARG_TYPE_INFO(0, name, IS_LONG, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_broker_list_dicts, 0, 1, IS_ARRAY, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_enchant_broker_list_dicts, 0, 1, IS_ARRAY, 1) ZEND_ARG_OBJ_INFO(0, broker, EnchantBroker, 0) ZEND_END_ARG_INFO() @@ -102,7 +102,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_EnchantBroker_getError, 0, 0, MAY_BE_STRING|MAY_BE_FALSE) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantBroker_listDicts, 0, 0, IS_ARRAY, 0) +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantBroker_listDicts, 0, 0, IS_ARRAY, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_EnchantBroker_requestDict, 0, 1, EnchantDict, MAY_BE_FALSE) @@ -122,9 +122,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantBroker_setOrdering, ZEND_ARG_TYPE_INFO(0, ordering, IS_STRING, 0) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantBroker_describe, 0, 1, IS_ARRAY, 0) - ZEND_ARG_INFO(0, broker) -ZEND_END_ARG_INFO() +#define arginfo_class_EnchantBroker_describe arginfo_class_EnchantBroker_listDicts ZEND_BEGIN_ARG_INFO_EX(arginfo_class_EnchantDict___construct, 0, 0, 2) ZEND_ARG_OBJ_INFO(0, broker, EnchantBroker, 0) @@ -159,7 +157,8 @@ ZEND_END_ARG_INFO() #define arginfo_class_EnchantDict_getError arginfo_class_EnchantBroker_getError -#define arginfo_class_EnchantDict_describe arginfo_class_EnchantBroker_listDicts +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantDict_describe, 0, 0, IS_ARRAY, 0) +ZEND_END_ARG_INFO() ZEND_FUNCTION(enchant_broker_init); From 614ba0b2afad62e755d7ed358d05a7145b7f5304 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Tue, 5 May 2020 16:52:45 +0200 Subject: [PATCH 05/10] add tests --- ext/enchant/tests/invalidobj.phpt | 27 ++++++++++++++++ ext/enchant/tests/object.phpt | 53 +++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 ext/enchant/tests/invalidobj.phpt create mode 100644 ext/enchant/tests/object.phpt diff --git a/ext/enchant/tests/invalidobj.phpt b/ext/enchant/tests/invalidobj.phpt new file mode 100644 index 0000000000000..7be030a69d084 --- /dev/null +++ b/ext/enchant/tests/invalidobj.phpt @@ -0,0 +1,27 @@ +--TEST-- +invalid object raise exception() function +--SKIPIF-- + +--FILE-- +getMessage()."\n"; + } +} else { + exit("init failed\n"); +} +echo "OK\n"; +?> +--EXPECTF-- +OK +Invalid or uninitialized EnchantBroker object +OK diff --git a/ext/enchant/tests/object.phpt b/ext/enchant/tests/object.phpt new file mode 100644 index 0000000000000..712ea50d3d6da --- /dev/null +++ b/ext/enchant/tests/object.phpt @@ -0,0 +1,53 @@ +--TEST-- +Object API +--SKIPIF-- + +--FILE-- +describe())); +$dicts = $broker->listDicts(); +var_dump($lang = $dicts[0]['lang_tag']); + +echo "+ Dict\n"; +var_dump($dict = $broker->requestDict($lang)); +var_dump(is_array($dict->describe())); +unset($dict); + +echo "+ Check\n"; +var_dump($dict = new EnchantDict($broker, $lang)); +$w = "ElePHPant"; +var_dump($dict->check($w)); +var_dump($dict->isAdded($w)); +$dict->addToSession($w); +var_dump($dict->check($w)); +var_dump($dict->isAdded($w)); + +echo "+ Suggest\n"; +var_dump(is_array($dict->suggest("soong"))); +?> +OK +--EXPECTF-- ++ Broker +object(EnchantBroker)#%d (0) { +} +bool(true) +string(%d) "%s" ++ Dict +object(EnchantDict)#%d (0) { +} +bool(true) ++ Check +object(EnchantDict)#%d (0) { +} +bool(false) +bool(false) +bool(true) +bool(true) ++ Suggest +bool(true) +OK From c0becc71a51e1eaed147cc2db8ac9764d4f5bff8 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Tue, 5 May 2020 18:23:16 +0200 Subject: [PATCH 06/10] typo --- ext/enchant/enchant.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index bce1648390a07..b8fad254b15ca 100644 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -282,7 +282,7 @@ PHP_MINFO_FUNCTION(enchant) #define PHP_ENCHANT_GET_DICT \ pdict = Z_ENCHANT_DICT_P(dict); \ if (!pdict || !pdict->pdict) { \ - zend_value_error("Invalid or uninitialized EnchantBroker object"); \ + zend_value_error("Invalid or uninitialized EnchantDict object"); \ RETURN_THROWS(); \ } From c2cee36205f71eb7596e3de72e6da455b66adc2e Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Wed, 6 May 2020 07:47:24 +0200 Subject: [PATCH 07/10] fix mem leak (thanks cmb) --- ext/enchant/enchant.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index b8fad254b15ca..996bc8e710397 100644 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -171,6 +171,7 @@ static void php_enchant_broker_free(zend_object *object) /* {{{ */ enchant_broker_free(broker->pbroker); } } + zend_object_std_dtor(object); } /* }}} */ @@ -190,6 +191,7 @@ static void php_enchant_dict_free(zend_object *object) /* {{{ */ } } } + zend_object_std_dtor(object); } /* }}} */ From e4b7387f07290ac998dc751d0d361a7b19dd51a7 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Wed, 6 May 2020 07:48:36 +0200 Subject: [PATCH 08/10] deprecate ENCHANT_MYSPELL and ENCHANT_ISPELL constants --- ext/enchant/enchant.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index 996bc8e710397..5227032479b59 100644 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -225,8 +225,8 @@ PHP_MINIT_FUNCTION(enchant) enchant_dict_handlers.free_obj = php_enchant_dict_free; enchant_dict_handlers.clone_obj = NULL; - REGISTER_LONG_CONSTANT("ENCHANT_MYSPELL", PHP_ENCHANT_MYSPELL, CONST_CS | CONST_PERSISTENT); - REGISTER_LONG_CONSTANT("ENCHANT_ISPELL", PHP_ENCHANT_ISPELL, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("ENCHANT_MYSPELL", PHP_ENCHANT_MYSPELL, CONST_CS | CONST_PERSISTENT | CONST_DEPRECATED); + REGISTER_LONG_CONSTANT("ENCHANT_ISPELL", PHP_ENCHANT_ISPELL, CONST_CS | CONST_PERSISTENT | CONST_DEPRECATED); #ifdef HAVE_ENCHANT_GET_VERSION REGISTER_STRING_CONSTANT("LIBENCHANT_VERSION", enchant_get_version(), CONST_CS | CONST_PERSISTENT); #endif From 029964ac28c6b67df61e078ec59d98aa38bfb900 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Wed, 6 May 2020 08:10:39 +0200 Subject: [PATCH 09/10] also fix def value for object --- ext/enchant/enchant.stub.php | 2 +- ext/enchant/enchant_arginfo.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/enchant/enchant.stub.php b/ext/enchant/enchant.stub.php index 1cc29dbed6292..c877d0a996ab4 100644 --- a/ext/enchant/enchant.stub.php +++ b/ext/enchant/enchant.stub.php @@ -34,7 +34,7 @@ final class EnchantDict public function __construct(EnchantBroker $broker, string $tag) {} /** @alias enchant_dict_quick_check */ - public function checkAndSuggest(string $word, &$suggestions = UNKNOWN): bool {} + public function checkAndSuggest(string $word, &$suggestions = null): bool {} /** @alias enchant_dict_check */ public function check(string $word): bool {} diff --git a/ext/enchant/enchant_arginfo.h b/ext/enchant/enchant_arginfo.h index b5fe8eaa69ec5..55b0514916ff3 100644 --- a/ext/enchant/enchant_arginfo.h +++ b/ext/enchant/enchant_arginfo.h @@ -131,7 +131,7 @@ ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantDict_checkAndSuggest, 0, 1, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO(0, word, IS_STRING, 0) - ZEND_ARG_INFO(1, suggestions) + ZEND_ARG_INFO_WITH_DEFAULT_VALUE(1, suggestions, "null") ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_EnchantDict_check, 0, 1, _IS_BOOL, 0) From 17ac5e7c1763f1e050563c6d2b7e4b1d2a0aa9bb Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Wed, 6 May 2020 08:32:34 +0200 Subject: [PATCH 10/10] fix test --- ext/enchant/tests/bug53070.phpt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ext/enchant/tests/bug53070.phpt b/ext/enchant/tests/bug53070.phpt index 237a95a3f61dd..c06542e46bcab 100644 --- a/ext/enchant/tests/bug53070.phpt +++ b/ext/enchant/tests/bug53070.phpt @@ -13,11 +13,15 @@ var_dump(enchant_broker_get_dict_path($broker, ENCHANT_MYSPELL)); var_dump(enchant_broker_get_dict_path($broker, ENCHANT_ISPELL)); ?> --EXPECTF-- +Deprecated: Constant ENCHANT_MYSPELL is deprecated in %s + Deprecated: Function enchant_broker_get_dict_path() is deprecated in %s Warning: enchant_broker_get_dict_path(): dict_path not set in %s on line %d bool(false) +Deprecated: Constant ENCHANT_ISPELL is deprecated in %s + Deprecated: Function enchant_broker_get_dict_path() is deprecated in %s Warning: enchant_broker_get_dict_path(): dict_path not set in %s on line %d