Index: test/mjsunit/strong/load-property.js |
diff --git a/test/mjsunit/strong/load-property.js b/test/mjsunit/strong/load-property.js |
deleted file mode 100644 |
index ddbcbb67fbd4e83fcd11dc54d16c71372da27709..0000000000000000000000000000000000000000 |
--- a/test/mjsunit/strong/load-property.js |
+++ /dev/null |
@@ -1,203 +0,0 @@ |
-// Copyright 2015 the V8 project authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-// Flags: --strong-mode --allow-natives-syntax |
- |
-function getSloppyArguments() { |
- return arguments; |
-} |
- |
-function getObjects() { |
- "use strict"; |
- return [ |
- {}, |
- Object(""), |
- [], |
- (function(){}), |
- (class Foo {}), |
- getSloppyArguments(), |
- arguments, |
- new Date(), |
- new Uint32Array(0) |
- ]; |
-} |
- |
-function readFromObjectSloppy(o) { |
- return o.foo; |
-} |
- |
-function readFromObjectKeyedSloppy(o) { |
- return o["foo"]; |
-} |
- |
-function readFromObjectKeyedVarSloppy(o) { |
- var a = "foo"; |
- return o[a]; |
-} |
- |
-function readFromObjectKeyedComputedSloppy(o) { |
- var a = "o"; |
- return o["fo" + a]; |
-} |
- |
-function readFromObjectStrong(o) { |
- "use strong"; |
- return o.foo; |
-} |
- |
-function readFromObjectKeyedStrong(o) { |
- "use strong"; |
- return o["foo"]; |
-} |
- |
-function readFromObjectKeyedLetStrong(o) { |
- "use strong"; |
- let a = "foo"; |
- return o[a]; |
-} |
- |
-function readFromObjectKeyedComputedStrong(o) { |
- "use strong"; |
- let a = "o"; |
- return o["fo" + a]; |
-} |
- |
-function getDescs(x) { |
- return [ |
- {value: x}, |
- {configurable: true, enumerable: true, writable: true, value: x}, |
- {configurable: true, enumerable: true, get: (function() {return x}) }, |
- ]; |
-} |
- |
-function assertStrongSemantics(func, object) { |
- %DeoptimizeFunction(func); |
- %ClearFunctionTypeFeedback(func); |
- assertThrows(function(){func(object)}, TypeError); |
- assertThrows(function(){func(object)}, TypeError); |
- assertThrows(function(){func(object)}, TypeError); |
- %OptimizeFunctionOnNextCall(func); |
- assertThrows(function(){func(object)}, TypeError); |
- %DeoptimizeFunction(func); |
- assertThrows(function(){func(object)}, TypeError); |
-} |
- |
-function assertSloppySemantics(func, object) { |
- %DeoptimizeFunction(func); |
- %ClearFunctionTypeFeedback(func); |
- assertDoesNotThrow(function(){func(object)}); |
- assertDoesNotThrow(function(){func(object)}); |
- assertDoesNotThrow(function(){func(object)}); |
- %OptimizeFunctionOnNextCall(func); |
- assertDoesNotThrow(function(){func(object)}); |
- %DeoptimizeFunction(func); |
- assertDoesNotThrow(function(){func(object)}); |
-} |
- |
-(function () { |
- "use strict"; |
- |
- let goodKeys = [ |
- "foo" |
- ] |
- |
- let badKeys = [ |
- "bar", |
- "1", |
- "100001", |
- "3000000001", |
- "5000000001" |
- ]; |
- |
- let values = [ |
- "string", |
- 1, |
- 100001, |
- 30000000001, |
- 50000000001, |
- NaN, |
- {}, |
- undefined |
- ]; |
- |
- let literals = [0, NaN, true, "string"]; |
- |
- let badAccessorDescs = [ |
- { set: (function(){}) }, |
- { configurable: true, enumerable: true, set: (function(){}) } |
- ]; |
- |
- let readSloppy = [ |
- readFromObjectSloppy, |
- readFromObjectKeyedSloppy, |
- readFromObjectKeyedVarSloppy, |
- readFromObjectKeyedComputedSloppy |
- ]; |
- |
- let readStrong = [ |
- readFromObjectStrong, |
- readFromObjectKeyedStrong, |
- readFromObjectKeyedLetStrong, |
- readFromObjectKeyedComputedStrong |
- ]; |
- |
- let dummyProto = {}; |
- for (let key of goodKeys) { |
- Object.defineProperty(dummyProto, key, { value: undefined }); |
- } |
- |
- let dummyAccessorProto = {}; |
- for (let key of goodKeys) { |
- Object.defineProperty(dummyAccessorProto, key, { set: (function(){}) }) |
- } |
- |
- // Attempting to access a property on an object with no defined properties |
- // should throw. |
- for (let object of getObjects().concat(literals)) { |
- for (let func of readStrong) { |
- assertStrongSemantics(func, object); |
- } |
- for (let func of readSloppy) { |
- assertSloppySemantics(func, object); |
- } |
- } |
- for (let object of getObjects()) { |
- // Accessing a property which is on the prototype chain of the object should |
- // not throw. |
- object.__proto__ = dummyProto; |
- for (let key of goodKeys) { |
- for (let func of readStrong.concat(readSloppy)) { |
- assertSloppySemantics(func, object); |
- } |
- } |
- } |
- // Properties with accessor descriptors missing 'get' should throw on access. |
- for (let desc of badAccessorDescs) { |
- for (let key of goodKeys) { |
- for (let object of getObjects()) { |
- Object.defineProperty(object, key, desc); |
- for (let func of readStrong) { |
- assertStrongSemantics(func, object); |
- } |
- for (let func of readSloppy) { |
- assertSloppySemantics(func, object); |
- } |
- } |
- } |
- } |
- // The same behaviour should be expected for bad accessor properties on the |
- // prototype chain. |
- for (let object of getObjects()) { |
- object.__proto__ = dummyAccessorProto; |
- for (let func of readStrong) { |
- assertStrongSemantics(func, object); |
- } |
- for (let func of readSloppy) { |
- assertSloppySemantics(func, object); |
- } |
- } |
- assertThrows(function(){"use strong"; typeof ({}).foo;}, TypeError); |
- assertThrows( |
- function(){"use strong"; typeof ({}).foo === "undefined"}, TypeError); |
-})(); |