Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1311)

Unified Diff: test/mjsunit/strong/object-delete.js

Issue 1156573002: [strong] Implement per-object restrictions behaviour of delete operator (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: cl feedback Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « test/cctest/test-api.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/mjsunit/strong/object-delete.js
diff --git a/test/mjsunit/strong/object-delete.js b/test/mjsunit/strong/object-delete.js
new file mode 100644
index 0000000000000000000000000000000000000000..a655b65c78fa2bfedd08d767bb43760765ce7167
--- /dev/null
+++ b/test/mjsunit/strong/object-delete.js
@@ -0,0 +1,255 @@
+// 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
+
+// TODO(conradw): Track implementation of strong bit for other objects, add
+// tests.
+
+function getSloppyObjects() {
+ return [(function(){}), ({})];
+}
+
+function getStrictObjects() {
+ "use strict";
+ return [(function(){}), ({})];
+}
+
+function getWeakObjects() {
+ return getSloppyObjects().concat(getStrictObjects());
+}
+
+function getStrongObjects() {
+ "use strong";
+// Strong functions can't have properties added to them, and will be tested as a
+// special case.
+ return [({})];
+}
+
+function strongFunction() {
+ "use strong";
+}
+
+function deleteFromObjectSloppy(o) {
+ return delete o.foo;
+}
+
+function deleteFromObjectKeyedSloppy(o) {
+ return delete o["foo"];
+}
+
+function deleteFromObjectKeyedVarSloppy(o) {
+ var a = "foo";
+ return delete o[a];
+}
+
+function deleteFromObjectKeyedComputedSloppy(o) {
+ var a = "o";
+ return delete o["fo" + a];
+}
+
+function deleteFromObjectWith(o) {
+ with (o) {
+ return delete foo;
+ }
+}
+
+function deleteFromObjectElementSloppy(o) {
+ return delete o[0];
+}
+
+function deleteFromObjectElementVarSloppy(o) {
+ var a = 0;
+ return delete o[a];
+}
+
+function deleteFromObjectElementSparseSloppy(o) {
+ return delete o[100000];
+}
+
+function deleteFromObjectElementVarSloppy(o) {
+ var a = 0;
+ return delete o[a];
+}
+
+function deleteFromObjectElementSparseVarSloppy(o) {
+ var a = 100000;
+ return delete o[a];
+}
+
+function deleteFromObjectStrict(o) {
+ "use strict";
+ return delete o.foo;
+}
+
+function deleteFromObjectKeyedStrict(o) {
+ "use strict";
+ return delete o["foo"];
+}
+
+function deleteFromObjectKeyedVarStrict(o) {
+ "use strict";
+ var a = "foo";
+ return delete o[a];
+}
+
+function deleteFromObjectKeyedComputedStrict(o) {
+ "use strict";
+ var a = "o";
+ return delete o["fo" + a];
+}
+
+function deleteFromObjectElementStrict(o) {
+ "use strict";
+ return delete o[0];
+}
+
+function deleteFromObjectElementSparseStrict(o) {
+ "use strict";
+ return delete o[100000];
+}
+
+function deleteFromObjectElementVarStrict(o) {
+ "use strict";
+ var a = 0;
+ return delete o[a];
+}
+
+function deleteFromObjectElementSparseVarStrict(o) {
+ "use strict";
+ var a = 100000;
+ return delete o[a];
+}
+
+function testStrongObjectDelete() {
+ "use strict";
+
+ let deletePropertyFuncsSloppy = [
+ deleteFromObjectSloppy,
+ deleteFromObjectKeyedSloppy,
+ deleteFromObjectKeyedVarSloppy,
+ deleteFromObjectKeyedComputedSloppy,
+ deleteFromObjectWith
+ ];
+ let deletePropertyFuncsStrict = [
+ deleteFromObjectStrict,
+ deleteFromObjectKeyedStrict,
+ deleteFromObjectKeyedVarStrict,
+ deleteFromObjectKeyedComputedStrict
+ ];
+ let deleteElementFuncsSloppy = [
+ deleteFromObjectElementSloppy,
+ deleteFromObjectElementVarSloppy
+ ];
+ let deleteElementSparseFuncsSloppy = [
+ deleteFromObjectElementSparseSloppy,
+ deleteFromObjectElementSparseVarSloppy
+ ];
+ let deleteElementFuncsStrict = [
+ deleteFromObjectElementStrict,
+ deleteFromObjectElementVarStrict
+ ];
+ let deleteElementSparseFuncsStrict = [
+ deleteFromObjectElementSparseStrict,
+ deleteFromObjectElementSparseVarStrict
+ ];
+ let deleteFuncs = deletePropertyFuncsSloppy.concat(
+ deletePropertyFuncsStrict, deleteElementFuncsSloppy,
+ deleteElementSparseFuncsSloppy, deleteElementFuncsStrict,
+ deleteElementSparseFuncsStrict);
+
+ for (let deleteFunc of deleteFuncs) {
+ assertTrue(deleteFunc(strongFunction));
+ }
+
+ let testCasesSloppy = [
+ [deletePropertyFuncsSloppy, "foo"],
+ [deleteElementFuncsSloppy, "0"],
+ [deleteElementSparseFuncsSloppy, "100000"]
+ ];
+
+ let testCasesStrict = [
+ [deletePropertyFuncsStrict, "foo"],
+ [deleteElementFuncsStrict, "0"],
+ [deleteElementSparseFuncsStrict, "100000"]
+ ];
+
+ let propDescs = [
+ {configurable: true, value: "bar"},
+ {configurable: true, value: 1},
+ {configurable: true, enumerable: true, writable: true, value: "bar"},
+ {configurable: true, enumerable: true, writable: true, value: 1},
+ {configurable: true, get: (function(){return 0}), set: (function(x){})}
+ ];
+
+ for (let propDesc of propDescs) {
+ for (let testCase of testCasesSloppy) {
+ let name = testCase[1];
+ for (let deleteFunc of testCase[0]) {
+ for (let o of getWeakObjects()) {
+ Object.defineProperty(o, name, propDesc);
+ assertTrue(delete o["bar"]);
+ assertTrue(delete o[5000]);
+ assertTrue(deleteFunc(o));
+ assertFalse(o.hasOwnProperty(name));
+ %OptimizeFunctionOnNextCall(deleteFunc);
+ Object.defineProperty(o, name, propDesc);
+ assertTrue(deleteFunc(o));
+ assertFalse(o.hasOwnProperty(name));
+ %DeoptimizeFunction(deleteFunc);
+ Object.defineProperty(o, name, propDesc);
+ assertTrue(deleteFunc(o));
+ assertFalse(o.hasOwnProperty(name));
+ }
+ for (let o of getStrongObjects()) {
+ Object.defineProperty(o, name, propDesc);
+ assertTrue(delete o["bar"]);
+ assertTrue(delete o[5000]);
+ assertFalse(deleteFunc(o));
+ assertTrue(o.hasOwnProperty(name));
+ %OptimizeFunctionOnNextCall(deleteFunc);
+ assertFalse(deleteFunc(o));
+ assertTrue(o.hasOwnProperty(name));
+ %DeoptimizeFunction(deleteFunc);
+ assertFalse(deleteFunc(o));
+ assertTrue(o.hasOwnProperty(name));
+ }
+ }
+ }
+ for (let testCase of testCasesStrict) {
+ let name = testCase[1];
+ for (let deleteFunc of testCase[0]) {
+ for (let o of getWeakObjects()) {
+ Object.defineProperty(o, name, propDesc);
+ assertTrue(delete o["bar"]);
+ assertTrue(delete o[5000]);
+ assertTrue(deleteFunc(o));
+ assertFalse(o.hasOwnProperty(name));
+ %OptimizeFunctionOnNextCall(deleteFunc);
+ Object.defineProperty(o, name, propDesc);
+ assertTrue(deleteFunc(o));
+ assertFalse(o.hasOwnProperty(name));
+ %DeoptimizeFunction(deleteFunc);
+ Object.defineProperty(o, name, propDesc);
+ assertTrue(deleteFunc(o));
+ assertFalse(o.hasOwnProperty(name));
+ }
+ for (let o of getStrongObjects()) {
+ Object.defineProperty(o, name, propDesc);
+ assertTrue(delete o["bar"]);
+ assertTrue(delete o[5000]);
+ assertThrows(function(){deleteFunc(o)}, TypeError);
+ assertTrue(o.hasOwnProperty(name));
+ %OptimizeFunctionOnNextCall(deleteFunc);
+ assertThrows(function(){deleteFunc(o)}, TypeError);
+ assertTrue(o.hasOwnProperty(name));
+ %DeoptimizeFunction(deleteFunc);
+ assertThrows(function(){deleteFunc(o)}, TypeError);
+ assertTrue(o.hasOwnProperty(name));
+ }
+ }
+ }
+ }
+}
+testStrongObjectDelete();
« no previous file with comments | « test/cctest/test-api.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698