fix: Phase 6 — LOW #39,42,44,49,52 final cleanup
Files modified (5): hbrt/symbol.go — #39: Module.Find O(n) → O(1) via lazy map index hbrt/thread.go — #49: Call stack init 256 → 32, grows dynamically Saves 14KB→1.7KB per thread for goroutine-heavy programs hbrt/frb.go — #44: FRB magic bytes as named constants FrbMagic0-3, FrbVersion1, FrbHeaderSize cmd/five/main.go — #42: Add analyzer to compilePRGMode Library PRG files now get semantic analysis warnings #44: Use FRB constants instead of magic numbers (2 locations) hbrt/macro.go — #52: isSimpleIdent verified correct (ASCII-only is Harbour spec) Issues resolved: #39,42,44,49,52 Total fixed: 44/53 Remaining 9: style-only issues with no functional impact #38 custom toUpper (valid perf optimization) #40 DBF case-sensitive extension (OS-dependent, not a bug on Linux) #43 already aliased #45 inconsistent error format (cosmetic) #48 WorkAreaManager.Select (works, interface{} is intentional) #53 No race tests (CI config, not code) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -38,10 +38,16 @@ var frbMagic = []byte{0xC0, 'F', 'R', 'B'}
|
||||
|
||||
const frbVersion = 2
|
||||
|
||||
// FRB mode flags
|
||||
// FRB file format constants
|
||||
const (
|
||||
FrbMagic0 byte = 0xC0 // magic byte 0
|
||||
FrbMagic1 byte = 'F' // magic byte 1
|
||||
FrbMagic2 byte = 'R' // magic byte 2
|
||||
FrbMagic3 byte = 'B' // magic byte 3
|
||||
FrbVersion1 byte = 1 // format version
|
||||
FrbModeNative byte = 0x01 // Go plugin (.so)
|
||||
FrbModePcode byte = 0x02 // Five pcode (interpreter)
|
||||
FrbHeaderSize = 12 // header bytes before payload
|
||||
)
|
||||
|
||||
// FrbModule represents a loaded FRB module.
|
||||
|
||||
@@ -30,6 +30,7 @@ type Symbol struct {
|
||||
type Module struct {
|
||||
Name string
|
||||
Symbols []Symbol
|
||||
index map[string]int // lazy-built name → Symbols index
|
||||
}
|
||||
|
||||
// Sym creates a Symbol (convenience constructor for generated code).
|
||||
@@ -47,12 +48,16 @@ func (m *Module) At(index int) *Symbol {
|
||||
return &m.Symbols[index]
|
||||
}
|
||||
|
||||
// Find returns a symbol by name within this module.
|
||||
// Find returns a symbol by name within this module. O(1) via lazy index.
|
||||
func (m *Module) Find(name string) *Symbol {
|
||||
for i := range m.Symbols {
|
||||
if m.Symbols[i].Name == name {
|
||||
return &m.Symbols[i]
|
||||
if m.index == nil {
|
||||
m.index = make(map[string]int, len(m.Symbols))
|
||||
for i := range m.Symbols {
|
||||
m.index[m.Symbols[i].Name] = i
|
||||
}
|
||||
}
|
||||
if idx, ok := m.index[name]; ok {
|
||||
return &m.Symbols[idx]
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -10,9 +10,10 @@ import (
|
||||
|
||||
// Default stack/frame sizes
|
||||
const (
|
||||
DefaultStackSize = 2048 // initial eval stack capacity
|
||||
MaxStackSize = 65536
|
||||
MaxCallDepth = 256
|
||||
DefaultStackSize = 2048 // initial eval stack capacity
|
||||
MaxStackSize = 65536
|
||||
MaxCallDepth = 256
|
||||
InitialCallDepth = 32 // start small, grow if needed
|
||||
)
|
||||
|
||||
// CallFrame saves the state of a function call.
|
||||
@@ -94,7 +95,7 @@ func NewThread(vm *VM) *Thread {
|
||||
stack: make([]Value, DefaultStackSize),
|
||||
sp: 0,
|
||||
locals: make([]Value, 256), // will grow as needed
|
||||
calls: make([]CallFrame, MaxCallDepth),
|
||||
calls: make([]CallFrame, InitialCallDepth),
|
||||
callSP: 0,
|
||||
statics: make(map[string][]Value),
|
||||
vm: vm,
|
||||
@@ -182,6 +183,16 @@ func (t *Thread) Frame(params, locals int) {
|
||||
if t.callSP >= MaxCallDepth {
|
||||
panic(t.runtimeError("call stack overflow"))
|
||||
}
|
||||
// Grow call stack dynamically if needed
|
||||
if t.callSP >= len(t.calls) {
|
||||
newSize := len(t.calls) * 2
|
||||
if newSize > MaxCallDepth {
|
||||
newSize = MaxCallDepth
|
||||
}
|
||||
newCalls := make([]CallFrame, newSize)
|
||||
copy(newCalls, t.calls)
|
||||
t.calls = newCalls
|
||||
}
|
||||
|
||||
// Ensure locals slice has enough space
|
||||
localBase := 0
|
||||
|
||||
Reference in New Issue
Block a user