From 25773e81defa6c9ca702dd6a62a55ec202e200ee Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 25 Sep 2020 14:41:21 -0500 Subject: [PATCH] starting to work on arbitrary varargs --- progs/vararg_test.onyx | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 progs/vararg_test.onyx diff --git a/progs/vararg_test.onyx b/progs/vararg_test.onyx new file mode 100644 index 00000000..6d391825 --- /dev/null +++ b/progs/vararg_test.onyx @@ -0,0 +1,36 @@ +package main + +#include_file "core/std/wasi" + +use package core; + +old_va_test :: proc (prefix: string, va: ..i32) { + for v: va do println(v); +} + +vararg_get :: proc (va: ^rawptr, ret: ^$T) { + *ret = *cast(^T) *va; + *va = cast(rawptr) (cast(^u8) *va + sizeof T); +} + +// va is just a rawptr with no bounds checking +new_va_test :: proc (prefix: string, va: ...) { + println(string); + + x : i32; + vararg_get(^va, ^x); + + println(x); +} + +main :: proc (args: [] cstring) { + va_test("foo", 1, 2, 3, 4); +} + +// Things needed to make the above work" +/* + 1. A RawVarArg type in the type system + 2. Parsing '...' as a rawvararg + 3. Typechecking is disabled for arguments in a rawvararg + 4. RawVarArg is treated as a pointer +*/ -- 2.25.1