Skip to content

v3.0 Release

Latest

Choose a tag to compare

@emkey1 emkey1 released this 28 Oct 09:51
· 808 commits to devel since this release
7e3614a

Pscal v3.0.0

Date: 2025-10-20

Highlights

  • New exsh front end – A Bash-compatible shell joins Pascal, CLike, Rea, and Tiny. exsh shares PSCAL’s builtin catalog, honours directory stacks, jobs, and traps, and now supports -c inline execution, parity-focused regression tests, and detailed debug logging.
  • Faster VM dispatch – Builtin lookups are now hash-indexed and the VM caches procedure symbols by bytecode address, trimming dispatch costs across every language while keeping optional-module detection stable.
  • Language feature growth – Pascal picks up goto/label support and compound assignment operators, while its dynamic array routines and Low/High intrinsics are hardened. Rea’s CLI gains --no-run and refined tracing, backed by expanded scope-verification suites.
  • Stronger toolingTests/run_all_tests auto-selects a writable temp directory and can be run from anywhere; the Rea harness survives set -u; library runners spin up local HTTP servers with consistent summaries.

New

  • Introduced the exsh shell front end with PSCAL builtin integration, Bash-style pipelines, directory-stack helpers, EXIT trap handling, and an opt-in debug log (Docs/exsh_debug_log.md).
  • Added Bash-compatible -c execution, logical-expression guards, and cached pipelines to exsh, improving benchmark parity and script ergonomics.
  • Pascal now accepts goto/label constructs, compound assignment operators, and ships an enhanced Blackjack example with CRT scoreboard tracking.
  • Added MStreamFromString so Pascal/CLike code can convert strings to memory streams without manual temp files—a prerequisite for socket helpers and new network demos.
  • Rea CLI adds --no-run for compile-only workflows alongside refined bytecode dumps and trace-head limits; new class/closure/module scope suites validate OOP semantics.

Improvements

  • Replaced the builtin registry with hash tables and cached procedure lookup metadata, preventing contention and shaving lookups for hot VM paths.
  • Thread helpers grow ThreadSpawnBuiltin, ThreadPoolSubmit, ThreadGetResult, ThreadGetStatus, ThreadSetName, ThreadLookup, ThreadStats, ThreadPause, ThreadResume, and ThreadCancel, letting exsh queue allow-listed VM builtins on worker threads while WaitForThread and the new worker-lookup helpers report their cached status codes. Documentation now includes sample transcripts and the explicit allowlist for threaded builtins.
  • Inlined shell loop guards, added owned-string helpers, and deferred exit handling in logical contexts to eliminate performance regressions observed in shellbench.
  • Updated SDL demos with corrected controls, shared font fallbacks, fast landscape rendering validation, and WASD zoom controls for the 3D bouncing balls showcase.
  • Expanded documentation: compiler flags, exsh debugging, and Rea programmer guidance all reflect the new workflows.
  • Tests/run_all_tests now establishes a writable TMPDIR, keeps network suites opt-in via RUN_NET_TESTS=1, and shells into the Tests/ directory so directory-stack parity stays stable.
  • Rea’s regression harness gracefully handles empty skip lists and argument manifests under set -u, preventing spurious macOS failures.

Fixed

  • Resolved numerous exsh correctness issues: errexit is preserved across traps, redirection backups no longer collide, IO-number parsing matches Bash, and directory stacks now mirror Bash output under differing $PWD roots.
  • Pascal dynamic array SetLength retains prior contents, Low/High operates on dynamic arrays, and multidimensional resizing no longer scrubs data.
  • Rea parser accepts type keywords as identifiers, constructor ordering is enforced, and cached bytecode invalidation respects binary timestamps.
  • Eliminated double frees and stale metadata introduced during the builtin registry refactor and guarded thread helper detection.
  • Corrected example glitches including Blackjack prompts, CRT colour artefacts, and SDL font paths.

Upgrade Notes

  • Rebuild with cmake -S . -B build -DRELEASE_BUILD=ON and cmake --build build to ensure all front ends pick up the hash-based registry and procedure caches. Clean builds are recommended for downstream packagers.
  • Tests/run_all_tests now defaults to RUN_NET_TESTS=0. Export RUN_NET_TESTS=1 (and optionally RUN_SDL=1) before invoking the script to exercise socket and HTTP fixtures as part of release verification.
  • Library regression suites (Tests/libs/run_all_tests.py) start local HTTP servers; when running inside restricted environments you may need elevated permissions (passable via --python or sandbox approvals).
  • exsh scripts share PSCAL’s builtin catalog; rebuild or redeploy extended modules (SQLite, yyjson, OpenAI, etc.) alongside the VM so optional capabilities remain discoverable via --dump-ext-builtins.
  • Threaded scripts should review the new Docs/threading.md guide. The worker pool still honours legacy handle-based APIs (WaitForThread, ThreadGetStatus, etc.), and Pascal’s Threading unit remains compatible—existing code keeps working while newer helpers add naming, metrics, and pool-size overrides.

Verification Checklist

  1. cmake -S . -B build && cmake --build build
  2. Tests/run_all_tests (optionally export RUN_NET_TESTS=1 RUN_SDL=1)
  3. TMPDIR=$PWD/Tests/tmp python3 Tests/libs/run_all_tests.py (requires local socket permissions)
  4. TMPDIR=$PWD/Tests/tmp python3 Tests/scope_verify/rea/rea_scope_test_harness.py
  5. Spot-check flagship examples:
    • build/bin/exsh Examples/exsh/pipeline
    • build/bin/exsh Examples/exsh/parallel-check github.com example.com
    • build/bin/pascal Examples/pascal/base/ThreadsProcPtrDemo
    • build/bin/clike Examples/clike/base/thread_demo
    • build/bin/rea Examples/rea/base/threads

