diff options
| author | Evan Phoenix <evan@phx.io> | 2023-01-22 15:30:59 -0800 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-03-02 05:28:55 +0000 |
| commit | 02411bcd7c8eda9c694a5755aff0a516d4983952 (patch) | |
| tree | 71106b1c22a459f53d59f68751267a35c4ddf65a /src/syscall | |
| parent | af9f21289fff0c513df3a785c97d8ca35e1829b2 (diff) | |
| download | go-02411bcd7c8eda9c694a5755aff0a516d4983952.tar.xz | |
all: implement wasmimport directive
Go programs can now use the //go:wasmimport module_name function_name
directive to import functions from the WebAssembly runtime.
For now, the directive is restricted to the runtime and syscall/js
packages.
* Derived from CL 350737
* Original work modified to work with changes to the IR conversion code.
* Modification of CL 350737 changes to fully exist in Unified IR path (emp)
* Original work modified to work with changes to the ABI configuration code.
* Fixes #38248
Co-authored-by: Vedant Roy <vroy101@gmail.com>
Co-authored-by: Richard Musiol <mail@richard-musiol.de>
Co-authored-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Change-Id: I740719735d91c306ac718a435a78e1ee9686bc16
Reviewed-on: https://go-review.googlesource.com/c/go/+/463018
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Auto-Submit: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Reviewed-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Diffstat (limited to 'src/syscall')
| -rw-r--r-- | src/syscall/js/js.go | 17 | ||||
| -rw-r--r-- | src/syscall/js/js_js.s | 68 | ||||
| -rw-r--r-- | src/syscall/js/js_test.go | 12 |
3 files changed, 32 insertions, 65 deletions
diff --git a/src/syscall/js/js.go b/src/syscall/js/js.go index 2f4f5adda0..5fdb14d446 100644 --- a/src/syscall/js/js.go +++ b/src/syscall/js/js.go @@ -58,6 +58,7 @@ func makeValue(r ref) Value { return Value{ref: r, gcPtr: gcPtr} } +//go:wasmimport gojs syscall/js.finalizeRef func finalizeRef(r ref) func predefValue(id uint32, typeFlag byte) Value { @@ -209,6 +210,7 @@ func ValueOf(x any) Value { } } +//go:wasmimport gojs syscall/js.stringVal func stringVal(x string) ref // Type represents the JavaScript type of a Value. @@ -292,6 +294,7 @@ func (v Value) Get(p string) Value { return r } +//go:wasmimport gojs syscall/js.valueGet func valueGet(v ref, p string) ref // Set sets the JavaScript property p of value v to ValueOf(x). @@ -306,6 +309,7 @@ func (v Value) Set(p string, x any) { runtime.KeepAlive(xv) } +//go:wasmimport gojs syscall/js.valueSet func valueSet(v ref, p string, x ref) // Delete deletes the JavaScript property p of value v. @@ -318,6 +322,7 @@ func (v Value) Delete(p string) { runtime.KeepAlive(v) } +//go:wasmimport gojs syscall/js.valueDelete func valueDelete(v ref, p string) // Index returns JavaScript index i of value v. @@ -331,6 +336,7 @@ func (v Value) Index(i int) Value { return r } +//go:wasmimport gojs syscall/js.valueIndex func valueIndex(v ref, i int) ref // SetIndex sets the JavaScript index i of value v to ValueOf(x). @@ -345,6 +351,7 @@ func (v Value) SetIndex(i int, x any) { runtime.KeepAlive(xv) } +//go:wasmimport gojs syscall/js.valueSetIndex func valueSetIndex(v ref, i int, x ref) func makeArgs(args []any) ([]Value, []ref) { @@ -369,6 +376,7 @@ func (v Value) Length() int { return r } +//go:wasmimport gojs syscall/js.valueLength func valueLength(v ref) int // Call does a JavaScript call to the method m of value v with the given arguments. @@ -391,6 +399,8 @@ func (v Value) Call(m string, args ...any) Value { return makeValue(res) } +//go:wasmimport gojs syscall/js.valueCall +//go:nosplit func valueCall(v ref, m string, args []ref) (ref, bool) // Invoke does a JavaScript call of the value v with the given arguments. @@ -410,6 +420,7 @@ func (v Value) Invoke(args ...any) Value { return makeValue(res) } +//go:wasmimport gojs syscall/js.valueInvoke func valueInvoke(v ref, args []ref) (ref, bool) // New uses JavaScript's "new" operator with value v as constructor and the given arguments. @@ -429,6 +440,7 @@ func (v Value) New(args ...any) Value { return makeValue(res) } +//go:wasmimport gojs syscall/js.valueNew func valueNew(v ref, args []ref) (ref, bool) func (v Value) isNumber() bool { @@ -528,8 +540,10 @@ func jsString(v Value) string { return string(b) } +//go:wasmimport gojs syscall/js.valuePrepareString func valuePrepareString(v ref) (ref, int) +//go:wasmimport gojs syscall/js.valueLoadString func valueLoadString(v ref, b []byte) // InstanceOf reports whether v is an instance of type t according to JavaScript's instanceof operator. @@ -540,6 +554,7 @@ func (v Value) InstanceOf(t Value) bool { return r } +//go:wasmimport gojs syscall/js.valueInstanceOf func valueInstanceOf(v ref, t ref) bool // A ValueError occurs when a Value method is invoked on @@ -566,6 +581,7 @@ func CopyBytesToGo(dst []byte, src Value) int { return n } +//go:wasmimport gojs syscall/js.copyBytesToGo func copyBytesToGo(dst []byte, src ref) (int, bool) // CopyBytesToJS copies bytes from src to dst. @@ -580,4 +596,5 @@ func CopyBytesToJS(dst Value, src []byte) int { return n } +//go:wasmimport gojs syscall/js.copyBytesToJS func copyBytesToJS(dst ref, src []byte) (int, bool) diff --git a/src/syscall/js/js_js.s b/src/syscall/js/js_js.s index 47ad6b83e5..abdccc9cb0 100644 --- a/src/syscall/js/js_js.s +++ b/src/syscall/js/js_js.s @@ -2,68 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -#include "textflag.h" - -TEXT ·finalizeRef(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·stringVal(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·valueGet(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·valueSet(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·valueDelete(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·valueIndex(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·valueSetIndex(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·valueCall(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·valueInvoke(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·valueNew(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·valueLength(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·valuePrepareString(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·valueLoadString(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·valueInstanceOf(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·copyBytesToGo(SB), NOSPLIT, $0 - CallImport - RET - -TEXT ·copyBytesToJS(SB), NOSPLIT, $0 - CallImport - RET +// The runtime package uses //go:linkname to push the setEventHandler to this +// package. To prevent the go tool from passing -complete to the compile tool, +// this file must remain stubbed out. diff --git a/src/syscall/js/js_test.go b/src/syscall/js/js_test.go index f860a5bb50..8823421b89 100644 --- a/src/syscall/js/js_test.go +++ b/src/syscall/js/js_test.go @@ -44,6 +44,18 @@ var dummys = js.Global().Call("eval", `({ objBooleanFalse: new Boolean(false), })`) +//go:wasmimport _gotest add +func testAdd(uint32, uint32) uint32 + +func TestWasmImport(t *testing.T) { + a := uint32(3) + b := uint32(5) + want := a + b + if got := testAdd(a, b); got != want { + t.Errorf("got %v, want %v", got, want) + } +} + func TestBool(t *testing.T) { want := true o := dummys.Get("someBool") |
