diff options
Diffstat (limited to 'src/pkg/exp/ogle/cmd.go')
-rw-r--r-- | src/pkg/exp/ogle/cmd.go | 210 |
1 files changed, 105 insertions, 105 deletions
diff --git a/src/pkg/exp/ogle/cmd.go b/src/pkg/exp/ogle/cmd.go index 2e75fe519..45b47ef5b 100644 --- a/src/pkg/exp/ogle/cmd.go +++ b/src/pkg/exp/ogle/cmd.go @@ -6,52 +6,52 @@ package ogle import ( - "bufio"; - "debug/elf"; - "debug/proc"; - "exp/eval"; - "fmt"; - "go/scanner"; - "go/token"; - "os"; - "strconv"; - "strings"; + "bufio" + "debug/elf" + "debug/proc" + "exp/eval" + "fmt" + "go/scanner" + "go/token" + "os" + "strconv" + "strings" ) var world *eval.World var curProc *Process func Main() { - world = eval.NewWorld(); - defineFuncs(); - r := bufio.NewReader(os.Stdin); + world = eval.NewWorld() + defineFuncs() + r := bufio.NewReader(os.Stdin) for { - print("; "); - line, err := r.ReadSlice('\n'); + print("; ") + line, err := r.ReadSlice('\n') if err != nil { break } // Try line as a command - cmd, rest := getCmd(line); + cmd, rest := getCmd(line) if cmd != nil { - err := cmd.handler(rest); + err := cmd.handler(rest) if err != nil { scanner.PrintError(os.Stderr, err) } - continue; + continue } // Try line as code - code, err := world.Compile(string(line)); + code, err := world.Compile(string(line)) if err != nil { - scanner.PrintError(os.Stderr, err); - continue; + scanner.PrintError(os.Stderr, err) + continue } - v, err := code.Run(); + v, err := code.Run() if err != nil { - fmt.Fprintf(os.Stderr, err.String()); - continue; + fmt.Fprintf(os.Stderr, err.String()) + continue } if v != nil { println(v.String()) @@ -61,11 +61,11 @@ func Main() { // newScanner creates a new scanner that scans that given input bytes. func newScanner(input []byte) (*scanner.Scanner, *scanner.ErrorVector) { - sc := new(scanner.Scanner); - ev := new(scanner.ErrorVector); - sc.Init("input", input, ev, 0); + sc := new(scanner.Scanner) + ev := new(scanner.ErrorVector) + sc.Init("input", input, ev, 0) - return sc, ev; + return sc, ev } /* @@ -75,12 +75,12 @@ func newScanner(input []byte) (*scanner.Scanner, *scanner.ErrorVector) { // A UsageError occurs when a command is called with illegal arguments. type UsageError string -func (e UsageError) String() string { return string(e) } +func (e UsageError) String() string { return string(e) } // A cmd represents a single command with a handler. type cmd struct { - cmd string; - handler func([]byte) os.Error; + cmd string + handler func([]byte) os.Error } var cmds = []cmd{ @@ -92,19 +92,19 @@ var cmds = []cmd{ // successful, it returns the command and the bytes remaining after // the command, which should be passed to the command. func getCmd(line []byte) (*cmd, []byte) { - sc, _ := newScanner(line); - pos, tok, lit := sc.Scan(); + sc, _ := newScanner(line) + pos, tok, lit := sc.Scan() if sc.ErrorCount != 0 || tok != token.IDENT { return nil, nil } - slit := string(lit); + slit := string(lit) for i := range cmds { if cmds[i].cmd == slit { return &cmds[i], line[pos.Offset+len(lit):] } } - return nil, nil; + return nil, nil } // cmdLoad starts or attaches to a process. Its form is similar to @@ -124,7 +124,7 @@ func getCmd(line []byte) (*cmd, []byte) { // // load always sets the current process to the loaded process. func cmdLoad(args []byte) os.Error { - ident, path, err := parseLoad(args); + ident, path, err := parseLoad(args) if err != nil { return err } @@ -136,99 +136,99 @@ func cmdLoad(args []byte) os.Error { } // Parse argument and start or attach to process - var fname string; - var tproc proc.Process; + var fname string + var tproc proc.Process if len(path) >= 4 && path[0:4] == "pid:" { - pid, err := strconv.Atoi(path[4:]); + pid, err := strconv.Atoi(path[4:]) if err != nil { return err } - fname, err = os.Readlink(fmt.Sprintf("/proc/%d/exe", pid)); + fname, err = os.Readlink(fmt.Sprintf("/proc/%d/exe", pid)) if err != nil { return err } - tproc, err = proc.Attach(pid); + tproc, err = proc.Attach(pid) if err != nil { return err } - println("Attached to", pid); + println("Attached to", pid) } else { - parts := strings.Split(path, " ", 0); + parts := strings.Split(path, " ", 0) if len(parts) == 0 { fname = "" } else { fname = parts[0] } - tproc, err = proc.ForkExec(fname, parts, os.Environ(), "", []*os.File{os.Stdin, os.Stdout, os.Stderr}); + tproc, err = proc.ForkExec(fname, parts, os.Environ(), "", []*os.File{os.Stdin, os.Stdout, os.Stderr}) if err != nil { return err } - println("Started", path); + println("Started", path) // TODO(austin) If we fail after this point, kill tproc // before detaching. } // Get symbols - f, err := os.Open(fname, os.O_RDONLY, 0); + f, err := os.Open(fname, os.O_RDONLY, 0) if err != nil { - tproc.Detach(); - return err; + tproc.Detach() + return err } - defer f.Close(); - elf, err := elf.NewFile(f); + defer f.Close() + elf, err := elf.NewFile(f) if err != nil { - tproc.Detach(); - return err; + tproc.Detach() + return err } - curProc, err = NewProcessElf(tproc, elf); + curProc, err = NewProcessElf(tproc, elf) if err != nil { - tproc.Detach(); - return err; + tproc.Detach() + return err } // Prepare new process - curProc.OnGoroutineCreate().AddHandler(EventPrint); - curProc.OnGoroutineExit().AddHandler(EventPrint); + curProc.OnGoroutineCreate().AddHandler(EventPrint) + curProc.OnGoroutineExit().AddHandler(EventPrint) - err = curProc.populateWorld(world); + err = curProc.populateWorld(world) if err != nil { - tproc.Detach(); - return err; + tproc.Detach() + return err } - return nil; + return nil } func parseLoad(args []byte) (ident string, path string, err os.Error) { - err = UsageError("Usage: load [sym] \"path\""); - sc, ev := newScanner(args); + err = UsageError("Usage: load [sym] \"path\"") + sc, ev := newScanner(args) - var toks [4]token.Token; - var lits [4][]byte; + var toks [4]token.Token + var lits [4][]byte for i := range toks { _, toks[i], lits[i] = sc.Scan() } if sc.ErrorCount != 0 { - err = ev.GetError(scanner.NoMultiples); - return; + err = ev.GetError(scanner.NoMultiples) + return } - i := 0; + i := 0 switch toks[i] { case token.PERIOD, token.IDENT: - ident = string(lits[i]); - i++; + ident = string(lits[i]) + i++ } if toks[i] != token.STRING { return } - path, uerr := strconv.Unquote(string(lits[i])); + path, uerr := strconv.Unquote(string(lits[i])) if uerr != nil { - err = uerr; - return; + err = uerr + return } - i++; + i++ if toks[i] == token.SEMICOLON { i++ @@ -237,13 +237,13 @@ func parseLoad(args []byte) (ident string, path string, err os.Error) { return } - return ident, path, nil; + return ident, path, nil } // cmdBt prints a backtrace for the current goroutine. It takes no // arguments. func cmdBt(args []byte) os.Error { - err := parseNoArgs(args, "Usage: bt"); + err := parseNoArgs(args, "Usage: bt") if err != nil { return err } @@ -252,10 +252,10 @@ func cmdBt(args []byte) os.Error { return NoCurrentGoroutine{} } - f := curProc.curGoroutine.frame; + f := curProc.curGoroutine.frame if f == nil { - fmt.Println("No frames on stack"); - return nil; + fmt.Println("No frames on stack") + return nil } for f.Inner() != nil { @@ -268,8 +268,8 @@ func cmdBt(args []byte) os.Error { } else { fmt.Printf(" ") } - fmt.Printf("%8x %v\n", f.pc, f); - f, err = f.Outer(); + fmt.Printf("%8x %v\n", f.pc, f) + f, err = f.Outer() if err != nil { return err } @@ -278,20 +278,20 @@ func cmdBt(args []byte) os.Error { } } - fmt.Println("..."); - return nil; + fmt.Println("...") + return nil } func parseNoArgs(args []byte, usage string) os.Error { - sc, ev := newScanner(args); - _, tok, _ := sc.Scan(); + sc, ev := newScanner(args) + _, tok, _ := sc.Scan() if sc.ErrorCount != 0 { return ev.GetError(scanner.NoMultiples) } if tok != token.EOF { return UsageError(usage) } - return nil; + return nil } /* @@ -300,12 +300,12 @@ func parseNoArgs(args []byte, usage string) os.Error { // defineFuncs populates world with the built-in functions. func defineFuncs() { - t, v := eval.FuncFromNativeTyped(fnOut, fnOutSig); - world.DefineConst("Out", t, v); - t, v = eval.FuncFromNativeTyped(fnContWait, fnContWaitSig); - world.DefineConst("ContWait", t, v); - t, v = eval.FuncFromNativeTyped(fnBpSet, fnBpSetSig); - world.DefineConst("BpSet", t, v); + t, v := eval.FuncFromNativeTyped(fnOut, fnOutSig) + world.DefineConst("Out", t, v) + t, v = eval.FuncFromNativeTyped(fnContWait, fnContWaitSig) + world.DefineConst("ContWait", t, v) + t, v = eval.FuncFromNativeTyped(fnBpSet, fnBpSetSig) + world.DefineConst("BpSet", t, v) } // printCurFrame prints the current stack frame, as it would appear in @@ -314,47 +314,47 @@ func printCurFrame() { if curProc == nil || curProc.curGoroutine == nil { return } - f := curProc.curGoroutine.frame; + f := curProc.curGoroutine.frame if f == nil { return } - fmt.Printf("=> %8x %v\n", f.pc, f); + fmt.Printf("=> %8x %v\n", f.pc, f) } // fnOut moves the current frame to the caller of the current frame. -func fnOutSig() {} +func fnOutSig() {} func fnOut(t *eval.Thread, args []eval.Value, res []eval.Value) { if curProc == nil { t.Abort(NoCurrentGoroutine{}) } - err := curProc.Out(); + err := curProc.Out() if err != nil { t.Abort(err) } // TODO(austin) Only in the command form - printCurFrame(); + printCurFrame() } // fnContWait continues the current process and waits for a stopping event. -func fnContWaitSig() {} +func fnContWaitSig() {} func fnContWait(t *eval.Thread, args []eval.Value, res []eval.Value) { if curProc == nil { t.Abort(NoCurrentGoroutine{}) } - err := curProc.ContWait(); + err := curProc.ContWait() if err != nil { t.Abort(err) } // TODO(austin) Only in the command form - ev := curProc.Event(); + ev := curProc.Event() if ev != nil { fmt.Printf("%v\n", ev) } - printCurFrame(); + printCurFrame() } // fnBpSet sets a breakpoint at the entry to the named function. -func fnBpSetSig(string) {} +func fnBpSetSig(string) {} func fnBpSet(t *eval.Thread, args []eval.Value, res []eval.Value) { // TODO(austin) This probably shouldn't take a symbol name. // Perhaps it should take an interface that provides PC's. @@ -363,10 +363,10 @@ func fnBpSet(t *eval.Thread, args []eval.Value, res []eval.Value) { if curProc == nil { t.Abort(NoCurrentGoroutine{}) } - name := args[0].(eval.StringValue).Get(t); - fn := curProc.syms.LookupFunc(name); + name := args[0].(eval.StringValue).Get(t) + fn := curProc.syms.LookupFunc(name) if fn == nil { t.Abort(UsageError("no such function " + name)) } - curProc.OnBreakpoint(proc.Word(fn.Entry)).AddHandler(EventStop); + curProc.OnBreakpoint(proc.Word(fn.Entry)).AddHandler(EventStop) } |