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

Unified Diff: test/mjsunit/regress/cross-script-vars.js

Issue 1259853002: Cross-script variables handling fixed. It was possible to write to read-only global variable. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 5 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 | « src/x87/code-stubs-x87.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/mjsunit/regress/cross-script-vars.js
diff --git a/test/mjsunit/regress/cross-script-vars.js b/test/mjsunit/regress/cross-script-vars.js
new file mode 100644
index 0000000000000000000000000000000000000000..24e53368cb9e1162250e4fc60f1740eeccbcd389
--- /dev/null
+++ b/test/mjsunit/regress/cross-script-vars.js
@@ -0,0 +1,573 @@
+// 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: --allow-natives-syntax
+
+function PrintDesc(desc, s) {
+ var json;
+ if (desc) {
+ json = JSON.stringify(desc);
+ } else {
+ json = "<no such property>";
+ }
+ if (s === undefined) {
+ print(json);
+ } else {
+ print(s + ": " + json);
+ }
+}
+
+
+var counters;
+var test_realm;
+var cfg;
+
+
+function GetDescriptor() {
+ var code = 'Object.getOwnPropertyDescriptor(global, "x")';
+ var desc = Realm.eval(test_realm, code);
+// PrintDesc(desc);
+ return desc;
+}
+
+function SetUp() {
+ counters = {};
+ Realm.shared = {counters: counters};
+ test_realm = Realm.create();
+ Realm.eval(test_realm, 'var global = Realm.global(Realm.current());');
+ print("=====================");
+ print("Test realm: " + test_realm);
+ assertEquals(undefined, GetDescriptor());
+}
+
+function TearDown() {
+ Realm.dispose(test_realm);
+ print("OK");
+}
+
+
+function AddStrict(code, cfg) {
+ return cfg.strict ? '"use strict"; ' + code : code;
+}
+
+function ForceMutablePropertyCellType() {
+ Realm.eval(test_realm, 'global.x = {}; global.x = undefined;');
+}
+
+function DeclareVar() {
+ var code = 'var x;';
+ return Realm.eval(test_realm, AddStrict(code, cfg));
+}
+
+function DefineVar(v) {
+ var code = 'var x = ' + v;
+ return Realm.eval(test_realm, AddStrict(code, cfg));
+}
+
+function DefineLoadVar() {
+ var name = 'LoadVar_' + test_realm;
+ var code =
+ 'var x;' +
+ 'function ' + name + '() {' +
+ ' return x;' +
+ '};';
+ return Realm.eval(test_realm, AddStrict(code, cfg));
+}
+
+function LoadVar() {
+ var name = 'LoadVar_' + test_realm;
+ var code =
+ (cfg.optimize ? '%OptimizeFunctionOnNextCall(' + name + ');' : '') +
+ name + '();';
+ return Realm.eval(test_realm, AddStrict(code, cfg));
+}
+
+function DefineStoreVar() {
+ var name = 'StoreVar_' + test_realm;
+ var code = 'var g = (Function("return this"))();' +
+ 'var x;' +
+ 'function ' + name + '(v) {' +
+// ' %DebugPrint(g);' +
+ ' return x = v;' +
+ '};';
+ return Realm.eval(test_realm, AddStrict(code, cfg));
+}
+
+function StoreVar(v) {
+ var name = 'StoreVar_' + test_realm;
+ var code =
+ (cfg.optimize ? '%OptimizeFunctionOnNextCall(' + name + ');' : '') +
+ name + '(' + v + ');';
+ return Realm.eval(test_realm, AddStrict(code, cfg));
+}
+
+// It does 13 iterations which results in 27 loads
+// and 14 stores.
+function LoadStoreLoop() {
+ var code = 'for(var x = 0; x < 13; x++);';
+ return Realm.eval(test_realm, AddStrict(code, cfg));
+}
+
+function DefineRWDataProperty() {
+ var code =
+ 'Object.defineProperty(global, "x", { ' +
+ ' value: 42, ' +
+ ' writable: true, ' +
+ ' enumerable: true, ' +
+ ' configurable: true ' +
+ '});';
+ return Realm.eval(test_realm, AddStrict(code, cfg));
+}
+
+function DefineRODataProperty() {
+ var code =
+ 'Object.defineProperty(global, "x", { ' +
+ ' value: 42, ' +
+ ' writable: false, ' +
+ ' enumerable: true, ' +
+ ' configurable: true ' +
+ '});';
+ return Realm.eval(test_realm, AddStrict(code, cfg));
+}
+
+function SetX_(v) {
+ var code =
+ 'global.x_ = ' + v + '; ';
+ return Realm.eval(test_realm, code);
+}
+
+function DefineRWAccessorProperty() {
+ var code =
+ 'Object.defineProperty(global, "x", {' +
+ ' get: function() { Realm.shared.counters.get_count++; return this.x_; },' +
+ ' set: function(v) { Realm.shared.counters.set_count++; this.x_ = v; },' +
+ ' enumerable: true, configurable: true' +
+ '});';
+ counters.get_count = 0;
+ counters.set_count = 0;
+ return Realm.eval(test_realm, AddStrict(code, cfg));
+}
+
+function DefineROAccessorProperty() {
+ var code =
+ 'Object.defineProperty(global, "x", {' +
+ ' get: function() { Realm.shared.counters.get_count++; return this.x_; },' +
+ ' enumerable: true, configurable: true' +
+ '});';
+ counters.get_count = 0;
+ counters.set_count = 0;
+ return Realm.eval(test_realm, AddStrict(code, cfg));
+}
+
+
+function testSuite(opt_cfg) {
+ //
+ // Non strict.
+ //
+
+ (function() {
+ SetUp();
+ cfg = {optimize: opt_cfg.optimize, strict: false};
+ DeclareVar();
+ DefineLoadVar();
+ DefineStoreVar();
+ assertEquals(undefined, LoadVar());
+ assertEquals(false, GetDescriptor().configurable);
+
+ // Force property cell type to kMutable.
+ DefineVar(undefined);
+ DefineVar(153);
+ assertEquals(false, GetDescriptor().configurable);
+
+ assertEquals(153, LoadVar());
+ assertEquals(113, StoreVar(113));
+ assertEquals(113, LoadVar());
+ LoadStoreLoop();
+ assertEquals(13, LoadVar());
+ TearDown();
+ })();
+
+
+ (function() {
+ SetUp();
+ cfg = {optimize: opt_cfg.optimize, strict: false};
+ ForceMutablePropertyCellType();
+ DefineLoadVar();
+ DefineStoreVar();
+ DefineRWDataProperty();
+ assertEquals(42, LoadVar());
+ assertEquals(true, GetDescriptor().configurable);
+
+ DefineVar(153);
+ assertEquals(true, GetDescriptor().configurable);
+
+ assertEquals(153, LoadVar());
+ assertEquals(113, StoreVar(113));
+ assertEquals(113, LoadVar());
+ LoadStoreLoop();
+ assertEquals(13, LoadVar());
+
+ // Now reconfigure to accessor.
+ DefineRWAccessorProperty();
+ assertEquals(undefined, GetDescriptor().value);
+ assertEquals(true, GetDescriptor().configurable);
+ assertEquals(0, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ assertEquals(undefined, LoadVar());
+ assertEquals(1, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ LoadStoreLoop();
+ assertEquals(28, counters.get_count);
+ assertEquals(14, counters.set_count);
+
+ assertEquals(13, LoadVar());
+ assertEquals(29, counters.get_count);
+ assertEquals(14, counters.set_count);
+
+ TearDown();
+ })();
+
+
+ (function() {
+ SetUp();
+ cfg = {optimize: opt_cfg.optimize, strict: false};
+ ForceMutablePropertyCellType();
+ DefineLoadVar();
+ DefineStoreVar();
+ DefineRODataProperty();
+ assertEquals(42, LoadVar());
+ assertEquals(true, GetDescriptor().configurable);
+
+ DefineVar(153);
+
+ assertEquals(42, LoadVar());
+ assertEquals(113, StoreVar(113));
+ assertEquals(42, LoadVar());
+ LoadStoreLoop();
+ assertEquals(42, LoadVar());
+
+ // Now reconfigure to accessor property.
+ DefineRWAccessorProperty();
+ assertEquals(undefined, GetDescriptor().value);
+ assertEquals(true, GetDescriptor().configurable);
+ assertEquals(0, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ assertEquals(undefined, LoadVar());
+ assertEquals(1, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ LoadStoreLoop();
+ assertEquals(28, counters.get_count);
+ assertEquals(14, counters.set_count);
+
+ assertEquals(13, LoadVar());
+ assertEquals(29, counters.get_count);
+ assertEquals(14, counters.set_count);
+
+ TearDown();
+ })();
+
+
+ (function() {
+ SetUp();
+ cfg = {optimize: opt_cfg.optimize, strict: false};
+ ForceMutablePropertyCellType();
+ DefineLoadVar();
+ DefineStoreVar();
+ DefineRWAccessorProperty();
+ assertEquals(0, counters.get_count);
+ assertEquals(0, counters.set_count);
+ assertEquals(true, GetDescriptor().configurable);
+
+ assertEquals(undefined, LoadVar());
+ assertEquals(1, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ DefineVar(153);
+ assertEquals(true, GetDescriptor().configurable);
+ assertEquals(1, counters.get_count);
+ assertEquals(1, counters.set_count);
+
+ assertEquals(153, LoadVar());
+ assertEquals(2, counters.get_count);
+ assertEquals(1, counters.set_count);
+
+ assertEquals(113, StoreVar(113));
+ assertEquals(2, counters.get_count);
+ assertEquals(2, counters.set_count);
+
+ assertEquals(113, LoadVar());
+ assertEquals(3, counters.get_count);
+ assertEquals(2, counters.set_count);
+
+ LoadStoreLoop();
+ assertEquals(30, counters.get_count);
+ assertEquals(16, counters.set_count);
+
+ assertEquals(13, LoadVar());
+ assertEquals(31, counters.get_count);
+ assertEquals(16, counters.set_count);
+
+ // Now reconfigure to data property.
+ DefineRWDataProperty();
+ assertEquals(42, GetDescriptor().value);
+ assertEquals(42, LoadVar());
+ assertEquals(113, StoreVar(113));
+ assertEquals(31, counters.get_count);
+ assertEquals(16, counters.set_count);
+
+ TearDown();
+ })();
+
+
+ (function() {
+ SetUp();
+ cfg = {optimize: opt_cfg.optimize, strict: false};
+ ForceMutablePropertyCellType();
+ DefineLoadVar();
+ DefineStoreVar();
+ DefineROAccessorProperty();
+ assertEquals(0, counters.get_count);
+ assertEquals(0, counters.set_count);
+ assertEquals(true, GetDescriptor().configurable);
+
+ assertEquals(undefined, LoadVar());
+ assertEquals(1, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ SetX_(42);
+ assertEquals(42, LoadVar());
+ assertEquals(2, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ DefineVar(153);
+ assertEquals(true, GetDescriptor().configurable);
+ assertEquals(2, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ assertEquals(42, LoadVar());
+ assertEquals(3, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ assertEquals(113, StoreVar(113));
+ assertEquals(3, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ assertEquals(42, LoadVar());
+ assertEquals(4, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ LoadStoreLoop();
+ assertEquals(5, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ assertEquals(42, LoadVar());
+ assertEquals(6, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ // Now reconfigure to data property.
+ DefineRWDataProperty();
+ assertEquals(42, GetDescriptor().value);
+ assertEquals(42, LoadVar());
+ assertEquals(113, StoreVar(113));
+ assertEquals(6, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ TearDown();
+ })();
+
+
+ //
+ // Strict.
+ //
+
+ (function() {
+ SetUp();
+ cfg = {optimize: opt_cfg.optimize, strict: true};
+ DeclareVar();
+ DefineLoadVar();
+ DefineStoreVar();
+ assertEquals(undefined, LoadVar());
+ assertEquals(false, GetDescriptor().configurable);
+
+ // Force property cell type to kMutable.
+ DefineVar(undefined);
+ DefineVar(153);
+ assertEquals(false, GetDescriptor().configurable);
+
+ assertEquals(153, LoadVar());
+ assertEquals(113, StoreVar(113));
+ assertEquals(113, LoadVar());
+ LoadStoreLoop();
+ assertEquals(13, LoadVar());
+ TearDown();
+ })();
+
+
+ (function() {
+ SetUp();
+ cfg = {optimize: opt_cfg.optimize, strict: true};
+ ForceMutablePropertyCellType();
+ DefineLoadVar();
+ DefineStoreVar();
+ DefineRWDataProperty();
+ assertEquals(42, LoadVar());
+ assertEquals(true, GetDescriptor().configurable);
+
+ DefineVar(153);
+ assertEquals(true, GetDescriptor().configurable);
+
+ assertEquals(153, LoadVar());
+ assertEquals(113, StoreVar(113));
+ assertEquals(113, LoadVar());
+ LoadStoreLoop();
+ assertEquals(13, LoadVar());
+ TearDown();
+ })();
+
+
+ (function() {
+ SetUp();
+ cfg = {optimize: opt_cfg.optimize, strict: true};
+ ForceMutablePropertyCellType();
+ DefineLoadVar();
+ DefineStoreVar();
+ DefineRWDataProperty();
+ assertEquals(true, GetDescriptor().configurable);
+ assertEquals(true, GetDescriptor().writable);
+ assertEquals(113, StoreVar(113));
+
+ DefineRODataProperty();
+ assertEquals(true, GetDescriptor().configurable);
+ assertEquals(false, GetDescriptor().writable);
+
+ assertEquals(42, LoadVar());
+ assertEquals(true, GetDescriptor().configurable);
+ assertThrows('DefineVar(153)');
+ assertEquals(42, LoadVar());
+ assertThrows('StoreVar(113)');
+ assertThrows('StoreVar(113)');
+ assertEquals(42, LoadVar());
+ assertThrows('LoadStoreLoop()');
+ assertEquals(42, LoadVar());
+ TearDown();
+ })();
+
+
+ (function() {
+ SetUp();
+ cfg = {optimize: opt_cfg.optimize, strict: true};
+ ForceMutablePropertyCellType();
+ DefineLoadVar();
+ DefineStoreVar();
+ DefineRWAccessorProperty();
+ assertEquals(0, counters.get_count);
+ assertEquals(0, counters.set_count);
+ assertEquals(true, GetDescriptor().configurable);
+
+ assertEquals(undefined, LoadVar());
+ assertEquals(1, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ DefineVar(153);
+ assertEquals(true, GetDescriptor().configurable);
+ assertEquals(1, counters.get_count);
+ assertEquals(1, counters.set_count);
+
+ assertEquals(153, LoadVar());
+ assertEquals(2, counters.get_count);
+ assertEquals(1, counters.set_count);
+
+ assertEquals(113, StoreVar(113));
+ assertEquals(2, counters.get_count);
+ assertEquals(2, counters.set_count);
+
+ assertEquals(113, LoadVar());
+ assertEquals(3, counters.get_count);
+ assertEquals(2, counters.set_count);
+
+ LoadStoreLoop();
+ assertEquals(30, counters.get_count);
+ assertEquals(16, counters.set_count);
+
+ assertEquals(13, LoadVar());
+ assertEquals(31, counters.get_count);
+ assertEquals(16, counters.set_count);
+
+ // Now reconfigure to data property.
+ DefineRWDataProperty();
+ assertEquals(42, GetDescriptor().value);
+ assertEquals(42, LoadVar());
+ assertEquals(113, StoreVar(113));
+ assertEquals(31, counters.get_count);
+ assertEquals(16, counters.set_count);
+
+ TearDown();
+ })();
+
+
+ (function() {
+ SetUp();
+ cfg = {optimize: opt_cfg.optimize, strict: true};
+ ForceMutablePropertyCellType();
+ DefineLoadVar();
+ DefineStoreVar();
+ DefineROAccessorProperty();
+ assertEquals(0, counters.get_count);
+ assertEquals(0, counters.set_count);
+ assertEquals(true, GetDescriptor().configurable);
+
+ assertEquals(undefined, LoadVar());
+ assertEquals(1, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ SetX_(42);
+ assertEquals(42, LoadVar());
+ assertEquals(2, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ assertThrows('DefineVar(153)');
+ assertEquals(true, GetDescriptor().configurable);
+ assertEquals(2, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ assertEquals(42, LoadVar());
+ assertEquals(3, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ assertThrows('StoreVar(113)');
+ assertEquals(3, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ assertEquals(42, LoadVar());
+ assertEquals(4, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ assertThrows('LoadStoreLoop()');
+ assertEquals(4, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ assertEquals(42, LoadVar());
+ assertEquals(5, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ // Now reconfigure to data property.
+ DefineRWDataProperty();
+ assertEquals(42, GetDescriptor().value);
+ assertEquals(42, LoadVar());
+ assertEquals(113, StoreVar(113));
+ assertEquals(5, counters.get_count);
+ assertEquals(0, counters.set_count);
+
+ TearDown();
+ })();
+
+} // testSuite
+
+
+testSuite({optimize: false});
+testSuite({optimize: true});
« no previous file with comments | « src/x87/code-stubs-x87.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698