Skip to content
QuickJS bindings for Go
Go Shell C
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
main fix go function exposure bug Jul 15, 2019
.gitignore upgrade quickjs to version: 2019-07-28 Aug 6, 2019
LICENSE fix license Jul 15, 2019
README.md fix typo Jul 15, 2019
context-raw.go
context.go upgrade quickjs to version: 2019-07-28 Aug 6, 2019
error.go add resource free Jul 15, 2019
function.go fix go function exposure bug Jul 15, 2019
install.sh upgrade quickjs to version: 2019-07-28 Aug 6, 2019
module.go fix function type & add module placeholder Jul 14, 2019
quickjs-bridge.c first commit Jul 14, 2019
quickjs-bridge.h first commit Jul 14, 2019
quickjs.go Add -lm to fix undefined references under Linux Jul 16, 2019
runtime.go add resource free Jul 15, 2019
value.go add resource free Jul 15, 2019

README.md

go-quickjs

QuickJS engine bindings for Go.

Warning: At present, both the original project quickjs and this project are still in the early stage of development. Please use this project carefully in the production environment.

Features

  • Evaluate script
  • Evaluate bytecode in []byte
  • Compile script into bytecode in []byte
  • Simple exception throwing and catching
  • Invoke Go function from JavaScript
  • Operate JavaScript values and objects in Go

Get Started

Install: (MacOS tested only)

wget https://raw.github.com/wspl/go-quickjs/master/install.sh && sh ./install.sh

Hello world:

package main

import "github.com/wspl/go-quickjs"

func main() {
	runtime := quickjs.NewJSRuntime()
	defer runtime.Free()
	context := runtime.NewContext()
	defer context.Free()

	ret, err := context.Eval("'Hello ' + 'World!'", "")
	if err != nil {
		println(err.Message())
	}
	println(ret.String())
}

Invoke Go function in JavaScript:

package main

import . "github.com/wspl/go-quickjs"

func main() {
	runtime := NewJSRuntime()
	defer runtime.Free()
	context := runtime.NewContext()
	defer context.Free()

	fn := context.NewGoFunction(func(args []*JSValue, this *JSValue) (*JSValue, *JSError) {
		println("Invoked!")
		return context.NewString("Hello World"), nil
	})
	fn.Value().Expose("hello")
	ret, err := context.Eval("hello()", "")
	if err != nil {
		println(err.Message())
	}
	println(ret.String())
}

TODOs

  • Test cases
  • Module support
  • Fix bugs

License

MIT

You can’t perform that action at this time.