Skip to content

v0.8.9

Choose a tag to compare

@rail5 rail5 released this 17 Apr 17:55
· 84 commits to main since this release
44e1794
  • Subshell code generation: Fixed critical bug where normal command
    substitution subshells ($(...)) and cat‑replacement subshells
    ($(< file)) incorrectly shared buffer placement logic.
    • Cat‑replacement subshells now enforce perfect forwarding: pre‑code
      and post‑code are placed strictly outside the substitution, and
      local object destruction is deferred until after buffers are flushed.
    • Normal subshells now correctly scope pre‑code, post‑code, and
      destructor calls inside the substitution, ensuring proper lifetime
      management and output capture.
    • Added test cases for cat‑replacement and corrected expectations in
      the local‑scope test.
  • AST pretty‑printing: SubshellSubstitution nodes now display whether
    they represent a cat‑replacement subshell, aiding debugging.
  • Parser error recovery: The parser now attempts to recover from syntax
    errors and continue building the AST, allowing multiple parser errors to
    be reported in a single compilation pass rather than aborting on the
    first failure.
  • bpp‑lsp improvements:
    • Removed unused --port and --socket options; the language server
      now communicates exclusively over stdio.
    • Eliminated unnecessary signal handlers; the server simply exits on
      signals as no extra cleanup is required.
    • Added a note to the help text describing LSP usage.
  • Code hygiene and refactoring:
    • Replaced system() with fork() + execvp() for runs-on-exit
    • Changed in_supershell boolean flag to a stack<std::monostate>
      to correctly track nested supershell contexts.
    • Unified multiple NullOStream implementations into a single common
      definition.
    • Migrated from realpath() to std::filesystem::canonical().
    • Refined argument parsing: Bash version string parsing moved into a
      constexpr constructor of BashVersion.