diff --git a/implementation-contributed/javascriptcore/stress/regress-189185.js b/implementation-contributed/javascriptcore/stress/regress-189185.js index c016efd268..14b901e7ca 100644 --- a/implementation-contributed/javascriptcore/stress/regress-189185.js +++ b/implementation-contributed/javascriptcore/stress/regress-189185.js @@ -1,5 +1,5 @@ -//@ runDefault //@ skip if $architecture == "x86" +//@ runDefault // This passes if it does not crash. new WebAssembly.CompileError({ valueOf() { diff --git a/implementation-contributed/javascriptcore/stress/symbol-description.js b/implementation-contributed/javascriptcore/stress/symbol-description.js new file mode 100644 index 0000000000..f2d8c760f0 --- /dev/null +++ b/implementation-contributed/javascriptcore/stress/symbol-description.js @@ -0,0 +1,95 @@ +function shouldBe(actual, expected) { + if (actual !== expected) + throw new Error(`bad value: ${String(actual)}`); +} + +function shouldThrow(func, errorMessage) { + var errorThrown = false; + var error = null; + try { + func(); + } catch (e) { + errorThrown = true; + error = e; + } + if (!errorThrown) + throw new Error('not thrown'); + if (String(error) !== errorMessage) + throw new Error(`bad error: ${String(error)}`); +} + +var s0 = Symbol("Cocoa"); +var s1 = Symbol("Cappuccino"); +var s2 = Symbol(""); +var s3 = Symbol(); + +shouldBe(s0.description, "Cocoa"); +shouldBe(s0.toString(), "Symbol(Cocoa)"); +shouldBe(s1.description, "Cappuccino"); +shouldBe(s1.toString(), "Symbol(Cappuccino)"); +shouldBe(s2.description, ""); +shouldBe(s2.toString(), "Symbol()"); +shouldBe(s3.description, undefined); +shouldBe(s3.toString(), "Symbol()"); + +var o0 = Object(s0); +var o1 = Object(s1); +var o2 = Object(s2); +var o3 = Object(s3); + +shouldBe(o0.description, "Cocoa"); +shouldBe(o0.toString(), "Symbol(Cocoa)"); +shouldBe(o1.description, "Cappuccino"); +shouldBe(o1.toString(), "Symbol(Cappuccino)"); +shouldBe(o2.description, ""); +shouldBe(o2.toString(), "Symbol()"); +shouldBe(o3.description, undefined); +shouldBe(o3.toString(), "Symbol()"); + +var descriptor = Object.getOwnPropertyDescriptor(Symbol.prototype, "description"); +shouldBe(descriptor.enumerable, false); +shouldBe(descriptor.configurable, true); +shouldBe(descriptor.set, undefined); +shouldBe(typeof descriptor.get, "function"); + +shouldThrow(() => { + "use strict"; + s0.description = "Matcha"; +}, `TypeError: Attempted to assign to readonly property.`); +shouldThrow(() => { + "use strict"; + o0.description = "Matcha"; +}, `TypeError: Attempted to assign to readonly property.`); + +shouldThrow(() => { + descriptor.get.call({}); +}, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); + +shouldThrow(() => { + descriptor.get.call(null); +}, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); + +shouldThrow(() => { + descriptor.get.call(undefined); +}, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); + +shouldThrow(() => { + descriptor.get.call(42); +}, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); + +shouldThrow(() => { + descriptor.get.call("Hello"); +}, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); + +shouldThrow(() => { + descriptor.get.call(42.195); +}, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); + +shouldThrow(() => { + descriptor.get.call(false); +}, `TypeError: Symbol.prototype.description requires that |this| be a symbol or a symbol object`); + +shouldBe(descriptor.get.call(s0), "Cocoa"); +shouldBe(descriptor.get.call(o0), "Cocoa"); +o0.__proto__ = {}; +shouldBe(descriptor.get.call(o0), "Cocoa");