aboutsummaryrefslogtreecommitdiff
path: root/src/syscall
diff options
context:
space:
mode:
authorEvan Phoenix <evan@phx.io>2023-01-22 15:30:59 -0800
committerGopher Robot <gobot@golang.org>2023-03-02 05:28:55 +0000
commit02411bcd7c8eda9c694a5755aff0a516d4983952 (patch)
tree71106b1c22a459f53d59f68751267a35c4ddf65a /src/syscall
parentaf9f21289fff0c513df3a785c97d8ca35e1829b2 (diff)
downloadgo-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.go17
-rw-r--r--src/syscall/js/js_js.s68
-rw-r--r--src/syscall/js/js_test.go12
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")