Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expand existing lifecycle configuration support #1647

Merged
merged 2 commits into from
May 12, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
122 changes: 97 additions & 25 deletions Library/Compiler.php
Original file line number Diff line number Diff line change
Expand Up @@ -773,21 +773,42 @@ public function generate(CommandInterface $command)
/**
* Check if there are module/request/global destructors
*/
$includes = '';
$destructors = $this->config->get('destructors');
if (is_array($destructors)) {
$invokeDestructors = $this->processCodeInjection($destructors);
$includes = $invokeDestructors[0];
$destructors = $invokeDestructors[1];
$invokeRequestDestructors = $this->processCodeInjection($destructors, 'request');
$includes .= PHP_EOL . $invokeRequestDestructors[0];
$reqDestructors = $invokeRequestDestructors[1];

$invokePostRequestDestructors = $this->processCodeInjection($destructors, 'post-request');
$includes .= PHP_EOL . $invokePostRequestDestructors[0];
$prqDestructors = $invokePostRequestDestructors[1];

$invokeModuleDestructors = $this->processCodeInjection($destructors, 'module');
$includes .= PHP_EOL . $invokeModuleDestructors[0];
$modDestructors = $invokeModuleDestructors[1];

$invokeGlobalsDestructors = $this->processCodeInjection($destructors, 'globals');
$includes .= PHP_EOL . $invokeGlobalsDestructors[0];
$glbDestructors = $invokeGlobalsDestructors[1];
}

/**
* Check if there are module/request/global initializers
*/
$initializers = $this->config->get('initializers');
if (is_array($initializers)) {
$invokeInitializers = $this->processCodeInjection($initializers);
$includes = $invokeInitializers[0];
$initializers = $invokeInitializers[1];
$invokeRequestInitializers = $this->processCodeInjection($initializers, 'request');
$includes .= PHP_EOL . $invokeRequestInitializers[0];
$reqInitializers = $invokeRequestInitializers[1];

$invokeModuleInitializers = $this->processCodeInjection($initializers, 'module');
$includes .= PHP_EOL . $invokeModuleInitializers[0];
$modInitializers = $invokeModuleInitializers[1];

$invokeGlobalsInitializers = $this->processCodeInjection($initializers, 'globals');
$includes .= PHP_EOL . $invokeGlobalsInitializers[0];
$glbInitializers = $invokeGlobalsInitializers[1];
}

