Stdlib: - `format` / `print` in std.sx — both move from `args: ..Any` to `..args: []Any`. The post-issue-0049 lowering makes this safe across module boundaries. - `open` in fs.sx — `args: ..s32` → `..args: []s32`. Foreign C-variadic semantics are preserved (the trailing `, ...` lands in the generated `declare` regardless of which surface form is used). Examples: - `19-varargs.sx` — `sum` / `print_all` migrated. - `20-any-varargs.sx` — `print_any` / `count` migrated. - `50-smoke.sx` — `typed_sum` migrated. - `120-interp-variadic-any.sx` — comment-only update referencing the new form. - `ffi-foreign-cvariadic.sx` — three C-variadic foreign decls migrated; header comment refreshed. Suite stays at 214/214. The legacy `name: ..T` surface form is still accepted by the parser; rejection follows in a later commit once specs.md catches up.
30 lines
777 B
Plaintext
30 lines
777 B
Plaintext
// IR interpreter — variadic `..Any` indexing inside post-link callback.
|
|
//
|
|
// `format(fmt, ..args: []Any)` lowers to `any_to_string(args[i])` calls.
|
|
// The interpreter must be able to read every element of the packed
|
|
// `[N x Any]` slice from within a `#run`/post-link callback, not just
|
|
// the first two — and not just via JIT.
|
|
|
|
#import "modules/std.sx";
|
|
#import "modules/compiler.sx";
|
|
|
|
puts :: (s: [:0]u8) -> s32 #foreign libc;
|
|
|
|
cb :: () -> bool {
|
|
a := format("{}", "x");
|
|
puts("1-arg ok");
|
|
b := format("{} {}", "x", "y");
|
|
puts("2-arg ok");
|
|
c := format("{} {} {}", "x", "y", "z");
|
|
puts("3-arg ok");
|
|
true;
|
|
}
|
|
|
|
configure :: () {
|
|
opts := build_options();
|
|
opts.set_post_link_callback(cb);
|
|
}
|
|
#run configure();
|
|
|
|
main :: () { print("rt\n"); }
|