1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/ecma_5/RegExp/instance-property-storage-introspection.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,153 @@ 1.4 +/* 1.5 + * Any copyright is dedicated to the Public Domain. 1.6 + * http://creativecommons.org/licenses/publicdomain/ 1.7 + */ 1.8 + 1.9 +var BUGNUMBER = 640072; 1.10 +var summary = 1.11 + "Represent /a/.{lastIndex,global,source,multiline,sticky,ignoreCase} with " + 1.12 + "plain old data properties"; 1.13 + 1.14 +print(BUGNUMBER + ": " + summary); 1.15 + 1.16 +/************** 1.17 + * BEGIN TEST * 1.18 + **************/ 1.19 + 1.20 +function checkDataProperty(obj, p, expect, msg) 1.21 +{ 1.22 + var d = Object.getOwnPropertyDescriptor(obj, p); 1.23 + 1.24 + assertEq(d.value, expect.value, msg + ": bad value for " + p); 1.25 + assertEq(d.writable, expect.writable, msg + ": bad writable for " + p); 1.26 + assertEq(d.enumerable, expect.enumerable, msg + ": bad enumerable for " + p); 1.27 + assertEq(d.configurable, expect.configurable, msg + ": bad configurable for " + p); 1.28 + 1.29 + // Try redefining the property using its initial values: these should all be 1.30 + // silent no-ops. 1.31 + Object.defineProperty(obj, p, { value: expect.value }); 1.32 + Object.defineProperty(obj, p, { writable: expect.writable }); 1.33 + Object.defineProperty(obj, p, { enumerable: expect.enumerable }); 1.34 + Object.defineProperty(obj, p, { configurable: expect.configurable }); 1.35 + 1.36 + var d2 = Object.getOwnPropertyDescriptor(obj, p); 1.37 + assertEq(d.value, d2.value, msg + ": value changed on redefinition of " + p + "?"); 1.38 + assertEq(d.writable, d2.writable, msg + ": writable changed on redefinition of " + p + "?"); 1.39 + assertEq(d.enumerable, d2.enumerable, msg + ": enumerable changed on redefinition of " + p + "?"); 1.40 + assertEq(d.configurable, d2.configurable, msg + ": configurable changed on redefinition of " + p + "?"); 1.41 +} 1.42 + 1.43 + 1.44 +// Check a bunch of "empty" regular expressions first. 1.45 + 1.46 +var choices = [{ msg: "RegExp.prototype", 1.47 + get: function() { return RegExp.prototype; } }, 1.48 + { msg: "new RegExp()", 1.49 + get: function() { return new RegExp(); } }, 1.50 + { msg: "/(?:)/", 1.51 + get: Function("return /(?:)/;") }]; 1.52 + 1.53 +function checkRegExp(r, msg, lastIndex, global, ignoreCase, multiline) 1.54 +{ 1.55 + var expect; 1.56 + 1.57 + expect = { value: lastIndex, enumerable: false, configurable: false, writable: true }; 1.58 + checkDataProperty(r, "lastIndex", expect, msg); 1.59 + 1.60 + // check source specially: its value is under-defined in the spec 1.61 + var d = Object.getOwnPropertyDescriptor(r, "source"); 1.62 + assertEq(d.writable, false, "bad writable: " + msg); 1.63 + assertEq(d.enumerable, false, "bad enumerable: " + msg); 1.64 + assertEq(d.configurable, false, "bad configurable: " + msg); 1.65 + 1.66 + expect = { value: global, enumerable: false, configurable: false, writable: false }; 1.67 + checkDataProperty(r, "global", expect, msg); 1.68 + 1.69 + expect = { value: ignoreCase, enumerable: false, configurable: false, writable: false }; 1.70 + checkDataProperty(r, "ignoreCase", expect, msg); 1.71 + 1.72 + expect = { value: multiline, enumerable: false, configurable: false, writable: false }; 1.73 + checkDataProperty(r, "multiline", expect, msg); 1.74 +} 1.75 + 1.76 +checkRegExp(RegExp.prototype, "RegExp.prototype", 0, false, false, false); 1.77 +checkRegExp(new RegExp(), "new RegExp()", 0, false, false, false); 1.78 +checkRegExp(/(?:)/, "/(?:)/", 0, false, false, false); 1.79 +checkRegExp(Function("return /(?:)/;")(), 'Function("return /(?:)/;")()', 0, false, false, false); 1.80 + 1.81 +for (var i = 0; i < choices.length; i++) 1.82 +{ 1.83 + var choice = choices[i]; 1.84 + var msg = choice.msg; 1.85 + var r = choice.get(); 1.86 + 1.87 + checkRegExp(r, msg, 0, false, false, false); 1.88 +} 1.89 + 1.90 +// Now test less generic regular expressions 1.91 + 1.92 +checkRegExp(/a/gim, "/a/gim", 0, true, true, true); 1.93 + 1.94 +var r; 1.95 + 1.96 +do 1.97 +{ 1.98 + r = /abcd/mg; 1.99 + checkRegExp(r, "/abcd/mg initially", 0, true, false, true); 1.100 + r.exec("abcdefg"); 1.101 + checkRegExp(r, "/abcd/mg step 1", 4, true, false, true); 1.102 + r.exec("abcdabcd"); 1.103 + checkRegExp(r, "/abcd/mg step 2", 8, true, false, true); 1.104 + r.exec("abcdabcd"); 1.105 + checkRegExp(r, "/abcd/mg end", 0, true, false, true); 1.106 + 1.107 + r = /cde/ig; 1.108 + checkRegExp(r, "/cde/ig initially", 0, true, true, false); 1.109 + var obj = r.lastIndex = { valueOf: function() { return 2; } }; 1.110 + checkRegExp(r, "/cde/ig after lastIndex", obj, true, true, false); 1.111 + r.exec("aaacdef"); 1.112 + checkRegExp(r, "/cde/ig after exec", 6, true, true, false); 1.113 + Object.defineProperty(r, "lastIndex", { value: 3 }); 1.114 + checkRegExp(r, "/cde/ig after define 3", 3, true, true, false); 1.115 + Object.defineProperty(r, "lastIndex", { value: obj }); 1.116 + checkRegExp(r, "/cde/ig after lastIndex", obj, true, true, false); 1.117 + 1.118 + 1.119 + // Tricky bits of testing: make sure that redefining lastIndex doesn't change 1.120 + // the slot where the lastIndex property is initially stored, even if 1.121 + // the redefinition also changes writability. 1.122 + r = /a/g; 1.123 + checkRegExp(r, "/a/g initially", 0, true, false, false); 1.124 + Object.defineProperty(r, "lastIndex", { value: 2 }); 1.125 + r.exec("aabbbba"); 1.126 + checkRegExp(r, "/a/g after first exec", 7, true, false, false); 1.127 + assertEq(r.lastIndex, 7); 1.128 + r.lastIndex = 2; 1.129 + checkRegExp(r, "/a/g after assign", 2, true, false, false); 1.130 + r.exec("aabbbba"); 1.131 + assertEq(r.lastIndex, 7); // check in reverse order 1.132 + checkRegExp(r, "/a/g after second exec", 7, true, false, false); 1.133 + 1.134 + r = /c/g; 1.135 + r.lastIndex = 2; 1.136 + checkRegExp(r, "/c/g initially", 2, true, false, false); 1.137 + Object.defineProperty(r, "lastIndex", { writable: false }); 1.138 + assertEq(Object.getOwnPropertyDescriptor(r, "lastIndex").writable, false); 1.139 + try { r.exec("aabbbba"); } catch (e) { /* swallow error if thrown */ } 1.140 + assertEq(Object.getOwnPropertyDescriptor(r, "lastIndex").writable, false); 1.141 + assertEq(Object.getOwnPropertyDescriptor(r, "source").writable, false); 1.142 + assertEq(Object.getOwnPropertyDescriptor(r, "global").value, true); 1.143 + assertEq(Object.getOwnPropertyDescriptor(r, "global").writable, false); 1.144 + assertEq(Object.getOwnPropertyDescriptor(r, "ignoreCase").value, false); 1.145 + assertEq(Object.getOwnPropertyDescriptor(r, "ignoreCase").writable, false); 1.146 + assertEq(Object.getOwnPropertyDescriptor(r, "multiline").value, false); 1.147 + assertEq(Object.getOwnPropertyDescriptor(r, "multiline").writable, false); 1.148 +} 1.149 +while (Math.random() > 17); // fake loop to discourage RegExp object caching 1.150 + 1.151 +/******************************************************************************/ 1.152 + 1.153 +if (typeof reportCompare === "function") 1.154 + reportCompare(true, true); 1.155 + 1.156 +print("All tests passed!");