function shouldBe(actual, expected) { if (actual !== expected) throw new Error('bad value: ' + actual); } function test1(string) { return string.valueOf(); } noInline(test1); function test2(string) { return string.valueOf(); } noInline(test2); function test3(string) { return string.valueOf(); } noInline(test3); var string = "Hello"; var stringObject = new String(string); for (var i = 0; i < 1e6; ++i) { shouldBe(test1(string), string); shouldBe(test2(stringObject), string); if (i & 1) shouldBe(test3(string), string); else shouldBe(test3(stringObject), string); } var object = {}; shouldBe(test1(object), object); shouldBe(test2(object), object); shouldBe(test3(object), object);