]> Cypherpunks repositories - gostls13.git/commitdiff
syscall.js: add Value.InstanceOf
authorRichard Musiol <mail@richard-musiol.de>
Fri, 15 Jun 2018 08:45:04 +0000 (10:45 +0200)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 25 Jun 2018 17:03:20 +0000 (17:03 +0000)
Change-Id: Icf56188fdb2b8ce6789830a35608203fdb9a3df6
Reviewed-on: https://go-review.googlesource.com/120560
Reviewed-by: Paul Jolly <paul@myitcv.org.uk>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
misc/wasm/wasm_exec.js
src/cmd/vet/all/whitelist/wasm.txt
src/syscall/js/js.go
src/syscall/js/js_js.s
src/syscall/js/js_test.go

index 1aa727ae4d20295296889d92e617be92d6c32f1b..4c29109766de870a0dfd0184cc8a4c6d5e41e819 100644 (file)
                                                loadSlice(sp + 16).set(str);
                                        },
 
+                                       // func valueInstanceOf(v ref, t ref) bool
+                                       "syscall/js.valueInstanceOf": (sp) => {
+                                               mem().setUint8(sp + 16, loadValue(sp + 8) instanceof loadValue(sp + 12));
+                                       },
+
                                        "debug": (value) => {
                                                console.log(value);
                                        },
index ade759026d8b0c4a3e6750b26b522f2e5887cfd1..2b59e5a700d6c078be4b426b25688821eb99b91a 100644 (file)
@@ -31,3 +31,4 @@ syscall/js/js_js.s: [wasm] valueInt: RET without writing to 8-byte ret+8(FP)
 syscall/js/js_js.s: [wasm] valueBool: RET without writing to 1-byte ret+8(FP)
 syscall/js/js_js.s: [wasm] valueLength: RET without writing to 8-byte ret+8(FP)
 syscall/js/js_js.s: [wasm] valuePrepareString: RET without writing to 4-byte ret+8(FP)
+syscall/js/js_js.s: [wasm] valueInstanceOf: RET without writing to 1-byte ret+8(FP)
index 34d70d40cb4f454203af57aa752df8cbbf5f6792..cbd0730c643da4ce712da59c24e4226d85b6acf9 100644 (file)
@@ -227,3 +227,10 @@ func (v Value) String() string {
 func valuePrepareString(v ref) (ref, int)
 
 func valueLoadString(v ref, b []byte)
+
+// InstanceOf reports whether v is an instance of type t according to JavaScript's instanceof operator.
+func (v Value) InstanceOf(t Value) bool {
+       return valueInstanceOf(v.ref, t.ref)
+}
+
+func valueInstanceOf(v ref, t ref) bool
index d1ee4654a7a821208f9470b447838843a35a8ece..cb90d88a6a132523bc9eff7ca5622ecb859dacf8 100644 (file)
@@ -71,3 +71,7 @@ TEXT ·valuePrepareString(SB), NOSPLIT, $0
 TEXT ·valueLoadString(SB), NOSPLIT, $0
   CallImport
   RET
+
+TEXT ·valueInstanceOf(SB), NOSPLIT, $0
+  CallImport
+  RET
index 7d5b1a238aed15f6f5b103570201ab243297f937..53d21a3f4f3e21c05efa7ee406b0e64670e2ec63 100644 (file)
@@ -146,6 +146,16 @@ func TestNew(t *testing.T) {
        }
 }
 
+func TestInstanceOf(t *testing.T) {
+       someArray := js.Global.Get("Array").New()
+       if got, want := someArray.InstanceOf(js.Global.Get("Array")), true; got != want {
+               t.Errorf("got %#v, want %#v", got, want)
+       }
+       if got, want := someArray.InstanceOf(js.Global.Get("Function")), false; got != want {
+               t.Errorf("got %#v, want %#v", got, want)
+       }
+}
+
 func TestCallback(t *testing.T) {
        c := make(chan struct{})
        cb := js.NewCallback(func(args []js.Value) {