From b0c568e6167871a0b90967af53137781e6533f11 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Fri, 2 Aug 2024 11:41:21 +0200 Subject: [PATCH] Improved performance --- src/build/compiler/Compile.go | 2 +- src/build/core/AddBytes.go | 2 +- src/build/core/Compile.go | 2 +- src/build/core/CompileAssert.go | 4 ++-- src/build/core/CompileCondition.go | 4 ++-- src/build/core/CompileIf.go | 6 +++--- src/build/core/CompileLoop.go | 2 +- src/build/core/Function.go | 17 +++++++++-------- src/build/core/NewFunction.go | 9 +++++---- src/build/register/SaveRegister.go | 8 ++++---- src/build/scanner/scanFile.go | 5 ----- 11 files changed, 29 insertions(+), 32 deletions(-) diff --git a/src/build/compiler/Compile.go b/src/build/compiler/Compile.go index facd13b..4b31d9a 100644 --- a/src/build/compiler/Compile.go +++ b/src/build/compiler/Compile.go @@ -23,7 +23,7 @@ func Compile(files <-chan *fs.File, functions <-chan *core.Function, errs <-chan } function.Functions = allFunctions - allFunctions[function.Name] = function + allFunctions[function.UniqueName] = function case file, ok := <-files: if !ok { diff --git a/src/build/core/AddBytes.go b/src/build/core/AddBytes.go index 2e793ea..d75c11d 100644 --- a/src/build/core/AddBytes.go +++ b/src/build/core/AddBytes.go @@ -7,7 +7,7 @@ import ( // AddBytes adds a sequence of bytes and returns its address as a label. func (f *Function) AddBytes(value []byte) string { f.count.data++ - label := fmt.Sprintf("%s_data_%d", f.Name, f.count.data) + label := fmt.Sprintf("%s_data_%d", f.UniqueName, f.count.data) f.Assembler.SetData(label, value) return label } diff --git a/src/build/core/Compile.go b/src/build/core/Compile.go index 4898f69..1a28253 100644 --- a/src/build/core/Compile.go +++ b/src/build/core/Compile.go @@ -2,7 +2,7 @@ package core // Compile turns a function into machine code. func (f *Function) Compile() { - f.AddLabel(f.Name) + f.AddLabel(f.UniqueName) f.Err = f.CompileTokens(f.Body) f.Return() diff --git a/src/build/core/CompileAssert.go b/src/build/core/CompileAssert.go index 2715e44..f601624 100644 --- a/src/build/core/CompileAssert.go +++ b/src/build/core/CompileAssert.go @@ -10,8 +10,8 @@ import ( // CompileAssert compiles an assertion. func (f *Function) CompileAssert(assert *ast.Assert) error { f.count.assert++ - success := fmt.Sprintf("%s_assert_%d_true", f.Name, f.count.assert) - fail := fmt.Sprintf("%s_assert_%d_false", f.Name, f.count.assert) + success := fmt.Sprintf("%s_assert_%d_true", f.UniqueName, f.count.assert) + fail := fmt.Sprintf("%s_assert_%d_false", f.UniqueName, f.count.assert) err := f.CompileCondition(assert.Condition, success, fail) if err != nil { diff --git a/src/build/core/CompileCondition.go b/src/build/core/CompileCondition.go index 54e0ab0..b43a65f 100644 --- a/src/build/core/CompileCondition.go +++ b/src/build/core/CompileCondition.go @@ -12,7 +12,7 @@ func (f *Function) CompileCondition(condition *expression.Expression, successLab switch condition.Token.Kind { case token.LogicalOr: f.count.subBranch++ - leftFailLabel := fmt.Sprintf("%s_false_%d", f.Name, f.count.subBranch) + leftFailLabel := fmt.Sprintf("%s_false_%d", f.UniqueName, f.count.subBranch) // Left left := condition.Children[0] @@ -39,7 +39,7 @@ func (f *Function) CompileCondition(condition *expression.Expression, successLab case token.LogicalAnd: f.count.subBranch++ - leftSuccessLabel := fmt.Sprintf("%s_true_%d", f.Name, f.count.subBranch) + leftSuccessLabel := fmt.Sprintf("%s_true_%d", f.UniqueName, f.count.subBranch) // Left left := condition.Children[0] diff --git a/src/build/core/CompileIf.go b/src/build/core/CompileIf.go index 6b1a869..ec15dcb 100644 --- a/src/build/core/CompileIf.go +++ b/src/build/core/CompileIf.go @@ -13,8 +13,8 @@ func (f *Function) CompileIf(branch *ast.If) error { var ( end string - success = fmt.Sprintf("%s_if_%d_true", f.Name, f.count.branch) - fail = fmt.Sprintf("%s_if_%d_false", f.Name, f.count.branch) + success = fmt.Sprintf("%s_if_%d_true", f.UniqueName, f.count.branch) + fail = fmt.Sprintf("%s_if_%d_false", f.UniqueName, f.count.branch) err = f.CompileCondition(branch.Condition, success, fail) ) @@ -31,7 +31,7 @@ func (f *Function) CompileIf(branch *ast.If) error { } if branch.Else != nil { - end = fmt.Sprintf("%s_if_%d_end", f.Name, f.count.branch) + end = fmt.Sprintf("%s_if_%d_end", f.UniqueName, f.count.branch) f.Jump(asm.JUMP, end) } diff --git a/src/build/core/CompileLoop.go b/src/build/core/CompileLoop.go index a1b116a..1a28900 100644 --- a/src/build/core/CompileLoop.go +++ b/src/build/core/CompileLoop.go @@ -10,7 +10,7 @@ import ( // CompileLoop compiles a loop instruction. func (f *Function) CompileLoop(loop *ast.Loop) error { f.count.loop++ - label := fmt.Sprintf("%s_loop_%d", f.Name, f.count.loop) + label := fmt.Sprintf("%s_loop_%d", f.UniqueName, f.count.loop) f.AddLabel(label) scope := f.PushScope(loop.Body, f.File.Bytes) scope.InLoop = true diff --git a/src/build/core/Function.go b/src/build/core/Function.go index 7a4b4c6..a4f9234 100644 --- a/src/build/core/Function.go +++ b/src/build/core/Function.go @@ -9,14 +9,15 @@ import ( // Function represents the smallest unit of code. type Function struct { register.Machine - Package string - Name string - File *fs.File - Body []token.Token - Functions map[string]*Function - Err error - deferred []func() - count counter + Package string + Name string + UniqueName string + File *fs.File + Body []token.Token + Functions map[string]*Function + Err error + deferred []func() + count counter } // counter stores how often a certain statement appeared so we can generate a unique label from it. diff --git a/src/build/core/NewFunction.go b/src/build/core/NewFunction.go index bd4f23b..2772db2 100644 --- a/src/build/core/NewFunction.go +++ b/src/build/core/NewFunction.go @@ -13,10 +13,11 @@ import ( // NewFunction creates a new function. func NewFunction(pkg string, name string, file *fs.File, body []token.Token) *Function { return &Function{ - Package: pkg, - Name: name, - File: file, - Body: body, + Package: pkg, + Name: name, + UniqueName: pkg + "." + name, + File: file, + Body: body, Machine: register.Machine{ Assembler: asm.Assembler{ Instructions: make([]asm.Instruction, 0, 8), diff --git a/src/build/register/SaveRegister.go b/src/build/register/SaveRegister.go index 1c20818..18dfb76 100644 --- a/src/build/register/SaveRegister.go +++ b/src/build/register/SaveRegister.go @@ -1,6 +1,8 @@ package register import ( + "slices" + "git.akyoto.dev/cli/q/src/build/asm" "git.akyoto.dev/cli/q/src/build/cpu" ) @@ -11,10 +13,8 @@ func (f *Machine) SaveRegister(register cpu.Register) { return } - for _, general := range f.CPU.General { - if register == general { - return - } + if slices.Contains(f.CPU.General, register) { + return } variable := f.VariableByRegister(register) diff --git a/src/build/scanner/scanFile.go b/src/build/scanner/scanFile.go index 757cbaf..0f21732 100644 --- a/src/build/scanner/scanFile.go +++ b/src/build/scanner/scanFile.go @@ -1,7 +1,6 @@ package scanner import ( - "fmt" "os" "path/filepath" @@ -209,10 +208,6 @@ func (s *Scanner) scanFile(path string, pkg string) error { name := tokens[nameStart].Text(contents) body := tokens[bodyStart:i] - if pkg != "" { - name = fmt.Sprintf("%s.%s", pkg, name) - } - function := core.NewFunction(pkg, name, file, body) parameters := tokens[paramsStart:paramsEnd] count := 0