summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle Gunger <kgunger12@gmail.com>2024-03-17 02:37:39 -0400
committerKyle Gunger <kgunger12@gmail.com>2024-03-17 02:37:39 -0400
commitd618ab0fb5e083dd9880f22b7bdc43be4a3c0327 (patch)
tree59548909be587a96b02f023e16dbf56b288c082e
parent9385eaa149fae5d3c793f154611518342b7f3e9e (diff)
parentf80bb4fd79f27210b606966c421ff3104ad0c959 (diff)
Merge branch 'main' of git.cshift.net:CircleShift/ctc
-rw-r--r--compiler.c19
-rwxr-xr-xtests/run.sh9
-rw-r--r--tests/test_controll.tnsl12
-rw-r--r--tests/test_funcall_5.tnsl12
-rw-r--r--tests/test_method_2.tnsl2
-rwxr-xr-xtnslc/build.sh9
-rw-r--r--tnslc/main.tnsl17
-rwxr-xr-xtnslc/tnslcbin0 -> 21440 bytes
-rw-r--r--tnslc/vector.tnsl87
9 files changed, 135 insertions, 32 deletions
diff --git a/compiler.c b/compiler.c
index f56fe18..8aac480 100644
--- a/compiler.c
+++ b/compiler.c
@@ -1027,7 +1027,7 @@ void _var_op_set_ptr(CompData *out, Variable *store, Variable *from) {
int *cur;
for (size_t i = store->ptr_chain.count - 1; i > 0; i--) {
cur = vect_get(&store->ptr_chain, i - 1);
- if (cur == PTYPE_REF) {
+ if (*cur == PTYPE_REF) {
vect_push_string(&out->text, "\tmov rdi, [rdi]\n");
} else {
break;
@@ -1054,7 +1054,7 @@ void _var_op_set_ptr(CompData *out, Variable *store, Variable *from) {
int *cur;
for (size_t i = from->ptr_chain.count - 1; i > 0; i--) {
cur = vect_get(&store->ptr_chain, i - 1);
- if (cur == PTYPE_REF) {
+ if (*cur == PTYPE_REF) {
vect_push_string(&out->text, "\tmov rsi, [rsi]\n");
} else {
break;
@@ -1544,18 +1544,23 @@ void var_op_mul(CompData *out, Variable *base, Variable *mul) {
if(base->type->name[0] == 'i') {
// Integer multiplication
if (base->location > 0 && mul->location != LOC_LITL) {
+ char *store = _var_get_store(out, base);
+ char *from = _var_get_from(out, base, mul);
+
vect_push_string(&out->text, "\timul ");
- vect_push_free_string(&out->text, _var_get_store(out, base));
+ vect_push_free_string(&out->text, store);
vect_push_string(&out->text, ", ");
- vect_push_free_string(&out->text, _var_get_from(out, base, mul));
+ vect_push_free_string(&out->text, from);
vect_push_string(&out->text, "; complete mul\n\n");
} else if (base->location > 0) {
vect_push_string(&out->text, "\tmov rcx, ");
vect_push_free_string(&out->text, int_to_str(mul->offset));
vect_push_string(&out->text, "; literal load\n");
+ char *store = _var_get_store(out, base);
+
vect_push_string(&out->text, "\timul ");
- vect_push_free_string(&out->text, _var_get_store(out, base));
+ vect_push_free_string(&out->text, store);
vect_push_string(&out->text, ", ");
vect_push_free_string(&out->text, _op_get_register(3, _var_size(base)));
vect_push_string(&out->text, "; complete mul\n\n");
@@ -4134,7 +4139,7 @@ Variable _eval_call(Scope *s, CompData *data, Vector *tokens, Function *f, Varia
Variable set = scope_mk_stmp(s, data, cur);
Variable from = _eval(s, data, tokens, pstart, pend);
// eval and set
- var_op_pure_set(data, &set, &from);
+ var_op_set(data, &set, &from);
scope_free_to(s, data, &set);
var_end(&from);
var_end(&set);
@@ -4186,7 +4191,7 @@ Variable _eval_call(Scope *s, CompData *data, Vector *tokens, Function *f, Varia
Variable set = scope_mk_stmp(s, data, cur);
// eval and set
Variable from = _eval(s, data, tokens, pstart, pend);
- var_op_pure_set(data, &set, &from);
+ var_op_set(data, &set, &from);
// cleanup
scope_free_to(s, data, &set);
var_end(&from);
diff --git a/tests/run.sh b/tests/run.sh
new file mode 100755
index 0000000..136dac1
--- /dev/null
+++ b/tests/run.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+mkdir -p ./out/artifact
+filename=$1
+filename="${filename%.*}"
+../ctc $1 out/artifact/$filename.asm
+nasm -f elf64 -o ./out/artifact/$filename.o ./out/artifact/$filename.asm
+gcc -o ./out/$filename ./out/artifact/$filename.o
+
diff --git a/tests/test_controll.tnsl b/tests/test_controll.tnsl
deleted file mode 100644
index 47ff241..0000000
--- a/tests/test_controll.tnsl
+++ /dev/null
@@ -1,12 +0,0 @@
-/; main [int]
-
- /; if (false)
- return 1
- ;; else if (1 == 0)
- return 2
- ;; else
- return 69
- ;/
-
- return 0
-;/
diff --git a/tests/test_funcall_5.tnsl b/tests/test_funcall_5.tnsl
new file mode 100644
index 0000000..48bd4fe
--- /dev/null
+++ b/tests/test_funcall_5.tnsl
@@ -0,0 +1,12 @@
+/; f_a (int a) [int]
+ return a
+;/
+
+/; f_b (int a, ~int b) [int]
+ return a + b`
+;/
+
+/; main [int]
+ int a = 60
+ return f_b(f_a(1) * 9, ~a)
+;/
diff --git a/tests/test_method_2.tnsl b/tests/test_method_2.tnsl
index 899cdcb..56b3419 100644
--- a/tests/test_method_2.tnsl
+++ b/tests/test_method_2.tnsl
@@ -12,6 +12,6 @@ struct Vector {
/; main [int]
Vector a
- a.init(1)
+ a.init(69)
return a._elsz
;/
diff --git a/tnslc/build.sh b/tnslc/build.sh
index b492dcd..a12ad5b 100755
--- a/tnslc/build.sh
+++ b/tnslc/build.sh
@@ -1,7 +1,8 @@
#!/bin/bash
-../ctc main.tnsl tnslc.asm
-nasm -f elf64 -o tnslc.o tnslc.asm
-gcc -o tnslc tnslc.o
-rm tnslc.asm tnslc.o
+mkdir -p out
+../ctc main.tnsl out/tnslc.asm
+nasm -f elf64 -o out/tnslc.o out/tnslc.asm
+gcc -o out/tnslc out/tnslc.o
+# rm tnslc.asm tnslc.o
diff --git a/tnslc/main.tnsl b/tnslc/main.tnsl
index 1abedb3..c7e8c95 100644
--- a/tnslc/main.tnsl
+++ b/tnslc/main.tnsl
@@ -1,14 +1,15 @@
:import "c_wrap_linux.tnsl"
+:import "vector.tnsl"
-~uint8 str_a = "Hello World\n\0"
-~uint8 str_b = "!\n\0"
+/; main [int]
-/; main (int argc, ~~uint8 argv) [int]
- _printf(str_a)
-
- /; if (argc > 2)
- _printf(str_b)
- ;/
+ Vector a
+ a.init(1)
+
+
+ a.end()
+
return 0
;/
+
diff --git a/tnslc/tnslc b/tnslc/tnslc
new file mode 100755
index 0000000..e8d4c46
--- /dev/null
+++ b/tnslc/tnslc
Binary files differ
diff --git a/tnslc/vector.tnsl b/tnslc/vector.tnsl
new file mode 100644
index 0000000..9b89081
--- /dev/null
+++ b/tnslc/vector.tnsl
@@ -0,0 +1,87 @@
+# Define vector struct
+struct Vector {
+ ~void data,
+ int
+ size,
+ count,
+ _elsz
+}
+
+# Consts used in impl
+int VECT_DEFAULT_SIZE = 4
+int VECT_MAX_GROW = 128
+
+# Methods on the struct
+/; method Vector
+
+ # Initialize a new vector with elements
+ # 'elsz' bytes long
+ /; init (int elsz)
+ self.size = VECT_DEFAULT_SIZE
+ self._elsz = elsz
+ self.count = 0
+ self.data = _alloc(elsz * VECT_DEFAULT_SIZE)
+ ;/
+
+ # Grow the size of the vector by 'size' elements
+ /; _grow (int size)
+ /; if (size > VECT_MAX_GROW)
+ size = VECT_MAX_GROW
+ ;/
+
+ self.size = self.size + size
+ self.data = _realloc(self.data, self.size * self._elsz)
+ ;/
+
+ # Shrink the size of the vector by 'size' elements
+ /; _shrink (int size)
+ /; if (self.size - size < 0)
+ self.size = 1
+ ;; else
+ self.size = self.size - size
+ ;/
+
+ /; if (self.count < self.size)
+ self.count = self.size
+ ;/
+
+ self.data = _realloc(self.data, self.size * self._elsz)
+ ;/
+
+ # Push an element onto the end of the vector
+ /; push (~void data)
+ /; if (count == size - 1)
+ self._grow(self.size)
+ ;/
+
+ /; loop (int i = 0; i < self._elsz) [i++]
+ (self.data + i)` = (data + i)`
+ ;/
+
+ self.count++
+ ;/
+
+ # Pop an element off of the end of the vector
+ /; pop
+ self.count--
+
+ /; if (self.count < self.size / 2)
+ self._shrink(self.size / 3)
+ ;/
+ ;/
+
+ # Get a pointer to the start of an element in the vector
+ /; get (int index) [~void]
+ return self.data
+ ;/
+
+ # Free all memory associated with the vector
+ /; end
+ _delete(self.data)
+ self.size = 0
+ self._elsz = 0
+ self.count = 0
+ ;/
+
+;/
+