Index: test/mjsunit/strong/load-element.js |
diff --git a/test/mjsunit/strong/load-element.js b/test/mjsunit/strong/load-element.js |
deleted file mode 100644 |
index 4007b7db6163325b53dc5472ceb0f3d03f16b7cd..0000000000000000000000000000000000000000 |
--- a/test/mjsunit/strong/load-element.js |
+++ /dev/null |
@@ -1,267 +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() |
- ]; |
-} |
- |
-//TODO(conradw): add tests for non-inheritance once semantics are implemented. |
-function getNonInheritingObjects() { |
- "use strong"; |
- return [ |
- Object(""), |
- [], |
- new Uint32Array(0) |
- ]; |
-} |
- |
-function readFromObjectElementSloppy(o) { |
- return o[0]; |
-} |
- |
-function readFromObjectElementSparseSloppy(o) { |
- return o[100000]; |
-} |
- |
-function readFromObjectElementNonSmiSloppy(o) { |
- return o[3000000000]; |
-} |
- |
-function readFromObjectNonIndexSloppy(o) { |
- return o[5000000000]; |
-} |
- |
-function readFromObjectElementVarSloppy(o) { |
- var a = 0; |
- return o[a]; |
-} |
- |
-function readFromObjectElementSparseVarSloppy(o) { |
- var a = 100000; |
- return o[a]; |
-} |
- |
-function readFromObjectElementNonSmiVarSloppy(o) { |
- var a = 3000000000; |
- return o[a]; |
-} |
- |
-function readFromObjectNonIndexVarSloppy(o) { |
- var a = 5000000000; |
- return o[a]; |
-} |
- |
-function readFromObjectElementStrong(o) { |
- "use strong"; |
- return o[0]; |
-} |
- |
-function readFromObjectElementSparseStrong(o) { |
- "use strong"; |
- return o[100000]; |
-} |
- |
-function readFromObjectElementNonSmiStrong(o) { |
- "use strong"; |
- return o[3000000000]; |
-} |
- |
-function readFromObjectNonIndexStrong(o) { |
- "use strong"; |
- return o[5000000000]; |
-} |
- |
-function readFromObjectElementLetStrong(o) { |
- "use strong"; |
- let a = 0; |
- return o[a]; |
-} |
- |
-function readFromObjectElementSparseLetStrong(o) { |
- "use strong"; |
- let a = 100000; |
- return o[a]; |
-} |
- |
-function readFromObjectElementNonSmiLetStrong(o) { |
- "use strong"; |
- let a = 3000000000; |
- return o[a]; |
-} |
- |
-function readFromObjectNonIndexLetStrong(o) { |
- "use strong"; |
- let a = 5000000000; |
- return o[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 = [ |
- "0", |
- "100000", |
- "3000000000", |
- "5000000000" |
- ] |
- |
- let badKeys = [ |
- "bar", |
- "1", |
- "100001", |
- "3000000001", |
- "5000000001" |
- ]; |
- |
- let values = [ |
- "string", |
- 1, |
- 100001, |
- 30000000001, |
- 50000000001, |
- NaN, |
- {}, |
- undefined |
- ]; |
- |
- let literals = [0, NaN, true, ""]; |
- |
- let badAccessorDescs = [ |
- { set: (function(){}) }, |
- { configurable: true, enumerable: true, set: (function(){}) } |
- ]; |
- |
- let readSloppy = [ |
- readFromObjectElementSloppy, |
- readFromObjectElementSparseSloppy, |
- readFromObjectElementNonSmiSloppy, |
- readFromObjectNonIndexSloppy, |
- readFromObjectElementVarSloppy, |
- readFromObjectElementSparseVarSloppy, |
- readFromObjectElementNonSmiVarSloppy, |
- readFromObjectNonIndexVarSloppy |
- ]; |
- |
- let readStrong = [ |
- readFromObjectElementStrong, |
- readFromObjectElementSparseStrong, |
- readFromObjectElementNonSmiStrong, |
- readFromObjectNonIndexStrong, |
- readFromObjectElementLetStrong, |
- readFromObjectElementSparseLetStrong, |
- readFromObjectElementNonSmiLetStrong, |
- readFromObjectNonIndexLetStrong |
- ]; |
- |
- 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(){}) }) |
- } |
- |
- // String literals/objects should not throw on character index access |
- assertDoesNotThrow(function() {"use strong"; return "string"[0]; }); |
- assertDoesNotThrow(function() {"use strong"; return Object("string")[0]; }); |
- |
- // Attempting to access a property on an object with no defined properties |
- // should throw. |
- for (let object of getObjects().concat(getNonInheritingObjects(), 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 ({})[1];}, TypeError); |
- assertThrows( |
- function(){"use strong"; typeof ({})[1] === "undefined"}, TypeError); |
-})(); |