Index: test/mjsunit/strict-mode.js |
diff --git a/test/mjsunit/strict-mode.js b/test/mjsunit/strict-mode.js |
index fbba64ed66606c125dbbec74a5849402c3b41144..bcd6e90e9bd76acc6b06a10f45e6abfa0f5b505b 100644 |
--- a/test/mjsunit/strict-mode.js |
+++ b/test/mjsunit/strict-mode.js |
@@ -438,7 +438,7 @@ repeat(10, function() { testAssignToUndefined(false); }); |
})(); |
// Not transforming this in Function.call and Function.apply. |
-(function testThisTransform() { |
+(function testThisTransformCallApply() { |
function non_strict() { |
return this; |
} |
@@ -478,3 +478,218 @@ repeat(10, function() { testAssignToUndefined(false); }); |
assertEquals(typeof strict.apply("Hello"), "string"); |
assertTrue(strict.apply(object) === object); |
})(); |
+ |
+(function testThisTransform() { |
+ try { |
+ function strict() { |
+ "use strict"; |
+ return typeof(this); |
+ } |
+ function nonstrict() { |
+ return typeof(this); |
+ } |
+ |
+ // Concat to avoid symbol. |
+ var strict_name = "str" + "ict"; |
+ var nonstrict_name = "non" + "str" + "ict"; |
+ var strict_number = 17; |
+ var nonstrict_number = 19; |
+ var strict_name_get = "str" + "ict" + "get"; |
+ var nonstrict_name_get = "non" + "str" + "ict" + "get" |
+ var strict_number_get = 23; |
+ var nonstrict_number_get = 29; |
+ |
+ function install(t) { |
+ t.prototype.strict = strict; |
+ t.prototype.nonstrict = nonstrict; |
+ t.prototype[strict_number] = strict; |
+ t.prototype[nonstrict_number] = nonstrict; |
+ Object.defineProperty(t.prototype, strict_name_get, |
+ { get: function() { return strict; }, |
+ configurable: true }); |
+ Object.defineProperty(t.prototype, nonstrict_name_get, |
+ { get: function() { return nonstrict; }, |
+ configurable: true }); |
+ Object.defineProperty(t.prototype, strict_number_get, |
+ { get: function() { return strict; }, |
+ configurable: true }); |
+ Object.defineProperty(t.prototype, nonstrict_number_get, |
+ { get: function() { return nonstrict; }, |
+ configurable: true }); |
+ } |
+ |
+ function cleanup(t) { |
+ delete t.prototype.strict; |
+ delete t.prototype.nonstrict; |
+ delete t.prototype[strict_number]; |
+ delete t.prototype[nonstrict_number]; |
+ delete t.prototype[strict_name_get]; |
+ delete t.prototype[nonstrict_name_get]; |
+ delete t.prototype[strict_number_get]; |
+ delete t.prototype[nonstrict_number_get]; |
+ } |
+ |
+ // Set up fakes |
+ install(String); |
+ install(Number); |
+ install(Boolean) |
+ |
+ function callStrict(o) { |
+ return o.strict(); |
+ } |
+ function callNonStrict(o) { |
+ return o.nonstrict(); |
+ } |
+ function callKeyedStrict(o) { |
+ return o[strict_name](); |
+ } |
+ function callKeyedNonStrict(o) { |
+ return o[nonstrict_name](); |
+ } |
+ function callIndexedStrict(o) { |
+ return o[strict_number](); |
+ } |
+ function callIndexedNonStrict(o) { |
+ return o[nonstrict_number](); |
+ } |
+ function callStrictGet(o) { |
+ return o.strictget(); |
+ } |
+ function callNonStrictGet(o) { |
+ return o.nonstrictget(); |
+ } |
+ function callKeyedStrictGet(o) { |
+ return o[strict_name_get](); |
+ } |
+ function callKeyedNonStrictGet(o) { |
+ return o[nonstrict_name_get](); |
+ } |
+ function callIndexedStrictGet(o) { |
+ return o[strict_number_get](); |
+ } |
+ function callIndexedNonStrictGet(o) { |
+ return o[nonstrict_number_get](); |
+ } |
+ |
+ for (var i = 0; i < 10; i ++) { |
+ assertEquals(("hello").strict(), "string"); |
+ assertEquals(("hello").nonstrict(), "object"); |
+ assertEquals(("hello")[strict_name](), "string"); |
+ assertEquals(("hello")[nonstrict_name](), "object"); |
+ assertEquals(("hello")[strict_number](), "string"); |
+ assertEquals(("hello")[nonstrict_number](), "object"); |
+ |
+ assertEquals((10 + i).strict(), "number"); |
+ assertEquals((10 + i).nonstrict(), "object"); |
+ assertEquals((10 + i)[strict_name](), "number"); |
+ assertEquals((10 + i)[nonstrict_name](), "object"); |
+ assertEquals((10 + i)[strict_number](), "number"); |
+ assertEquals((10 + i)[nonstrict_number](), "object"); |
+ |
+ assertEquals((true).strict(), "boolean"); |
+ assertEquals((true).nonstrict(), "object"); |
+ assertEquals((true)[strict_name](), "boolean"); |
+ assertEquals((true)[nonstrict_name](), "object"); |
+ assertEquals((true)[strict_number](), "boolean"); |
+ assertEquals((true)[nonstrict_number](), "object"); |
+ |
+ assertEquals((false).strict(), "boolean"); |
+ assertEquals((false).nonstrict(), "object"); |
+ assertEquals((false)[strict_name](), "boolean"); |
+ assertEquals((false)[nonstrict_name](), "object"); |
+ assertEquals((false)[strict_number](), "boolean"); |
+ assertEquals((false)[nonstrict_number](), "object"); |
+ |
+ assertEquals(callStrict("howdy"), "string"); |
+ assertEquals(callNonStrict("howdy"), "object"); |
+ assertEquals(callKeyedStrict("howdy"), "string"); |
+ assertEquals(callKeyedNonStrict("howdy"), "object"); |
+ assertEquals(callIndexedStrict("howdy"), "string"); |
+ assertEquals(callIndexedNonStrict("howdy"), "object"); |
+ |
+ assertEquals(callStrict(17 + i), "number"); |
+ assertEquals(callNonStrict(17 + i), "object"); |
+ assertEquals(callKeyedStrict(17 + i), "number"); |
+ assertEquals(callKeyedNonStrict(17 + i), "object"); |
+ assertEquals(callIndexedStrict(17 + i), "number"); |
+ assertEquals(callIndexedNonStrict(17 + i), "object"); |
+ |
+ assertEquals(callStrict(true), "boolean"); |
+ assertEquals(callNonStrict(true), "object"); |
+ assertEquals(callKeyedStrict(true), "boolean"); |
+ assertEquals(callKeyedNonStrict(true), "object"); |
+ assertEquals(callIndexedStrict(true), "boolean"); |
+ assertEquals(callIndexedNonStrict(true), "object"); |
+ |
+ assertEquals(callStrict(false), "boolean"); |
+ assertEquals(callNonStrict(false), "object"); |
+ assertEquals(callKeyedStrict(false), "boolean"); |
+ assertEquals(callKeyedNonStrict(false), "object"); |
+ assertEquals(callIndexedStrict(false), "boolean"); |
+ assertEquals(callIndexedNonStrict(false), "object"); |
+ |
+ // All of the above, with getters |
+ assertEquals(("hello").strictget(), "string"); |
+ assertEquals(("hello").nonstrictget(), "object"); |
+ assertEquals(("hello")[strict_name_get](), "string"); |
+ assertEquals(("hello")[nonstrict_name_get](), "object"); |
+ assertEquals(("hello")[strict_number_get](), "string"); |
+ assertEquals(("hello")[nonstrict_number_get](), "object"); |
+ |
+ assertEquals((10 + i).strictget(), "number"); |
+ assertEquals((10 + i).nonstrictget(), "object"); |
+ assertEquals((10 + i)[strict_name_get](), "number"); |
+ assertEquals((10 + i)[nonstrict_name_get](), "object"); |
+ assertEquals((10 + i)[strict_number_get](), "number"); |
+ assertEquals((10 + i)[nonstrict_number_get](), "object"); |
+ |
+ assertEquals((true).strictget(), "boolean"); |
+ assertEquals((true).nonstrictget(), "object"); |
+ assertEquals((true)[strict_name_get](), "boolean"); |
+ assertEquals((true)[nonstrict_name_get](), "object"); |
+ assertEquals((true)[strict_number_get](), "boolean"); |
+ assertEquals((true)[nonstrict_number_get](), "object"); |
+ |
+ assertEquals((false).strictget(), "boolean"); |
+ assertEquals((false).nonstrictget(), "object"); |
+ assertEquals((false)[strict_name_get](), "boolean"); |
+ assertEquals((false)[nonstrict_name_get](), "object"); |
+ assertEquals((false)[strict_number_get](), "boolean"); |
+ assertEquals((false)[nonstrict_number_get](), "object"); |
+ |
+ assertEquals(callStrictGet("howdy"), "string"); |
+ assertEquals(callNonStrictGet("howdy"), "object"); |
+ assertEquals(callKeyedStrictGet("howdy"), "string"); |
+ assertEquals(callKeyedNonStrictGet("howdy"), "object"); |
+ assertEquals(callIndexedStrictGet("howdy"), "string"); |
+ assertEquals(callIndexedNonStrictGet("howdy"), "object"); |
+ |
+ assertEquals(callStrictGet(17 + i), "number"); |
+ assertEquals(callNonStrictGet(17 + i), "object"); |
+ assertEquals(callKeyedStrictGet(17 + i), "number"); |
+ assertEquals(callKeyedNonStrictGet(17 + i), "object"); |
+ assertEquals(callIndexedStrictGet(17 + i), "number"); |
+ assertEquals(callIndexedNonStrictGet(17 + i), "object"); |
+ |
+ assertEquals(callStrictGet(true), "boolean"); |
+ assertEquals(callNonStrictGet(true), "object"); |
+ assertEquals(callKeyedStrictGet(true), "boolean"); |
+ assertEquals(callKeyedNonStrictGet(true), "object"); |
+ assertEquals(callIndexedStrictGet(true), "boolean"); |
+ assertEquals(callIndexedNonStrictGet(true), "object"); |
+ |
+ assertEquals(callStrictGet(false), "boolean"); |
+ assertEquals(callNonStrictGet(false), "object"); |
+ assertEquals(callKeyedStrictGet(false), "boolean"); |
+ assertEquals(callKeyedNonStrictGet(false), "object"); |
+ assertEquals(callIndexedStrictGet(false), "boolean"); |
+ assertEquals(callIndexedNonStrictGet(false), "object"); |
+ |
+ } |
+ } finally { |
+ // Cleanup |
+ cleanup(String); |
+ cleanup(Number); |
+ cleanup(Boolean); |
+ } |
+})(); |