|
|
486e466592
|
feat: FiveSql2 43/43, @byref, mutable closure, RTL 479, DateTime fix
Major changes since last commit:
- FiveSql2 SQL:1999 engine (10,458 LOC) — 43/43 ALL PASS
- 21 compiler/runtime bugs fixed (short-circuit AND/OR, FOR LOOP, etc.)
- @byref pass-by-reference via RefCell pattern
- Mutable closure capture (EnsureLocalRef + RefCell sharing)
- RTL: 400 → 479 functions (+79: file, string, datetime, hash, UTF-8)
- DateTime/Timestamp fully working (hb_DateTime, hb_Hour/Min/Sec, display)
- Reserved word guard (39 keywords blocked from function calls)
- AEval arg order fix (element before index)
- Closure capture redecl fix (unique _cap_ names per block)
- Hash/string indexing in ArrayPush/ArrayPop
- Harbour compat test suite: 51/51
- 4 docs: Porting Report, Implementation Plan, Optimization Plan, Commercialization
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-11 11:35:37 +09:00 |
|
|
|
d451b836a6
|
perf: inline Str/PadR/PadL/SubStr/Left/Right/At/IIF in gengo
13 more RTL functions inlined — no Frame/EndProc, no VM dispatch:
- Str(n,w,d) → fmt.Sprintf("%*.*f", w, d, n)
- PadR(s,n) → s + hbrtl.Spaces(n-len(s))
- PadL(s,n[,fill]) → Spaces(pad) + s or Repeat(fill, pad) + s
- SubStr(s,p,l) → s[p:p+l] with bounds check
- Left(s,n) → s[:n], Right(s,n) → s[len-n:]
- At(search,target) → strings.Index + 1
- IIF(cond,a,b) → if/else without function call
Also: Spaces() exported for generated code access.
50K SEEK random: 62ms (Harbour 67ms — Five FASTER!)
82/82 stress PASS. 14 packages ALL PASS.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-07 23:16:38 +09:00 |
|
|
|
05ccef05e2
|
perf: EndProcFast — eliminate defer recover() from RTL hot paths
Problem: every RTL function calls defer t.EndProc() which does recover().
50K SEEK loop = 250K recover() calls = ~12ms wasted.
Solution: EndProcFast() skips recover (only needs endFrame restore).
Applied to ALL RTL functions in strings.go, rdd.go, missing.go, database.go.
EndProc() with recover kept for generated PRG code (needs BEGIN SEQUENCE).
Analysis (50K sequential SEEK breakdown):
Go NTX Seek direct: 7ms (faster than Harbour 27ms!)
PRG VM overhead: 38ms (Frame + RTL calls + key generation)
Key generation: 25ms (Str+LTrim+PadL+PadR = 5 RTL Frame/EndProc per iter)
With EndProcFast: RTL overhead reduced ~30%.
CDX SCOPE: 2ms (Harbour 4ms — 2x FASTER!)
82/82 stress PASS. 14 packages ALL PASS.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-07 21:43:39 +09:00 |
|
|
|
5b378318a0
|
perf: RTL optimization — cached WA, spaces pool, stack-alloc fmt_int64
rdd.go:
- getWA() cached type assertion (avoid repeated interface check)
- waCache stores last WA pointer → O(1) for repeated calls
strings.go:
- spacesCache[257]: pre-built space strings for pad sizes 0-256
- spaces(n) returns cached string (no Repeat allocation)
- PadR/PadL use spaces() for fill=" " (most common case)
- Str() uses spaces() for right-padding
missing.go:
- fmt_int64: stack-allocated [20]byte array (was heap make([]byte))
- Reverse iteration (no prepend overhead)
- PadC uses spaces() for left/right padding
Benchmark (ext4, home dir):
10K APPEND: 28ms → 26ms (Harbour 27ms!)
50K APPEND: 130ms → 113ms (13% improvement)
50K SCAN: 24ms → 23ms
50K DUPKEY: 42ms → 35ms (17% improvement)
CDX SCOPE: 12ms → 10ms (17% improvement)
82/82 stress PASS. 14 packages ALL PASS.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-07 18:16:22 +09:00 |
|
|
|
827adeeb99
|
feat: SET commands + ErrorBlock/Break error handling
SET commands (setcmd.go):
- SetDateFunc: __SetDateFormat([cNew]) → cOld
- SetDecimalsFunc: SET DECIMALS TO n
- SetEpochFunc: SET EPOCH TO n
- 11 toggle functions: SetExact, SetDeleted, SetSoftSeek, SetExclusive,
SetFixed, SetCancel, SetBell, SetConfirm, SetInsert, SetEscape, SetWrap
- SET constants: _SET_EXACT, _SET_DELETED, etc. for PRG code
- GetSetDateFormat(), GetSetDecimals(), GetSetEpoch() helpers
- Default: DATE="mm/dd/yy", EPOCH=1900, DECIMALS=2
Error handling (error.go):
- Break(xValue): panics with BreakValue, caught by BEGIN SEQUENCE
- BreakBlock(): returns {|e| Break(e)} code block
- LaunchError(): dispatches error through ErrorBlock handler
- RuntimeError(): creates + launches standard runtime error
- IsBreak(): checks if recovered panic is a BreakValue
- createErrorHash(): builds Harbour-compatible error hash
Registration: ErrorBlock, ErrorNew, DosError, FError, Break + all SET functions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-02 15:33:07 +09:00 |
|
|
|
59568f3301
|
Five v0.9 — Harbour + Go fusion language
- Compiler: PP → Lexer → Parser → Analyzer → Gengo pipeline
- Parser: 232/236 (98%) Harbour compatibility, registry-based dispatch
- RTL: 351 Harbour-compatible functions
- RDD: DBF/NTX/CDX engines with Rushmore bitmap optimization
- Go Interop: IMPORT + pkg.Func() + obj:Method() with FastPath (15M calls/sec)
- HB_FUNC API: Full Harbour C API compatible Go bridge
- Concurrency: SPAWN/LAUNCH/GOROUTINE, <-, WATCH, PARALLEL FOR, ASYNC/AWAIT
- Extensions: Multi-return, DEFER, Slice, f-string, Nil-safe ?:, CONST
- Macro Compiler: Runtime AST parsing and evaluation
- Debugger: TUI debugger with source display, breakpoints, stepping
- FRB: Native + Pcode dual mode runtime binary
- Tests: 13 packages ALL PASS
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-03-31 09:41:50 +09:00 |
|