52 lines
2.3 KiB
Plaintext
52 lines
2.3 KiB
Plaintext
|
|
// 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)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|