Zephir\Compiler::generateFunctionInformation PHP Метод

generateFunctionInformation() публичный Метод

    public function generateFunctionInformation()
    {
        $headerPrinter = new CodePrinter();
        $entryPrinter = new CodePrinter();
        /**
         * Create argument info
         */
        foreach ($this->functionDefinitions as $func) {
            $funcName = $func->getInternalName();
            $argInfoName = 'arginfo_' . strtolower($funcName);
            $headerPrinter->output('PHP_FUNCTION(' . $funcName . ');');
            $parameters = $func->getParameters();
            if (count($parameters)) {
                $headerPrinter->output('ZEND_BEGIN_ARG_INFO_EX(' . $argInfoName . ', 0, 0, ' . $func->getNumberOfRequiredParameters() . ')');
                foreach ($parameters->getParameters() as $parameter) {
                    switch ($parameter['data-type']) {
                        case 'array':
                            $headerPrinter->output("\t" . 'ZEND_ARG_ARRAY_INFO(0, ' . $parameter['name'] . ', ' . (isset($parameter['default']) ? 1 : 0) . ')');
                            break;
                        case 'variable':
                            if (isset($parameter['cast'])) {
                                switch ($parameter['cast']['type']) {
                                    case 'variable':
                                        $value = $parameter['cast']['value'];
                                        $headerPrinter->output("\t" . 'ZEND_ARG_OBJ_INFO(0, ' . $parameter['name'] . ', ' . Utils::escapeClassName($compilationContext->getFullName($value)) . ', ' . (isset($parameter['default']) ? 1 : 0) . ')');
                                        break;
                                    default:
                                        throw new Exception('Unexpected exception');
                                }
                            } else {
                                $headerPrinter->output("\t" . 'ZEND_ARG_INFO(0, ' . $parameter['name'] . ')');
                            }
                            break;
                        default:
                            $headerPrinter->output("\t" . 'ZEND_ARG_INFO(0, ' . $parameter['name'] . ')');
                            break;
                    }
                }
                $headerPrinter->output('ZEND_END_ARG_INFO()');
                $headerPrinter->outputBlankLine();
            }
            /** Generate FE's */
            $paramData = count($parameters) ? $argInfoName : 'NULL';
            if ($func->isGlobal()) {
                $entryPrinter->output('ZEND_NAMED_FE(' . $func->getName() . ', ZEND_FN(' . $funcName . '), ' . $paramData . ')');
            } else {
                $entryPrinter->output('ZEND_NS_NAMED_FE("' . str_replace('\\', '\\\\', $func->getNamespace()) . '", ' . $func->getName() . ', ZEND_FN(' . $funcName . '), ' . $paramData . ')');
            }
        }
        $entryPrinter->output('ZEND_FE_END');
        return array($headerPrinter->getOutput(), $entryPrinter->getOutput());
    }