summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler.c16
-rw-r--r--tests/test_funcall_5.tnsl12
-rwxr-xr-xtnslc/build.sh2
-rw-r--r--tnslc/main.tnsl13
-rw-r--r--tnslc/vector.tnsl32
5 files changed, 58 insertions, 17 deletions
diff --git a/compiler.c b/compiler.c
index 9901e2e..9d66258 100644
--- a/compiler.c
+++ b/compiler.c
@@ -1846,7 +1846,7 @@ void *mod_find_rec(Module *mod, Artifact *art, size_t sub, int find_type) {
char **to_check = vect_get(art, sub);
Vector e_check = vect_from_string("@@"); // In case it is a variable inside an enum
- Vector t_check = vect_from_string("@"); // In case it is a function inside a method block
+ Vector t_check = vect_from_string("_#"); // In case it is a function inside a method block
vect_push_string(&e_check, *to_check);
vect_as_string(&e_check);
vect_push_string(&t_check, *to_check);
@@ -1939,7 +1939,7 @@ void mod_full_path_rec(Module *m, Vector *v) {
mod_full_path_rec(m->parent, v);
char dot = '.';
- if(v->count > 0 || (v->count == 0 && m->name[0] == '@'))
+ if(v->count > 0)
vect_push(v, &dot);
vect_push_string(v, m->name);
}
@@ -3094,7 +3094,7 @@ void p1_parse_method(Module *root, Vector *tokens, size_t *pos) {
return;
}
- Vector mod_name = vect_from_string("@");
+ Vector mod_name = vect_from_string("_#");
vect_push_string(&mod_name, t->data);
Module out = mod_init(vect_as_string(&mod_name), root, root->exported);
vect_end(&mod_name);
@@ -3290,7 +3290,7 @@ void p1_size_type (Module *root, Type *t) {
int sum = 0;
t->size = -1;
- Vector tmp = vect_from_string("@");
+ Vector tmp = vect_from_string("_#");
vect_push_string(&tmp, t->name);
t->module = mod_find_sub(root, vect_as_string(&tmp));
vect_end(&tmp);
@@ -3349,7 +3349,7 @@ void p1_size_type (Module *root, Type *t) {
void p1_resolve_func_types(Module *root, Function *func) {
- bool method = root->name != NULL && strlen(root->name) > 0 && root->name[0] == '@';
+ bool method = root->name != NULL && strlen(root->name) > 1 && root->name[0] == '_' && root->name[1] == '#';
int reg = 1;
if (method)
@@ -5036,7 +5036,7 @@ void p2_compile_control(Scope *s, CompData *out, Vector *tokens, size_t *pos, Ve
void _p2_handle_method_scope(Module *root, CompData *out, Scope *fs, Function *f) {
// load type for method
- Artifact t_art = art_from_str((root->name + 1), '.');
+ Artifact t_art = art_from_str((root->name + 2), '.');
Type *t = mod_find_type(root, &t_art);
art_end(&t_art);
@@ -5148,7 +5148,7 @@ void p2_compile_function(Module *root, CompData *out, Vector *tokens, size_t *po
// Scope init
Scope fs = scope_init(t->data, root);
_p2_func_scope_init(root, out, &fs, f, &p_list);
- if(root->name != NULL && strlen(root->name) > 0 && root->name[0] == '@') {
+ if(root->name != NULL && strlen(root->name) > 1 && root->name[0] == '_' && root->name[1] == '#') {
_p2_handle_method_scope(root, out, &fs, f);
}
@@ -5253,7 +5253,7 @@ void p2_compile_method(Module *root, CompData *out, Vector *tokens, size_t *pos)
return;
}
- Vector sub_name = vect_from_string("@");
+ Vector sub_name = vect_from_string("_#");
vect_push_string(&sub_name, t->data);
// TODO: method loop
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/tnslc/build.sh b/tnslc/build.sh
index b492dcd..798e77d 100755
--- a/tnslc/build.sh
+++ b/tnslc/build.sh
@@ -3,5 +3,5 @@
../ctc main.tnsl tnslc.asm
nasm -f elf64 -o tnslc.o tnslc.asm
gcc -o tnslc tnslc.o
-rm tnslc.asm tnslc.o
+# rm tnslc.asm tnslc.o
diff --git a/tnslc/main.tnsl b/tnslc/main.tnsl
index 1abedb3..ac56836 100644
--- a/tnslc/main.tnsl
+++ b/tnslc/main.tnsl
@@ -1,14 +1,11 @@
: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)
+ Vector a
+ a.init(1)
- /; if (argc > 2)
- _printf(str_b)
- ;/
-
return 0
;/
+
diff --git a/tnslc/vector.tnsl b/tnslc/vector.tnsl
new file mode 100644
index 0000000..1377938
--- /dev/null
+++ b/tnslc/vector.tnsl
@@ -0,0 +1,32 @@
+struct Vector {
+ ~void data,
+ int
+ size,
+ count,
+ _elsz
+}
+
+int VECT_DEFAULT_SIZE = 4
+
+/; method Vector
+
+ /; init (int elsz)
+ self._elsz = elsz
+ self.size = VECT_DEFAULT_SIZE
+ self.data = _alloc(elsz * self.size)
+ self.count = 0
+ ;/
+
+ /; get (int index) [~void]
+ return self.data
+ ;/
+
+ /; end
+ _delete(self.data)
+ self.size = 0
+ self._elsz = 0
+ self.count = 0
+ ;/
+
+;/
+