diff --git a/playground/socket/socket.go b/playground/socket/socket.go index 4d84cf0963..89dc532783 100644 --- a/playground/socket/socket.go +++ b/playground/socket/socket.go @@ -268,7 +268,14 @@ func (p *process) start(body string, opt *Options) error { } // run x - cmd = p.cmd("", bin) + if isNacl() { + cmd, err = p.naclCmd(bin) + if err != nil { + return err + } + } else { + cmd = p.cmd("", bin) + } if opt != nil && opt.Race { cmd.Env = append(cmd.Env, "GOMAXPROCS=2") } @@ -317,6 +324,44 @@ func (p *process) cmd(dir string, args ...string) *exec.Cmd { return cmd } +func isNacl() bool { + for _, v := range append(Environ(), os.Environ()...) { + if v == "GOOS=nacl" { + return true + } + } + return false +} + +// naclCmd returns an *exec.Cmd that executes bin under native client. +func (p *process) naclCmd(bin string) (*exec.Cmd, error) { + pwd, err := os.Getwd() + if err != nil { + return nil, err + } + var ldr string + env := []string{ + "NACLENV_GOOS=" + runtime.GOOS, + "NACLENV_GOROOT=/go", + "NACLENV_NACLPWD=" + strings.Replace(pwd, runtime.GOROOT(), "/go", 1), + } + switch runtime.GOARCH { + case "amd64": + env = append(env, "NACLENV_GOARCH=amd64") + ldr = "sel_ldr_x86_64" + case "386": + env = append(env, "NACLENV_GOARCH=386") + ldr = "sel_ldr_x86_32" + default: + return nil, errors.New("native client does not support GOARCH=" + runtime.GOARCH) + } + + cmd := p.cmd("", ldr, "-l", "/dev/null", "-S", "-e", bin) + cmd.Env = append(cmd.Env, env...) + + return cmd, nil +} + func packageName(body string) (string, error) { f, err := parser.ParseFile(token.NewFileSet(), "prog.go", strings.NewReader(body), parser.PackageClauseOnly)