/**
Expand Down Expand Up @@ -1687,15 +1708,19 @@ public function processExtensionInfo()
* @param array $entries
* @return array
*/
public function processCodeInjection(array $entries)
public function processCodeInjection(array $entries, $section = 'request')
{
$codes = array();
$includes = array();

if (isset($entries['request'])) {
foreach ($entries['request'] as $entry) {
$codes[] = $entry['code'] . ';';
$includes[] = "#include \"" . $entry['include'] . "\"";
if (isset($entries[$section])) {
foreach ($entries[$section] as $entry) {
if (isset($entry['code']) && !empty($entry['code'])) {
$codes[] = $entry['code'] . ';';
}
if (isset($entry['include']) && !empty($entry['include'])) {
$includes[] = "#include \"" . $entry['include'] . "\"";
}
}
}

Expand Down Expand Up @@ -1770,7 +1795,13 @@ public function createProjectFiles($project)
}

$includes = '';
$destructors = '';
$reqInitializers = '';
$reqDestructors = '';
$prqDestructors = '';
$modInitializers = '';
$modDestructors = '';
$glbInitializers = '';
$glbDestructors = '';
$files = array_merge($this->files, $this->anonymousFiles);

/**
Expand Down Expand Up @@ -1872,19 +1903,39 @@ public function createProjectFiles($project)
*/
$destructors = $this->config->get('destructors');
if (is_array($destructors)) {
$invokeDestructors = $this->processCodeInjection($destructors);
$includes = $invokeDestructors[0];
$destructors = $invokeDestructors[1];
$invokeRequestDestructors = $this->processCodeInjection($destructors, 'request');
$includes .= PHP_EOL . $invokeRequestDestructors[0];
$reqDestructors = $invokeRequestDestructors[1];

$invokePostRequestDestructors = $this->processCodeInjection($destructors, 'post-request');
$includes .= PHP_EOL . $invokePostRequestDestructors[0];
$prqDestructors = $invokePostRequestDestructors[1];

$invokeModuleDestructors = $this->processCodeInjection($destructors, 'module');
$includes .= PHP_EOL . $invokeModuleDestructors[0];
$modDestructors = $invokeModuleDestructors[1];

$invokeGlobalsDestructors = $this->processCodeInjection($destructors, 'globals');
$includes .= PHP_EOL . $invokeGlobalsDestructors[0];
$glbDestructors = $invokeGlobalsDestructors[1];
}

/**
* Check if there are module/request/global initializers
*/
$initializers = $this->config->get('initializers');
if (is_array($initializers)) {
$invokeInitializers = $this->processCodeInjection($initializers);
$includes = $invokeInitializers[0];
$initializers = $invokeInitializers[1];
$invokeRequestInitializers = $this->processCodeInjection($initializers, 'request');
$includes .= PHP_EOL . $invokeRequestInitializers[0];
$reqInitializers = $invokeRequestInitializers[1];

$invokeModuleInitializers = $this->processCodeInjection($initializers, 'module');
$includes .= PHP_EOL . $invokeModuleInitializers[0];
$modInitializers = $invokeModuleInitializers[1];

$invokeGlobalsInitializers = $this->processCodeInjection($initializers, 'globals');
$includes .= PHP_EOL . $invokeGlobalsInitializers[0];
$glbInitializers = $invokeGlobalsInitializers[1];
}

/**
Expand Down Expand Up @@ -1916,14 +1967,36 @@ public function createProjectFiles($project)
PHP_EOL . "\t",
array_merge($completeInterfaceInits, $completeClassInits)
),
'%INIT_GLOBALS%' => $globalsDefault[0],
'%INIT_GLOBALS%' => implode(
PHP_EOL . "\t",
array_merge((array)$globalsDefault[0], array($glbInitializers))
),
'%INIT_MODULE_GLOBALS%' => $globalsDefault[1],
'%DESTROY_GLOBALS%' => $glbDestructors,
'%EXTENSION_INFO%' => $phpInfo,
'%EXTRA_INCLUDES%' => $includes,
'%DESTRUCTORS%' => $destructors,
'%INITIALIZERS%' => implode(
'%EXTRA_INCLUDES%' => implode(
PHP_EOL,
array_unique(explode(PHP_EOL, $includes))
),
'%MOD_INITIALIZERS%' => $modInitializers,
'%MOD_DESTRUCTORS%' => $modDestructors,
'%REQ_INITIALIZERS%' => implode(
PHP_EOL . "\t",
array_merge($this->internalInitializers, array($reqInitializers))
),
'%REQ_DESTRUCTORS%' => $reqDestructors,
'%POSTREQ_DESTRUCTORS%' => empty($prqDestructors) ? '' : implode(
PHP_EOL,
array_merge($this->internalInitializers, array($initializers))
array(
'#define ZEPHIR_POST_REQUEST 1',
'static PHP_PRSHUTDOWN_FUNCTION(' . strtolower($project) . ')',
'{',
"\t" . implode(
PHP_EOL . "\t",
explode(PHP_EOL, $prqDestructors)
),
'}'
)
),
'%FE_HEADER%' => $feHeader,
'%FE_ENTRIES%' => $feEntries,
Expand Down Expand Up @@ -2235,8 +2308,7 @@ public function generatePackageDependenciesM4($contentM4)
*/
protected function checkRequires()
{
$extensionRequires = $this->config->get("requires");
$extensionRequires = $extensionRequires["extensions"];
$extensionRequires = $this->config->get("extensions", "requires");
if ($extensionRequires) {
$collectionError = PHP_EOL . "\tCould not load extension : ";
foreach ($extensionRequires as $key => $value) {
Expand Down
27 changes: 15 additions & 12 deletions templates/ZendEngine2/project.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ static PHP_MINIT_FUNCTION(%PROJECT_LOWER%)
#endif
REGISTER_INI_ENTRIES();
%CLASS_INITS%
%MOD_INITIALIZERS%

// TODO: Deprecated. Will be removed in future
#if PHP_VERSION_ID < 50500
Expand All @@ -68,7 +69,7 @@ static PHP_MINIT_FUNCTION(%PROJECT_LOWER%)
#ifndef ZEPHIR_RELEASE
static PHP_MSHUTDOWN_FUNCTION(%PROJECT_LOWER%)
{

%MOD_DESTRUCTORS%
zephir_deinitialize_memory(TSRMLS_C);
UNREGISTER_INI_ENTRIES();
return SUCCESS;
Expand Down Expand Up @@ -97,40 +98,38 @@ static void php_zephir_init_globals(zend_%PROJECT_LOWER%_globals *%PROJECT_LOWER
/* Static cache */
memset(%PROJECT_LOWER%_globals->scache, '\0', sizeof(zephir_fcall_cache_entry*) * ZEPHIR_MAX_CACHE_SLOTS);

%INIT_GLOBALS%
%INIT_GLOBALS%
}

/**
* Initialize globals only on each thread started
*/
static void php_zephir_init_module_globals(zend_%PROJECT_LOWER%_globals *%PROJECT_LOWER%_globals TSRMLS_DC)
{
%INIT_MODULE_GLOBALS%
%INIT_MODULE_GLOBALS%
}

static PHP_RINIT_FUNCTION(%PROJECT_LOWER%)
{

zend_%PROJECT_LOWER%_globals *%PROJECT_LOWER%_globals_ptr = ZEPHIR_VGLOBAL;

php_zephir_init_globals(%PROJECT_LOWER%_globals_ptr TSRMLS_CC);
//zephir_init_interned_strings(TSRMLS_C);

zephir_initialize_memory(%PROJECT_LOWER%_globals_ptr TSRMLS_CC);

%INITIALIZERS%
%REQ_INITIALIZERS%
return SUCCESS;
}

static PHP_RSHUTDOWN_FUNCTION(%PROJECT_LOWER%)
{

%DESTRUCTORS%

%REQ_DESTRUCTORS%
zephir_deinitialize_memory(TSRMLS_C);
return SUCCESS;
}

%POSTREQ_DESTRUCTORS%

static PHP_MINFO_FUNCTION(%PROJECT_LOWER%)
{
php_info_print_box_start(0);
Expand All @@ -144,7 +143,7 @@ static PHP_MINFO_FUNCTION(%PROJECT_LOWER%)
php_info_print_table_row(2, "Build Date", __DATE__ " " __TIME__ );
php_info_print_table_row(2, "Powered by Zephir", "Version " PHP_%PROJECT_UPPER%_ZEPVERSION);
php_info_print_table_end();
%EXTENSION_INFO%
%EXTENSION_INFO%
DISPLAY_INI_ENTRIES();
}

Expand All @@ -156,12 +155,12 @@ static PHP_GINIT_FUNCTION(%PROJECT_LOWER%)

static PHP_GSHUTDOWN_FUNCTION(%PROJECT_LOWER%)
{

%DESTROY_GLOBALS%
}

%FE_HEADER%
zend_function_entry php_%PROJECT_LOWER_SAFE%_functions[] = {
%FE_ENTRIES%
%FE_ENTRIES%
};

zend_module_entry %PROJECT_LOWER_SAFE%_module_entry = {
Expand All @@ -183,7 +182,11 @@ zend_module_entry %PROJECT_LOWER_SAFE%_module_entry = {
ZEND_MODULE_GLOBALS(%PROJECT_LOWER%),
PHP_GINIT(%PROJECT_LOWER%),
PHP_GSHUTDOWN(%PROJECT_LOWER%),
#ifdef ZEPHIR_POST_REQUEST
PHP_PRSHUTDOWN(%PROJECT_LOWER%),
#else
NULL,
#endif
STANDARD_MODULE_PROPERTIES_EX
};

Expand Down
23 changes: 15 additions & 8 deletions templates/ZendEngine3/project.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,14 @@ static PHP_MINIT_FUNCTION(%PROJECT_LOWER%)
REGISTER_INI_ENTRIES();
zephir_module_init();
%CLASS_INITS%
%MOD_INITIALIZERS%
return SUCCESS;
}

#ifndef ZEPHIR_RELEASE
static PHP_MSHUTDOWN_FUNCTION(%PROJECT_LOWER%)
{
%MOD_DESTRUCTORS%
zephir_deinitialize_memory(TSRMLS_C);
UNREGISTER_INI_ENTRIES();
return SUCCESS;
Expand Down Expand Up @@ -70,20 +72,19 @@ static void php_zephir_init_globals(zend_%PROJECT_LOWER%_globals *%PROJECT_LOWER
/* Static cache */
memset(%PROJECT_LOWER%_globals->scache, '\0', sizeof(zephir_fcall_cache_entry*) * ZEPHIR_MAX_CACHE_SLOTS);

%INIT_GLOBALS%
%INIT_GLOBALS%
}

/**
* Initialize globals only on each thread started
*/
static void php_zephir_init_module_globals(zend_%PROJECT_LOWER%_globals *%PROJECT_LOWER%_globals TSRMLS_DC)
{
%INIT_MODULE_GLOBALS%
%INIT_MODULE_GLOBALS%
}

static PHP_RINIT_FUNCTION(%PROJECT_LOWER%)
{

zend_%PROJECT_LOWER%_globals *%PROJECT_LOWER%_globals_ptr;
#ifdef ZTS
tsrm_ls = ts_resource(0);
Expand All @@ -93,17 +94,19 @@ static PHP_RINIT_FUNCTION(%PROJECT_LOWER%)
php_zephir_init_globals(%PROJECT_LOWER%_globals_ptr TSRMLS_CC);
zephir_initialize_memory(%PROJECT_LOWER%_globals_ptr TSRMLS_CC);

%INITIALIZERS%
%REQ_INITIALIZERS%
return SUCCESS;
}

static PHP_RSHUTDOWN_FUNCTION(%PROJECT_LOWER%)
{
%DESTRUCTORS%
%REQ_DESTRUCTORS%
zephir_deinitialize_memory(TSRMLS_C);
return SUCCESS;
}

%POSTREQ_DESTRUCTORS%

static PHP_MINFO_FUNCTION(%PROJECT_LOWER%)
{
php_info_print_box_start(0);
Expand All @@ -117,7 +120,7 @@ static PHP_MINFO_FUNCTION(%PROJECT_LOWER%)
php_info_print_table_row(2, "Build Date", __DATE__ " " __TIME__ );
php_info_print_table_row(2, "Powered by Zephir", "Version " PHP_%PROJECT_UPPER%_ZEPVERSION);
php_info_print_table_end();
%EXTENSION_INFO%
%EXTENSION_INFO%
DISPLAY_INI_ENTRIES();
}

Expand All @@ -129,12 +132,12 @@ static PHP_GINIT_FUNCTION(%PROJECT_LOWER%)

static PHP_GSHUTDOWN_FUNCTION(%PROJECT_LOWER%)
{

%DESTROY_GLOBALS%
}

%FE_HEADER%
zend_function_entry php_%PROJECT_LOWER_SAFE%_functions[] = {
%FE_ENTRIES%
%FE_ENTRIES%
};

zend_module_entry %PROJECT_LOWER_SAFE%_module_entry = {
Expand All @@ -156,7 +159,11 @@ zend_module_entry %PROJECT_LOWER_SAFE%_module_entry = {
ZEND_MODULE_GLOBALS(%PROJECT_LOWER%),
PHP_GINIT(%PROJECT_LOWER%),
PHP_GSHUTDOWN(%PROJECT_LOWER%),
#ifdef ZEPHIR_POST_REQUEST
PHP_PRSHUTDOWN(%PROJECT_LOWER%),
#else
NULL,
#endif
STANDARD_MODULE_PROPERTIES_EX
};

Expand Down
2 changes: 1 addition & 1 deletion unit-tests/Zephir/Test/ConfigTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public function setUp()
*/
public function testConstructWithBadConfigFile()
{
chdir(__DIR__ . DIRECTORY_SEPARATOR . '_files');
chdir(__DIR__ . DIRECTORY_SEPARATOR . '_files/badconfig');
$config = new Config();
}

Expand Down
Loading