Chris@16: setClosure($__psysh__, function () use ($__psysh__) { Chris@16: // Restore execution scope variables Chris@17: \extract($__psysh__->getScopeVariables(false)); Chris@16: Chris@16: do { Chris@16: $__psysh__->beforeLoop(); Chris@16: Chris@16: try { Chris@16: $__psysh__->getInput(); Chris@16: Chris@16: try { Chris@17: // Pull in any new execution scope variables Chris@17: if ($__psysh__->getLastExecSuccess()) { Chris@17: \extract($__psysh__->getScopeVariablesDiff(\get_defined_vars())); Chris@17: } Chris@17: Chris@16: // Buffer stdout; we'll need it later Chris@17: \ob_start([$__psysh__, 'writeStdout'], 1); Chris@16: Chris@16: // Convert all errors to exceptions Chris@17: \set_error_handler([$__psysh__, 'handleError']); Chris@16: Chris@16: // Evaluate the current code buffer Chris@16: $_ = eval($__psysh__->onExecute($__psysh__->flushCode() ?: ExecutionClosure::NOOP_INPUT)); Chris@16: } catch (\Throwable $_e) { Chris@16: // Clean up on our way out. Chris@17: \restore_error_handler(); Chris@17: if (\ob_get_level() > 0) { Chris@17: \ob_end_clean(); Chris@16: } Chris@16: Chris@16: throw $_e; Chris@16: } catch (\Exception $_e) { Chris@16: // Clean up on our way out. Chris@17: \restore_error_handler(); Chris@17: if (\ob_get_level() > 0) { Chris@17: \ob_end_clean(); Chris@16: } Chris@16: Chris@16: throw $_e; Chris@16: } Chris@16: Chris@16: // Won't be needing this anymore Chris@17: \restore_error_handler(); Chris@16: Chris@16: // Flush stdout (write to shell output, plus save to magic variable) Chris@17: \ob_end_flush(); Chris@16: Chris@16: // Save execution scope variables for next time Chris@17: $__psysh__->setScopeVariables(\get_defined_vars()); Chris@16: Chris@16: $__psysh__->writeReturnValue($_); Chris@16: } catch (BreakException $_e) { Chris@16: $__psysh__->writeException($_e); Chris@16: Chris@16: return; Chris@16: } catch (ThrowUpException $_e) { Chris@16: $__psysh__->writeException($_e); Chris@16: Chris@16: throw $_e; Chris@16: } catch (\TypeError $_e) { Chris@16: $__psysh__->writeException(TypeErrorException::fromTypeError($_e)); Chris@16: } catch (\Error $_e) { Chris@16: $__psysh__->writeException(ErrorException::fromError($_e)); Chris@16: } catch (\Exception $_e) { Chris@16: $__psysh__->writeException($_e); Chris@16: } Chris@16: Chris@16: $__psysh__->afterLoop(); Chris@16: } while (true); Chris@16: }); Chris@16: } Chris@16: }