Files
hakorune/apps/tests/jsonbox_collect_prints_smoke.nyash
Selfhosting Dev 27568eb4a6 json: add v2 JsonDoc/JsonNode plugin with runtime provider switch; vendored yyjson + FFI; loader resolve(name)->method_id; PyVM JSON shims; smokes + CI gate; disable MiniVmPrints fallbacks by default
- plugin_loader_v2: store per-Box resolve() from TypeBox FFI; add resolve_method_id() and use in invoke_instance_method
- plugin_loader_unified: resolve_method() falls back to loader’s resolve when TOML lacks method entries
- nyash.toml: register JsonDocBox/JsonNodeBox methods (birth/parse/root/error; kind/get/size/at/str/int/bool)
- plugins/nyash-json-plugin:
  * serde/yyjson provider switch via env NYASH_JSON_PROVIDER (default serde)
  * vendored yyjson (c/yyjson) + shim; parse/root/get/size/at/str/int/bool implemented for yyjson
  * TLV void returns aligned to tag=9
- PyVM: add minimal JsonDocBox/JsonNodeBox shims in ops_box.py (for dev path)
- tests/smokes: add jsonbox_{parse_ok,parse_err,nested,collect_prints}; wire two into min-gate CI
- tools: collect_prints_mixed now uses JSON-based app
- MiniVmPrints: move BinaryOp and fallback heuristics behind a dev toggle (default OFF)
- CURRENT_TASK.md: updated with provider policy and fallback stance
2025-09-22 06:16:20 +09:00

54 lines
2.8 KiB
Plaintext

static box Main {
main(args) {
// JSON v0 Program with mixed Print expressions
local json = "{\"kind\":\"Program\",\"statements\":[{\"kind\":\"Print\",\"expression\":{\"kind\":\"Literal\",\"value\":{\"type\":\"string\",\"value\":\"A\"}}},{\"kind\":\"Print\",\"expression\":{\"kind\":\"FunctionCall\",\"name\":\"echo\",\"arguments\":[{\"kind\":\"Literal\",\"value\":{\"type\":\"string\",\"value\":\"B\"}}]}},{\"kind\":\"Print\",\"expression\":{\"kind\":\"FunctionCall\",\"name\":\"itoa\",\"arguments\":[{\"kind\":\"Literal\",\"value\":{\"type\":\"int\",\"value\":7}}]}},{\"kind\":\"Print\",\"expression\":{\"kind\":\"Compare\",\"operation\":\"<\",\"lhs\":{\"kind\":\"Literal\",\"value\":{\"type\":\"int\",\"value\":1}},\"rhs\":{\"kind\":\"Literal\",\"value\":{\"type\":\"int\",\"value\":2}}}},{\"kind\":\"Print\",\"expression\":{\"kind\":\"BinaryOp\",\"operator\":\"+\",\"left\":{\"kind\":\"Literal\",\"value\":{\"type\":\"int\",\"value\":3}},\"right\":{\"kind\":\"Literal\",\"value\":{\"type\":\"int\",\"value\":4}}}},{\"kind\":\"Print\",\"expression\":{\"kind\":\"Literal\",\"value\":{\"type\":\"int\",\"value\":5}}}]}"
local doc = new JsonDocBox()
doc.parse(json)
local root = doc.root()
local stmts = root.get("statements")
local n = stmts.size()
local i = 0
loop (i < n) {
local node = stmts.at(i)
local expr = node.get("expression")
local kind = expr.get("kind").str()
if kind == "Literal" {
local val = expr.get("value")
local ty = val.get("type").str()
if ty == "string" { print(val.get("value").str()) } else { print(val.get("value").int()) }
} else if kind == "FunctionCall" {
local name = expr.get("name").str()
// First argument as typed literal object { type, value }
local arg0 = expr.get("arguments").at(0).get("value")
if name == "echo" {
if arg0.get("type").str() == "string" { print(arg0.get("value").str()) } else { print(arg0.get("value").int()) }
}
if name == "itoa" { print(arg0.get("value").int()) }
} else if kind == "Compare" {
local op = expr.get("operation").str()
local lhs = expr.get("lhs").get("value").get("value").int()
local rhs = expr.get("rhs").get("value").get("value").int()
if op == "<" {
if lhs < rhs { print(1) } else { print(0) }
}
if op == "==" {
if lhs == rhs { print(1) } else { print(0) }
}
if op == ">" {
if lhs > rhs { print(1) } else { print(0) }
}
} else if kind == "BinaryOp" {
local op = expr.get("operator").str()
if op == "+" {
local left = expr.get("left").get("value").get("value").int()
local right = expr.get("right").get("value").get("value").int()
print(left + right)
}
}
i = i + 1
}
return 0
}
}