From 0c1b57b4e41d6190cdfd1a7f5e52312e70b91741 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Tue, 30 Jul 2024 20:02:55 +0200 Subject: [PATCH] Added main prefix --- lib/log/number.q | 6 +++++- src/build/compiler/Compile.go | 2 +- src/build/compiler/Result.go | 2 +- src/build/core/CompileCall.go | 26 +++++++++++++++++--------- src/build/core/Function.go | 1 + src/build/core/NewFunction.go | 9 +++++---- src/build/expression/Expression.go | 2 +- src/build/scanner/queue.go | 4 ++-- src/build/scanner/scanFile.go | 2 +- 9 files changed, 34 insertions(+), 20 deletions(-) diff --git a/lib/log/number.q b/lib/log/number.q index 58456ad..c8de482 100644 --- a/lib/log/number.q +++ b/lib/log/number.q @@ -4,6 +4,11 @@ import sys number(x) { length := 20 buffer := mem.alloc(length) + itoa(x, buffer, length) + mem.free(buffer, length) +} + +itoa(x, buffer, length) { end := buffer + length tmp := end digit := 0 @@ -15,7 +20,6 @@ number(x) { if x == 0 { sys.write(1, tmp, end - tmp) - mem.free(buffer, length) return } } diff --git a/src/build/compiler/Compile.go b/src/build/compiler/Compile.go index 565fe28..e25de67 100644 --- a/src/build/compiler/Compile.go +++ b/src/build/compiler/Compile.go @@ -47,7 +47,7 @@ func Compile(functions <-chan *core.Function, errs <-chan error) (Result, error) } // Check for existence of `main` - main, exists := all["main"] + main, exists := all["main.main"] if !exists { return result, errors.MissingMainFunction diff --git a/src/build/compiler/Result.go b/src/build/compiler/Result.go index 68c37ca..db1f814 100644 --- a/src/build/compiler/Result.go +++ b/src/build/compiler/Result.go @@ -31,7 +31,7 @@ func (r *Result) finalize() ([]byte, []byte) { Data: make(map[string][]byte, r.DataCount), } - final.Call("main") + final.Call("main.main") final.RegisterNumber(asm.MOVE, x64.SyscallRegisters[0], linux.Exit) final.RegisterNumber(asm.MOVE, x64.SyscallRegisters[1], 0) final.Syscall() diff --git a/src/build/core/CompileCall.go b/src/build/core/CompileCall.go index 1441ee9..9251510 100644 --- a/src/build/core/CompileCall.go +++ b/src/build/core/CompileCall.go @@ -1,6 +1,8 @@ package core import ( + "fmt" + "git.akyoto.dev/cli/q/src/build/asm" "git.akyoto.dev/cli/q/src/build/errors" "git.akyoto.dev/cli/q/src/build/expression" @@ -11,22 +13,28 @@ import ( // Registers that are in use must be saved if they are modified by the function. // After the function call, they must be restored in reverse order. func (f *Function) CompileCall(root *expression.Expression) error { - funcName := "" - funcNameRoot := root.Children[0] + var ( + pkg = f.Package + nameRoot = root.Children[0] + name string + fullName string + ) - if funcNameRoot.IsLeaf() { - funcName = funcNameRoot.Token.Text(f.File.Bytes) + if nameRoot.IsLeaf() { + name = nameRoot.Token.Text(f.File.Bytes) } else { - funcName = funcNameRoot.Children[0].Token.Text(f.File.Bytes) + funcNameRoot.Token.Text(f.File.Bytes) + funcNameRoot.Children[1].Token.Text(f.File.Bytes) + pkg = nameRoot.Children[0].Token.Text(f.File.Bytes) + name = nameRoot.Children[1].Token.Text(f.File.Bytes) } - isSyscall := funcName == "syscall" + isSyscall := name == "syscall" if !isSyscall { - _, exists := f.Functions[funcName] + fullName = fmt.Sprintf("%s.%s", pkg, name) + _, exists := f.Functions[fullName] if !exists { - return errors.New(&errors.UnknownFunction{Name: funcName}, f.File, root.Children[0].Token.Position) + return errors.New(&errors.UnknownFunction{Name: name}, f.File, root.Children[0].Token.Position) } } @@ -56,7 +64,7 @@ func (f *Function) CompileCall(root *expression.Expression) error { if isSyscall { f.Syscall() } else { - f.Call(funcName) + f.Call(fullName) } // Free parameter registers diff --git a/src/build/core/Function.go b/src/build/core/Function.go index 29fe007..7a4b4c6 100644 --- a/src/build/core/Function.go +++ b/src/build/core/Function.go @@ -9,6 +9,7 @@ import ( // Function represents the smallest unit of code. type Function struct { register.Machine + Package string Name string File *fs.File Body []token.Token diff --git a/src/build/core/NewFunction.go b/src/build/core/NewFunction.go index d4bc8f3..bd4f23b 100644 --- a/src/build/core/NewFunction.go +++ b/src/build/core/NewFunction.go @@ -11,11 +11,12 @@ import ( ) // NewFunction creates a new function. -func NewFunction(name string, file *fs.File, body []token.Token) *Function { +func NewFunction(pkg string, name string, file *fs.File, body []token.Token) *Function { return &Function{ - Name: name, - File: file, - Body: body, + Package: pkg, + Name: name, + File: file, + Body: body, Machine: register.Machine{ Assembler: asm.Assembler{ Instructions: make([]asm.Instruction, 0, 8), diff --git a/src/build/expression/Expression.go b/src/build/expression/Expression.go index 070b4fa..3a55506 100644 --- a/src/build/expression/Expression.go +++ b/src/build/expression/Expression.go @@ -11,8 +11,8 @@ type Expression struct { Parent *Expression Children []*Expression Token token.Token - Precedence int8 Value int + Precedence int8 IsFolded bool } diff --git a/src/build/scanner/queue.go b/src/build/scanner/queue.go index 6ccfc15..0bc628b 100644 --- a/src/build/scanner/queue.go +++ b/src/build/scanner/queue.go @@ -13,9 +13,9 @@ func (s *Scanner) queue(files ...string) { } if stat.IsDir() { - s.queueDirectory(file, "") + s.queueDirectory(file, "main") } else { - s.queueFile(file, "") + s.queueFile(file, "main") } } } diff --git a/src/build/scanner/scanFile.go b/src/build/scanner/scanFile.go index e724767..4d7b620 100644 --- a/src/build/scanner/scanFile.go +++ b/src/build/scanner/scanFile.go @@ -198,7 +198,7 @@ func (s *Scanner) scanFile(path string, pkg string) error { name = fmt.Sprintf("%s.%s", pkg, name) } - function := core.NewFunction(name, file, body) + function := core.NewFunction(pkg, name, file, body) parameters := tokens[paramsStart:paramsEnd] count := 0