From 463d693b17a916dac4672fec5d96e6c9b2baebf6 Mon Sep 17 00:00:00 2001 From: Brian Picciano Date: Wed, 15 Feb 2017 08:36:23 -0700 Subject: [PATCH] implement tupElOp and use it in vAsTup --- vm/cmds.go | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/vm/cmds.go b/vm/cmds.go index d5aa049..9571b54 100644 --- a/vm/cmds.go +++ b/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 { voidIn a, b op @@ -148,11 +176,12 @@ func termToOp(t lang.Term) (op, error) { if err != nil { return nil, err } - vtup, ok := vop.(tupOp) - if !ok || len(vtup.els) != n { - return nil, fmt.Errorf("op %v expects a %d-tuple argument", k, n) + ops := make([]op, n) + for i := range ops { + ops[i] = tupElOp{tup: vop, i: i} } - return vtup.els, nil + + return ops, nil } switch k {