Removed unnecessary function
This commit is contained in:
parent
be384c5136
commit
b32df45289
@ -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
|
|
||||||
}
|
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user