What's Changed

  • Fix SDL quit flag deadlock by @emkey1 in #934
  • Sync Devel branch to main by @emkey1 in #985
  • Allow Pascal @ to take general lvalues by @emkey1 in #1035
  • Improve Mandelbrot thread scheduling by @emkey1 in #1036
  • Add realtime clock extended builtin by @emkey1 in #1037
  • Add CLI dumps for extended builtin inventory by @emkey1 in #1039
  • Adopt MIT license for PSCAL by @emkey1 in #1040
  • Add yyjson extended builtins by @emkey1 in #1038
  • Gate Rea terminal init behind PSCAL_INIT_TERM by @emkey1 in #1041
  • Add shared conditional preprocessor for extended builtin checks by @emkey1 in #1042
  • Devel Merge to main by @emkey1 in #1043
  • Exercise CLI options on all front ends by @emkey1 in #1044
  • Add clike demo for sqlite and yyjson extended builtins by @emkey1 in #1045
  • Skip run_with_timeout wrapper on Alpine by @emkey1 in #1046
  • Enhance Pascal weather JSON demo by @emkey1 in #1047
  • Add custom Xcode project generator by @emkey1 in #1049
  • Free weather_json HTTP response stream by @emkey1 in #1050
  • Fix Xcode project root path by @emkey1 in #1051
  • Fix Xcode header search path for generated project by @emkey1 in #1052
  • Fix Xcode generator version macros by @emkey1 in #1053
  • Fix quoting in Xcode project macros by @emkey1 in #1054
  • Make C-like AST type annotations optional by @emkey1 in #1055
  • Handle unquoted build metadata in Xcode by @emkey1 in #1056
  • Add Xcode runner target for configurable launch by @emkey1 in #1057
  • Revert "Add Xcode runner target for configurable launch" by @emkey1 in #1059
  • Add Xcode runner target for selectable PSCAL binaries by @emkey1 in #1058
  • Fix debug global linkage for Xcode targets by @emkey1 in #1060
  • Fix integer precision warnings by @emkey1 in #1061
  • Load Xcode runner config from default locations by @emkey1 in #1062
  • Clarify pascal args for Xcode runner by @emkey1 in #1063
  • Add SDL include paths to the Xcode project by @emkey1 in #1066
  • Revert "Add SDL include paths to the Xcode project" by @emkey1 in #1067
  • Seed SDL include paths for Xcode builds by @emkey1 in #1065
  • Include runner target in generated Xcode project by @emkey1 in #1068
  • Fix CASE codegen to handle multiple labels by @emkey1 in #1069
  • Add Rea OpenWeather forecast example by @emkey1 in #1070
  • Hoist OpenWeather mstreams out of branch scopes by @emkey1 in #1071
  • Fix Rea parser dropping function statements by @emkey1 in #1072
  • Add C-like scope verification harness by @emkey1 in #1073
  • Add scoped pattern matching and exception support to Rea by @emkey1 in #1075
  • Align clike scope tests with C semantics by @emkey1 in #1074
  • Fix struct initialization and printf translation by @emkey1 in #1076
  • Fix Rea vtable emission and class constant lookup by @emkey1 in #1078
  • Fix Rea scoping for grouped declarations by @emkey1 in #1079
  • Flatten Rea declaration groups before semantic analysis by @emkey1 in #1080
  • Fix object allocation to prevent Rea method demo segfault by @emkey1 in #1081
  • Fix Pascal local var registration for nested routines by @emkey1 in #1082
  • Fix MiscDemo date formatting and extend Pascal scope harness by @emkey1 in #1083
  • Update Pascal scope verification tests to reflect runtime behaviour by @emkey1 in #1084
  • Enhance Rea SDL landscape visuals by @emkey1 in #1085
  • Optimize water rendering in Rea SDL landscape demo by @emkey1 in #1086
  • Fix parameter scope lookup for Rea functions by @emkey1 in #1087
  • Expand Pascal scope verification coverage by @emkey1 in #1089
  • Accelerate landscape demo with new extended builtins by @emkey1 in #1088
  • Add landscape precompute builtins and sky rendering by @emkey1 in #1090
  • Fix SDL landscape setup and camera controls by @emkey1 in #1091
  • Improve SDL landscape input handling by @emkey1 in #1092
  • Fix SDL event watch install build error by @emkey1 in #1093
  • Handle movement keys via discrete input by @emkey1 in #1094
  • Fix SDL landscape movement key polling by @emkey1 in #1096
  • Pump SDL events before sampling landscape movement keys by @emkey1 in #1097
  • Restore SDL backend C implementation by @emkey1 in #1098
  • Add SDL input event watch implementation by @emkey1 in #1099
  • Fix SDL2 key handling and event watch setup by @emkey1 in #1100
  • Restore four-argument getmousestate support by @emkey1 in #1102
  • Fix printf formatting spacing and detect duplicate functions by @emkey1 in #1103
  • Implement include expansion for clike preprocessor by @emkey1 in #1104
  • Improve CLike control-flow scope isolation by @emkey1 in #1105
  • Restore Pascal write semantics without breaking Rea by @emkey1 in #1107
  • Fix C-like printf boolean formatting and disassembly expectations by @emkey1 in #1109
  • Fix import semantic duplication when analyzing modules by @emkey1 in #1110
  • Refactor openweather forecast scoping by @emkey1 in #1111
  • Add scope harnesses to CI pipeline by @emkey1 in #1112
  • Update bytecode cache location to ~/.pscal/bc_cache by @emkey1 in #1113
  • Fix variable_format demo entrypoint by @emkey1 in #1114
  • Devel by @emkey1 in #1115
  • Update weather examples to load OpenWeather API key from home config by @emkey1 in #1116
  • Add fallback to One Call 2.5 when 3.0 requires subscription by @emkey1 in #1117
  • Add 3D bouncing balls demo with optimized builtin by @emkey1 in #1118
  • Define local bar helper for SDL multibouncing balls 3D demo by @emkey1 in #1119
  • Fix SDL multibouncing balls demo to use drawline builtin by @emkey1 in #1120
  • Fix undefined builtins in SDL multi bouncing balls demo by @emkey1 in #1121
  • Add formatfloat builtin for numeric string formatting by @emkey1 in #1122
  • Improve SDL multibouncing balls quit handling and visibility by @emkey1 in #1123
  • Rewrite 3D balls demo to compute physics without user builtin by @emkey1 in #1124
  • Preserve legacy ID for write builtin by @emkey1 in #1125
  • Improve Rea 3D bouncing balls depth rendering by @emkey1 in #1126
  • Add advanced bouncing balls builtin and update SDL demo by @emkey1 in #1128
  • Fix BouncingBalls3D builtin var handling and add regression test by @emkey1 in #1129
  • Enhance CLike GL bindings and refresh Rea landscape demo by @emkey1 in #1130
  • Fix grid interpolation cast in 3D bouncing balls demo by @emkey1 in #1131
  • Add BouncingBalls3DAccelerate builtin and retune SDL demo by @emkey1 in #1132
  • Keep SDL GraphLoop responsive to window manager pings by @emkey1 in #1133
  • Handle X11 WM ping events to keep SDL demos responsive by @emkey1 in #1134
  • Fix X11 display pointer retrieval for SDL syswm events by @emkey1 in #1135
  • Ensure GraphLoop pumps SDL events even when behind schedule by @emkey1 in #1136
  • Add optimized BouncingBalls3D builtins by @emkey1 in #1137
  • Add arrow key rotation to 3D bouncing balls demo by @emkey1 in #1138
  • Fix floor visibility through glass back wall by @emkey1 in #1139
  • Add sparkling starfield to Rea 3D bouncing balls demo by @emkey1 in #1140
  • Refactor Rea SDL multi bouncing balls demo by @emkey1 in #1141
  • Fix SDL multibouncing balls Rea demo compile errors by @emkey1 in #1142
  • Fix Rea SDL demo field names conflicting with consts by @emkey1 in #1143
  • Fix SDL multi bouncing balls demo argument list by @emkey1 in #1144
  • Fix SDL 3D multibouncing balls shading by @emkey1 in #1146
  • Fix clamp helper name collision in SDL multibouncing balls example by @emkey1 in #1147
  • Fix SDL multibouncing balls visibility by @emkey1 in #1149
  • Add regression test for Rea BouncingBalls3D data flow by @emkey1 in #1150
  • Handle ES index limits in balls3d sphere cache by @emkey1 in #1151
  • Implement Balls3D cleanup to fix SDL build linking by @emkey1 in #1153
  • Ensure global constructors see initialized vtables by @emkey1 in #1154
  • Refine Rea install script and import path parsing by @emkey1 in #1156
  • Merge latest devel into main by @emkey1 in #1155
  • Refactor extended builtin registry and add 3D category by @emkey1 in #1157
  • Move SDL Support To Extended Builtin by @emkey1 in #1158
  • Add standard utility modules for Rea by @emkey1 in #1159
  • Add opt-in Rea library test suite by @emkey1 in #1160
  • Fix install script case statement termination by @emkey1 in #1161
  • Improve Rea test runner executable resolution by @emkey1 in #1162
  • Fix install layout for library assets by @emkey1 in #1163
  • Fix Rea module registry to keep module bindings stable by @emkey1 in #1164
  • Fix DateTime module helper exports by @emkey1 in #1165
  • Fix DateTime module self-references by @emkey1 in #1166
  • Fix DateTime module exports to include parameter metadata by @emkey1 in #1167
  • Use safe integer division in DateTime helpers by @emkey1 in #1168
  • Fix module routine registration for Rea modules by @emkey1 in #1169
  • Fix REA module resolution and JSON int handling by @emkey1 in #1170
  • Restore CRT text color after tests by @emkey1 in #1171
  • Restore CRT library test terminal state by @emkey1 in #1172
  • Add ternary support to Rea, Pascal and CLike front ends by @emkey1 in #1173
  • Fix CRT TextAttr default and REA test mod issue by @emkey1 in #1174
  • Support hierarchical extended builtin groups by @emkey1 in #1175
  • Normalize console color at start of library tests by @emkey1 in #1176
  • Add CLike equivalents for Rea standard library modules by @emkey1 in #1177
  • Propagate extended builtin detection to library harnesses by @emkey1 in #1178
  • Add HTTP-backed SQLite demo by @emkey1 in #1179
  • Fix SQLite HTTP import demo price handling by @emkey1 in #1180
  • Add Rea demo showing SQLite analysis of Spotify songs dataset by @emkey1 in #1181
  • Add bit shift support to Rea front-end by @emkey1 in #1182
  • Add open array parameter support to Rea parser by @emkey1 in #1185
  • Fix Rea string literal handling for sqlite demo by @emkey1 in #1186
  • Fix SQL insert termination in Spotify SQLite demo by @emkey1 in #1187
  • Fix SQLite Spotify demo CSV parsing for null track IDs by @emkey1 in #1188
  • Fix SQLite Spotify demo nil handling by @emkey1 in #1189
  • Handle missing required fields in Spotify SQLite demo by @emkey1 in #1190
  • Fix Spotify demo CSV import field parsing by @emkey1 in #1191
  • Handle duplicate tracks during Spotify import by @emkey1 in #1192
  • Handle duplicate-row resets in Spotify demo by @emkey1 in #1193
  • Restore printf formatting support in REA by @emkey1 in #1194
  • Avoid rebuilding existing Spotify demo database by @emkey1 in #1195
  • Fix block_game example for interpreter compatibility by @emkey1 in #1196
  • Fix string indexing for block_game tetromino shapes by @emkey1 in #1197
  • Fix integer color extraction in Rea Tetris example by @emkey1 in #1198
  • Initialize font system in Rea block_game example by @emkey1 in #1199
  • Fix block game rendering rectangles by @emkey1 in #1200
  • Fix block_game controls and piece rendering by @emkey1 in #1201
  • Fix class const scope resolution by @emkey1 in #1202
  • Add aggregate scope verification harness runner by @emkey1 in #1203
  • Fix falling piece alignment in Rea block_game by @emkey1 in #1204
  • Handle SDL keyboard focus in ReadKey by @emkey1 in #1205
  • Revert "Handle SDL keyboard focus in ReadKey" by @emkey1 in #1206
  • Fix SDL builtin merge artifact and ReadKey compilation error by @emkey1 in #1207
  • Cast Mandelbrot spans to integers in Rea demos by @emkey1 in #1208
  • Fix SDL multibouncing balls frame delay division by @emkey1 in #1209
  • Emit real division when DIV uses real operands by @emkey1 in #1210
  • Fix AST real operand handling for division by @emkey1 in #1211
  • Revert "Fix AST real operand handling for division" by @emkey1 in #1212
  • Fix Rea parser arithmetic type promotion by @emkey1 in #1213
  • Revert "Fix Rea parser arithmetic type promotion" by @emkey1 in #1215
  • Fix Rea parser arithmetic type promotion by @emkey1 in #1214
  • Ensure INT_DIV is only emitted for integer operands by @emkey1 in #1216
  • Revert "Ensure INT_DIV is only emitted for integer operands" by @emkey1 in #1217
  • Ensure INT_DIV bytecode is only emitted for integer operands by @emkey1 in #1218
  • Handle HTTP 5xx statuses without runtime crash by @emkey1 in #1220
  • Align WebSocketEcho host with handshake header by @emkey1 in #1221
  • Update WebSocketEcho example to use ws.postman-echo.com by @emkey1 in #1222
  • Handle socketconnect DNS lookups per socket family by @emkey1 in #1223
  • Improve WebSocket echo example connection handling by @emkey1 in #1224
  • Consolidate optional test suites under Tests by @emkey1 in #1225
  • Rename Tests/etc to Tests/libs and repair library suites by @emkey1 in #1226
  • Support unit-qualified Pascal globals by @emkey1 in #1227
  • Refactor library tests to be module-friendly by @emkey1 in #1228
  • Handle UTF-8 decode issues and update library tests by @emkey1 in #1229
  • Fix constant overflow in CLike codegen and filesystem helpers by @emkey1 in #1230
  • Zero pad date/time in DOS example by @emkey1 in #1231
  • Support width specifiers in Str builtin by @emkey1 in #1232
  • Fix SDL keypad keycode translation to avoid range warning by @emkey1 in #1233
  • Add CRT text attribute helpers for CLike modules by @emkey1 in #1234
  • Update agent notes with test harness details by @emkey1 in #1235
  • Initialize local records and enable mylib record test by @emkey1 in #1236
  • Handle cancellation for async file downloads by @emkey1 in #1238
  • Fix HTTP request error handling to avoid VM crash by @emkey1 in #1237
  • Improve plasma SDL RGB progressive rendering by @emkey1 in #1240
  • Ensure Pascal and CLike library tests use gray output by @emkey1 in #1243
  • Round weather JSON temperatures before formatting by @emkey1 in #1244
  • Allow byte arguments for integer parameters by @emkey1 in #1246
  • Allow GraphLoop to accept real arguments by @emkey1 in #1245
  • Restructure examples into base and SDL groups by @emkey1 in #1248
  • Fix block game active piece rendering by @emkey1 in #1249
  • Fix integer arguments for game over text position by @emkey1 in #1250
  • Restore // comments in Rea while supporting context-sensitive integer division by @emkey1 in #1251
  • Accelerate landscape precompute builtins by @emkey1 in #1254
  • Call vertex baking builtin from LandscapeDemo by @emkey1 in #1255
  • Fix landscape builtin min/max height var parameters by @emkey1 in #1256
  • Fix Rea landscape input regression and restore terrain rendering by @emkey1 in #1258
  • Fix landscape ArrayArg refactor by @emkey1 in #1259
  • Disable landscape draw builtins and validate extended data by @emkey1 in #1261
  • Disable rendering in landscape extended builtins and add data validation by @emkey1 in #1260
  • Ensure glcullface builtin is available across front ends by @emkey1 in #1263
  • Add runtime fallback for landscape fast draw builtins by @emkey1 in #1264
  • Implement SDL fast landscape rendering by @emkey1 in #1265
  • Enable fast draw by default and refresh landscape sky by @emkey1 in #1266
  • Enhance sun and cloud rendering in Rea landscape demo by @emkey1 in #1267
  • Allow match identifiers in Rea parser by @emkey1 in #1269
  • Optimize SDL Mandelbrot demo performance by @emkey1 in #1270
  • docs: document new rea CLI flags by @emkey1 in #1272
  • docs: document new rea CLI flags by @emkey1 in #1273
  • Clarify Rea bytecode inspection docs by @emkey1 in #1274
  • Devel by @emkey1 in #1271
  • Add scope verification tests for Rea classes by @emkey1 in #1275
  • Add OpenAI extended builtin interfaces by @emkey1 in #1276
  • Add Pascal demo for OpenAI responses API by @emkey1 in #1277
  • Add Rea OpenAI chat demo for local server by @emkey1 in #1278
  • Allow type keywords as identifier names in the Rea parser by @emkey1 in #1279
  • Refactor chat demo to support generic OpenAI-compatible servers by @emkey1 in #1281
  • Ensure openai chat defaults use dynamic strings by @emkey1 in #1282
  • Add LM Studio preset and guidance to chat demo by @emkey1 in #1283
  • Add LM Studio model availability check to chat demo by @emkey1 in #1284
  • Fix LM Studio CLI model argument handling by @emkey1 in #1285
  • Auto-detect LM Studio model slug for chat demo by @emkey1 in #1286
  • Add shell frontend infrastructure by @emkey1 in #1288
  • Fix LM Studio model identifier normalization by @emkey1 in #1289
  • Add detailed debug logging to LM Studio chat demo by @emkey1 in #1291
  • Fix substringRange helper placement in REA chat demo by @emkey1 in #1292
  • Add VM shell execution builtins and docs by @emkey1 in #1290
  • Refine chat payload builder by @emkey1 in #1293
  • Add shell front end build configuration, docs, and regression harness by @emkey1 in #1294
  • Add README describing psh example scripts by @emkey1 in #1295
  • Rename shell examples directory to psh and add new sample scripts by @emkey1 in #1297
  • Make psh interactive by default by @emkey1 in #1296
  • Scope shell builtins to psh extended module by @emkey1 in #1298
  • Implement environment expansion and history recall in psh by @emkey1 in #1299
  • Add POSIX history and environment helpers to psh by @emkey1 in #1300
  • Enable inline history expansion in psh interactive shell by @emkey1 in #1301
  • Add regex history expansion to psh interactive shell by @emkey1 in #1302
  • Enable glob expansion for interactive psh commands by @emkey1 in #1303
  • Add interactive history navigation to psh by @emkey1 in #1304
  • Improve psh interactive completion and glob warnings by @emkey1 in #1305
  • Fix shell conditional branching by @emkey1 in #1306
  • Avoid false shell warnings and gate VM crash dumps by @emkey1 in #1307
  • Add shell case statement support by @emkey1 in #1308
  • Add shell function definitions and runtime support by @emkey1 in #1309
  • Implement shell command substitution and add regression tests by @emkey1 in #1310
  • Add arithmetic expansion evaluation to shell by @emkey1 in #1311
  • Add job control builtins to shell runtime by @emkey1 in #1312
  • Add source builtin and dynamic prompt to psh by @emkey1 in #1313
  • Add psh builtin command and documentation by @emkey1 in #1314
  • Stop linking shell builtins into non-shell front ends by @emkey1 in #1315
  • Improve interactive shell editing and tilde expansion by @emkey1 in #1316
  • Fix psh source builtin and support PS1 escape sequences by @emkey1 in #1317
  • Handle shell assignment words in sourced scripts by @emkey1 in #1318
  • Fix shell prompt escape handling by @emkey1 in #1319
  • Fix multiline prompt redraw in interactive shell by @emkey1 in #1320
  • Rename shell frontend to exsh and ignore Ctrl+Z in interactive mode by @emkey1 in #1321
  • Fix exsh foreground job control and add interactive keybindings by @emkey1 in #1322
  • Fix Pascal overflow warning regression by @emkey1 in #1323
  • Handle separators before loop body in exsh parser by @emkey1 in #1324
  • Fix Pascal harness stderr truncation by @emkey1 in #1325
  • Ensure runtime errors emit location without verbose context by @emkey1 in #1326
  • Add readline-style editing shortcuts to exsh interactive mode by @emkey1 in #1327
  • Declare interactiveUpdateScratch prototype by @emkey1 in #1328
  • Fix shell parser handling of function definitions by @emkey1 in #1329
  • Show ambiguous tab completion options in exsh by @emkey1 in #1330
  • Add help flag to front ends by @emkey1 in #1331
  • Implement shell control builtins and errexit handling by @emkey1 in #1332
  • Fix job control handling for exsh by @emkey1 in #1336
  • Fix exsh job control by spawning children with fork by @emkey1 in #1337
  • Add colon builtin to exsh shell runtime by @emkey1 in #1338
  • Fix shell loop code generation to repeat iterations by @emkey1 in #1339
  • Fix interactive signal handling for exsh by @emkey1 in #1340
  • Enhance shell lexer tokens and add regression checks by @emkey1 in #1341
  • Add brace group metadata and pipeline helpers by @emkey1 in #1342
  • Fix function name retention and pipeline negation by @emkey1 in #1343
  • Restore ShellParser state fields for heredoc handling by @emkey1 in #1345
  • Add shell grammar regression coverage by @emkey1 in #1346
  • Add eval builtin to shell frontend by @emkey1 in #1347
  • Add dot alias for source builtin in exsh by @emkey1 in #1348
  • Fix shell lexer parsing for special parameter tokens by @emkey1 in #1349
  • Handle array assignments in shell lexer by @emkey1 in #1350
  • Handle shell substring parameter expansion by @emkey1 in #1351
  • Handle shell array subscripts in parameter expansion by @emkey1 in #1354
  • Fix default parameter expansion in exsh by @emkey1 in #1355
  • Require NAME tokens after shell for loops by @emkey1 in #1356
  • Enforce shell function keyword syntax by @emkey1 in #1357
  • Implement shell control flow execution by @emkey1 in #1358
  • Initialize merge_pattern before early exits by @emkey1 in #1359
  • Run ~/.exshrc only for interactive exsh sessions by @emkey1 in #1360
  • Add read builtin to exsh runtime by @emkey1 in #1361
  • Fix shell source builtin and here-doc expansion by @emkey1 in #1362
  • Rename exsh example and test directories by @emkey1 in #1363
  • Add return/shift shell builtins and improve export semantics by @emkey1 in #1364
  • Fix exsh if/elif parsing bug by @emkey1 in #1365
  • Fix exsh comment skipping to retain newlines by @emkey1 in #1366
  • Fix exsh handling of double-bracket tests by @emkey1 in #1367
  • Handle bang tokens as words in exsh command bodies by @emkey1 in #1368
  • Improve exsh tab completion and add finger builtin by @emkey1 in #1370
  • Add RANDOM parameter support to exsh by @emkey1 in #1375
  • Fix exsh finger builtin and improve interactive UI by @emkey1 in #1374
  • Add help builtin to exsh interactive mode by @emkey1 in #1376
  • Optimize CI workflow to build affected frontends only by @emkey1 in #1377
  • Align regression harness summaries with shell format by @emkey1 in #1382
  • Fix SDL cleanup link error when 3D builtins are disabled by @emkey1 in #1383
  • Enhance exsh help overview by @emkey1 in #1384
  • Fix broken exsh overview link in docs index by @emkey1 in #1385
  • Allow literal structural tokens in exsh commands by @emkey1 in #1386
  • Fix case pattern token scheduling in exsh parser by @emkey1 in #1387
  • Fix CI target detection for impacted binaries by @emkey1 in #1388
  • Fix exsh ':' builtin lookup by @emkey1 in #1389
  • Ensure non-interactive shell exits on signals by @emkey1 in #1390
  • Fix CI build plan to include required runtime targets by @emkey1 in #1392
  • Handle SIGINT exits for foreground scripts by @emkey1 in #1391
  • Fix shell logical short-circuiting by @emkey1 in #1393
  • Fix conditional CI workflow build step by @emkey1 in #1394
  • Adjust exsh help listing behavior by @emkey1 in #1395
  • Remove help overview adjustments by @emkey1 in #1396
  • Restore CI workflow to always build all targets by @emkey1 in #1397
  • Fix export assignment parsing in exsh by @emkey1 in #1398
  • Fix alias assignments with quoted values in exsh by @emkey1 in #1399
  • Fix array assignment handling in exsh by @emkey1 in #1400
  • Add exsh Sierpinski triangle threaded demo by @emkey1 in #1402
  • Allow logical lists in shell conditionals by @emkey1 in #1403
  • Improve exsh demo terminal detection by @emkey1 in #1404
  • Add exec builtin to exsh runtime by @emkey1 in #1405
  • Fix exsh Sierpinski threads worker startup by @emkey1 in #1406
  • Fix exsh Sierpinski demo environment handling by @emkey1 in #1408
  • Fix shell builtin status leakage by @emkey1 in #1409
  • Add raw-mode handling to exsh read builtin by @emkey1 in #1410
  • Add declare builtin associative array support by @emkey1 in #1411
  • Fix array literal lexing across newlines by @emkey1 in #1412
  • Add here-string redirection support by @emkey1 in #1416
  • Fix stuff in exsh. by @emkey1 in #1417
  • Handle declare -g in exsh by @emkey1 in #1418
  • Implement builtin handler for double bracket comparisons by @emkey1 in #1419
  • Normalize bytecode spelling by @emkey1 in #1421
  • Allow configuring PSCAL install root by @emkey1 in #1422
  • Fix quoted positional parameter handling by @emkey1 in #1423
  • Fix exsh read -a option and add regression test by @emkey1 in #1424
  • Add plain text summary of exsh Bash builtin coverage by @emkey1 in #1425
  • Implement directory stack builtins for exsh by @emkey1 in #1426
  • Align unalias builtin with Bash behaviour by @emkey1 in #1427
  • Add let builtin regression test coverage by @emkey1 in #1428
  • Align exsh parity with host bash for declare and bind by @emkey1 in #1429
  • Default 3D extended builtins on when SDL is enabled by @emkey1 in #1430
  • Add release profile option enabling all builtins by @emkey1 in #1431
  • Add umask builtin and regression tests by @emkey1 in #1433
  • Add logout builtin for exsh by @emkey1 in #1434
  • Add disown builtin to exsh job control by @emkey1 in #1435
  • Add printf shell builtin with formatting support by @emkey1 in #1436
  • Implement times builtin for exsh shell by @emkey1 in #1437
  • Add getopts and mapfile builtins with parity tests by @emkey1 in #1438
  • Add hash builtin support and coverage for exsh by @emkey1 in #1439
  • Add -c inline execution mode to exsh by @emkey1 in #1440
  • Add POSIX mode toggle for shell set builtin by @emkey1 in #1441
  • Add integer coercion for typeset -i and parity test by @emkey1 in #1442
  • Fix condition evaluation handling for exsh by @emkey1 in #1443
  • Preserve shell symbol tables across nested evals by @emkey1 in #1444
  • Implement function-local scope tracking for typeset by @emkey1 in #1445
  • Allow case clauses to accept leading parens by @emkey1 in #1446
  • Add (( )) arithmetic command support to exsh by @emkey1 in #1447
  • Add runtime support for here-strings by @emkey1 in #1448
  • Allow function keyword without parentheses by @emkey1 in #1449
  • Implement POSIX test builtin for exsh by @emkey1 in #1450
  • Fix exsh builtins to match shellbench expectations by @emkey1 in #1451
  • Preserve declare values when no assignment is provided by @emkey1 in #1452
  • Recognize eval builtin invocation in exsh by @emkey1 in #1453
  • Fix duplicate registration of VM builtins by @emkey1 in #1454
  • Make builtin registration idempotent by @emkey1 in #1455
  • Reuse cached VM for shell function invocations by @emkey1 in #1456
  • Add echo/true/false shell builtins and tests by @emkey1 in #1457
  • Fix command substitution pipeline deadlock in exsh by @emkey1 in #1458
  • Fix exsh forward function resolution by @emkey1 in #1461
  • Add optional verbose compile banners to front ends by @emkey1 in #1462
  • Improve bytecode cache key robustness by @emkey1 in #1463
  • Fix Rea bytecode cache dependency resolution by @emkey1 in #1464
  • Fix Rea bytecode cache for extended integer constants by @emkey1 in #1465
  • Fix builtin redirection buffering for exsh builtins by @emkey1 in #1466
  • Disable exsh semantic warnings by default by @emkey1 in #1467
  • Allow configuring PSCAL install root by @emkey1 in #1468
  • Replace install.sh with enhanced CMake install rules by @emkey1 in #1469
  • Install examples and resolve assets from install prefix by @emkey1 in #1470
  • Configure example resource paths using install prefix by @emkey1 in #1471
  • Hard code example resource paths by @emkey1 in #1472
  • Fix configured example install destinations by @emkey1 in #1473
  • Implement kill builtin parity with bash by @emkey1 in #1474
  • Add Bash-compatible caller builtin and call stack tracking by @emkey1 in #1475
  • Add enable builtin support to exsh by @emkey1 in #1476
  • Support unquoted backtick command substitution by @emkey1 in #1477
  • Add Pascal support for compound assignments by @emkey1 in #1479
  • Add actionable plan for Pascal goto support by @emkey1 in #1480
  • Add Pascal goto/label support and tests by @emkey1 in #1481
  • Handle dynamic arrays in SetLength by @emkey1 in #1482
  • Handle Pascal Low/High pointers and add regression test by @emkey1 in #1483
  • Allow Pascal uses clauses to accept semicolon separators by @emkey1 in #1484
  • Enhance Blackjack example with CRT scoreboard by @emkey1 in #1485
  • Fix exsh parity regressions around exit and builtin redirections by @emkey1 in #1486
  • Fix Blackjack example play-again prompt placement by @emkey1 in #1487
  • Cache VM procedure lookups by bytecode address by @emkey1 in #1488
  • Fix IO-number parsing for redirection duplicates by @emkey1 in #1489
  • Fix redirection backup collisions in exsh by @emkey1 in #1490
  • Ensure shellbench EXIT traps run under errexit by @emkey1 in #1491
  • Fix errexit handling for logical contexts and clean up logging by @emkey1 in #1492
  • Keep shell errexit deferral active during condition checks by @emkey1 in #1493
  • Restore EXIT trap output when shellbench terminates scripts by @emkey1 in #1494
  • Add bash-compatible -c option handling for exsh by @emkey1 in #1495
  • Add owned string helper for VM string concatenation by @emkey1 in #1496
  • Use hash table for VM builtin lookup by @emkey1 in #1498
  • Use hash-backed lookup for compiler builtins by @emkey1 in #1499
  • Refactor extended builtin registry with hashed lookups by @emkey1 in #1500
  • Cache builtin lowercase metadata in bytecode by @emkey1 in #1501
  • Improve hangman dictionary lookup by @emkey1 in #1503
  • Guard pipeline teardown for loop constructs by @emkey1 in #1504
  • Fix pipeline subshell and command substitution scoping by @emkey1 in #1505
  • Fix exsh subshell scope handling by @emkey1 in #1506
  • Add automated tests for base example programs by @emkey1 in #1507
  • Short-circuit opcode profiling when disabled by @emkey1 in #1508
  • Reduce exsh exit polling overhead by @emkey1 in #1509
  • Reduce builtin flushing overhead by @emkey1 in #1510
  • Improve command execution and [[ expansion by @emkey1 in https://github.com//pull/1511
  • Bump tj-actions/changed-files from 41 to 46 in /.github/workflows in the github_actions group across 1 directory by @dependabot[bot] in #1512
  • Align exsh script extensions with new naming conventions by @emkey1 in #1513
  • Rename exsh status variable to EXSH_LAST_STATUS by @emkey1 in #1514
  • Ensure EXSH_LAST_STATUS remains exported by @emkey1 in #1515
  • Fix exsh command substitution stack overflow by @emkey1 in #1516
  • Fix exsh path resolution for Sierpinski threads demo by @emkey1 in #1517
  • Add VM thread-backed Sierpinski demo workers by @emkey1 in #1518
  • Hook WaitForThread into exsh front-end by @emkey1 in #1519
  • Handle cd -- sentinel in exsh builtins by @emkey1 in #1520
  • Fix exsh Sierpinski demo prompt wait by @emkey1 in #1521
  • Fix exsh Sierpinski demo rendering by @emkey1 in #1522
  • Add threaded builtin execution helpers by @emkey1 in #1524
  • Expose exsh thread spawn helpers and document builtin allowlist by @emkey1 in #1525
  • Fix macOS weak imports for shell runtime symbols by @emkey1 in #1526
  • Fix macOS link failures by adding shell runtime stubs by @emkey1 in #1527
  • Fix macOS link failure for pscaljson2bc by @emkey1 in #1528
  • Document VM worker pool usage and add reuse regression test by @emkey1 in #1529
  • Fix idle worker cancellation handling by @emkey1 in #1530
  • Add preliminary thread management builtins by @emkey1 in #1531
  • Document thread helpers in Clike and Rea usage text by @emkey1 in #1532
  • Document thread pool usage and add config samples by @emkey1 in #1533
  • Fix exsh threading demo option handling by @emkey1 in #1534
  • Add comprehensive exsh threading showcase example by @emkey1 in #1535
  • Consume thread status during WaitForThread joins by @emkey1 in #1537
  • Allow GetScreenSize before initializing SDL by @emkey1 in #1538
  • Fix threading_showcase worker metadata iteration by @emkey1 in #1539
  • Handle mktemp portability in exsh threading showcase by @emkey1 in #1540
  • Handle macOS mktemp quirks in threading_showcase example by @emkey1 in #1541
  • Fix exsh threading_showcase script parsing on macOS by @emkey1 in #1542
  • Fix subshell parsing and negation handling by @emkey1 in #1543
  • Improve threading_showcase tmpfile creation portability by @emkey1 in #1544
  • Add ThreadStatsJson builtin for exsh stats by @emkey1 in #1545
  • Fix threading_showcase result replay by @emkey1 in #1546
  • Fix parallel-check cleanup after WaitForThread by @emkey1 in #1547
  • Mark DNS lookup thread failures when resolution fails by @emkey1 in #1548
  • Add cache-friendly shellbench variant without -c by @emkey1 in #1549
  • Stabilize shellbench script filenames for caching by @emkey1 in #1551
  • Embed script hashes in shellbench identifiers by @emkey1 in #1552
  • Fix shellbench cache file naming collisions by @emkey1 in #1553
  • devel Merge to main branch by @emkey1 in #1557
  • Fix REA constructor aliases when loading bytecode by @emkey1 in #1558
  • Fix Rea constructor call resolution by @emkey1 in #1560
  • Fix hangman guessed letter sorting by @emkey1 in #1561
  • Improve interactivity of CLike Mandelbrot demo by @emkey1 in #1562
  • Fix CLike thread join releasing worker slots by @emkey1 in #1563
  • Fix SDL multibouncingballs quit handling by @emkey1 in #1564
  • Enhance SDL spacegame example by @emkey1 in #1565
  • Load font for spacegame HUD rendering by @emkey1 in #1566
  • Handle missing font path in spacegame by @emkey1 in #1567
  • Handle missing sound assets in clike spacegame example by @emkey1 in #1568
  • Fix CLike local string initialization by @emkey1 in #1569
  • Improve spacegame ship visuals by @emkey1 in #1570
  • Avoid full rebuild when example files change by @emkey1 in #1571
  • Fix Sierpinski shell demo thread spawn by @emkey1 in #1572
  • Fix Sierpinski thread demo synchronization by @emkey1 in #1573
  • Add sequential Sierpinski exsh demo by @emkey1 in #1574
  • Handle non-numeric recursion levels in exsh Sierpinski demo by @emkey1 in #1575
  • Fix HttpAsyncDemo file handling by @emkey1 in #1576
  • Fix Pascal string literal escape handling by @emkey1 in #1577
  • Implement StringReplace flags in SysUtils by @emkey1 in #1578
  • Fix Pascal set literal constant handling by @emkey1 in #1579
  • Fix set literal enum resolution by @emkey1 in #1580
  • Ensure enum literals from imported units are registered as constants by @emkey1 in #1581
  • Prevent duplicate playback status in psound demo by @emkey1 in #1582
  • Fix SDL Mandelbrot input handling on macOS by @emkey1 in #1583
  • Wrap Pascal spawn targets with call frame when needed by @emkey1 in #1584
  • Fix Mandelbrot extended example thread entry by @emkey1 in #1586
  • Make Mandelbrot demos adjust iteration caps during zoom by @emkey1 in #1587
  • Add Earth's moon to inner planets 3D demo by @emkey1 in #1588
  • Add Jupiter moon rendering to inner planets demo by @emkey1 in #1589
  • Add pause and speed controls to planets_inner_3d demo by @emkey1 in #1590
  • Fix keyboard controls in planets_inner_3d SDL demo by @emkey1 in #1591
  • Fix planets inner 3D key handling by @emkey1 in https://github.com/emkey1/pscal/pull/1592
  • Handle minus/equals names in SDL IsKeyDown by @emkey1 in https://github.com/emkey1/pscal/pull/1593
  • Improve SDL text input handling for pollkeyany by @emkey1 in https://github.com/emkey1/pscal/pull/1597
  • Add scripted flyby to inner planets SDL demo by @emkey1 in https://github.com/emkey1/pscal/pull/1598
  • Add atan2 math builtin by @emkey1 in https://github.com/emkey1/pscal/pull/1599
  • Register atan2 builtin for Rea front end by @emkey1 in https://github.com/emkey1/pscal/pull/1600
  • Enhance inner planets flyby tour by @emkey1 in https://github.com/emkey1/pscal/pull/1601
  • Tighten flyby camera proximity and adjust star distribution by @emkey1 in https://github.com/emkey1/pscal/pull/1602
  • Scale planet radii in inner solar SDL sample by @emkey1 in https://github.com/emkey1/pscal/pull/1603
  • Validate temporary directory in Rea SQLite Spotify demo by @emkey1 in https://github.com/emkey1/pscal/pull/1604
  • Avoid SDL scancode name lookup in inner planets sim by @emkey1 in https://github.com/emkey1/pscal/pull/1605
  • Handle missing example files in CMake by @emkey1 in https://github.com/emkey1/pscal/pull/1606
  • Retry transient DNS lookup failures by @emkey1 in https://github.com/emkey1/pscal/pull/1607
  • devel merge to main by @emkey1 in https://github.com/emkey1/pscal/pull/1608

Full Changelog: v2.2.1...v3.0.0