Chris@0: setClosure($__psysh__, function () use ($__psysh__) { Chris@0: // Restore execution scope variables Chris@0: 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@0: // Buffer stdout; we'll need it later Chris@0: ob_start([$__psysh__, 'writeStdout'], 1); Chris@0: Chris@0: // Convert all errors to exceptions Chris@0: 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@0: restore_error_handler(); Chris@0: if (ob_get_level() > 0) { Chris@0: 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@0: restore_error_handler(); Chris@0: if (ob_get_level() > 0) { Chris@0: ob_end_clean(); Chris@0: } Chris@0: Chris@0: throw $_e; Chris@0: } Chris@0: Chris@0: // Won't be needing this anymore Chris@0: restore_error_handler(); Chris@0: Chris@0: // Flush stdout (write to shell output, plus save to magic variable) Chris@0: ob_end_flush(); Chris@0: Chris@0: // Save execution scope variables for next time Chris@0: $__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: }