Fixed missing values of casts
This commit is contained in:
parent
4428b09de2
commit
d7f30d8319
@ -52,17 +52,6 @@ func (f *Function) CompileCall(root *expression.Expression) ([]types.Type, error
|
|||||||
fn, exists = f.All.Functions[pkg+"."+name]
|
fn, exists = f.All.Functions[pkg+"."+name]
|
||||||
|
|
||||||
if !exists {
|
if !exists {
|
||||||
typ := types.ByName(name, f.Package, f.All.Structs)
|
|
||||||
|
|
||||||
if typ != nil {
|
|
||||||
if len(root.Children) != 2 {
|
|
||||||
return nil, errors.New(&errors.ParameterCountMismatch{Function: name, Count: len(root.Children), ExpectedCount: 1}, f.File, nameNode.Token.End())
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := f.ExpressionToRegister(root.Children[1], f.CPU.Output[0])
|
|
||||||
return []types.Type{typ}, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, errors.New(&errors.UnknownFunction{Name: name}, f.File, nameNode.Token.Position)
|
return nil, errors.New(&errors.UnknownFunction{Name: name}, f.File, nameNode.Token.Position)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,12 +1,56 @@
|
|||||||
package core
|
package core
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"git.urbach.dev/cli/q/src/errors"
|
||||||
"git.urbach.dev/cli/q/src/eval"
|
"git.urbach.dev/cli/q/src/eval"
|
||||||
"git.urbach.dev/cli/q/src/expression"
|
"git.urbach.dev/cli/q/src/expression"
|
||||||
|
"git.urbach.dev/cli/q/src/token"
|
||||||
|
"git.urbach.dev/cli/q/src/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
// EvaluateCall evaluates a function call.
|
// EvaluateCall evaluates a function call.
|
||||||
func (f *Function) EvaluateCall(expr *expression.Expression) (*eval.Register, error) {
|
func (f *Function) EvaluateCall(expr *expression.Expression) (eval.Value, error) {
|
||||||
|
if expr.Children[0].Token.Kind == token.Identifier {
|
||||||
|
nameNode := expr.Children[0]
|
||||||
|
name := nameNode.String(f.File.Bytes)
|
||||||
|
typ := types.ByName(name, f.Package, f.All.Structs)
|
||||||
|
|
||||||
|
if typ != nil {
|
||||||
|
if len(expr.Children) != 2 {
|
||||||
|
return nil, errors.New(&errors.ParameterCountMismatch{Function: name, Count: len(expr.Children), ExpectedCount: 1}, f.File, nameNode.Token.End())
|
||||||
|
}
|
||||||
|
|
||||||
|
value, err := f.Evaluate(expr.Children[1])
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch value := value.(type) {
|
||||||
|
case *eval.Register:
|
||||||
|
if value.IsAlive() {
|
||||||
|
value = &eval.Register{
|
||||||
|
Typ: typ,
|
||||||
|
Register: value.Register,
|
||||||
|
Alive: value.Alive,
|
||||||
|
}
|
||||||
|
|
||||||
|
return value, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
value.Typ = typ
|
||||||
|
case *eval.Number:
|
||||||
|
value.Typ = typ
|
||||||
|
case *eval.Memory:
|
||||||
|
value.Typ = typ
|
||||||
|
case *eval.Label:
|
||||||
|
value.Typ = typ
|
||||||
|
}
|
||||||
|
|
||||||
|
return value, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
typ, err := f.CompileCall(expr)
|
typ, err := f.CompileCall(expr)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -28,8 +28,8 @@ func (f *Function) ExpressionToRegister(node *expression.Expression, register cp
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch node.Token.Kind {
|
switch node.Token.Kind {
|
||||||
case token.Array:
|
case token.Call:
|
||||||
value, err := f.EvaluateArray(node)
|
value, err := f.EvaluateCall(node)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -48,8 +48,8 @@ func (f *Function) ExpressionToRegister(node *expression.Expression, register cp
|
|||||||
f.ValueToRegister(value, register)
|
f.ValueToRegister(value, register)
|
||||||
return value.Type(), nil
|
return value.Type(), nil
|
||||||
|
|
||||||
case token.Call:
|
case token.Array:
|
||||||
value, err := f.EvaluateCall(node)
|
value, err := f.EvaluateArray(node)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
Loading…
x
Reference in New Issue
Block a user