From 6c144a6f554b8650311eba2a5379ae734c66de00 Mon Sep 17 00:00:00 2001 From: kjdev Date: Fri, 1 Aug 2025 07:50:20 +0900 Subject: [PATCH 1/2] feat: named arguments support (PHP 8.0+) --- zstd.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/zstd.c b/zstd.c index 8ad068f..8ba82c9 100644 --- a/zstd.c +++ b/zstd.c @@ -316,43 +316,89 @@ static php_zstd_context* php_zstd_output_handler_context_init(void) #define php_zstd_output_handler_context_free(ctx) php_zstd_context_free(ctx) /* One-shot functions */ +#if PHP_VERSION_ID >= 80000 +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_zstd_compress, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) + ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, level, IS_LONG, 0, "ZSTD_COMPRESS_LEVEL_DEFAULT") +#else ZEND_BEGIN_ARG_INFO_EX(arginfo_zstd_compress, 0, 0, 1) ZEND_ARG_INFO(0, data) ZEND_ARG_INFO(0, level) +#endif ZEND_END_ARG_INFO() +#if PHP_VERSION_ID >= 80000 +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_zstd_uncompress, 0, 1, MAY_BE_STRING|MAY_BE_FALSE) + ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) +#else ZEND_BEGIN_ARG_INFO_EX(arginfo_zstd_uncompress, 0, 0, 1) ZEND_ARG_INFO(0, data) +#endif ZEND_END_ARG_INFO() +#if PHP_VERSION_ID >= 80000 +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_zstd_compress_dict, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) + ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, dict, IS_STRING, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, level, IS_LONG, 0, "ZSTD_COMPRESS_LEVEL_DEFAULT") +#else ZEND_BEGIN_ARG_INFO_EX(arginfo_zstd_compress_dict, 0, 0, 2) ZEND_ARG_INFO(0, data) - ZEND_ARG_INFO(0, dictBuffer) + ZEND_ARG_INFO(0, dict) ZEND_ARG_INFO(0, level) +#endif ZEND_END_ARG_INFO() +#if PHP_VERSION_ID >= 80000 +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_zstd_uncompress_dict, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) + ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, dict, IS_STRING, 0) +#else ZEND_BEGIN_ARG_INFO_EX(arginfo_zstd_uncompress_dict, 0, 0, 2) ZEND_ARG_INFO(0, data) - ZEND_ARG_INFO(0, dictBuffer) + ZEND_ARG_INFO(0, dict) +#endif ZEND_END_ARG_INFO() /* Incremental functions */ +#if PHP_VERSION_ID >= 80000 +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_zstd_compress_init, 0, 0, Zstd\\Compress\\Context, MAY_BE_FALSE) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, level, IS_LONG, 0, "ZSTD_COMPRESS_LEVEL_DEFAULT") +#else ZEND_BEGIN_ARG_INFO_EX(arginfo_zstd_compress_init, 0, 0, 0) ZEND_ARG_INFO(0, level) +#endif ZEND_END_ARG_INFO() +#if PHP_VERSION_ID >= 80000 +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_zstd_compress_add, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) + ZEND_ARG_OBJ_INFO(0, context, Zstd\\Compress\\Context, 0) + ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, end, _IS_BOOL, 0, "false") +#else ZEND_BEGIN_ARG_INFO_EX(arginfo_zstd_compress_add, 0, 0, 2) ZEND_ARG_INFO(0, context) ZEND_ARG_INFO(0, data) ZEND_ARG_INFO(0, end) +#endif ZEND_END_ARG_INFO() +#if PHP_VERSION_ID >= 80000 +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_zstd_uncompress_init, 0, 0, Zstd\\UnCompress\\Context, MAY_BE_FALSE) +#else ZEND_BEGIN_ARG_INFO_EX(arginfo_zstd_uncompress_init, 0, 0, 0) +#endif ZEND_END_ARG_INFO() +#if PHP_VERSION_ID >= 80000 +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_zstd_uncompress_add, 0, 2, MAY_BE_STRING|MAY_BE_FALSE) + ZEND_ARG_OBJ_INFO(0, context, Zstd\\UnCompress\\Context, 0) + ZEND_ARG_TYPE_INFO(0, data, IS_STRING, 0) +#else ZEND_BEGIN_ARG_INFO_EX(arginfo_zstd_uncompress_add, 0, 0, 2) ZEND_ARG_INFO(0, context) ZEND_ARG_INFO(0, data) +#endif ZEND_END_ARG_INFO() #if PHP_VERSION_ID >= 80000 From 8b8e84cfd5f60664efb5333dc17c380a1b475430 Mon Sep 17 00:00:00 2001 From: kjdev Date: Fri, 1 Aug 2025 08:23:14 +0900 Subject: [PATCH 2/2] test: add named arguments --- tests/dictionary_named_args.phpt | 132 +++++++++++++++++++++++++++++++ tests/inc_named_args.phpt | 77 ++++++++++++++++++ tests/named_args.phpt | 77 ++++++++++++++++++ 3 files changed, 286 insertions(+) create mode 100644 tests/dictionary_named_args.phpt create mode 100644 tests/inc_named_args.phpt create mode 100644 tests/named_args.phpt diff --git a/tests/dictionary_named_args.phpt b/tests/dictionary_named_args.phpt new file mode 100644 index 0000000..2e87e8c --- /dev/null +++ b/tests/dictionary_named_args.phpt @@ -0,0 +1,132 @@ +--TEST-- +dict function with use named arguments +--SKIPIF-- + +--FILE-- +getMessage(), PHP_EOL; +} + +echo "** zstd_compress_dict(data:) **\n"; +try { + var_dump(gettype(zstd_compress_dict(data: $data))); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +echo "** zstd_compress_dict(dict:) **\n"; +try { + var_dump(gettype(zstd_compress_dict(dict: $dict))); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +echo "** zstd_compress_dict(level:) **\n"; +try { + var_dump(gettype(zstd_compress_dict(level: $level))); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +echo "** zstd_compress_dict(data:, level:) **\n"; +try { + var_dump(gettype(zstd_compress_dict(data: $data, level: $level))); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +echo "** zstd_compress_dict(data:, dict:) **\n"; +try { + var_dump(gettype(zstd_compress_dict(data: $data, dict: $dict))); + var_dump(zstd_uncompress_dict(zstd_compress_dict(data: $data, dict: $dict), $dict) === $data); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +echo "** zstd_compress_dict(level:, dict:) **\n"; +try { + var_dump(gettype(zstd_compress_dict(level: $level, dict: $dict))); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +echo "** zstd_compress_dict(data:, dict:, level:) **\n"; +try { + var_dump(gettype(zstd_compress_dict(data: $data, dict: $dict, level: $level))); + var_dump(zstd_uncompress_dict(zstd_compress_dict(data: $data, dict: $dict, level: $level), $dict) === $data); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +$compressed = zstd_compress_dict(data: $data, dict: $dict); + +echo "** zstd_uncompress_dict(): false **\n"; +try { + var_dump(gettype(zstd_uncompress_dict())); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +echo "** zstd_uncompress_dict(data:) **\n"; +try { + var_dump(gettype(zstd_uncompress_dict(data: $compressed))); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +echo "** zstd_uncompress_dict(dict:) **\n"; +try { + var_dump(gettype(zstd_uncompress_dict(dict: $dict))); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +echo "** zstd_uncompress_dict(data:, dict:) **\n"; +try { + var_dump(gettype(zstd_uncompress_dict(data: $compressed, dict: $dict))); + var_dump(zstd_uncompress_dict(data: $compressed, dict: $dict) === $data); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} +?> +===DONE=== +--EXPECTF-- +** zstd_compress_dict() ** +zstd_compress_dict() expects at least 2 arguments, 0 given +** zstd_compress_dict(data:) ** +zstd_compress_dict() expects at least 2 arguments, 1 given +** zstd_compress_dict(dict:) ** +zstd_compress_dict(): Argument #1 ($data) not passed +** zstd_compress_dict(level:) ** +zstd_compress_dict(): Argument #1 ($data) not passed +** zstd_compress_dict(data:, level:) ** +zstd_compress_dict(): Argument #2 ($dict) not passed +** zstd_compress_dict(data:, dict:) ** +string(6) "string" +bool(true) +** zstd_compress_dict(level:, dict:) ** +zstd_compress_dict(): Argument #1 ($data) not passed +** zstd_compress_dict(data:, dict:, level:) ** +string(6) "string" +bool(true) +** zstd_uncompress_dict(): false ** +zstd_uncompress_dict() expects exactly 2 arguments, 0 given +** zstd_uncompress_dict(data:) ** +zstd_uncompress_dict() expects exactly 2 arguments, 1 given +** zstd_uncompress_dict(dict:) ** +zstd_uncompress_dict(): Argument #1 ($data) not passed +** zstd_uncompress_dict(data:, dict:) ** +string(6) "string" +bool(true) +===DONE=== diff --git a/tests/inc_named_args.phpt b/tests/inc_named_args.phpt new file mode 100644 index 0000000..a5ec24e --- /dev/null +++ b/tests/inc_named_args.phpt @@ -0,0 +1,77 @@ +--TEST-- +incremental function with use named arguments +--SKIPIF-- + +--FILE-- + +===DONE=== +--EXPECTF-- +level=0 +OK +Ok +level=9 +OK +Ok +level=22 +OK +Ok +level=30 + +Warning: zstd_compress_init(): compression level (30) must be within 1..22 or smaller then 0 in %s on line %d +ERROR +level=-1 +OK +Ok +===DONE=== diff --git a/tests/named_args.phpt b/tests/named_args.phpt new file mode 100644 index 0000000..236043f --- /dev/null +++ b/tests/named_args.phpt @@ -0,0 +1,77 @@ +--TEST-- +use named arguments +--SKIPIF-- + +--FILE-- +getMessage(), PHP_EOL; +} + +echo "** zstd_compress(data:) **\n"; +try { + var_dump(gettype(zstd_compress(data: $data))); + var_dump(zstd_uncompress(zstd_compress(data: $data)) === $data); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +echo "** zstd_compress(level:) **\n"; +try { + var_dump(gettype(zstd_compress(level: $level))); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +echo "** zstd_compress(data:, level:) **\n"; +try { + var_dump(gettype(zstd_compress(data: $data, level: $level))); + var_dump(zstd_uncompress(zstd_compress(data: $data, level: $level)) === $data); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +$compressed = zstd_compress(data: $data); + +echo "** zstd_uncompress(): false **\n"; +try { + var_dump(gettype(zstd_uncompress())); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} + +echo "** zstd_uncompress(data:) **\n"; +try { + var_dump(gettype(zstd_uncompress(data: $compressed))); + var_dump(zstd_uncompress(data: $compressed) === $data); +} catch (Error $e) { + echo $e->getMessage(), PHP_EOL; +} +?> +===DONE=== +--EXPECTF-- +** zstd_compress() ** +zstd_compress() expects at least 1 argument, 0 given +** zstd_compress(data:) ** +string(6) "string" +bool(true) +** zstd_compress(level:) ** +zstd_compress(): Argument #1 ($data) not passed +** zstd_compress(data:, level:) ** +string(6) "string" +bool(true) +** zstd_uncompress(): false ** +zstd_uncompress() expects exactly 1 argument, 0 given +** zstd_uncompress(data:) ** +string(6) "string" +bool(true) +===DONE===