Files
hakorune/apps/selfhost-runtime/ops_calls.nyash

52 lines
2.3 KiB
Plaintext
Raw Normal View History

// OpsCalls — Selfhost runtime BoxCall dispatcher (skeleton)
// - pref: "plugin" (default) or "ny" (use lib std boxes)
box OpsCalls {
pref
birth() { me.pref = "plugin" return 0 }
set_pref(p) {
if p == "ny" { me.pref = "ny" } else { me.pref = "plugin" }
return 0
}
// Dispatch method call on receiver `recv` by policy.
// MVP: when pref=ny and method is recognized, route to lib wrappers; otherwise call receiver method.
dispatch(recv, method, args) {
if me.pref == "ny" {
// Console
if method == "print" { return new ConsoleStd().print(args.get(0)) }
if method == "println" { return new ConsoleStd().println(args.get(0)) }
if method == "log" { return new ConsoleStd().log(args.get(0)) }
// String
if method == "length" { return new StringStd().length(recv) }
if method == "substring" { return new StringStd().substring(recv, args.get(0), args.get(1)) }
if method == "indexOf" { return new StringStd().indexOf(recv, args.get(0), args.get(1)) }
if method == "lastIndexOf" { return new StringStd().lastIndexOf(recv, args.get(0), args.get(1)) }
if method == "esc_json" { return new StringStd().esc_json(args.get(0)) }
// Array
if method == "size" { return new ArrayStd().size(recv) }
if method == "len" { return new ArrayStd().len(recv) }
if method == "get" { return new ArrayStd().get(recv, args.get(0)) }
if method == "set" { return new ArrayStd().set(recv, args.get(0), args.get(1)) }
if method == "push" { return new ArrayStd().push(recv, args.get(0)) }
if method == "toString" { return new ArrayStd().toString(recv) }
// Map
if method == "size" { return new MapStd().size(recv) }
if method == "has" { return new MapStd().has(recv, args.get(0)) }
if method == "get" { return new MapStd().get(recv, args.get(0)) }
if method == "set" { return new MapStd().set(recv, args.get(0), args.get(1)) }
if method == "toString" { return new MapStd().toString(recv) }
}
// Fallback: direct method invocation on receiver
// Note: This will route to plugin or built-in box implementations.
if args == null { return recv[method]() }
local a0 = args.get(0)
local a1 = args.get(1)
local a2 = args.get(2)
// call with up to 3 args (MVP)
return recv[method](a0, a1, a2)
}
}