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
-cinline 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/labelsupport and compound assignment operators, while its dynamic array routines andLow/Highintrinsics are hardened. Rea’s CLI gains--no-runand refined tracing, backed by expanded scope-verification suites. - Stronger tooling –
Tests/run_all_testsauto-selects a writable temp directory and can be run from anywhere; the Rea harness survivesset -u; library runners spin up local HTTP servers with consistent summaries.
New
- Introduced the
exshshell 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
-cexecution, logical-expression guards, and cached pipelines to exsh, improving benchmark parity and script ergonomics. - Pascal now accepts
goto/labelconstructs, compound assignment operators, and ships an enhanced Blackjack example with CRT scoreboard tracking. - Added
MStreamFromStringso 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-runfor 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, andThreadCancel, letting exsh queue allow-listed VM builtins on worker threads whileWaitForThreadand 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_testsnow establishes a writableTMPDIR, keeps network suites opt-in viaRUN_NET_TESTS=1, and shells into theTests/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
$PWDroots. - Pascal dynamic array
SetLengthretains prior contents,Low/Highoperates 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=ONandcmake --build buildto ensure all front ends pick up the hash-based registry and procedure caches. Clean builds are recommended for downstream packagers. Tests/run_all_testsnow defaults toRUN_NET_TESTS=0. ExportRUN_NET_TESTS=1(and optionallyRUN_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--pythonor 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’sThreadingunit remains compatible—existing code keeps working while newer helpers add naming, metrics, and pool-size overrides.
Verification Checklist
cmake -S . -B build && cmake --build buildTests/run_all_tests(optionally exportRUN_NET_TESTS=1 RUN_SDL=1)TMPDIR=$PWD/Tests/tmp python3 Tests/libs/run_all_tests.py(requires local socket permissions)TMPDIR=$PWD/Tests/tmp python3 Tests/scope_verify/rea/rea_scope_test_harness.py- Spot-check flagship examples:
build/bin/exsh Examples/exsh/pipelinebuild/bin/exsh Examples/exsh/parallel-check github.com example.combuild/bin/pascal Examples/pascal/base/ThreadsProcPtrDemobuild/bin/clike Examples/clike/base/thread_demobuild/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