on master help sign in
no more runtime ld
commit5962a8caabca4ba0541cabcfd674cf3edef4adb7 authorMason Clayton <masongclayton@gmail.com> dateFri 19 Oct 2018, 19:56 (8 years ago) parente3fc5ea
25 files changed+143−192
Dockerfile+23−8 Makefile+10−14 README.md−2 inject_launch.go+6 src/languages/R/main.go → languages/R/main.go+13−13 src/languages/lua/lua.c → languages/lua/lua.c src/languages/lua/main.go → languages/lua/main.go+11−7 src/languages/lua/pry.c → languages/lua/pry.c src/languages/lua/pry.h → languages/lua/pry.h src/languages/python2/main.go → languages/python2/main.go+17−14 src/languages/python2/pry_python2.c → languages/python2/pry_python2.c src/languages/python2/pry_python2.h → languages/python2/pry_python2.h src/languages/python3/main.go → languages/python3/main.go+6−3 src/languages/python3/pry_python3.c → languages/python3/pry_python3.c src/languages/python3/pry_python3.h → languages/python3/pry_python3.h src/languages/ruby/main.go → languages/ruby/main.go+14−12 src/languages/ruby/pry_ruby.c → languages/ruby/pry_ruby.c src/languages/ruby/pry_ruby.h → languages/ruby/pry_ruby.h src/languages/spidermonkey/main.go → languages/spidermonkey/main.go+9−9 src/languages/tcl/main.go → languages/tcl/main.go+12−10 src/languages/tcl/pry_tcl.c → languages/tcl/pry_tcl.c src/languages/tcl/pry_tcl.h → languages/tcl/pry_tcl.h mk-deps.sh−22 src/language.go → utils/language.go+12−60 src/main.go → utils/utils.go+10−18
Dockerfile+23−8
@@ -1,17 +1,32 @@
11FROM ubuntu:bionic
22
33RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
4−build-essential wget golang python-dev python3-dev liblua5.2-dev \
5−ruby2.5-dev tcl-dev libnspr4-dev libffi-dev
4+ build-essential \
5+ wget \
6+ golang \
7+ python-dev \
8+ python3-dev \
9+ liblua5.2-dev \
10+ ruby2.5-dev \
11+ tcl-dev \
12+ libnspr4-dev \
13+ libffi-dev
614
7−RUN wget http://launchpadlibrarian.net/309343864/libmozjs185-dev_1.8.5-1.0.0+dfsg-7_amd64.deb && wget http://launchpadlibrarian.net/309343863/libmozjs185-1.0_1.8.5-1.0.0+dfsg-7_amd64.deb && dpkg -i libmozjs185*.deb && rm libmozjs185*.deb
15+RUN wget \
16+ http://launchpadlibrarian.net/309343864/libmozjs185-dev_1.8.5-1.0.0+dfsg-7_amd64.deb && \
17+ wget http://launchpadlibrarian.net/309343863/libmozjs185-1.0_1.8.5-1.0.0+dfsg-7_amd64.deb && \
18+ dpkg -i libmozjs185*.deb && rm libmozjs185*.deb
819
9−ADD . /prybar
10−RUN cd /prybar && make
20+RUN mkdir -p /gocode/src/github.com/replit/prybar
1121
12−WORKDIR /prybar
22+ENV GOPATH=/gocode
23+
24+ADD . /gocode/src/github.com/replit/prybar
25+
26+WORKDIR /gocode/src/github.com/replit/prybar
27+
28+RUN make prybar-python2 prybar-python3 prybar-ruby prybar-lua prybar-spidermonkey
1329
1430ENV LC_ALL=C.UTF-8
1531
16−ENTRYPOINT [ "/prybar/prybar" ]
17−CMD [ "-h" ]
32+CMD bash
Makefile+10−14
@@ -1,19 +1,15 @@
1−.PHONY: clean default
2−
3−default: prybar
1+LANGDIR := ./languages
2+LANGS := $(shell ls $(LANGDIR))
3+BINS := $(addprefix prybar-,$(LANGS))
44
5−deps.lst: mk-deps.sh
6− ./mk-deps.sh > deps.lst
7−
8−-include deps.lst
5+.PHONY: clean default
96
10−prybar: src/*.go $(plugins)
11− cd src && go build -o ../prybar
7+default: $(BINS)
128
13−plugins/%.so: src/languages/%/*.*
14− cd src/languages/$* && CGO_LDFLAGS_ALLOW=".*" go build -buildmode=plugin -o ../../../$@
9+prybar-%: ./languages/$(*) ./utils/* ./linenoise/* ./languages/$(*)/*
10+ cp inject_launch.go ./languages/$(*)/inject_launch.go
11+ go build -o prybar-$(*) ./languages/$(*)
12+ rm ./languages/$(*)/inject_launch.go
1513
1614clean:
17− @rm deps.lst
18− @rm prybar
19− @rm plugins/*
15+ @rm ./prybar-*
README.md−2
@@ -59,8 +59,6 @@ brew install go r ruby python python@2 lua spidermonkey
5959
6060The script `./extract.sh` can be used to compile all plugins and produce a tarball containing a `prybar` binary and supporting `plugin.so` files.
6161
62−
63−
6462## License
6563
6664 Copyright (C) 2004-2018 Neoreason, Inc. et al.
inject_launch.gonew file+6
@@ -0,0 +1,6 @@
1+// this file will be injected into a language's main package at build.
2+package main
3+
4+import "github.com/replit/prybar/utils"
5+
6+func main() { utils.DoCli() }
src/languages/R/main.go → languages/R/main.gorenamed+13−13
@@ -37,36 +37,36 @@ import "C"
3737
3838import (
3939 "unsafe"
40+
41+ "github.com/replit/prybar/utils"
4042 //"strings"
4143)
4244
45+func init() {
46+ utils.Register(&Language{})
47+}
4348
44−type R struct {
45−
49+type Language struct {
4650}
4751
48−func (p R) Open() {
52+func (p Language) Open() {
4953 C.pry_open()
5054}
5155
52−func (p R) Version() string {
56+func (p Language) Version() string {
5357 return C.GoString(C.pry_version())
5458}
5559
56−func (p R) Eval(code string) {
60+func (p Language) Eval(code string) {
5761 ccode := C.CString(code)
5862 defer C.free(unsafe.Pointer(ccode))
59− C.pry_eval(ccode)
63+ C.pry_eval(ccode)
6064}
6165
62−
63−func (p R) REPL() {
64− C.pry_repl();
66+func (p Language) REPL() {
67+ C.pry_repl()
6568}
6669
67−func (p R) Close() {
70+func (p Language) Close() {
6871 C.Rf_endEmbeddedR(0)
6972}
70−
71−// exported
72−var Instance R
src/languages/lua/lua.c → languages/lua/lua.crenamed

The content is the same.

src/languages/lua/main.go → languages/lua/main.gorenamed+11−7
@@ -16,13 +16,17 @@ int pmain (lua_State *L);
1616import "C"
1717
1818import (
19− "unsafe"
2019 "strings"
20+ "unsafe"
21+
22+ "github.com/replit/prybar/utils"
2123)
2224
25+func init() {
26+ utils.Register(&Lua{})
27+}
2328
2429type Lua struct {
25−
2630}
2731
2832func (p Lua) Open() {
@@ -36,16 +40,16 @@ func (p Lua) Version() string {
3640func (p Lua) Eval(code string) {
3741 ccode := C.CString(code)
3842 defer C.free(unsafe.Pointer(ccode))
39− C.pry_eval(ccode);
43+ C.pry_eval(ccode)
4044}
4145
4246func (p Lua) EvalFile(file string, args []string) {
4347 cfile := C.CString(file)
4448 defer C.free(unsafe.Pointer(cfile))
45−
49+
4650 argv := C.CString(file + "\x00" + strings.Join(args, "\x00"))
4751 defer C.free(unsafe.Pointer(argv))
48− C.pry_eval_file(cfile, C.int(len(args) + 1), argv)
52+ C.pry_eval_file(cfile, C.int(len(args)+1), argv)
4953}
5054
5155func (p Lua) REPL() {
@@ -54,8 +58,8 @@ func (p Lua) REPL() {
5458 C.dotty(C.pry_L)
5559}
5660
57−func (p Lua) Close() {
58− C.lua_close(C.pry_L)
61+func (p Lua) Close() {
62+ C.lua_close(C.pry_L)
5963}
6064
6165// exported
src/languages/lua/pry.c → languages/lua/pry.crenamed

The content is the same.

src/languages/lua/pry.h → languages/lua/pry.hrenamed

The content is the same.

src/languages/python2/main.go → languages/python2/main.gorenamed+17−14
@@ -9,32 +9,38 @@ import "C"
99import (
1010 "strings"
1111 "unsafe"
12+
13+ "github.com/replit/prybar/utils"
1214)
1315
14−type Python struct {
16+func init() {
17+ utils.Register(&Language{})
18+}
19+
20+type Language struct {
1521}
1622
17−func (p Python) Open() {
23+func (p Language) Open() {
1824 C.Py_Initialize()
1925}
2026
21−func (p Python) Version() string {
27+func (p Language) Version() string {
2228 return "Python " + C.GoString(C.Py_GetVersion()) + " on " + C.GoString(C.Py_GetPlatform())
2329}
2430
25−func (p Python) Eval(code string) {
31+func (p Language) Eval(code string) {
2632 ccode := C.CString(code)
2733 defer C.free(unsafe.Pointer(ccode))
2834 C.GoString(C.pry_eval(ccode, C.Py_file_input))
2935}
3036
31−func (p Python) EvalExpression(code string) string {
37+func (p Language) EvalExpression(code string) string {
3238 ccode := C.CString(code)
3339 defer C.free(unsafe.Pointer(ccode))
3440 return C.GoString(C.pry_eval(ccode, C.Py_eval_input))
3541}
3642
37−func (p Python) EvalFile(file string, args []string) {
43+func (p Language) EvalFile(file string, args []string) {
3844 handle := C.stdin
3945 cfile := C.CString(file)
4046 defer C.free(unsafe.Pointer(cfile))
@@ -52,19 +58,19 @@ func (p Python) EvalFile(file string, args []string) {
5258 C.pry_eval_file(handle, cfile, C.int(len(args)+1), argv)
5359}
5460
55−func (p Python) REPLLikeEval(code string) {
61+func (p Language) REPLLikeEval(code string) {
5662 ccode := C.CString(code)
5763 defer C.free(unsafe.Pointer(ccode))
5864 C.pry_eval(ccode, C.Py_single_input)
5965}
6066
61−func (p Python) LoadModule(mod string) {
67+func (p Language) LoadModule(mod string) {
6268 cmode := C.CString(mod)
6369 defer C.free(unsafe.Pointer(cmode))
6470 C.PyImport_ImportModule(cmode)
6571}
6672
67−func (p Python) REPL() {
73+func (p Language) REPL() {
6874 p.LoadModule("readline")
6975
7076 fn := C.CString("<stdin>")
@@ -72,7 +78,7 @@ func (p Python) REPL() {
7278 C.PyRun_InteractiveLoopFlags(C.stdin, fn, nil)
7379}
7480
75−func (p Python) SetPrompts(ps1, ps2 string) {
81+func (p Language) SetPrompts(ps1, ps2 string) {
7682 cps1 := C.CString(ps1)
7783 defer C.free(unsafe.Pointer(cps1))
7884 cps2 := C.CString(ps2)
@@ -81,9 +87,6 @@ func (p Python) SetPrompts(ps1, ps2 string) {
8187 C.pry_set_prompts(cps1, cps2)
8288}
8389
84−func (p Python) Close() {
90+func (p Language) Close() {
8591 C.Py_Finalize()
8692}
87−
88−// exported
89−var Instance Python
src/languages/python2/pry_python2.c → languages/python2/pry_python2.crenamed

The content is the same.

src/languages/python2/pry_python2.h → languages/python2/pry_python2.hrenamed

The content is the same.

src/languages/python3/main.go → languages/python3/main.gorenamed+6−3
@@ -10,8 +10,14 @@ import "C"
1010import (
1111 "strings"
1212 "unsafe"
13+
14+ "github.com/replit/prybar/utils"
1315)
1416
17+func init() {
18+ utils.Register(&Python{})
19+}
20+
1521type Python struct {
1622}
1723
@@ -79,6 +85,3 @@ func (p Python) SetPrompts(ps1, ps2 string) {
7985func (p Python) Close() {
8086 C.Py_Finalize()
8187}
82−
83−// exported
84−var Instance Python
src/languages/python3/pry_python3.c → languages/python3/pry_python3.crenamed

The content is the same.

src/languages/python3/pry_python3.h → languages/python3/pry_python3.hrenamed

The content is the same.

src/languages/ruby/main.go → languages/ruby/main.gorenamed+14−12
@@ -8,44 +8,46 @@ import "C"
88
99import (
1010 "unsafe"
11+
12+ "github.com/replit/prybar/utils"
1113)
1214
15+func init() {
16+ utils.Register(&Language{})
17+}
18+
1319/* */
14−type Ruby struct {
20+type Language struct {
1521}
1622
17−func (p Ruby) Open() {
23+func (p Language) Open() {
1824 C.pry_open()
1925}
2026
21−func (p Ruby) Version() string {
27+func (p Language) Version() string {
2228 return C.GoString(C.pry_ruby_version())
2329}
2430
25−func (p Ruby) Eval(code string) {
31+func (p Language) Eval(code string) {
2632 p.EvalExpression(code)
2733}
2834
29−func (p Ruby) EvalExpression(code string) string {
35+func (p Language) EvalExpression(code string) string {
3036 ccode := C.CString(code)
3137 defer C.free(unsafe.Pointer(ccode))
3238 res := C.pry_eval(ccode)
3339 return C.GoString(res)
3440}
3541
36−func (p Ruby) EvalFile(file string, args []string) {
42+func (p Language) EvalFile(file string, args []string) {
3743 cfile := C.CString(file)
3844 defer C.free(unsafe.Pointer(cfile))
3945 C.pry_eval_file(cfile)
4046}
4147
42−func (p Ruby) REPL() {
48+func (p Language) REPL() {
4349 p.Eval("require 'irb'\nbinding.irb")
4450}
45−
46−func (p Ruby) Close() {
51+func (p Language) Close() {
4752 C.ruby_cleanup(0)
4853}
49−
50−// exported
51−var Instance Ruby
src/languages/ruby/pry_ruby.c → languages/ruby/pry_ruby.crenamed

The content is the same.

src/languages/ruby/pry_ruby.h → languages/ruby/pry_ruby.hrenamed

The content is the same.

src/languages/spidermonkey/main.go → languages/spidermonkey/main.gorenamed+9−9
@@ -1,6 +1,5 @@
11package main
22
3−
43/*
54#cgo pkg-config: mozjs185
65#include "jsapi.h"
@@ -64,31 +63,32 @@ import "C"
6463
6564import (
6665 "unsafe"
67−)
68−
6966
70−type Language struct {
67+ "github.com/replit/prybar/utils"
68+)
7169
70+func init() {
71+ utils.Register(&Language{})
7272}
7373
74+type Language struct{}
75+
7476func (p Language) Open() {
7577 C.pry_open()
7678}
7779
7880func (p Language) Version() string {
7981 return C.GoString(C.JS_GetImplementationVersion())
80− //return "JS";
8182}
8283
8384func (p Language) Eval(code string) {
8485 ccode := C.CString(code)
8586 defer C.free(unsafe.Pointer(ccode))
86− C.pry_eval(ccode)
87+ C.pry_eval(ccode)
8788}
8889
89−
90−func (p Language) Close() {
91− C.pry_close()
90+func (p Language) Close() {
91+ C.pry_close()
9292}
9393
9494// exported
src/languages/tcl/main.go → languages/tcl/main.gorenamed+12−10
@@ -9,37 +9,39 @@ import "C"
99
1010import (
1111 "unsafe"
12+
13+ "github.com/replit/prybar/utils"
1214)
1315
14−type Python struct {
16+func init() {
17+ utils.Register(&Language{})
1518}
1619
17−func (p Python) Open() {
20+type Language struct{}
21+
22+func (p Language) Open() {
1823 C.pry_open()
1924}
2025
21−func (p Python) Version() string {
26+func (p Language) Version() string {
2227 cver := C.pry_version()
2328 ver := C.GoString(cver)
2429 C.free(unsafe.Pointer(cver))
25− return "TCL " + ver
30+ return "Language " + ver
2631}
2732
28−func (p Python) Eval(code string) {
33+func (p Language) Eval(code string) {
2934 ccode := C.CString(code)
3035 defer C.free(unsafe.Pointer(ccode))
3136 C.pry_eval(ccode)
3237}
3338
34−func (p Python) EvalExpression(code string) string {
39+func (p Language) EvalExpression(code string) string {
3540 ccode := C.CString(code)
3641 defer C.free(unsafe.Pointer(ccode))
3742 return C.GoString(C.pry_eval(ccode))
3843}
3944
40−func (p Python) Close() {
45+func (p Language) Close() {
4146 C.pry_close()
4247}
43−
44−// exported
45−var Instance Python
src/languages/tcl/pry_tcl.c → languages/tcl/pry_tcl.crenamed

The content is the same.

src/languages/tcl/pry_tcl.h → languages/tcl/pry_tcl.hrenamed

The content is the same.

mk-deps.shdeleted−22
@@ -1,22 +0,0 @@
1−#/bin/bash
2−
3−FOUND=""
4−check() {
5− pkg-config --exists $2
6− if [ $? -eq 0 ]; then
7− echo "Found plugin $1 => $2" 1>&2
8− FOUND="$FOUND plugins/$1.so"
9− else
10− echo "Couldnt find $1" 1>&2
11− fi
12−}
13−
14−for plugin in $(ls -1 src/languages/); do
15− PKG=$(grep cgo.*pkg-config src/languages/$plugin/main.go | cut -d ':' -f 2)
16− check $plugin $PKG
17−done
18−
19−
20−echo "plugins = $FOUND"
21−
22−
src/language.go → utils/language.gorenamed+12−60
@@ -1,12 +1,8 @@
1−package main
1+package utils
22
33import (
44 "fmt"
55 "io/ioutil"
6− "os"
7− "path/filepath"
8− "plugin"
9− "runtime"
106
117 "github.com/replit/prybar/linenoise"
128)
@@ -47,64 +43,20 @@ type PluginSetPrompts interface {
4743 SetPrompts(ps1, ps2 string)
4844}
4945
50−type Langauge struct {
46+type Language struct {
5147 ptr PluginBase
48+ ps1 string
5249}
5350
54−func finalizer(f *Langauge) {
55− fmt.Println("a finalizer has run.")
56−}
57−
58−func GetLanguage(name string) *Langauge {
59− base := "."
60− exe, err := os.Executable()
61− for {
62− o, err := os.Readlink(exe)
63− if err == nil {
64− exe = o
65− } else {
66− break
67− }
68− }
69−
70− base = filepath.Dir(exe)
71− plug, err := plugin.Open(base + "/plugins/" + name + ".so")
72−
73− if err != nil {
74− fmt.Println(err)
75− os.Exit(1)
76− }
77−
78− sym, err := plug.Lookup("Instance")
79− if err != nil {
80− fmt.Println(err)
81− os.Exit(1)
82− }
83−
84− var lang PluginBase
85− lang, ok := sym.(PluginBase)
86− if !ok {
87− fmt.Println("module did not export Language interface")
88− os.Exit(1)
89− }
90−
91− result := &Langauge{
92− ptr: lang,
93− }
94− lang.Open()
95− runtime.SetFinalizer(result, finalizer)
96− return result
97−}
98−
99−func (lang Langauge) Version() string {
51+func (lang Language) Version() string {
10052 return lang.ptr.Version()
10153}
10254
103−func (lang Langauge) Eval(code string) {
55+func (lang Language) Eval(code string) {
10456 lang.ptr.(PluginEval).Eval(code)
10557}
10658
107−func (lang Langauge) EvalAndTryToPrint(code string) {
59+func (lang Language) EvalAndTryToPrint(code string) {
10860 ee, ok := lang.ptr.(PluginEvalExpression)
10961 if ok {
11062 fmt.Println(ee.EvalExpression(code))
@@ -113,7 +65,7 @@ func (lang Langauge) EvalAndTryToPrint(code string) {
11365 }
11466}
11567
116−func (lang Langauge) REPLLikeEval(code string) {
68+func (lang Language) REPLLikeEval(code string) {
11769 rle, ok := lang.ptr.(PluginREPLLikeEval)
11870 if ok {
11971 rle.REPLLikeEval(code)
@@ -128,7 +80,7 @@ func (lang Langauge) REPLLikeEval(code string) {
12880 }
12981}
13082
131−func (lang Langauge) EvalFile(file string, args []string) {
83+func (lang Language) EvalFile(file string, args []string) {
13284 pef, ok := lang.ptr.(PluginEvalFile)
13385 if ok {
13486 pef.EvalFile(file, args)
@@ -141,7 +93,7 @@ func (lang Langauge) EvalFile(file string, args []string) {
14193 }
14294}
14395
144−func (lang Langauge) REPL() {
96+func (lang Language) REPL() {
14597 repl, ok := lang.ptr.(PluginREPL)
14698 if ok {
14799 repl.REPL()
@@ -150,9 +102,9 @@ func (lang Langauge) REPL() {
150102 }
151103}
152104
153−func (lang Langauge) InternalREPL() {
105+func (lang Language) InternalREPL() {
154106 for {
155− line, err := linenoise.Linenoise(ps1)
107+ line, err := linenoise.Linenoise(lang.ps1)
156108 if err != nil {
157109 break
158110 }
@@ -161,7 +113,7 @@ func (lang Langauge) InternalREPL() {
161113 }
162114}
163115
164−func (lang Langauge) SetPrompts(ps1, ps2 string) {
116+func (lang Language) SetPrompts(ps1, ps2 string) {
165117 ee, ok := lang.ptr.(PluginSetPrompts)
166118 if ok {
167119 ee.SetPrompts(ps1, ps2)
src/main.go → utils/utils.gorenamed+10−18
@@ -1,15 +1,18 @@
1−package main
1+package utils
22
33import (
44 "flag"
55 "fmt"
66 "io"
77 "os"
8− "strings"
98 "syscall"
109)
1110
12−var ps1, ps2 string
11+var instance PluginBase
12+
13+func Register(b PluginBase) {
14+ instance = b
15+}
1316
1417type Red struct {
1518 parent io.Writer
@@ -22,20 +25,14 @@ func (r *Red) Write(p []byte) (n int, err error) {
2225 return n, err
2326}
2427
25−func main() {
26− var language string
28+func DoCli() {
2729 var interactive, ourInteractive bool
2830 var code string
2931 var quiet bool
3032 var exp string
3133 var colorizeStderr bool
34+ var ps1, ps2 string
3235
33− defaultLangague := os.Args[0]
34− if defaultLangague == "prybar" || strings.ContainsAny(defaultLangague, "./") {
35− defaultLangague = "python2"
36− }
37−
38− flag.StringVar(&language, "l", defaultLangague, "langauge")
3936 flag.StringVar(&code, "c", "", "code to run")
4037 flag.StringVar(&exp, "e", "", "expression to print")
4138
@@ -52,14 +49,9 @@ func main() {
5249
5350 args := flag.Args()
5451
55− switch language {
56− case "python":
57− language = "python3"
58− case "javascript":
59− language = "spidermonkey"
60− }
52+ instance.Open()
53+ lang := &Language{ptr: instance, ps1: ps1}
6154
62− lang := GetLanguage(language)
6355 if !quiet {
6456 fmt.Println(lang.Version())
6557 }