Skip to content

Commit 612e086

Browse files
committed
[go] fix nested_call.mk
1 parent f8e4baf commit 612e086

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

eval.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"fmt"
2121
"os"
2222
"path/filepath"
23+
"strconv"
2324
"strings"
2425
"sync"
2526

@@ -399,6 +400,18 @@ func (ev *Evaluator) evalCommand(ast *commandAST) error {
399400
return nil
400401
}
401402

403+
func (ev *Evaluator) paramVar(name string) (Var, error) {
404+
idx, err := strconv.ParseInt(name, 10, 32)
405+
if err != nil {
406+
return nil, fmt.Errorf("param: %s: %v", name, err)
407+
}
408+
i := int(idx)
409+
if i < 0 || i >= len(ev.paramVars) {
410+
return nil, fmt.Errorf("param: %s out of %d", name, len(ev.paramVars))
411+
}
412+
return &automaticVar{value: []byte(ev.paramVars[i])}, nil
413+
}
414+
402415
// LookupVar looks up named variable.
403416
func (ev *Evaluator) LookupVar(name string) Var {
404417
if ev.currentScope != nil {
@@ -411,6 +424,10 @@ func (ev *Evaluator) LookupVar(name string) Var {
411424
if v.IsDefined() {
412425
return v
413426
}
427+
v, err := ev.paramVar(name)
428+
if err == nil {
429+
return v
430+
}
414431
return ev.vars.Lookup(name)
415432
}
416433

@@ -423,6 +440,10 @@ func (ev *Evaluator) lookupVarInCurrentScope(name string) Var {
423440
if v.IsDefined() {
424441
return v
425442
}
443+
v, err := ev.paramVar(name)
444+
if err == nil {
445+
return v
446+
}
426447
return ev.vars.Lookup(name)
427448
}
428449

func.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,16 +1030,26 @@ func (f *funcCall) Eval(w evalWriter, ev *Evaluator) error {
10301030
}
10311031
v := ev.LookupVar(variable)
10321032
// Evalualte all arguments first before we modify the table.
1033-
var args []tmpval
1033+
// An omitted argument should be blank, even if it's nested inside
1034+
// another call statement that did have that argument passed.
1035+
// see testcases/nested_call.mk
1036+
arglen := len(ev.paramVars)
1037+
if arglen == 0 {
1038+
arglen++
1039+
}
1040+
if arglen < len(fargs[1:])+1 {
1041+
arglen = len(fargs[1:]) + 1
1042+
}
1043+
args := make([]tmpval, arglen)
10341044
// $0 is variable.
1035-
args = append(args, tmpval(varname))
1045+
args[0] = tmpval(varname)
10361046
// TODO(ukai): If variable is the name of a built-in function,
10371047
// the built-in function is always invoked (even if a make variable
10381048
// by that name also exists).
10391049

10401050
for i, arg := range fargs[1:] {
10411051
// f.args[2]=>args[1] will be $1.
1042-
args = append(args, tmpval(arg))
1052+
args[i+1] = tmpval(arg)
10431053
if glog.V(1) {
10441054
glog.Infof("call $%d: %q=>%q", i+1, arg, fargs[i+1])
10451055
}

0 commit comments

Comments
 (0)