function funcInfoToCode()

in gen_stub.php [1362:1469]


function funcInfoToCode(FuncInfo $funcInfo, bool $minimal): string {
    $code = '';

    // Generate the minimal, most compatible arginfo across PHP versions
    if ($minimal) {
        $code .= sprintf("ZEND_BEGIN_ARG_INFO_EX(%s, 0, %d, %d)\n",
            $funcInfo->getArgInfoName(),
            $funcInfo->return->byRef,
            $funcInfo->numRequiredArgs);
        foreach ($funcInfo->args as $argInfo) {
            $code .= sprintf("\tZEND_ARG_INFO(0, %s)\n", $argInfo->name);
        }
    } else {
        $returnType = $funcInfo->return->type;
        if ($returnType !== null) {
            if (null !== $simpleReturnType = $returnType->tryToSimpleType()) {
                if ($simpleReturnType->isBuiltin) {
                    $code .= sprintf(
                        "AWS_PHP_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(%s, %d, %d, %s, %d)\n",
                        $funcInfo->getArgInfoName(), $funcInfo->return->byRef,
                        $funcInfo->numRequiredArgs,
                        $simpleReturnType->toEscapedName(), $returnType->isNullable()
                    );
                }
            } else {
                $arginfoType = $returnType->toArginfoType();
                if ($arginfoType->hasClassType()) {
                    $code .= sprintf(
                        "ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(%s, %d, %d, %s, %s)\n",
                        $funcInfo->getArgInfoName(), $funcInfo->return->byRef,
                        $funcInfo->numRequiredArgs,
                        $arginfoType->toClassTypeString(), $arginfoType->toTypeMask()
                    );
                } else {
                    $code .= sprintf(
                        "ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(%s, %d, %d, %s)\n",
                        $funcInfo->getArgInfoName(), $funcInfo->return->byRef,
                        $funcInfo->numRequiredArgs,
                        $arginfoType->toTypeMask()
                    );
                }
            }
        } else {
            $code .= sprintf(
                "ZEND_BEGIN_ARG_INFO_EX(%s, 0, %d, %d)\n",
                $funcInfo->getArgInfoName(), $funcInfo->return->byRef, $funcInfo->numRequiredArgs
            );
        }

        foreach ($funcInfo->args as $argInfo) {
            $argKind = $argInfo->isVariadic ? "ARG_VARIADIC" : "ARG";
            $argDefaultKind = $argInfo->hasProperDefaultValue() ? "_WITH_DEFAULT_VALUE" : "";
            $argType = $argInfo->type;
            if ($argType !== null) {
                if (null !== $simpleArgType = $argType->tryToSimpleType()) {
                    if ($simpleArgType->isBuiltin) {
                        $code .= sprintf(
                            "\tZEND_%s_TYPE_INFO%s(%s, %s, %s, %d%s)\n",
                            $argKind, $argDefaultKind, $argInfo->getSendByString(), $argInfo->name,
                            $simpleArgType->toTypeCode(), $argType->isNullable(),
                            $argInfo->hasProperDefaultValue() ? ", " . $argInfo->getDefaultValueAsArginfoString() : ""
                        );
                    } else {
                        $code .= sprintf(
                            "\tZEND_%s_OBJ_INFO%s(%s, %s, %s, %d%s)\n",
                            $argKind,$argDefaultKind, $argInfo->getSendByString(), $argInfo->name,
                            $simpleArgType->toEscapedName(), $argType->isNullable(),
                            $argInfo->hasProperDefaultValue() ? ", " . $argInfo->getDefaultValueAsArginfoString() : ""
                        );
                    }
                } else {
                    $arginfoType = $argType->toArginfoType();
                    if ($arginfoType->hasClassType()) {
                        $code .= sprintf(
                            "\tZEND_%s_OBJ_TYPE_MASK(%s, %s, %s, %s, %s)\n",
                            $argKind, $argInfo->getSendByString(), $argInfo->name,
                            $arginfoType->toClassTypeString(), $arginfoType->toTypeMask(),
                            $argInfo->getDefaultValueAsArginfoString()
                        );
                    } else {
                        $code .= sprintf(
                            "\tZEND_%s_TYPE_MASK(%s, %s, %s, %s)\n",
                            $argKind, $argInfo->getSendByString(), $argInfo->name,
                            $arginfoType->toTypeMask(),
                            $argInfo->getDefaultValueAsArginfoString()
                        );
                    }
                }
            } else {
                $code .= sprintf(
                    "\tZEND_%s_INFO%s(%s, %s%s)\n",
                    $argKind, $argDefaultKind, $argInfo->getSendByString(), $argInfo->name,
                    $argInfo->hasProperDefaultValue() ? ", " . $argInfo->getDefaultValueAsArginfoString() : ""
                );
            }
        }
    }

    $code .= "ZEND_END_ARG_INFO()";
    return $code . "\n";
}