From 60f271358f07647be0de9ee8225b50a391ea5def Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Sat, 28 Sep 2019 23:47:37 +0200 Subject: [PATCH] syscall/js: add Value.Delete for deleting JavaScript properties This change adds the method Value.Delete, which implements JavaScript's "delete" operator for deleting properties. Fixes #33079. Change-Id: Ia5b190240bd59daca48094fcbc32f8d0a06f19d5 Reviewed-on: https://go-review.googlesource.com/c/go/+/197840 Run-TryBot: Richard Musiol TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick Reviewed-by: Cherry Zhang --- misc/wasm/wasm_exec.js | 5 +++++ src/syscall/js/js.go | 11 +++++++++++ src/syscall/js/js_js.s | 4 ++++ src/syscall/js/js_test.go | 12 ++++++++++++ 4 files changed, 32 insertions(+) diff --git a/misc/wasm/wasm_exec.js b/misc/wasm/wasm_exec.js index 9639585693..9ffa9201e8 100644 --- a/misc/wasm/wasm_exec.js +++ b/misc/wasm/wasm_exec.js @@ -308,6 +308,11 @@ Reflect.set(loadValue(sp + 8), loadString(sp + 16), loadValue(sp + 32)); }, + // func valueDelete(v ref, p string) + "syscall/js.valueDelete": (sp) => { + Reflect.deleteProperty(loadValue(sp + 8), loadString(sp + 16)); + }, + // func valueIndex(v ref, i int) ref "syscall/js.valueIndex": (sp) => { storeValue(sp + 24, Reflect.get(loadValue(sp + 8), getInt64(sp + 16))); diff --git a/src/syscall/js/js.go b/src/syscall/js/js.go index 7300d2c769..f42a16f0d0 100644 --- a/src/syscall/js/js.go +++ b/src/syscall/js/js.go @@ -267,6 +267,17 @@ func (v Value) Set(p string, x interface{}) { func valueSet(v ref, p string, x ref) +// Delete deletes the JavaScript property p of value v. +// It panics if v is not a JavaScript object. +func (v Value) Delete(p string) { + if vType := v.Type(); !vType.isObject() { + panic(&ValueError{"Value.Delete", vType}) + } + valueDelete(v.ref, p) +} + +func valueDelete(v ref, p string) + // Index returns JavaScript index i of value v. // It panics if v is not a JavaScript object. func (v Value) Index(i int) Value { diff --git a/src/syscall/js/js_js.s b/src/syscall/js/js_js.s index 5f29468237..ab56087c16 100644 --- a/src/syscall/js/js_js.s +++ b/src/syscall/js/js_js.s @@ -16,6 +16,10 @@ TEXT ·valueSet(SB), NOSPLIT, $0 CallImport RET +TEXT ·valueDelete(SB), NOSPLIT, $0 + CallImport + RET + TEXT ·valueIndex(SB), NOSPLIT, $0 CallImport RET diff --git a/src/syscall/js/js_test.go b/src/syscall/js/js_test.go index 753c2c3a0d..10d4364e4c 100644 --- a/src/syscall/js/js_test.go +++ b/src/syscall/js/js_test.go @@ -212,6 +212,18 @@ func TestSet(t *testing.T) { }) } +func TestDelete(t *testing.T) { + dummys.Set("test", 42) + dummys.Delete("test") + if dummys.Call("hasOwnProperty", "test").Bool() { + t.Errorf("property still exists") + } + + expectValueError(t, func() { + dummys.Get("zero").Delete("badField") + }) +} + func TestIndex(t *testing.T) { if got := dummys.Get("someArray").Index(1).Int(); got != 42 { t.Errorf("got %#v, want %#v", got, 42) -- 2.50.0