aboutsummaryrefslogtreecommitdiff
path: root/src/syscall
diff options
context:
space:
mode:
authorCherry Mui <cherryyz@google.com>2024-08-19 15:17:04 -0400
committerCherry Mui <cherryyz@google.com>2024-08-21 01:11:27 +0000
commitf38d42f2c4c6ad0d7cbdad5e1417cac3be2a5dcb (patch)
treed305e0873748c2f413f9b8cb4e354a2fcefbeee8 /src/syscall
parent24fd1a043d1a81267d4a8175c114b59a86928ddd (diff)
downloadgo-f38d42f2c4c6ad0d7cbdad5e1417cac3be2a5dcb.tar.xz
cmd/link: support wasmexport on js/wasm
Add export functions to the wasm module on GOOS=js. (Other parts work the same way as wasip1.) Add a test. Fixes #65199. Change-Id: Ia22580859fe40631d487f70ee293c12867e0c988 Reviewed-on: https://go-review.googlesource.com/c/go/+/606855 Reviewed-by: Zxilly Chou <zxilly@outlook.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Diffstat (limited to 'src/syscall')
-rw-r--r--src/syscall/js/js_test.go52
1 files changed, 46 insertions, 6 deletions
diff --git a/src/syscall/js/js_test.go b/src/syscall/js/js_test.go
index cec5f28a08..d6bcc6370d 100644
--- a/src/syscall/js/js_test.go
+++ b/src/syscall/js/js_test.go
@@ -56,6 +56,46 @@ func TestWasmImport(t *testing.T) {
}
}
+// testCallExport is imported from host (wasm_exec.js), which calls testExport.
+//
+//go:wasmimport _gotest callExport
+func testCallExport(a int32, b int64) int64
+
+//go:wasmexport testExport
+func testExport(a int32, b int64) int64 {
+ testExportCalled = true
+ // test stack growth
+ growStack(1000)
+ // force a goroutine switch
+ ch := make(chan int64)
+ go func() {
+ ch <- int64(a)
+ ch <- b
+ }()
+ return <-ch + <-ch
+}
+
+var testExportCalled bool
+
+func growStack(n int64) {
+ if n > 0 {
+ growStack(n - 1)
+ }
+}
+
+func TestWasmExport(t *testing.T) {
+ testExportCalled = false
+ a := int32(123)
+ b := int64(456)
+ want := int64(a) + b
+ if got := testCallExport(a, b); got != want {
+ t.Errorf("got %v, want %v", got, want)
+ }
+ if !testExportCalled {
+ t.Error("testExport not called")
+ }
+}
+
func TestBool(t *testing.T) {
want := true
o := dummys.Get("someBool")
@@ -587,13 +627,13 @@ func TestGarbageCollection(t *testing.T) {
// Note: All JavaScript functions return a JavaScript array, which will cause
// one allocation to be created to track the Value.gcPtr for the Value finalizer.
var allocTests = []struct {
- argLen int // The number of arguments to use for the syscall
+ argLen int // The number of arguments to use for the syscall
expected int // The expected number of allocations
}{
// For less than or equal to 16 arguments, we expect 1 allocation:
// - makeValue new(ref)
- {0, 1},
- {2, 1},
+ {0, 1},
+ {2, 1},
{15, 1},
{16, 1},
// For greater than 16 arguments, we expect 3 allocation:
@@ -613,7 +653,7 @@ func TestCallAllocations(t *testing.T) {
tmpArray := js.Global().Get("Array").New(0)
numAllocs := testing.AllocsPerRun(100, func() {
tmpArray.Call("concat", args...)
- });
+ })
if numAllocs != float64(test.expected) {
t.Errorf("got numAllocs %#v, want %#v", numAllocs, test.expected)
@@ -630,7 +670,7 @@ func TestInvokeAllocations(t *testing.T) {
concatFunc := tmpArray.Get("concat").Call("bind", tmpArray)
numAllocs := testing.AllocsPerRun(100, func() {
concatFunc.Invoke(args...)
- });
+ })
if numAllocs != float64(test.expected) {
t.Errorf("got numAllocs %#v, want %#v", numAllocs, test.expected)
@@ -647,7 +687,7 @@ func TestNewAllocations(t *testing.T) {
numAllocs := testing.AllocsPerRun(100, func() {
arrayConstructor.New(args...)
- });
+ })
if numAllocs != float64(test.expected) {
t.Errorf("got numAllocs %#v, want %#v", numAllocs, test.expected)