- Notifications
You must be signed in to change notification settings - Fork96
[abandoned] Duktape JavaScript engine bindings for Go
License
olebedev/go-duktape
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Duktape is a thin, embeddable javascript engine.Most of theapi is implemented.The exceptions are listedhere.
The package is fully go-getable, no need to install any external C libraries.
So, just typego get gopkg.in/olebedev/go-duktape.v3
to install.
package mainimport"fmt"import"gopkg.in/olebedev/go-duktape.v3"funcmain() {ctx:=duktape.New()ctx.PevalString(`2 + 3`)result:=ctx.GetNumber(-1)ctx.Pop()fmt.Println("result is:",result)// To prevent memory leaks, don't forget to clean up after// yourself when you're done using a context.ctx.DestroyHeap()}
Bindings between Go and Javascript contexts are not fully functional.However, binding a Go function to the Javascript context is available:
package mainimport"fmt"import"gopkg.in/olebedev/go-duktape.v3"funcmain() {ctx:=duktape.New()ctx.PushGlobalGoFunction("log",func(c*duktape.Context)int {fmt.Println(c.SafeToString(-1))return0 })ctx.PevalString(`log('Go lang Go!')`)}
then run it.
$ go run*.goGo lang Go!$
There is a method to inject timers to the global scope:
package mainimport"fmt"import"gopkg.in/olebedev/go-duktape.v3"funcmain() {ctx:=duktape.New()// Let's inject `setTimeout`, `setInterval`, `clearTimeout`,// `clearInterval` into global scope.ctx.PushTimers()ch:=make(chanstring)ctx.PushGlobalGoFunction("second",func(_*Context)int {ch<-"second step"return0 })ctx.PevalString(` setTimeout(second, 0); print('first step'); `)fmt.Println(<-ch)}
then run it
$ go run*.gofirst stepsecond step$
Also you canFlushTimers()
.
Installgo get gopkg.in/olebedev/go-duktape.v3/...
.
Execute file.js:$GOPATH/bin/go-duk file.js
.
prog | time |
---|---|
otto | 200.13s |
anko | 231.19s |
agora | 149.33s |
GopherLua | 8.39s |
go-duktape | 9.80s |
More details arehere.
The package is not fully tested, so be careful.
Pull requests are welcome! Also, if you want to discuss something send a pull request with proposal and changes.Convention: fork the repository and make changes on your fork in a feature branch.