5258785c81
* cmd, core, eth/tracers: support fancier js tracing * eth, internal/web3ext: rework trace API, concurrency, chain tracing * eth/tracers: add three more JavaScript tracers * eth/tracers, vendor: swap ottovm to duktape for tracing * core, eth, internal: finalize call tracer and needed extras * eth, tests: prestate tracer, call test suite, rewinding * vendor: fix windows builds for tracer js engine * vendor: temporary duktape fix * eth/tracers: fix up 4byte and evmdis tracer * vendor: pull in latest duktape with my upstream fixes * eth: fix some review comments * eth: rename rewind to reexec to make it more obvious * core/vm: terminate tracing using defers |
||
---|---|---|
.. | ||
Gopkg.lock | ||
Gopkg.toml | ||
LICENSE.md | ||
README.md | ||
api.go | ||
appveyor.yml | ||
conts.go | ||
duk_alloc_pool.c | ||
duk_alloc_pool.h | ||
duk_config.h | ||
duk_console.c | ||
duk_console.h | ||
duk_logging.c | ||
duk_logging.h | ||
duk_minimal_printf.c | ||
duk_minimal_printf.h | ||
duk_module_duktape.c | ||
duk_module_duktape.h | ||
duk_module_node.c | ||
duk_module_node.h | ||
duk_print_alert.c | ||
duk_print_alert.h | ||
duk_v1_compat.c | ||
duk_v1_compat.h | ||
duktape.c | ||
duktape.go | ||
duktape.h | ||
timers.go | ||
utils.go | ||
wercker.yml |
README.md
Duktape bindings for Go(Golang)
Duktape is a thin, embeddable javascript engine. Most of the api is implemented. The exceptions are listed here.
Usage
The package is fully go-getable, no need to install any external C libraries.
So, just type go get gopkg.in/olebedev/go-duktape.v3
to install.
package main
import "fmt"
import "gopkg.in/olebedev/go-duktape.v3"
func main() {
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()
}
Go specific notes
Bindings between Go and Javascript contexts are not fully functional. However, binding a Go function to the Javascript context is available:
package main
import "fmt"
import "gopkg.in/olebedev/go-duktape.v3"
func main() {
ctx := duktape.New()
ctx.PushGlobalGoFunction("log", func(c *duktape.Context) int {
fmt.Println(c.SafeToString(-1))
return 0
})
ctx.PevalString(`log('Go lang Go!')`)
}
then run it.
$ go run *.go
Go lang Go!
$
Timers
There is a method to inject timers to the global scope:
package main
import "fmt"
import "gopkg.in/olebedev/go-duktape.v3"
func main() {
ctx := duktape.New()
// Let's inject `setTimeout`, `setInterval`, `clearTimeout`,
// `clearInterval` into global scope.
ctx.PushTimers()
ch := make(chan string)
ctx.PushGlobalGoFunction("second", func(_ *Context) int {
ch <- "second step"
return 0
})
ctx.PevalString(`
setTimeout(second, 0);
print('first step');
`)
fmt.Println(<-ch)
}
then run it
$ go run *.go
first step
second step
$
Also you can FlushTimers()
.
Command line tool
Install go get gopkg.in/olebedev/go-duktape.v3/...
.
Execute file.js: $GOPATH/bin/go-duk file.js
.
Benchmarks
prog | time |
---|---|
otto | 200.13s |
anko | 231.19s |
agora | 149.33s |
GopherLua | 8.39s |
go-duktape | 9.80s |
More details are here.
Status
The package is not fully tested, so be careful.
Contribution
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.