]> Cypherpunks repositories - gostls13.git/commitdiff
misc/wasm: make sure value ref id is unique
authorCherry Zhang <cherryyz@google.com>
Sat, 30 Jun 2018 03:09:34 +0000 (23:09 -0400)
committerCherry Zhang <cherryyz@google.com>
Sun, 1 Jul 2018 21:36:23 +0000 (21:36 +0000)
For each Javascript object that returns to Go as a js.Value, we
associate the ref id to it. But if this ref id is copied or
inherited to other object, it would mess up the ref-object
mapping.

In storeValue, make sure the object is indeed the one we are
storing. Otherwise allocate a new ref id.

Fixes #26143.

Change-Id: Ie60bb2f8d1533da1bbe6f46045866515ec2af5a9
Reviewed-on: https://go-review.googlesource.com/121835
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Richard Musiol <neelance@gmail.com>
misc/wasm/wasm_exec.js
src/syscall/js/js_test.go

index ecb096509fb7ebdac281a97405c86201bffbba32..3617c498664522955f76754845e4fcc6d43e2232 100644 (file)
                                }
 
                                let ref = v[this._refProp];
-                               if (ref === undefined) {
+                               if (ref === undefined || this._values[ref] !== v) {
                                        ref = this._values.length;
                                        this._values.push(v);
                                        v[this._refProp] = ref;
index 497b9467bbeab7b61bb93b0c08933f7ddbd4daa8..c4141c2196ede9bbe0c0e89d8b706015002da9ce 100644 (file)
@@ -107,6 +107,13 @@ func TestObject(t *testing.T) {
        if dummys.Get("someArray") != dummys.Get("someArray") {
                t.Errorf("same value not equal")
        }
+
+       // An object and its prototype should not be equal.
+       proto := js.Global().Get("Object").Get("prototype")
+       o := js.Global().Call("eval", "new Object()")
+       if proto == o {
+               t.Errorf("object equals to its prototype")
+       }
 }
 
 func TestTypedArrayOf(t *testing.T) {