7281f80151
Revert "Revert relanded strong property access CL"
Regression issues should be solved. Initial patchset is the original, subsequent patchsets are the fixing modifications.
This reverts commit 4ac7be5656
.
BUG=v8:3956
LOG=N
Review URL: https://codereview.chromium.org/1199983002
Cr-Commit-Position: refs/heads/master@{#29384}
175 lines
3.9 KiB
JavaScript
175 lines
3.9 KiB
JavaScript
// 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): uncomment once Object.defineProperty is fixed.
|
|
// 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 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 });
|
|
}
|
|
|
|
// After altering the backing store, accessing a missing property should still
|
|
// throw.
|
|
for (let key of badKeys) {
|
|
for (let value of values) {
|
|
for (let desc of getDescs(value)) {
|
|
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);
|
|
}
|
|
// 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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
})();
|