func scopePrefix(client service.Client, cmdname string, pargs ...string) error { fullargs := make([]string, 0, len(pargs)+1) fullargs = append(fullargs, cmdname) fullargs = append(fullargs, pargs...) scope := api.EvalScope{-1, 0} lastcmd := "" callFilterSortAndOutput := func(fn scopedFilteringFunc, fnargs []string) error { outfn := filterSortAndOutput(func(client service.Client, filter string) ([]string, error) { return fn(client, scope, filter) }) return outfn(client, fnargs...) } for i := 0; i < len(fullargs); i++ { lastcmd = fullargs[i] switch fullargs[i] { case "goroutine": if i+1 >= len(fullargs) { return fmt.Errorf("goroutine command needs an argument") } n, err := strconv.Atoi(fullargs[i+1]) if err != nil { return fmt.Errorf("invalid argument to goroutine, expected integer") } scope.GoroutineID = int(n) i++ case "frame": if i+1 >= len(fullargs) { return fmt.Errorf("frame command needs an argument") } n, err := strconv.Atoi(fullargs[i+1]) if err != nil { return fmt.Errorf("invalid argument to frame, expected integer") } scope.Frame = int(n) i++ case "locals": return callFilterSortAndOutput(locals, fullargs[i+1:]) case "args": return callFilterSortAndOutput(args, fullargs[i+1:]) case "print", "p": return printVar(client, scope, fullargs[i+1:]...) default: return fmt.Errorf("unknown command %s", fullargs[i]) } } return fmt.Errorf("no command passed to %s", lastcmd) }
func scopePrefix(client service.Client, cmdname string, pargs ...string) error { fullargs := make([]string, 0, len(pargs)+1) fullargs = append(fullargs, cmdname) fullargs = append(fullargs, pargs...) scope := api.EvalScope{-1, 0} lastcmd := "" callFilterSortAndOutput := func(fn scopedFilteringFunc, fnargs []string) error { outfn := filterSortAndOutput(func(client service.Client, filter string) ([]string, error) { return fn(client, scope, filter) }) return outfn(client, fnargs...) } for i := 0; i < len(fullargs); i++ { lastcmd = fullargs[i] switch fullargs[i] { case "goroutine": if i+1 >= len(fullargs) { return fmt.Errorf("goroutine command needs an argument") } n, err := strconv.Atoi(fullargs[i+1]) if err != nil { return fmt.Errorf("invalid argument to goroutine, expected integer") } scope.GoroutineID = int(n) i++ case "frame": if i+1 >= len(fullargs) { return fmt.Errorf("frame command needs an argument") } n, err := strconv.Atoi(fullargs[i+1]) if err != nil { return fmt.Errorf("invalid argument to frame, expected integer") } scope.Frame = int(n) i++ case "list", "ls": frame, gid := scope.Frame, scope.GoroutineID locs, err := client.Stacktrace(gid, frame, false) if err != nil { return err } if frame >= len(locs) { return fmt.Errorf("Frame %d does not exist in goroutine %d", frame, gid) } loc := locs[frame] return printfile(loc.File, loc.Line, true) case "stack", "bt": depth, full, err := parseStackArgs(fullargs[i+1:]) if err != nil { return err } stack, err := client.Stacktrace(scope.GoroutineID, depth, full) if err != nil { return err } printStack(stack, "") return nil case "locals": return callFilterSortAndOutput(locals, fullargs[i+1:]) case "args": return callFilterSortAndOutput(args, fullargs[i+1:]) case "print", "p": return printVar(client, scope, fullargs[i+1:]...) default: return fmt.Errorf("unknown command %s", fullargs[i]) } } return fmt.Errorf("no command passed to %s", lastcmd) }
func scopePrefix(t *Term, cmdstr string) error { scope := api.EvalScope{GoroutineID: -1, Frame: 0} lastcmd := "" rest := cmdstr nexttok := func() string { v := strings.SplitN(rest, " ", 2) if len(v) > 1 { rest = v[1] } else { rest = "" } return v[0] } callFilterSortAndOutput := func(fn scopedFilteringFunc, fnargs string) error { outfn := filterSortAndOutput(func(t *Term, filter string) ([]string, error) { return fn(t, scope, filter) }) return outfn(t, fnargs) } for { cmd := nexttok() if cmd == "" && rest == "" { break } switch cmd { case "goroutine": if rest == "" { return fmt.Errorf("goroutine command needs an argument") } n, err := strconv.Atoi(nexttok()) if err != nil { return fmt.Errorf("invalid argument to goroutine, expected integer") } scope.GoroutineID = int(n) case "frame": if rest == "" { return fmt.Errorf("frame command needs an argument") } n, err := strconv.Atoi(nexttok()) if err != nil { return fmt.Errorf("invalid argument to frame, expected integer") } scope.Frame = int(n) case "list", "ls": frame, gid := scope.Frame, scope.GoroutineID locs, err := t.client.Stacktrace(gid, frame, false) if err != nil { return err } if frame >= len(locs) { return fmt.Errorf("Frame %d does not exist in goroutine %d", frame, gid) } loc := locs[frame] return printfile(t, loc.File, loc.Line, true) case "stack", "bt": depth, full, err := parseStackArgs(rest) if err != nil { return err } stack, err := t.client.Stacktrace(scope.GoroutineID, depth, full) if err != nil { return err } printStack(stack, "") return nil case "locals": return callFilterSortAndOutput(locals, rest) case "args": return callFilterSortAndOutput(args, rest) case "print", "p": return printVar(t, scope, rest) case "set": return setVar(t, scope, rest) default: return fmt.Errorf("unknown command %s", cmd) } lastcmd = cmd } return fmt.Errorf("no command passed to %s", lastcmd) }