<?php /* * This file is part of Psy Shell. * * (c) 2012-2023 Justin Hileman * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Psy; use Psy\Exception\BreakException; use Psy\Exception\ThrowUpException; /** * The Psy Shell's execution loop scope. * * @todo Once we're on PHP 5.5, we can switch ExecutionClosure to a generator * and get rid of the duplicate closure implementations :) */ class ExecutionLoopClosure extends ExecutionClosure { /** * @param Shell $__psysh__ */ public function __construct(Shell $__psysh__) { $this->setClosure($__psysh__, function () use ($__psysh__) { // Restore execution scope variables \extract($__psysh__->getScopeVariables(false)); while (true) { $__psysh__->beforeLoop(); try { $__psysh__->getInput(); try { // Pull in any new execution scope variables if ($__psysh__->getLastExecSuccess()) { \extract($__psysh__->getScopeVariablesDiff(\get_defined_vars())); } // Buffer stdout; we'll need it later \ob_start([$__psysh__, 'writeStdout'], 1); // Convert all errors to exceptions \set_error_handler([$__psysh__, 'handleError']); // Evaluate the current code buffer $_ = eval($__psysh__->onExecute($__psysh__->flushCode() ?: ExecutionClosure::NOOP_INPUT)); } catch (\Throwable $_e) { // Clean up on our way out. if (\ob_get_level() > 0) { \ob_end_clean(); } throw $_e; } finally { // Won't be needing this anymore \restore_error_handler(); } // Flush stdout (write to shell output, plus save to magic variable) \ob_end_flush(); // Save execution scope variables for next time $__psysh__->setScopeVariables(\get_defined_vars()); $__psysh__->writeReturnValue($_); } catch (BreakException $_e) { $__psysh__->writeException($_e); return; } catch (ThrowUpException $_e) { $__psysh__->writeException($_e); throw $_e; } catch (\Throwable $_e) { $__psysh__->writeException($_e); } $__psysh__->afterLoop(); } }); } }
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
CodeCleaner | Folder | 0755 |
|
|
Command | Folder | 0755 |
|
|
Exception | Folder | 0755 |
|
|
ExecutionLoop | Folder | 0755 |
|
|
Formatter | Folder | 0755 |
|
|
Input | Folder | 0755 |
|
|
Output | Folder | 0755 |
|
|
Readline | Folder | 0755 |
|
|
Reflection | Folder | 0755 |
|
|
Sudo | Folder | 0755 |
|
|
TabCompletion | Folder | 0755 |
|
|
Util | Folder | 0755 |
|
|
VarDumper | Folder | 0755 |
|
|
VersionUpdater | Folder | 0755 |
|
|
CodeCleaner.php | File | 11.86 KB | 0644 |
|
ConfigPaths.php | File | 11.39 KB | 0644 |
|
Configuration.php | File | 54.35 KB | 0644 |
|
Context.php | File | 7.71 KB | 0644 |
|
ContextAware.php | File | 567 B | 0644 |
|
EnvInterface.php | File | 443 B | 0644 |
|
ExecutionClosure.php | File | 2.25 KB | 0644 |
|
ExecutionLoopClosure.php | File | 2.81 KB | 0644 |
|
ParserFactory.php | File | 1.58 KB | 0644 |
|
Shell.php | File | 47.2 KB | 0644 |
|
Sudo.php | File | 5.28 KB | 0644 |
|
SuperglobalsEnv.php | File | 620 B | 0644 |
|
functions.php | File | 16.51 KB | 0644 |
|