implement tupElOp and use it in vAsTup
This commit is contained in:
parent
c6ce87df84
commit
463d693b17
37
vm/cmds.go
37
vm/cmds.go
@ -102,6 +102,34 @@ func (to tupOp) build(mod *Module) (llvm.Value, error) {
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
type tupElOp struct {
|
||||||
|
voidIn
|
||||||
|
tup op
|
||||||
|
i int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (teo tupElOp) outType() valType {
|
||||||
|
tupType := teo.tup.outType()
|
||||||
|
return valType{
|
||||||
|
llvm: tupType.llvm.StructElementTypes()[teo.i],
|
||||||
|
term: tupType.term.(lang.Tuple)[1].(lang.Tuple)[1],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (teo tupElOp) build(mod *Module) (llvm.Value, error) {
|
||||||
|
if to, ok := teo.tup.(tupOp); ok {
|
||||||
|
return to.els[teo.i].build(mod)
|
||||||
|
}
|
||||||
|
|
||||||
|
tv, err := teo.tup.build(mod)
|
||||||
|
if err != nil {
|
||||||
|
return llvm.Value{}, err
|
||||||
|
}
|
||||||
|
return mod.b.CreateExtractValue(tv, teo.i, ""), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
type addOp struct {
|
type addOp struct {
|
||||||
voidIn
|
voidIn
|
||||||
a, b op
|
a, b op
|
||||||
@ -148,11 +176,12 @@ func termToOp(t lang.Term) (op, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
vtup, ok := vop.(tupOp)
|
ops := make([]op, n)
|
||||||
if !ok || len(vtup.els) != n {
|
for i := range ops {
|
||||||
return nil, fmt.Errorf("op %v expects a %d-tuple argument", k, n)
|
ops[i] = tupElOp{tup: vop, i: i}
|
||||||
}
|
}
|
||||||
return vtup.els, nil
|
|
||||||
|
return ops, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
switch k {
|
switch k {
|
||||||
|
Loading…
Reference in New Issue
Block a user