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