From a161b75a01eee7249f989c3a85d92b69c1818370 Mon Sep 17 00:00:00 2001 From: Leo Tenenbaum Date: Sat, 25 Apr 2020 16:10:45 -0400 Subject: stop copying whole fn body unless necessary when generating an instance --- tests/arr.toc | 2 +- tests/arr2.toc | 2 +- tests/arr3.toc | 4 +-- tests/bf.toc | 73 +++++++++++++++++++++++++++----------------------- tests/control_flow.toc | 4 +-- tests/defer.toc | 2 +- tests/foreign.toc | 2 +- tests/io.toc | 43 ----------------------------- tests/mem.toc | 23 ---------------- tests/misc.toc | 2 +- tests/new.toc | 4 +-- tests/nms.toc | 2 +- tests/sizeof.toc | 4 +-- tests/std/io.toc | 43 +++++++++++++++++++++++++++++ tests/std/mem.toc | 23 ++++++++++++++++ tests/types.toc | 5 ++-- tests/use.toc | 4 +-- 17 files changed, 124 insertions(+), 118 deletions(-) delete mode 100644 tests/io.toc delete mode 100644 tests/mem.toc create mode 100644 tests/std/io.toc create mode 100644 tests/std/mem.toc (limited to 'tests') diff --git a/tests/arr.toc b/tests/arr.toc index 5fb8328..3af9edd 100644 --- a/tests/arr.toc +++ b/tests/arr.toc @@ -1,4 +1,4 @@ -#include "mem.toc"; +#include "std/mem.toc"; puti ::= fn(x: int) { //tcc's giving me "incompatible types for redefinition of 'printf'" for some reason (even though the declarations have the exact same type) #C("#ifndef __TINYC__ diff --git a/tests/arr2.toc b/tests/arr2.toc index 9d6aa34..189512a 100644 --- a/tests/arr2.toc +++ b/tests/arr2.toc @@ -1,4 +1,4 @@ -#include "mem.toc"; +#include "std/mem.toc"; puti ::= fn(x: int) { #C("#ifndef __TINYC__ extern int printf(const char *fmt, ...); diff --git a/tests/arr3.toc b/tests/arr3.toc index 4310d64..25c5554 100644 --- a/tests/arr3.toc +++ b/tests/arr3.toc @@ -1,5 +1,5 @@ -#include "io.toc"; -#include "mem.toc"; +#include "std/io.toc"; +#include "std/mem.toc"; arr_add ::= fn(t ::=, a : &Arr(t), x : t) { diff --git a/tests/bf.toc b/tests/bf.toc index d300bc9..166601b 100644 --- a/tests/bf.toc +++ b/tests/bf.toc @@ -1,43 +1,50 @@ -#include "mem.toc"; +#include "std/mem.toc"; + readfile ::= fn(filename: []char) []char { #C("extern void *fopen(char *name, char const *mode); extern char *fgets(char *buf, size_t sz, void *f);"); - fp : &u8 = #C("fopen(&(((char *)filename.data)[0]), \"r\")"); - contents := news(char, 1); - contents_sz : int; - contents_len : int; - buffer : [1024]char; - while #C("fgets(buffer, 1024, fp)") { - buffer_len : int; - while buffer[buffer_len] { - buffer_len = buffer_len + 1; - } - if contents_sz < contents_len + buffer_len { - old_contents := contents; - contents_sz = 2*contents_sz + 1024; - contents = news(char, contents_sz); - i := 0; - while i < contents_len { - contents[i] = old_contents[i]; - i = i + 1; - } - dels(old_contents); - } - i := 0; - while i < buffer_len { - contents[contents_len] = buffer[i]; - contents_len = contents_len + 1; - i = i + 1; - } - } - contents[contents_len] = 0 as char; - contents +#C(" +extern int printf(const char *fmt, ...); +extern void exit(int); +"); + fp : &u8 = #C("(u8 *)fopen(&(((char *)filename.data)[0]), \"r\")"); + if !fp { + #C("printf(\"Couldn't open file\\n\"); exit(-1);"); + } + contents := news(char, 1); + contents_sz : int; + contents_len : int; + buffer : [1024]char; + while #C("fgets(buffer, 1024, fp)") { + buffer_len : int; + while buffer[buffer_len] { + buffer_len = buffer_len + 1; + } + if contents_sz < contents_len + buffer_len { + old_contents := contents; + contents_sz = 2*contents_sz + 1024; + contents = news(char, contents_sz); + i := 0; + while i < contents_len { + contents[i] = old_contents[i]; + i = i + 1; + } + dels(old_contents); + } + i := 0; + while i < buffer_len { + contents[contents_len] = buffer[i]; + contents_len = contents_len + 1; + i = i + 1; + } + } + contents[contents_len] = 0 as char; + contents }; puti ::= fn(x: int) { - #C("#ifndef __TINYC__ + #C(" extern int printf(const char *fmt, ...); -#endif "); #C("printf(\"%ld\\n\", x);"); }; diff --git a/tests/control_flow.toc b/tests/control_flow.toc index 923a40b..043d4b7 100644 --- a/tests/control_flow.toc +++ b/tests/control_flow.toc @@ -1,4 +1,4 @@ -#include "io.toc", io; +#include "std/io.toc", io; f ::= fn() int { total := 0; @@ -28,4 +28,4 @@ main ::= fn() { x ::= f(); io.puti(x); io.puti(f()); -} \ No newline at end of file +} diff --git a/tests/defer.toc b/tests/defer.toc index 578668d..ec06a19 100644 --- a/tests/defer.toc +++ b/tests/defer.toc @@ -1,4 +1,4 @@ -#include "io.toc", io; +#include "std/io.toc", io; plusone ::= fn(n : int) x := n { defer x += 1; diff --git a/tests/foreign.toc b/tests/foreign.toc index d88a223..92038d9 100644 --- a/tests/foreign.toc +++ b/tests/foreign.toc @@ -22,4 +22,4 @@ hw ::= fn() int { main ::= fn() { hw(); x ::= hw(); -}; \ No newline at end of file +}; diff --git a/tests/io.toc b/tests/io.toc deleted file mode 100644 index 2c82dc9..0000000 --- a/tests/io.toc +++ /dev/null @@ -1,43 +0,0 @@ -putchar ::= #foreign("putchar", "libc.so.6") fn(#C int) #C int; -toc_putchar ::= fn(x: char) { - putchar(x as #C int); -} -printf ::= #foreign("printf", "libc.so.6") fn(#C &"char const", #C ..) #C int; - -writes ::= fn(x: []char) { - printf_strfmt := "%s\0"; - printf(&printf_strfmt[0], &x[0]); -} - -puts ::= fn(x: []char) { - writes(x); - toc_putchar('\n'); -} - -writei ::= fn(x: int) { - if x < 0 { - toc_putchar('-'); - // NOTE: don't do x = -x; here to make sure I64_MIN works - } - if x == 0 { - toc_putchar('0'); - } else { - abs ::= fn(x: int) int { if x < 0 { -x } else { x } }; - scan_digit := 1000000000000000000; - started := false; - while scan_digit > 0 { - digit := abs((x / scan_digit) % 10); - if digit > 0 { started = true; } - if started { - toc_putchar((('0' as int) + digit) as char); - } - scan_digit /= 10; - } - } -} - -puti ::= fn(x: int) { - writei(x); - toc_putchar('\n'); -} - diff --git a/tests/mem.toc b/tests/mem.toc deleted file mode 100644 index 6d16895..0000000 --- a/tests/mem.toc +++ /dev/null @@ -1,23 +0,0 @@ -// TODO: check for failed calloc -calloc ::= #foreign("calloc", "libc.so.6") fn(#C size_t, #C size_t) #C &"void"; -free ::= #foreign("free", "libc.so.6") fn(#C &"void"); - -new ::= fn(t :: Type) &t { - calloc(1, (sizeof t) as #C size_t) -} - -news ::= fn(t :: Type, n : int) []t { - s: []t; - s.data = calloc(n as #C size_t, (sizeof t) as #C size_t); - s.len = n; - s -} - -// TODO(eventually): use type information to make this just one function -del ::= fn(t::=, x: &t) { - free(x); -} - -dels ::= fn(t::=, x: []t) { - free(x.data); -} diff --git a/tests/misc.toc b/tests/misc.toc index 26ecf3e..5dcd1eb 100644 --- a/tests/misc.toc +++ b/tests/misc.toc @@ -1,4 +1,4 @@ -#include "io.toc", io; +#include "std/io.toc", io; main ::= fn() { x ::= 3; diff --git a/tests/new.toc b/tests/new.toc index bb6a5fa..790a115 100644 --- a/tests/new.toc +++ b/tests/new.toc @@ -1,5 +1,5 @@ -#include "mem.toc", mem; -#include "io.toc", io; +#include "std/mem.toc", mem; +#include "std/io.toc", io; calculation ::= fn() int { total := 0; diff --git a/tests/nms.toc b/tests/nms.toc index 413da8d..32c2955 100644 --- a/tests/nms.toc +++ b/tests/nms.toc @@ -1,5 +1,5 @@ io ::= nms { - #include "io.toc"; + #include "std/io.toc"; }; n ::= nms { diff --git a/tests/sizeof.toc b/tests/sizeof.toc index 0bc806b..5a97985 100644 --- a/tests/sizeof.toc +++ b/tests/sizeof.toc @@ -1,4 +1,4 @@ -#include "io.toc", io; +#include "std/io.toc", io; Point3D ::= struct { x, y, z: f32; @@ -14,4 +14,4 @@ main ::= fn() { x ::= calculation(); io.puti(x); io.puti(calculation()); -} \ No newline at end of file +} diff --git a/tests/std/io.toc b/tests/std/io.toc new file mode 100644 index 0000000..2c82dc9 --- /dev/null +++ b/tests/std/io.toc @@ -0,0 +1,43 @@ +putchar ::= #foreign("putchar", "libc.so.6") fn(#C int) #C int; +toc_putchar ::= fn(x: char) { + putchar(x as #C int); +} +printf ::= #foreign("printf", "libc.so.6") fn(#C &"char const", #C ..) #C int; + +writes ::= fn(x: []char) { + printf_strfmt := "%s\0"; + printf(&printf_strfmt[0], &x[0]); +} + +puts ::= fn(x: []char) { + writes(x); + toc_putchar('\n'); +} + +writei ::= fn(x: int) { + if x < 0 { + toc_putchar('-'); + // NOTE: don't do x = -x; here to make sure I64_MIN works + } + if x == 0 { + toc_putchar('0'); + } else { + abs ::= fn(x: int) int { if x < 0 { -x } else { x } }; + scan_digit := 1000000000000000000; + started := false; + while scan_digit > 0 { + digit := abs((x / scan_digit) % 10); + if digit > 0 { started = true; } + if started { + toc_putchar((('0' as int) + digit) as char); + } + scan_digit /= 10; + } + } +} + +puti ::= fn(x: int) { + writei(x); + toc_putchar('\n'); +} + diff --git a/tests/std/mem.toc b/tests/std/mem.toc new file mode 100644 index 0000000..6d16895 --- /dev/null +++ b/tests/std/mem.toc @@ -0,0 +1,23 @@ +// TODO: check for failed calloc +calloc ::= #foreign("calloc", "libc.so.6") fn(#C size_t, #C size_t) #C &"void"; +free ::= #foreign("free", "libc.so.6") fn(#C &"void"); + +new ::= fn(t :: Type) &t { + calloc(1, (sizeof t) as #C size_t) +} + +news ::= fn(t :: Type, n : int) []t { + s: []t; + s.data = calloc(n as #C size_t, (sizeof t) as #C size_t); + s.len = n; + s +} + +// TODO(eventually): use type information to make this just one function +del ::= fn(t::=, x: &t) { + free(x); +} + +dels ::= fn(t::=, x: []t) { + free(x.data); +} diff --git a/tests/types.toc b/tests/types.toc index 4ef55e8..7262637 100644 --- a/tests/types.toc +++ b/tests/types.toc @@ -1,6 +1,5 @@ -#include "io.toc", io; -#include "mem.toc"; - +#include "std/io.toc", io; +#include "std/mem.toc"; main ::= fn() { nums := news(int, 10); diff --git a/tests/use.toc b/tests/use.toc index f1228f6..98e9221 100644 --- a/tests/use.toc +++ b/tests/use.toc @@ -1,5 +1,5 @@ -#include "io.toc", io; -#include "mem.toc", mem; +#include "std/io.toc", io; +#include "std/mem.toc", mem; use mem; -- cgit v1.2.3