Removed unnecessary function

This commit is contained in:
Eduard Urbach 2025-02-12 16:29:45 +01:00
parent be384c5136
commit b32df45289
Signed by: akyoto
GPG Key ID: C874F672B1AF20C0
7 changed files with 25 additions and 40 deletions

View File

@ -1,32 +0,0 @@
package core
import (
"git.akyoto.dev/cli/q/src/cpu"
"git.akyoto.dev/cli/q/src/errors"
"git.akyoto.dev/cli/q/src/expression"
"git.akyoto.dev/cli/q/src/token"
"git.akyoto.dev/cli/q/src/types"
)
// BeforeCall loads the registers with the parameter values and checks that the types match with the function signature.
func (f *Function) BeforeCall(fn *Function, parameters []*expression.Expression, registers []cpu.Register) error {
for i := len(parameters) - 1; i >= 0; i-- {
typ, err := f.ExpressionToRegister(parameters[i], registers[i])
if err != nil {
return err
}
if !types.Is(typ, fn.Input[i].Type) {
_, expectsPointer := fn.Input[i].Type.(*types.Pointer)
if expectsPointer && parameters[i].Token.Kind == token.Number && parameters[i].Token.Text(f.File.Bytes) == "0" {
continue
}
return errors.New(&errors.TypeMismatch{Encountered: typ.Name(), Expected: fn.Input[i].Type.Name(), ParameterName: fn.Input[i].Name}, f.File, parameters[i].Token.Position)
}
}
return nil
}

View File

@ -26,7 +26,7 @@ func (f *Function) CallExtern(fn *Function, parameters []*expression.Expression)
} }
registers := x86.WindowsInputRegisters[:len(parameters)] registers := x86.WindowsInputRegisters[:len(parameters)]
err := f.BeforeCall(fn, parameters, registers) err := f.ExpressionsToRegisters(parameters, registers, fn.Input)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -75,7 +75,7 @@ func (f *Function) CompileCall(root *expression.Expression) ([]types.Type, error
} }
registers := f.CPU.Input[:len(parameters)] registers := f.CPU.Input[:len(parameters)]
err := f.BeforeCall(fn, parameters, registers) err := f.ExpressionsToRegisters(parameters, registers, fn.Input)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -18,6 +18,7 @@ func (f *Function) CompileReturn(node *ast.Return) error {
} }
for i := len(node.Values) - 1; i >= 0; i-- { for i := len(node.Values) - 1; i >= 0; i-- {
f.SaveRegister(f.CPU.Output[i])
typ, err := f.ExpressionToRegister(node.Values[i], f.CPU.Output[i]) typ, err := f.ExpressionToRegister(node.Values[i], f.CPU.Output[i])
if err != nil { if err != nil {

View File

@ -8,7 +8,7 @@ import (
func (f *Function) CompileSyscall(root *expression.Expression) error { func (f *Function) CompileSyscall(root *expression.Expression) error {
parameters := root.Children[1:] parameters := root.Children[1:]
registers := f.CPU.SyscallInput[:len(parameters)] registers := f.CPU.SyscallInput[:len(parameters)]
err := f.ExpressionsToRegisters(parameters, registers) err := f.ExpressionsToRegisters(parameters, registers, nil)
if err != nil { if err != nil {
return err return err

View File

@ -12,8 +12,6 @@ import (
// ExpressionToRegister puts the result of an expression into the specified register. // ExpressionToRegister puts the result of an expression into the specified register.
func (f *Function) ExpressionToRegister(node *expression.Expression, register cpu.Register) (types.Type, error) { func (f *Function) ExpressionToRegister(node *expression.Expression, register cpu.Register) (types.Type, error) {
f.SaveRegister(register)
if node.IsFolded { if node.IsFolded {
f.RegisterNumber(asm.MOVE, register, node.Value) f.RegisterNumber(asm.MOVE, register, node.Value)
return types.Int, nil return types.Int, nil

View File

@ -2,17 +2,35 @@ package core
import ( import (
"git.akyoto.dev/cli/q/src/cpu" "git.akyoto.dev/cli/q/src/cpu"
"git.akyoto.dev/cli/q/src/errors"
"git.akyoto.dev/cli/q/src/expression" "git.akyoto.dev/cli/q/src/expression"
"git.akyoto.dev/cli/q/src/token"
"git.akyoto.dev/cli/q/src/types"
) )
// ExpressionsToRegisters moves multiple expressions into the specified registers. // ExpressionsToRegisters moves multiple expressions into the specified registers and checks that the types match with the function signature.
func (f *Function) ExpressionsToRegisters(expressions []*expression.Expression, registers []cpu.Register) error { func (f *Function) ExpressionsToRegisters(expressions []*expression.Expression, registers []cpu.Register, input []*Input) error {
for i := len(expressions) - 1; i >= 0; i-- { for i := len(expressions) - 1; i >= 0; i-- {
_, err := f.ExpressionToRegister(expressions[i], registers[i]) f.SaveRegister(registers[i])
typ, err := f.ExpressionToRegister(expressions[i], registers[i])
if err != nil { if err != nil {
return err return err
} }
if input == nil {
continue
}
if !types.Is(typ, input[i].Type) {
_, expectsPointer := input[i].Type.(*types.Pointer)
if expectsPointer && expressions[i].Token.Kind == token.Number && expressions[i].Token.Text(f.File.Bytes) == "0" {
continue
}
return errors.New(&errors.TypeMismatch{Encountered: typ.Name(), Expected: input[i].Type.Name(), ParameterName: input[i].Name}, f.File, expressions[i].Token.Position)
}
} }
return nil return nil