"use strict"; function truth() { return true; } noInline(truth); function assert(cond) { if (!cond) throw new Error("broke assertion"); } noInline(assert); function shouldThrowInvalidConstAssignment(f) { var threw = false; try { f(); } catch(e) { if (e.name.indexOf("TypeError") !== -1 && e.message.indexOf("readonly") !== -1) threw = true; } assert(threw); } noInline(shouldThrowInvalidConstAssignment); // ========== tests below =========== const NUM_LOOPS = 1000; ;(function() { function foo() { const obj = {a: 20, b: 40, c: 50}; const props = []; for (const p in obj) props.push(p); assert(props.length === 3); for (const p of props) assert(!!obj[p]); assert(props.indexOf("a") !== -1); assert(props.indexOf("b") !== -1); assert(props.indexOf("c") !== -1); } function bar() { const funcs = []; for (const item of [1, 2, 3]) funcs.push(function() { return item; }); let i = 1; assert(funcs.length === 3); for (const f of funcs) { assert(f() === i); i++; } } function baz() { const funcs = []; const obj = {a:1, b:2, c:3}; for (const p in obj) funcs.push(function() { return p; }); let i = 1; assert(funcs.length === 3); for (const f of funcs) { assert(obj[f()] === i); i++; } } function taz() { for (const item of [1,2,3]) { const item = 20; assert(item === 20); } } function jaz() { let i = 0; for (const x = 40; i < 10; i++) { assert(x === 40); } } for (var i = 0; i < NUM_LOOPS; i++) { foo(); bar(); baz(); taz(); jaz(); } })(); ;(function() { function foo() { for (const item of [1,2,3]) item = 20; } function bar() { for (const item of [1,2,3]) eval("item = 20") } function baz() { for (const p in {a: 20, b: 40}) p = 20; } function taz() { for (const p in {a: 20, b: 40}) eval("p = 20") } function jaz() { for (const x = 0; x < 10; x++) { } } function raz() { for (const x = 0; x < 10; ++x) { } } function paz() { for (const x = 0; x < 10; x++) { let f = function() { return x; } } } function maz() { for (const x = 0; x < 10; ++x) { let f = function() { return x; } } } for (var i = 0; i < NUM_LOOPS; i++) { shouldThrowInvalidConstAssignment(foo); shouldThrowInvalidConstAssignment(bar); shouldThrowInvalidConstAssignment(baz); shouldThrowInvalidConstAssignment(taz); shouldThrowInvalidConstAssignment(jaz); shouldThrowInvalidConstAssignment(raz); shouldThrowInvalidConstAssignment(paz); shouldThrowInvalidConstAssignment(maz); } })();