Seditio Source
Root |
./othercms/dle15_0/upload/engine/classes/composer/vendor/mtdowling/jmespath.php/src/CompilerRuntime.php
<?php
namespace JmesPath;

/**
 * Compiles JMESPath expressions to PHP source code and executes it.
 *
 * JMESPath file names are stored in the cache directory using the following
 * logic to determine the filename:
 *
 * 1. Start with the string "jmespath_"
 * 2. Append the MD5 checksum of the expression.
 * 3. Append ".php"
 */
class CompilerRuntime
{
    private
$parser;
    private
$compiler;
    private
$cacheDir;
    private
$interpreter;

   
/**
     * @param string|null $dir Directory used to store compiled PHP files.
     * @param Parser|null $parser JMESPath parser to utilize
     * @throws \RuntimeException if the cache directory cannot be created
     */
   
public function __construct($dir = null, Parser $parser = null)
    {
       
$this->parser = $parser ?: new Parser();
       
$this->compiler = new TreeCompiler();
       
$dir = $dir ?: sys_get_temp_dir();

        if (!
is_dir($dir) && !mkdir($dir, 0755, true)) {
            throw new \
RuntimeException("Unable to create cache directory: $dir");
        }

       
$this->cacheDir = realpath($dir);
       
$this->interpreter = new TreeInterpreter();
    }

   
/**
     * Returns data from the provided input that matches a given JMESPath
     * expression.
     *
     * @param string $expression JMESPath expression to evaluate
     * @param mixed  $data       Data to search. This data should be data that
     *                           is similar to data returned from json_decode
     *                           using associative arrays rather than objects.
     *
     * @return mixed Returns the matching data or null
     * @throws \RuntimeException
     */
   
public function __invoke($expression, $data)
    {
       
$functionName = 'jmespath_' . md5($expression);

        if (!
function_exists($functionName)) {
           
$filename = "{$this->cacheDir}/{$functionName}.php";
            if (!
file_exists($filename)) {
               
$this->compile($filename, $expression, $functionName);
            }
            require
$filename;
        }

        return
$functionName($this->interpreter, $data);
    }

    private function
compile($filename, $expression, $functionName)
    {
       
$code = $this->compiler->visit(
           
$this->parser->parse($expression),
           
$functionName,
           
$expression
       
);

        if (!
file_put_contents($filename, $code)) {
            throw new \
RuntimeException(sprintf(
               
'Unable to write the compiled PHP code to: %s (%s)',
               
$filename,
               
var_export(error_get_last(), true)
            ));
        }
    }
}