starting to work on arbitrary varargs
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 25 Sep 2020 19:41:21 +0000 (14:41 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 25 Sep 2020 19:41:21 +0000 (14:41 -0500)
progs/vararg_test.onyx [new file with mode: 0644]

diff --git a/progs/vararg_test.onyx b/progs/vararg_test.onyx
new file mode 100644 (file)
index 0000000..6d39182
--- /dev/null
@@ -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
+*/