Files
aego/script/bind/doc.go
T
sanspie cf68c71f05 Stage 6: coroutines, signals, ScriptRef, workspace CLI, editor tooling
Language: yield/signal/coroutine become keywords, start is contextual.
Coroutine methods (func Name() coroutine) with start and
yield / wait / frames / fixed / await; signals with Emit/Connect and
Connection handles; ScriptRef<T> and node.GetScript<T>() for fields,
plain methods and signals of other scripts. Diagnostics AES2050-AES2059.

Bytecode v3: ScriptRefs, XFields, XMethods and Connects tables resolved by
name in vm.Link, per-script signals, coroutine flag on functions; new
opcodes START/YIELD/EMIT/CONNECT/DISCONNECT/CONNECTED/COSTOP/CORUN/
SELFREF/GETSCRIPT/GETXF/SETXF/CALLR, checked by verify.

Runtime: script/coroutine scheduler (frames/fixed counters, time heap,
await lists; only due coroutines are visited) and script/signal registry
(snapshot per Emit, deferred removal, no allocations in steady state).
Hot reload cancels coroutines of changed scripts, rebinds connections by
name and signature, then runs Reloaded.

Tooling: script/build removed, aego check/test/dump run on the workspace
(test builds include _test.aes); langsvc completion, hover, signatures and
semantic tokens for the new syntax; editor highlighting, snippets with
placeholders, coroutine/signal profiler graphs and stats.

Docs (script.md sections 16-19, editor.md, ARCHITECTURE), test fixtures and
golden files, platformer enemies wired to the player, scriptreload demo,
and run.Config.FrameTime for deterministic headless fixed steps.

Modules (6.5): engine/module registry and ComponentBuilder are the one
registration path for engine subsystems and native code; render2d,
render3d and script/engine are modules over scene/frame, the script
component moved to scene/scriptcomp, and scene/components and
scene/systems are gone. Editor inspector, templates, picking shapes and
extension hooks are driven by descriptors and editor/builtins; sdk gains
Component/EditorHook; depcheck checks the module graph and the
aego_runtime graph.

Also: stop tracking built tool binaries; gl33 activates the scratch unit
before binding for texture updates.

Verification: typed component method adapters (Method0..2, Proc0..2)
with direct field access and no allocations; app.Build as the single
construction path for run and the editor; modules attach per scene
document; depcheck aego_editor pass; diagnostic codes in one place and
every code covered by a test; indexed coroutine heaps with eager
cancel; dead component references and nil intrinsics fault with
AES6004, host faults keep their code; GC roots of struct fields checked
in verify and vm.Link; 255-field limit; AES4010 for script packages
shadowing host modules; architecture registry D111-D147.

Golden: the harness renders on the thread that owns the GL context,
ReadPixels returns rows in memory order (render targets are top-down per
D17), and the first rendering references are committed.
2026-10-12 14:22:08 +03:00

85 lines
1.6 KiB
Go

package bind
import (
"fmt"
"runtime"
"strconv"
"strings"
)
type Info struct {
Doc string
Params []string
Example string
Loc string
}
type Option func(*Info)
func Doc(s string) Option {
return func(i *Info) { i.Doc = s }
}
func Params(names ...string) Option {
return func(i *Info) { i.Params = append([]string(nil), names...) }
}
func Example(s string) Option {
return func(i *Info) { i.Example = s }
}
func NewManifest() *Registry {
r := New()
r.locate = true
return r
}
func (r *Registry) Locate(on bool) {
r.locate = on
}
func (r *Registry) Info(module, name string) Info {
return r.docs[key(module, name)]
}
func Describe(m *Module, name string, opts ...Option) {
k := key(m.path, name)
info := m.reg.docs[k]
for _, o := range opts {
o(&info)
}
m.reg.docs[k] = info
}
func (r *Registry) describe(module, name string, opts []Option, params int) error {
var info Info
for _, o := range opts {
o(&info)
}
if params >= 0 && len(info.Params) > 0 && len(info.Params) != params {
return fmt.Errorf("Params names %d parameters, the function has %d", len(info.Params), params)
}
if r.locate {
info.Loc = callerLoc()
}
if info.Doc != "" || info.Loc != "" || info.Example != "" || len(info.Params) > 0 {
r.docs[key(module, name)] = info
}
return nil
}
func callerLoc() string {
var pcs [24]uintptr
n := runtime.Callers(3, pcs[:])
frames := runtime.CallersFrames(pcs[:n])
for {
f, more := frames.Next()
if !strings.HasPrefix(f.Function, "aego/script/bind.") && !strings.HasPrefix(f.Function, "aego/sdk.") {
return f.File + ":" + strconv.Itoa(f.Line)
}
if !more {
return ""
}
}
}