[ClassLoader] Fix ClassCollectionLoader inlining with __halt_compiler
This commit is contained in:
parent
9a66470116
commit
a60cd15850
@ -104,8 +104,15 @@ class ClassCollectionLoader
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$c = '(?:\s*+(?:(?:#|//)[^\n]*+\n|/\*(?:(?<!\*/).)++)?+)*+';
|
$spacesRegex = '(?:\s*+(?:(?:\#|//)[^\n]*+\n|/\*(?:(?<!\*/).)++)?+)*+';
|
||||||
$strictTypesRegex = str_replace('.', $c, "'^<\?php\s.declare.\(.strict_types.=.1.\).;'is");
|
$dontInlineRegex = <<<REGEX
|
||||||
|
'(?:
|
||||||
|
^<\?php\s.declare.\(.strict_types.=.1.\).;
|
||||||
|
| \b__halt_compiler.\(.\)
|
||||||
|
| \b__(?:DIR|FILE)__\b
|
||||||
|
)'isx
|
||||||
|
REGEX;
|
||||||
|
$dontInlineRegex = str_replace('.', $spacesRegex, $dontInlineRegex);
|
||||||
|
|
||||||
$cacheDir = explode(DIRECTORY_SEPARATOR, $cacheDir);
|
$cacheDir = explode(DIRECTORY_SEPARATOR, $cacheDir);
|
||||||
$files = array();
|
$files = array();
|
||||||
@ -118,7 +125,7 @@ class ClassCollectionLoader
|
|||||||
$files[] = $file = $class->getFileName();
|
$files[] = $file = $class->getFileName();
|
||||||
$c = file_get_contents($file);
|
$c = file_get_contents($file);
|
||||||
|
|
||||||
if (preg_match($strictTypesRegex, $c)) {
|
if (preg_match($dontInlineRegex, $c)) {
|
||||||
$file = explode(DIRECTORY_SEPARATOR, $file);
|
$file = explode(DIRECTORY_SEPARATOR, $file);
|
||||||
|
|
||||||
for ($i = 0; isset($file[$i], $cacheDir[$i]); ++$i) {
|
for ($i = 0; isset($file[$i], $cacheDir[$i]); ++$i) {
|
||||||
|
@ -235,7 +235,7 @@ class ClassCollectionLoaderTest extends \PHPUnit_Framework_TestCase
|
|||||||
$strictTypes = defined('HHVM_VERSION') ? '' : "\nnamespace {require __DIR__.'/Fixtures/Namespaced/WithStrictTypes.php';}";
|
$strictTypes = defined('HHVM_VERSION') ? '' : "\nnamespace {require __DIR__.'/Fixtures/Namespaced/WithStrictTypes.php';}";
|
||||||
|
|
||||||
ClassCollectionLoader::load(
|
ClassCollectionLoader::load(
|
||||||
array('Namespaced\\WithComments', 'Pearlike_WithComments', $strictTypes ? 'Namespaced\\WithStrictTypes' : 'Namespaced\\WithComments'),
|
array('Namespaced\\WithComments', 'Pearlike_WithComments', 'Namespaced\\WithDirMagic', 'Namespaced\\WithFileMagic', 'Namespaced\\WithHaltCompiler', $strictTypes ? 'Namespaced\\WithStrictTypes' : 'Namespaced\\WithComments'),
|
||||||
__DIR__,
|
__DIR__,
|
||||||
'bar',
|
'bar',
|
||||||
false
|
false
|
||||||
@ -275,6 +275,9 @@ class Pearlike_WithComments
|
|||||||
public static $loaded = true;
|
public static $loaded = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
namespace {require __DIR__.'/Fixtures/Namespaced/WithDirMagic.php';}
|
||||||
|
namespace {require __DIR__.'/Fixtures/Namespaced/WithFileMagic.php';}
|
||||||
|
namespace {require __DIR__.'/Fixtures/Namespaced/WithHaltCompiler.php';}
|
||||||
EOF
|
EOF
|
||||||
.$strictTypes,
|
.$strictTypes,
|
||||||
str_replace(array("<?php \n", '\\\\'), array('', '/'), file_get_contents($file))
|
str_replace(array("<?php \n", '\\\\'), array('', '/'), file_get_contents($file))
|
||||||
|
@ -76,9 +76,11 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase
|
|||||||
'Namespaced\\Foo' => realpath(__DIR__).'/Fixtures/Namespaced/Foo.php',
|
'Namespaced\\Foo' => realpath(__DIR__).'/Fixtures/Namespaced/Foo.php',
|
||||||
'Namespaced\\Baz' => realpath(__DIR__).'/Fixtures/Namespaced/Baz.php',
|
'Namespaced\\Baz' => realpath(__DIR__).'/Fixtures/Namespaced/Baz.php',
|
||||||
'Namespaced\\WithComments' => realpath(__DIR__).'/Fixtures/Namespaced/WithComments.php',
|
'Namespaced\\WithComments' => realpath(__DIR__).'/Fixtures/Namespaced/WithComments.php',
|
||||||
'Namespaced\WithStrictTypes' => realpath(__DIR__).'/Fixtures/Namespaced/WithStrictTypes.php',
|
'Namespaced\\WithStrictTypes' => realpath(__DIR__).'/Fixtures/Namespaced/WithStrictTypes.php',
|
||||||
),
|
'Namespaced\\WithHaltCompiler' => realpath(__DIR__).'/Fixtures/Namespaced/WithHaltCompiler.php',
|
||||||
),
|
'Namespaced\\WithDirMagic' => realpath(__DIR__).'/Fixtures/Namespaced/WithDirMagic.php',
|
||||||
|
'Namespaced\\WithFileMagic' => realpath(__DIR__).'/Fixtures/Namespaced/WithFileMagic.php',
|
||||||
|
)),
|
||||||
array(__DIR__.'/Fixtures/beta/NamespaceCollision', array(
|
array(__DIR__.'/Fixtures/beta/NamespaceCollision', array(
|
||||||
'NamespaceCollision\\A\\B\\Bar' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Bar.php',
|
'NamespaceCollision\\A\\B\\Bar' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Bar.php',
|
||||||
'NamespaceCollision\\A\\B\\Foo' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Foo.php',
|
'NamespaceCollision\\A\\B\\Foo' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Foo.php',
|
||||||
|
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* foo
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Namespaced;
|
||||||
|
|
||||||
|
class WithDirMagic
|
||||||
|
{
|
||||||
|
public function getDir()
|
||||||
|
{
|
||||||
|
return __DIR__;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* foo
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Namespaced;
|
||||||
|
|
||||||
|
class WithFileMagic
|
||||||
|
{
|
||||||
|
public function getFile()
|
||||||
|
{
|
||||||
|
return __FILE__;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* foo
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Namespaced;
|
||||||
|
|
||||||
|
class WithHaltCompiler
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// the end of the script execution
|
||||||
|
__halt_compiler(); data
|
||||||
|
data
|
||||||
|
data
|
||||||
|
data
|
||||||
|
...
|
Reference in New Issue
Block a user