From: Nikita Popov Date: Fri, 21 Feb 2020 14:08:56 +0000 (+0100) Subject: Generate function entries from stubs X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=51bc6233b266f514fb65fa97dfc1754cd0dd4010;p=php Generate function entries from stubs If @generate-function-entries is specified in the stub file, also generate function entries for the extension. Currently limited to free functions only. --- diff --git a/build/gen_stub.php b/build/gen_stub.php old mode 100755 new mode 100644 index f3a9a492b0..d25ef2dc22 --- a/build/gen_stub.php +++ b/build/gen_stub.php @@ -1,6 +1,7 @@ #!/usr/bin/env php getMessage()}\n"; @@ -299,6 +300,10 @@ class ReturnInfo { class FuncInfo { /** @var string */ public $name; + /** @var ?string */ + public $className; + /** @var ?string */ + public $alias; /** @var ArgInfo[] */ public $args; /** @var ReturnInfo */ @@ -309,9 +314,12 @@ class FuncInfo { public $cond; public function __construct( - string $name, array $args, ReturnInfo $return, int $numRequiredArgs, ?string $cond + string $name, ?string $className, ?string $alias, array $args, ReturnInfo $return, + int $numRequiredArgs, ?string $cond ) { $this->name = $name; + $this->className = $className; + $this->alias = $alias; $this->args = $args; $this->return = $return; $this->numRequiredArgs = $numRequiredArgs; @@ -333,11 +341,33 @@ class FuncInfo { && $this->numRequiredArgs === $other->numRequiredArgs && $this->cond === $other->cond; } + + public function getArgInfoName(): string { + if ($this->className) { + return 'arginfo_class_' . $this->className . '_' . $this->name; + } + return 'arginfo_' . $this->name; + } +} + +class FileInfo { + /** @var FuncInfo[] */ + public $funcInfos; + /** @var bool */ + public $generateFunctionEntries; + + public function __construct(array $funcInfos, bool $generateFunctionEntries) { + $this->funcInfos = $funcInfos; + $this->generateFunctionEntries = $generateFunctionEntries; + } } -function parseFunctionLike(string $name, Node\FunctionLike $func, ?string $cond): FuncInfo { +function parseFunctionLike( + string $name, ?string $className, Node\FunctionLike $func, ?string $cond +): FuncInfo { $comment = $func->getDocComment(); $paramMeta = []; + $alias = null; if ($comment) { $commentText = substr($comment->getText(), 2, -2); @@ -349,6 +379,8 @@ function parseFunctionLike(string $name, Node\FunctionLike $func, ?string $cond) $paramMeta[$varName] = []; } $paramMeta[$varName]['preferRef'] = true; + } else if (preg_match('/^\*\s*@alias\s+(.+)$/', trim($commentLine), $matches)) { + $alias = $matches[1]; } } } @@ -403,7 +435,7 @@ function parseFunctionLike(string $name, Node\FunctionLike $func, ?string $cond) $return = new ReturnInfo( $func->returnsByRef(), $returnType ? Type::fromNode($returnType) : null); - return new FuncInfo($name, $args, $return, $numRequiredArgs, $cond); + return new FuncInfo($name, $className, $alias, $args, $return, $numRequiredArgs, $cond); } function handlePreprocessorConditions(array &$conds, Stmt $stmt): ?string { @@ -434,8 +466,24 @@ function handlePreprocessorConditions(array &$conds, Stmt $stmt): ?string { return empty($conds) ? null : implode(' && ', $conds); } -/** @return FuncInfo[] */ -function parseStubFile(string $fileName) { +function getFileDocComment(array $stmts): ?DocComment { + if (empty($stmts)) { + return null; + } + + $comments = $stmts[0]->getComments(); + if (empty($comments)) { + return null; + } + + if ($comments[0] instanceof DocComment) { + return $comments[0]; + } + + return null; +} + +function parseStubFile(string $fileName): FileInfo { if (!file_exists($fileName)) { throw new Exception("File $fileName does not exist"); } @@ -450,6 +498,14 @@ function parseStubFile(string $fileName) { $stmts = $parser->parse($code); $nodeTraverser->traverse($stmts); + $generateFunctionEntries = false; + $fileDocComment = getFileDocComment($stmts); + if ($fileDocComment) { + if (strpos($fileDocComment->getText(), '@generate-function-entries') !== false) { + $generateFunctionEntries = true; + } + } + $funcInfos = []; $conds = []; foreach ($stmts as $stmt) { @@ -459,7 +515,7 @@ function parseStubFile(string $fileName) { } if ($stmt instanceof Stmt\Function_) { - $funcInfos[] = parseFunctionLike($stmt->name->toString(), $stmt, $cond); + $funcInfos[] = parseFunctionLike($stmt->name->toString(), null, $stmt, $cond); continue; } @@ -476,7 +532,7 @@ function parseStubFile(string $fileName) { } $funcInfos[] = parseFunctionLike( - 'class_' . $className . '_' . $classStmt->name->toString(), $classStmt, $cond); + $classStmt->name->toString(), $className, $classStmt, $cond); } continue; } @@ -484,7 +540,7 @@ function parseStubFile(string $fileName) { throw new Exception("Unexpected node {$stmt->getType()}"); } - return $funcInfos; + return new FileInfo($funcInfos, $generateFunctionEntries); } function funcInfoToCode(FuncInfo $funcInfo): string { @@ -494,28 +550,32 @@ function funcInfoToCode(FuncInfo $funcInfo): string { if (null !== $simpleReturnType = $returnType->tryToSimpleType()) { if ($simpleReturnType->isBuiltin) { $code .= sprintf( - "ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_%s, %d, %d, %s, %d)\n", - $funcInfo->name, $funcInfo->return->byRef, $funcInfo->numRequiredArgs, + "ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(%s, %d, %d, %s, %d)\n", + $funcInfo->getArgInfoName(), $funcInfo->return->byRef, + $funcInfo->numRequiredArgs, $simpleReturnType->toTypeCode(), $returnType->isNullable() ); } else { $code .= sprintf( - "ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_%s, %d, %d, %s, %d)\n", - $funcInfo->name, $funcInfo->return->byRef, $funcInfo->numRequiredArgs, + "ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(%s, %d, %d, %s, %d)\n", + $funcInfo->getArgInfoName(), $funcInfo->return->byRef, + $funcInfo->numRequiredArgs, $simpleReturnType->toEscapedName(), $returnType->isNullable() ); } } else if (null !== $representableType = $returnType->tryToRepresentableType()) { if ($representableType->classType !== null) { $code .= sprintf( - "ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_%s, %d, %d, %s, %s)\n", - $funcInfo->name, $funcInfo->return->byRef, $funcInfo->numRequiredArgs, + "ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(%s, %d, %d, %s, %s)\n", + $funcInfo->getArgInfoName(), $funcInfo->return->byRef, + $funcInfo->numRequiredArgs, $representableType->classType->toEscapedName(), $representableType->toTypeMask() ); } else { $code .= sprintf( - "ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_%s, %d, %d, %s)\n", - $funcInfo->name, $funcInfo->return->byRef, $funcInfo->numRequiredArgs, + "ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(%s, %d, %d, %s)\n", + $funcInfo->getArgInfoName(), $funcInfo->return->byRef, + $funcInfo->numRequiredArgs, $representableType->toTypeMask() ); } @@ -524,8 +584,8 @@ function funcInfoToCode(FuncInfo $funcInfo): string { } } else { $code .= sprintf( - "ZEND_BEGIN_ARG_INFO_EX(arginfo_%s, 0, %d, %d)\n", - $funcInfo->name, $funcInfo->return->byRef, $funcInfo->numRequiredArgs + "ZEND_BEGIN_ARG_INFO_EX(%s, 0, %d, %d)\n", + $funcInfo->getArgInfoName(), $funcInfo->return->byRef, $funcInfo->numRequiredArgs ); } @@ -566,7 +626,7 @@ function funcInfoToCode(FuncInfo $funcInfo): string { } $code .= "ZEND_END_ARG_INFO()"; - return $code; + return $code . "\n"; } function findEquivalentFuncInfo(array $generatedFuncInfos, $funcInfo): ?FuncInfo { @@ -578,33 +638,80 @@ function findEquivalentFuncInfo(array $generatedFuncInfos, $funcInfo): ?FuncInfo return null; } -/** @param FuncInfo[] $funcInfos */ -function generateArginfoCode(array $funcInfos): string { - $code = "/* This is a generated file, edit the .stub.php file instead. */"; - $generatedFuncInfos = []; - foreach ($funcInfos as $funcInfo) { - $code .= "\n\n"; - if ($funcInfo->cond) { - $code .= "#if {$funcInfo->cond}\n"; +function generateCodeWithConditions( + FileInfo $fileInfo, string $separator, Closure $codeGenerator): string { + $code = ""; + foreach ($fileInfo->funcInfos as $funcInfo) { + $funcCode = $codeGenerator($funcInfo); + if ($funcCode === null) { + continue; } - /* If there already is an equivalent arginfo structure, only emit a #define */ - if ($generatedFuncInfo = findEquivalentFuncInfo($generatedFuncInfos, $funcInfo)) { - $code .= sprintf( - "#define arginfo_%s arginfo_%s", - $funcInfo->name, $generatedFuncInfo->name - ); + $code .= $separator; + if ($funcInfo->cond) { + $code .= "#if {$funcInfo->cond}\n"; + $code .= $funcCode; + $code .= "#endif\n"; } else { - $code .= funcInfoToCode($funcInfo); + $code .= $funcCode; } + } + return $code; +} - if ($funcInfo->cond) { - $code .= "\n#endif"; +function generateArgInfoCode(FileInfo $fileInfo): string { + $funcInfos = $fileInfo->funcInfos; + + $code = "/* This is a generated file, edit the .stub.php file instead. */\n"; + $generatedFuncInfos = []; + $code .= generateCodeWithConditions( + $fileInfo, "\n", + function(FuncInfo $funcInfo) use(&$generatedFuncInfos) { + /* If there already is an equivalent arginfo structure, only emit a #define */ + if ($generatedFuncInfo = findEquivalentFuncInfo($generatedFuncInfos, $funcInfo)) { + $code = sprintf( + "#define %s %s\n", + $funcInfo->getArgInfoName(), $generatedFuncInfo->getArgInfoName() + ); + } else { + $code = funcInfoToCode($funcInfo); + } + + $generatedFuncInfos[] = $funcInfo; + return $code; } + ); + + if ($fileInfo->generateFunctionEntries) { + $code .= "\n\n"; + $code .= generateCodeWithConditions($fileInfo, "", function(FuncInfo $funcInfo) { + if ($funcInfo->className || $funcInfo->alias) { + return null; + } + + return "ZEND_FUNCTION($funcInfo->name);\n"; + }); + + $code .= "\n\nstatic const zend_function_entry ext_functions[] = {\n"; + $code .= generateCodeWithConditions($fileInfo, "", function(FuncInfo $funcInfo) { + if ($funcInfo->className) { + return null; + } - $generatedFuncInfos[] = $funcInfo; + if ($funcInfo->alias) { + return sprintf( + "\tZEND_FALIAS(%s, %s, %s)\n", + $funcInfo->name, $funcInfo->alias, $funcInfo->getArgInfoName() + ); + } else { + return sprintf("\tZEND_FE(%s, %s)\n", $funcInfo->name, $funcInfo->getArgInfoName()); + } + }); + $code .= "\tZEND_FE_END\n"; + $code .= "};\n"; } - return $code . "\n"; + + return $code; } function initPhpParser() { diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 219656021e..d99b7fb498 100755 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -33,7 +33,6 @@ #include "ext/standard/php_dns.h" #include "ext/standard/php_uuencode.h" #include "ext/standard/php_mt_rand.h" -#include "basic_functions_arginfo.h" #ifdef PHP_WIN32 #include "win32/php_win32_globals.h" @@ -107,6 +106,7 @@ PHPAPI php_basic_globals basic_globals; #include "php_fopen_wrappers.h" #include "streamsfuncs.h" +#include "basic_functions_arginfo.h" static zend_class_entry *incomplete_class_entry = NULL; @@ -120,711 +120,6 @@ typedef struct _user_tick_function_entry { static void user_shutdown_function_dtor(zval *zv); static void user_tick_function_dtor(user_tick_function_entry *tick_function_entry); -/* {{{ arginfo */ - -static const zend_function_entry basic_functions[] = { /* {{{ */ - PHP_FE(constant, arginfo_constant) - PHP_FE(bin2hex, arginfo_bin2hex) - PHP_FE(hex2bin, arginfo_hex2bin) - PHP_FE(sleep, arginfo_sleep) - PHP_FE(usleep, arginfo_usleep) -#if HAVE_NANOSLEEP - PHP_FE(time_nanosleep, arginfo_time_nanosleep) - PHP_FE(time_sleep_until, arginfo_time_sleep_until) -#endif - -#if HAVE_STRPTIME - PHP_FE(strptime, arginfo_strptime) -#endif - - PHP_FE(flush, arginfo_flush) - PHP_FE(wordwrap, arginfo_wordwrap) - PHP_FE(htmlspecialchars, arginfo_htmlspecialchars) - PHP_FE(htmlentities, arginfo_htmlentities) - PHP_FE(html_entity_decode, arginfo_html_entity_decode) - PHP_FE(htmlspecialchars_decode, arginfo_htmlspecialchars_decode) - PHP_FE(get_html_translation_table, arginfo_get_html_translation_table) - PHP_FE(sha1, arginfo_sha1) - PHP_FE(sha1_file, arginfo_sha1_file) - PHP_FE(md5, arginfo_md5) - PHP_FE(md5_file, arginfo_md5_file) - PHP_FE(crc32, arginfo_crc32) - - PHP_FE(iptcparse, arginfo_iptcparse) - PHP_FE(iptcembed, arginfo_iptcembed) - PHP_FE(getimagesize, arginfo_getimagesize) - PHP_FE(getimagesizefromstring, arginfo_getimagesizefromstring) - PHP_FE(image_type_to_mime_type, arginfo_image_type_to_mime_type) - PHP_FE(image_type_to_extension, arginfo_image_type_to_extension) - - PHP_FE(phpinfo, arginfo_phpinfo) - PHP_FE(phpversion, arginfo_phpversion) - PHP_FE(phpcredits, arginfo_phpcredits) - PHP_FE(php_sapi_name, arginfo_php_sapi_name) - PHP_FE(php_uname, arginfo_php_uname) - PHP_FE(php_ini_scanned_files, arginfo_php_ini_scanned_files) - PHP_FE(php_ini_loaded_file, arginfo_php_ini_loaded_file) - - PHP_FE(strnatcmp, arginfo_strnatcmp) - PHP_FE(strnatcasecmp, arginfo_strnatcasecmp) - PHP_FE(substr_count, arginfo_substr_count) - PHP_FE(strspn, arginfo_strspn) - PHP_FE(strcspn, arginfo_strcspn) - PHP_FE(strtok, arginfo_strtok) - PHP_FE(strtoupper, arginfo_strtoupper) - PHP_FE(strtolower, arginfo_strtolower) - PHP_FE(str_contains, arginfo_str_contains) - PHP_FE(strpos, arginfo_strpos) - PHP_FE(stripos, arginfo_stripos) - PHP_FE(strrpos, arginfo_strrpos) - PHP_FE(strripos, arginfo_strripos) - PHP_FE(strrev, arginfo_strrev) - PHP_FE(hebrev, arginfo_hebrev) - PHP_FE(nl2br, arginfo_nl2br) - PHP_FE(basename, arginfo_basename) - PHP_FE(dirname, arginfo_dirname) - PHP_FE(pathinfo, arginfo_pathinfo) - PHP_FE(stripslashes, arginfo_stripslashes) - PHP_FE(stripcslashes, arginfo_stripcslashes) - PHP_FE(strstr, arginfo_strstr) - PHP_FE(stristr, arginfo_stristr) - PHP_FE(strrchr, arginfo_strrchr) - PHP_FE(str_shuffle, arginfo_str_shuffle) - PHP_FE(str_word_count, arginfo_str_word_count) - PHP_FE(str_split, arginfo_str_split) - PHP_FE(strpbrk, arginfo_strpbrk) - PHP_FE(substr_compare, arginfo_substr_compare) - PHP_FE(utf8_encode, arginfo_utf8_encode) - PHP_FE(utf8_decode, arginfo_utf8_decode) - PHP_FE(strcoll, arginfo_strcoll) - - PHP_FE(substr, arginfo_substr) - PHP_FE(substr_replace, arginfo_substr_replace) - PHP_FE(quotemeta, arginfo_quotemeta) - PHP_FE(ucfirst, arginfo_ucfirst) - PHP_FE(lcfirst, arginfo_lcfirst) - PHP_FE(ucwords, arginfo_ucwords) - PHP_FE(strtr, arginfo_strtr) - PHP_FE(addslashes, arginfo_addslashes) - PHP_FE(addcslashes, arginfo_addcslashes) - PHP_FE(rtrim, arginfo_rtrim) - PHP_FE(str_replace, arginfo_str_replace) - PHP_FE(str_ireplace, arginfo_str_ireplace) - PHP_FE(str_repeat, arginfo_str_repeat) - PHP_FE(count_chars, arginfo_count_chars) - PHP_FE(chunk_split, arginfo_chunk_split) - PHP_FE(trim, arginfo_trim) - PHP_FE(ltrim, arginfo_ltrim) - PHP_FE(strip_tags, arginfo_strip_tags) - PHP_FE(similar_text, arginfo_similar_text) - PHP_FE(explode, arginfo_explode) - PHP_FE(implode, arginfo_implode) - PHP_FALIAS(join, implode, arginfo_join) - PHP_FE(setlocale, arginfo_setlocale) - PHP_FE(localeconv, arginfo_localeconv) - -#if HAVE_NL_LANGINFO - PHP_FE(nl_langinfo, arginfo_nl_langinfo) -#endif - - PHP_FE(soundex, arginfo_soundex) - PHP_FE(levenshtein, arginfo_levenshtein) - PHP_FE(chr, arginfo_chr) - PHP_FE(ord, arginfo_ord) - PHP_FE(parse_str, arginfo_parse_str) - PHP_FE(str_getcsv, arginfo_str_getcsv) - PHP_FE(str_pad, arginfo_str_pad) - PHP_FALIAS(chop, rtrim, arginfo_chop) - PHP_FALIAS(strchr, strstr, arginfo_strchr) - PHP_FE(sprintf, arginfo_sprintf) - PHP_FE(printf, arginfo_printf) - PHP_FE(vprintf, arginfo_vprintf) - PHP_FE(vsprintf, arginfo_vsprintf) - PHP_FE(fprintf, arginfo_fprintf) - PHP_FE(vfprintf, arginfo_vfprintf) - PHP_FE(sscanf, arginfo_sscanf) - PHP_FE(fscanf, arginfo_fscanf) - PHP_FE(parse_url, arginfo_parse_url) - PHP_FE(urlencode, arginfo_urlencode) - PHP_FE(urldecode, arginfo_urldecode) - PHP_FE(rawurlencode, arginfo_rawurlencode) - PHP_FE(rawurldecode, arginfo_rawurldecode) - PHP_FE(http_build_query, arginfo_http_build_query) - -#if defined(HAVE_SYMLINK) || defined(PHP_WIN32) - PHP_FE(readlink, arginfo_readlink) - PHP_FE(linkinfo, arginfo_linkinfo) - PHP_FE(symlink, arginfo_symlink) - PHP_FE(link, arginfo_link) -#endif - - PHP_FE(unlink, arginfo_unlink) - PHP_FE(exec, arginfo_exec) - PHP_FE(system, arginfo_system) - PHP_FE(escapeshellcmd, arginfo_escapeshellcmd) - PHP_FE(escapeshellarg, arginfo_escapeshellarg) - PHP_FE(passthru, arginfo_passthru) - PHP_FE(shell_exec, arginfo_shell_exec) -#ifdef PHP_CAN_SUPPORT_PROC_OPEN - PHP_FE(proc_open, arginfo_proc_open) - PHP_FE(proc_close, arginfo_proc_close) - PHP_FE(proc_terminate, arginfo_proc_terminate) - PHP_FE(proc_get_status, arginfo_proc_get_status) -#endif - -#ifdef HAVE_NICE - PHP_FE(proc_nice, arginfo_proc_nice) -#endif - - PHP_FE(rand, arginfo_rand) - PHP_FALIAS(srand, mt_srand, arginfo_srand) - PHP_FALIAS(getrandmax, mt_getrandmax, arginfo_getrandmax) - PHP_FE(mt_rand, arginfo_mt_rand) - PHP_FE(mt_srand, arginfo_mt_srand) - PHP_FE(mt_getrandmax, arginfo_mt_getrandmax) - - PHP_FE(random_bytes, arginfo_random_bytes) - PHP_FE(random_int, arginfo_random_int) - -#if HAVE_GETSERVBYNAME - PHP_FE(getservbyname, arginfo_getservbyname) -#endif - -#if HAVE_GETSERVBYPORT - PHP_FE(getservbyport, arginfo_getservbyport) -#endif - -#if HAVE_GETPROTOBYNAME - PHP_FE(getprotobyname, arginfo_getprotobyname) -#endif - -#if HAVE_GETPROTOBYNUMBER - PHP_FE(getprotobynumber, arginfo_getprotobynumber) -#endif - - PHP_FE(getmyuid, arginfo_getmyuid) - PHP_FE(getmygid, arginfo_getmygid) - PHP_FE(getmypid, arginfo_getmypid) - PHP_FE(getmyinode, arginfo_getmyinode) - PHP_FE(getlastmod, arginfo_getlastmod) - - PHP_FE(base64_decode, arginfo_base64_decode) - PHP_FE(base64_encode, arginfo_base64_encode) - - PHP_FE(password_hash, arginfo_password_hash) - PHP_FE(password_get_info, arginfo_password_get_info) - PHP_FE(password_needs_rehash, arginfo_password_needs_rehash) - PHP_FE(password_verify, arginfo_password_verify) - PHP_FE(password_algos, arginfo_password_algos) - PHP_FE(convert_uuencode, arginfo_convert_uuencode) - PHP_FE(convert_uudecode, arginfo_convert_uudecode) - - PHP_FE(abs, arginfo_abs) - PHP_FE(ceil, arginfo_ceil) - PHP_FE(floor, arginfo_floor) - PHP_FE(round, arginfo_round) - PHP_FE(sin, arginfo_sin) - PHP_FE(cos, arginfo_cos) - PHP_FE(tan, arginfo_tan) - PHP_FE(asin, arginfo_asin) - PHP_FE(acos, arginfo_acos) - PHP_FE(atan, arginfo_atan) - PHP_FE(atanh, arginfo_atanh) - PHP_FE(atan2, arginfo_atan2) - PHP_FE(sinh, arginfo_sinh) - PHP_FE(cosh, arginfo_cosh) - PHP_FE(tanh, arginfo_tanh) - PHP_FE(asinh, arginfo_asinh) - PHP_FE(acosh, arginfo_acosh) - PHP_FE(expm1, arginfo_expm1) - PHP_FE(log1p, arginfo_log1p) - PHP_FE(pi, arginfo_pi) - PHP_FE(is_finite, arginfo_is_finite) - PHP_FE(is_nan, arginfo_is_nan) - PHP_FE(is_infinite, arginfo_is_infinite) - PHP_FE(pow, arginfo_pow) - PHP_FE(exp, arginfo_exp) - PHP_FE(log, arginfo_log) - PHP_FE(log10, arginfo_log10) - PHP_FE(sqrt, arginfo_sqrt) - PHP_FE(hypot, arginfo_hypot) - PHP_FE(deg2rad, arginfo_deg2rad) - PHP_FE(rad2deg, arginfo_rad2deg) - PHP_FE(bindec, arginfo_bindec) - PHP_FE(hexdec, arginfo_hexdec) - PHP_FE(octdec, arginfo_octdec) - PHP_FE(decbin, arginfo_decbin) - PHP_FE(decoct, arginfo_decoct) - PHP_FE(dechex, arginfo_dechex) - PHP_FE(base_convert, arginfo_base_convert) - PHP_FE(number_format, arginfo_number_format) - PHP_FE(fmod, arginfo_fmod) - PHP_FE(fdiv, arginfo_fdiv) - PHP_FE(intdiv, arginfo_intdiv) -#ifdef HAVE_INET_NTOP - PHP_FE(inet_ntop, arginfo_inet_ntop) -#endif -#ifdef HAVE_INET_PTON - PHP_FE(inet_pton, arginfo_inet_pton) -#endif - PHP_FE(ip2long, arginfo_ip2long) - PHP_FE(long2ip, arginfo_long2ip) - - PHP_FE(getenv, arginfo_getenv) -#ifdef HAVE_PUTENV - PHP_FE(putenv, arginfo_putenv) -#endif - - PHP_FE(getopt, arginfo_getopt) - -#ifdef HAVE_GETLOADAVG - PHP_FE(sys_getloadavg, arginfo_sys_getloadavg) -#endif -#ifdef HAVE_GETTIMEOFDAY - PHP_FE(microtime, arginfo_microtime) - PHP_FE(gettimeofday, arginfo_gettimeofday) -#endif - -#ifdef HAVE_GETRUSAGE - PHP_FE(getrusage, arginfo_getrusage) -#endif - - PHP_FE(hrtime, arginfo_hrtime) - -#ifdef HAVE_GETTIMEOFDAY - PHP_FE(uniqid, arginfo_uniqid) -#endif - - PHP_FE(quoted_printable_decode, arginfo_quoted_printable_decode) - PHP_FE(quoted_printable_encode, arginfo_quoted_printable_encode) - PHP_FE(get_current_user, arginfo_get_current_user) - PHP_FE(set_time_limit, arginfo_set_time_limit) - PHP_FE(header_register_callback, arginfo_header_register_callback) - PHP_FE(get_cfg_var, arginfo_get_cfg_var) - - PHP_FE(error_log, arginfo_error_log) - PHP_FE(error_get_last, arginfo_error_get_last) - PHP_FE(error_clear_last, arginfo_error_clear_last) - PHP_FE(call_user_func, arginfo_call_user_func) - PHP_FE(call_user_func_array, arginfo_call_user_func_array) - PHP_FE(forward_static_call, arginfo_forward_static_call) - PHP_FE(forward_static_call_array, arginfo_forward_static_call_array) - PHP_FE(serialize, arginfo_serialize) - PHP_FE(unserialize, arginfo_unserialize) - - PHP_FE(var_dump, arginfo_var_dump) - PHP_FE(var_export, arginfo_var_export) - PHP_FE(debug_zval_dump, arginfo_debug_zval_dump) - PHP_FE(print_r, arginfo_print_r) - PHP_FE(memory_get_usage, arginfo_memory_get_usage) - PHP_FE(memory_get_peak_usage, arginfo_memory_get_peak_usage) - - PHP_FE(register_shutdown_function, arginfo_register_shutdown_function) - PHP_FE(register_tick_function, arginfo_register_tick_function) - PHP_FE(unregister_tick_function, arginfo_unregister_tick_function) - - PHP_FE(highlight_file, arginfo_highlight_file) - PHP_FALIAS(show_source, highlight_file, arginfo_show_source) - PHP_FE(highlight_string, arginfo_highlight_string) - PHP_FE(php_strip_whitespace, arginfo_php_strip_whitespace) - - PHP_FE(ini_get, arginfo_ini_get) - PHP_FE(ini_get_all, arginfo_ini_get_all) - PHP_FE(ini_set, arginfo_ini_set) - PHP_FALIAS(ini_alter, ini_set, arginfo_ini_alter) - PHP_FE(ini_restore, arginfo_ini_restore) - PHP_FE(get_include_path, arginfo_get_include_path) - PHP_FE(set_include_path, arginfo_set_include_path) - - PHP_FE(setcookie, arginfo_setcookie) - PHP_FE(setrawcookie, arginfo_setrawcookie) - PHP_FE(header, arginfo_header) - PHP_FE(header_remove, arginfo_header_remove) - PHP_FE(headers_sent, arginfo_headers_sent) - PHP_FE(headers_list, arginfo_headers_list) - PHP_FE(http_response_code, arginfo_http_response_code) - - PHP_FE(connection_aborted, arginfo_connection_aborted) - PHP_FE(connection_status, arginfo_connection_status) - PHP_FE(ignore_user_abort, arginfo_ignore_user_abort) - PHP_FE(parse_ini_file, arginfo_parse_ini_file) - PHP_FE(parse_ini_string, arginfo_parse_ini_string) -#if ZEND_DEBUG - PHP_FE(config_get_hash, arginfo_config_get_hash) -#endif - PHP_FE(is_uploaded_file, arginfo_is_uploaded_file) - PHP_FE(move_uploaded_file, arginfo_move_uploaded_file) - - /* functions from dns.c */ - PHP_FE(gethostbyaddr, arginfo_gethostbyaddr) - PHP_FE(gethostbyname, arginfo_gethostbyname) - PHP_FE(gethostbynamel, arginfo_gethostbynamel) - -#ifdef HAVE_GETHOSTNAME - PHP_FE(gethostname, arginfo_gethostname) -#endif - -#if defined(PHP_WIN32) || HAVE_GETIFADDRS - PHP_FE(net_get_interfaces, arginfo_net_get_interfaces) -#endif - -#if defined(PHP_WIN32) || HAVE_DNS_SEARCH_FUNC - - PHP_FE(dns_check_record, arginfo_dns_check_record) - PHP_FALIAS(checkdnsrr, dns_check_record, arginfo_checkdnsrr) - -# if defined(PHP_WIN32) || HAVE_FULL_DNS_FUNCS - PHP_FE(dns_get_mx, arginfo_dns_get_mx) - PHP_FALIAS(getmxrr, dns_get_mx, arginfo_getmxrr) - PHP_FE(dns_get_record, arginfo_dns_get_record) -# endif -#endif - - /* functions from type.c */ - PHP_FE(intval, arginfo_intval) - PHP_FE(floatval, arginfo_floatval) - PHP_FALIAS(doubleval, floatval, arginfo_doubleval) - PHP_FE(strval, arginfo_strval) - PHP_FE(boolval, arginfo_boolval) - PHP_FE(gettype, arginfo_gettype) - PHP_FE(settype, arginfo_settype) - PHP_FE(is_null, arginfo_is_null) - PHP_FE(is_resource, arginfo_is_resource) - PHP_FE(is_bool, arginfo_is_bool) - PHP_FE(is_int, arginfo_is_int) - PHP_FE(is_float, arginfo_is_float) - PHP_FALIAS(is_integer, is_int, arginfo_is_integer) - PHP_FALIAS(is_long, is_int, arginfo_is_long) - PHP_FALIAS(is_double, is_float, arginfo_is_double) - PHP_DEP_FALIAS(is_real, is_float, arginfo_is_real) - PHP_FE(is_numeric, arginfo_is_numeric) - PHP_FE(is_string, arginfo_is_string) - PHP_FE(is_array, arginfo_is_array) - PHP_FE(is_object, arginfo_is_object) - PHP_FE(is_scalar, arginfo_is_scalar) - PHP_FE(is_callable, arginfo_is_callable) - PHP_FE(is_iterable, arginfo_is_iterable) - PHP_FE(is_countable, arginfo_is_countable) - - /* functions from file.c */ - PHP_FE(pclose, arginfo_pclose) - PHP_FE(popen, arginfo_popen) - PHP_FE(readfile, arginfo_readfile) - PHP_FE(rewind, arginfo_rewind) - PHP_FE(rmdir, arginfo_rmdir) - PHP_FE(umask, arginfo_umask) - PHP_FE(fclose, arginfo_fclose) - PHP_FE(feof, arginfo_feof) - PHP_FE(fgetc, arginfo_fgetc) - PHP_FE(fgets, arginfo_fgets) - PHP_FE(fread, arginfo_fread) - PHP_FE(fopen, arginfo_fopen) - PHP_FE(fpassthru, arginfo_fpassthru) - PHP_FE(ftruncate, arginfo_ftruncate) - PHP_FE(fstat, arginfo_fstat) - PHP_FE(fseek, arginfo_fseek) - PHP_FE(ftell, arginfo_ftell) - PHP_FE(fflush, arginfo_fflush) - PHP_FE(fwrite, arginfo_fwrite) - PHP_FALIAS(fputs, fwrite, arginfo_fputs) - PHP_FE(mkdir, arginfo_mkdir) - PHP_FE(rename, arginfo_rename) - PHP_FE(copy, arginfo_copy) - PHP_FE(tempnam, arginfo_tempnam) - PHP_FE(tmpfile, arginfo_tmpfile) - PHP_FE(file, arginfo_file) - PHP_FE(file_get_contents, arginfo_file_get_contents) - PHP_FE(file_put_contents, arginfo_file_put_contents) - PHP_FE(stream_select, arginfo_stream_select) - PHP_FE(stream_context_create, arginfo_stream_context_create) - PHP_FE(stream_context_set_params, arginfo_stream_context_set_params) - PHP_FE(stream_context_get_params, arginfo_stream_context_get_params) - PHP_FE(stream_context_set_option, arginfo_stream_context_set_option) - PHP_FE(stream_context_get_options, arginfo_stream_context_get_options) - PHP_FE(stream_context_get_default, arginfo_stream_context_get_default) - PHP_FE(stream_context_set_default, arginfo_stream_context_set_default) - PHP_FE(stream_filter_prepend, arginfo_stream_filter_prepend) - PHP_FE(stream_filter_append, arginfo_stream_filter_append) - PHP_FE(stream_filter_remove, arginfo_stream_filter_remove) - PHP_FE(stream_socket_client, arginfo_stream_socket_client) - PHP_FE(stream_socket_server, arginfo_stream_socket_server) - PHP_FE(stream_socket_accept, arginfo_stream_socket_accept) - PHP_FE(stream_socket_get_name, arginfo_stream_socket_get_name) - PHP_FE(stream_socket_recvfrom, arginfo_stream_socket_recvfrom) - PHP_FE(stream_socket_sendto, arginfo_stream_socket_sendto) - PHP_FE(stream_socket_enable_crypto, arginfo_stream_socket_enable_crypto) -#ifdef HAVE_SHUTDOWN - PHP_FE(stream_socket_shutdown, arginfo_stream_socket_shutdown) -#endif -#if HAVE_SOCKETPAIR - PHP_FE(stream_socket_pair, arginfo_stream_socket_pair) -#endif - PHP_FE(stream_copy_to_stream, arginfo_stream_copy_to_stream) - PHP_FE(stream_get_contents, arginfo_stream_get_contents) - PHP_FE(stream_supports_lock, arginfo_stream_supports_lock) - PHP_FE(stream_isatty, arginfo_stream_isatty) -#ifdef PHP_WIN32 - PHP_FE(sapi_windows_vt100_support, arginfo_sapi_windows_vt100_support) -#endif - PHP_FE(fgetcsv, arginfo_fgetcsv) - PHP_FE(fputcsv, arginfo_fputcsv) - PHP_FE(flock, arginfo_flock) - PHP_FE(get_meta_tags, arginfo_get_meta_tags) - PHP_FE(stream_set_read_buffer, arginfo_stream_set_read_buffer) - PHP_FE(stream_set_write_buffer, arginfo_stream_set_write_buffer) - PHP_FALIAS(set_file_buffer, stream_set_write_buffer, arginfo_set_file_buffer) - PHP_FE(stream_set_chunk_size, arginfo_stream_set_chunk_size) - - PHP_FE(stream_set_blocking, arginfo_stream_set_blocking) - PHP_FALIAS(socket_set_blocking, stream_set_blocking, arginfo_socket_set_blocking) - - PHP_FE(stream_get_meta_data, arginfo_stream_get_meta_data) - PHP_FE(stream_get_line, arginfo_stream_get_line) - PHP_FE(stream_wrapper_register, arginfo_stream_wrapper_register) - PHP_FALIAS(stream_register_wrapper, stream_wrapper_register, arginfo_stream_register_wrapper) - PHP_FE(stream_wrapper_unregister, arginfo_stream_wrapper_unregister) - PHP_FE(stream_wrapper_restore, arginfo_stream_wrapper_restore) - PHP_FE(stream_get_wrappers, arginfo_stream_get_wrappers) - PHP_FE(stream_get_transports, arginfo_stream_get_transports) - PHP_FE(stream_resolve_include_path, arginfo_stream_resolve_include_path) - PHP_FE(stream_is_local, arginfo_stream_is_local) - PHP_FE(get_headers, arginfo_get_headers) - -#if HAVE_SYS_TIME_H || defined(PHP_WIN32) - PHP_FE(stream_set_timeout, arginfo_stream_set_timeout) - PHP_FALIAS(socket_set_timeout, stream_set_timeout, arginfo_socket_set_timeout) -#endif - - PHP_FALIAS(socket_get_status, stream_get_meta_data, arginfo_socket_get_status) - - PHP_FE(realpath, arginfo_realpath) - -#ifdef HAVE_FNMATCH - PHP_FE(fnmatch, arginfo_fnmatch) -#endif - - /* functions from fsock.c */ - PHP_FE(fsockopen, arginfo_fsockopen) - PHP_FE(pfsockopen, arginfo_pfsockopen) - - /* functions from pack.c */ - PHP_FE(pack, arginfo_pack) - PHP_FE(unpack, arginfo_unpack) - - /* functions from browscap.c */ - PHP_FE(get_browser, arginfo_get_browser) - - /* functions from crypt.c */ - PHP_FE(crypt, arginfo_crypt) - - /* functions from dir.c */ - PHP_FE(opendir, arginfo_opendir) - PHP_FE(closedir, arginfo_closedir) - PHP_FE(chdir, arginfo_chdir) - -#if defined(HAVE_CHROOT) && !defined(ZTS) && ENABLE_CHROOT_FUNC - PHP_FE(chroot, arginfo_chroot) -#endif - - PHP_FE(getcwd, arginfo_getcwd) - PHP_FE(rewinddir, arginfo_rewinddir) - PHP_FE(readdir, arginfo_readdir) - PHP_FALIAS(dir, getdir, arginfo_dir) - PHP_FE(scandir, arginfo_scandir) -#ifdef HAVE_GLOB - PHP_FE(glob, arginfo_glob) -#endif - /* functions from filestat.c */ - PHP_FE(fileatime, arginfo_fileatime) - PHP_FE(filectime, arginfo_filectime) - PHP_FE(filegroup, arginfo_filegroup) - PHP_FE(fileinode, arginfo_fileinode) - PHP_FE(filemtime, arginfo_filemtime) - PHP_FE(fileowner, arginfo_fileowner) - PHP_FE(fileperms, arginfo_fileperms) - PHP_FE(filesize, arginfo_filesize) - PHP_FE(filetype, arginfo_filetype) - PHP_FE(file_exists, arginfo_file_exists) - PHP_FE(is_writable, arginfo_is_writable) - PHP_FALIAS(is_writeable, is_writable, arginfo_is_writeable) - PHP_FE(is_readable, arginfo_is_readable) - PHP_FE(is_executable, arginfo_is_executable) - PHP_FE(is_file, arginfo_is_file) - PHP_FE(is_dir, arginfo_is_dir) - PHP_FE(is_link, arginfo_is_link) - PHP_FE(stat, arginfo_stat) - PHP_FE(lstat, arginfo_lstat) - PHP_FE(chown, arginfo_chown) - PHP_FE(chgrp, arginfo_chgrp) -#if HAVE_LCHOWN - PHP_FE(lchown, arginfo_lchown) -#endif -#if HAVE_LCHOWN - PHP_FE(lchgrp, arginfo_lchgrp) -#endif - PHP_FE(chmod, arginfo_chmod) -#if HAVE_UTIME - PHP_FE(touch, arginfo_touch) -#endif - PHP_FE(clearstatcache, arginfo_clearstatcache) - PHP_FE(disk_total_space, arginfo_disk_total_space) - PHP_FE(disk_free_space, arginfo_disk_free_space) - PHP_FALIAS(diskfreespace, disk_free_space, arginfo_diskfreespace) - PHP_FE(realpath_cache_size, arginfo_realpath_cache_size) - PHP_FE(realpath_cache_get, arginfo_realpath_cache_get) - - /* functions from mail.c */ - PHP_FE(mail, arginfo_mail) - - /* functions from syslog.c */ -#ifdef HAVE_SYSLOG_H - PHP_FE(openlog, arginfo_openlog) - PHP_FE(syslog, arginfo_syslog) - PHP_FE(closelog, arginfo_closelog) -#endif - - /* functions from lcg.c */ - PHP_FE(lcg_value, arginfo_lcg_value) - - /* functions from metaphone.c */ - PHP_FE(metaphone, arginfo_metaphone) - - /* functions from output.c */ - PHP_FE(ob_start, arginfo_ob_start) - PHP_FE(ob_flush, arginfo_ob_flush) - PHP_FE(ob_clean, arginfo_ob_clean) - PHP_FE(ob_end_flush, arginfo_ob_end_flush) - PHP_FE(ob_end_clean, arginfo_ob_end_clean) - PHP_FE(ob_get_flush, arginfo_ob_get_flush) - PHP_FE(ob_get_clean, arginfo_ob_get_clean) - PHP_FE(ob_get_length, arginfo_ob_get_length) - PHP_FE(ob_get_level, arginfo_ob_get_level) - PHP_FE(ob_get_status, arginfo_ob_get_status) - PHP_FE(ob_get_contents, arginfo_ob_get_contents) - PHP_FE(ob_implicit_flush, arginfo_ob_implicit_flush) - PHP_FE(ob_list_handlers, arginfo_ob_list_handlers) - - /* functions from array.c */ - PHP_FE(ksort, arginfo_ksort) - PHP_FE(krsort, arginfo_krsort) - PHP_FE(natsort, arginfo_natsort) - PHP_FE(natcasesort, arginfo_natcasesort) - PHP_FE(asort, arginfo_asort) - PHP_FE(arsort, arginfo_arsort) - PHP_FE(sort, arginfo_sort) - PHP_FE(rsort, arginfo_rsort) - PHP_FE(usort, arginfo_usort) - PHP_FE(uasort, arginfo_uasort) - PHP_FE(uksort, arginfo_uksort) - PHP_FE(shuffle, arginfo_shuffle) - PHP_FE(array_walk, arginfo_array_walk) - PHP_FE(array_walk_recursive, arginfo_array_walk_recursive) - PHP_FE(count, arginfo_count) - PHP_FE(end, arginfo_end) - PHP_FE(prev, arginfo_prev) - PHP_FE(next, arginfo_next) - PHP_FE(reset, arginfo_reset) - PHP_FE(current, arginfo_current) - PHP_FE(key, arginfo_key) - PHP_FE(min, arginfo_min) - PHP_FE(max, arginfo_max) - PHP_FE(in_array, arginfo_in_array) - PHP_FE(array_search, arginfo_array_search) - PHP_FE(extract, arginfo_extract) - PHP_FE(compact, arginfo_compact) - PHP_FE(array_fill, arginfo_array_fill) - PHP_FE(array_fill_keys, arginfo_array_fill_keys) - PHP_FE(range, arginfo_range) - PHP_FE(array_multisort, arginfo_array_multisort) - PHP_FE(array_push, arginfo_array_push) - PHP_FE(array_pop, arginfo_array_pop) - PHP_FE(array_shift, arginfo_array_shift) - PHP_FE(array_unshift, arginfo_array_unshift) - PHP_FE(array_splice, arginfo_array_splice) - PHP_FE(array_slice, arginfo_array_slice) - PHP_FE(array_merge, arginfo_array_merge) - PHP_FE(array_merge_recursive, arginfo_array_merge_recursive) - PHP_FE(array_replace, arginfo_array_replace) - PHP_FE(array_replace_recursive, arginfo_array_replace_recursive) - PHP_FE(array_keys, arginfo_array_keys) - PHP_FE(array_key_first, arginfo_array_key_first) - PHP_FE(array_key_last, arginfo_array_key_last) - PHP_FE(array_values, arginfo_array_values) - PHP_FE(array_count_values, arginfo_array_count_values) - PHP_FE(array_column, arginfo_array_column) - PHP_FE(array_reverse, arginfo_array_reverse) - PHP_FE(array_reduce, arginfo_array_reduce) - PHP_FE(array_pad, arginfo_array_pad) - PHP_FE(array_flip, arginfo_array_flip) - PHP_FE(array_change_key_case, arginfo_array_change_key_case) - PHP_FE(array_rand, arginfo_array_rand) - PHP_FE(array_unique, arginfo_array_unique) - PHP_FE(array_intersect, arginfo_array_intersect) - PHP_FE(array_intersect_key, arginfo_array_intersect_key) - PHP_FE(array_intersect_ukey, arginfo_array_intersect_ukey) - PHP_FE(array_uintersect, arginfo_array_uintersect) - PHP_FE(array_intersect_assoc, arginfo_array_intersect_assoc) - PHP_FE(array_uintersect_assoc, arginfo_array_uintersect_assoc) - PHP_FE(array_intersect_uassoc, arginfo_array_intersect_uassoc) - PHP_FE(array_uintersect_uassoc, arginfo_array_uintersect_uassoc) - PHP_FE(array_diff, arginfo_array_diff) - PHP_FE(array_diff_key, arginfo_array_diff_key) - PHP_FE(array_diff_ukey, arginfo_array_diff_ukey) - PHP_FE(array_udiff, arginfo_array_udiff) - PHP_FE(array_diff_assoc, arginfo_array_diff_assoc) - PHP_FE(array_udiff_assoc, arginfo_array_udiff_assoc) - PHP_FE(array_diff_uassoc, arginfo_array_diff_uassoc) - PHP_FE(array_udiff_uassoc, arginfo_array_udiff_uassoc) - PHP_FE(array_sum, arginfo_array_sum) - PHP_FE(array_product, arginfo_array_product) - PHP_FE(array_filter, arginfo_array_filter) - PHP_FE(array_map, arginfo_array_map) - PHP_FE(array_chunk, arginfo_array_chunk) - PHP_FE(array_combine, arginfo_array_combine) - PHP_FE(array_key_exists, arginfo_array_key_exists) - - /* aliases from array.c */ - PHP_FALIAS(pos, current, arginfo_pos) - PHP_FALIAS(sizeof, count, arginfo_sizeof) - PHP_FALIAS(key_exists, array_key_exists, arginfo_key_exists) - - /* functions from assert.c */ - PHP_FE(assert, arginfo_assert) - PHP_FE(assert_options, arginfo_assert_options) - - /* functions from versioning.c */ - PHP_FE(version_compare, arginfo_version_compare) - - /* functions from ftok.c*/ -#if HAVE_FTOK - PHP_FE(ftok, arginfo_ftok) -#endif - - PHP_FE(str_rot13, arginfo_str_rot13) - PHP_FE(stream_get_filters, arginfo_stream_get_filters) - PHP_FE(stream_filter_register, arginfo_stream_filter_register) - PHP_FE(stream_bucket_make_writeable, arginfo_stream_bucket_make_writeable) - PHP_FE(stream_bucket_prepend, arginfo_stream_bucket_prepend) - PHP_FE(stream_bucket_append, arginfo_stream_bucket_append) - PHP_FE(stream_bucket_new, arginfo_stream_bucket_new) - - PHP_FE(output_add_rewrite_var, arginfo_output_add_rewrite_var) - PHP_FE(output_reset_rewrite_vars, arginfo_output_reset_rewrite_vars) - - PHP_FE(sys_get_temp_dir, arginfo_sys_get_temp_dir) - -#ifdef PHP_WIN32 - PHP_FE(sapi_windows_cp_set, arginfo_sapi_windows_cp_set) - PHP_FE(sapi_windows_cp_get, arginfo_sapi_windows_cp_get) - PHP_FE(sapi_windows_cp_is_utf8, arginfo_sapi_windows_cp_is_utf8) - PHP_FE(sapi_windows_cp_conv, arginfo_sapi_windows_cp_conv) - PHP_FE(sapi_windows_set_ctrl_handler, arginfo_sapi_windows_set_ctrl_handler) - PHP_FE(sapi_windows_generate_ctrl_event, arginfo_sapi_windows_generate_ctrl_event) -#endif - PHP_FE_END -}; -/* }}} */ - static const zend_module_dep standard_deps[] = { /* {{{ */ ZEND_MOD_OPTIONAL("session") ZEND_MOD_END @@ -836,7 +131,7 @@ zend_module_entry basic_functions_module = { /* {{{ */ NULL, standard_deps, "standard", /* extension name */ - basic_functions, /* function list */ + ext_functions, /* function list */ PHP_MINIT(basic), /* process startup */ PHP_MSHUTDOWN(basic), /* process shutdown */ PHP_RINIT(basic), /* request startup */ diff --git a/ext/standard/basic_functions.stub.php b/ext/standard/basic_functions.stub.php index 4a2df3e578..4b39aa32f9 100755 --- a/ext/standard/basic_functions.stub.php +++ b/ext/standard/basic_functions.stub.php @@ -1,5 +1,7 @@