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}); |