From 138bfc28090ccf03450cf02cb24f06b60f57cd3b Mon Sep 17 00:00:00 2001 From: Richard Musiol Date: Thu, 18 Oct 2018 15:53:38 +0200 Subject: syscall/js: make zero js.Value represent "undefined" This commit changes the encoding of js.Value so that the zero js.Value represents the JavaScript value "undefined". This is what users intuitively expect. Specifically, the encodings of "undefined" and the number zero have been swapped. Fixes #27592. Change-Id: Icfc832c8cdf7a8a78bd69d20e00a04dbed0ccd10 Reviewed-on: https://go-review.googlesource.com/c/143137 Run-TryBot: Richard Musiol TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- misc/wasm/wasm_exec.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'misc') diff --git a/misc/wasm/wasm_exec.js b/misc/wasm/wasm_exec.js index 815b3fbeff..bd9754e53a 100644 --- a/misc/wasm/wasm_exec.js +++ b/misc/wasm/wasm_exec.js @@ -95,6 +95,9 @@ const loadValue = (addr) => { const f = mem().getFloat64(addr, true); + if (f === 0) { + return undefined; + } if (!isNaN(f)) { return f; } @@ -112,14 +115,18 @@ mem().setUint32(addr, 0, true); return; } + if (v === 0) { + mem().setUint32(addr + 4, nanHead, true); + mem().setUint32(addr, 1, true); + return; + } mem().setFloat64(addr, v, true); return; } switch (v) { case undefined: - mem().setUint32(addr + 4, nanHead, true); - mem().setUint32(addr, 1, true); + mem().setFloat64(addr, 0, true); return; case null: mem().setUint32(addr + 4, nanHead, true); @@ -334,7 +341,7 @@ this._inst = instance; this._values = [ // TODO: garbage collection NaN, - undefined, + 0, null, true, false, @@ -396,14 +403,14 @@ } static _makeCallbackHelper(id, pendingCallbacks, go) { - return function() { + return function () { pendingCallbacks.push({ id: id, args: arguments }); go._resolveCallbackPromise(); }; } static _makeEventCallbackHelper(preventDefault, stopPropagation, stopImmediatePropagation, fn) { - return function(event) { + return function (event) { if (preventDefault) { event.preventDefault(); } -- cgit v1.3