summaryrefslogtreecommitdiffstats
path: root/js/src/tests/ecma_3/extensions
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/ecma_3/extensions')
-rw-r--r--js/src/tests/ecma_3/extensions/10.1.3-2.js128
-rw-r--r--js/src/tests/ecma_3/extensions/7.9.1.js47
-rw-r--r--js/src/tests/ecma_3/extensions/browser.js0
-rw-r--r--js/src/tests/ecma_3/extensions/regress-103087.js144
-rw-r--r--js/src/tests/ecma_3/extensions/regress-188206-01.js74
-rw-r--r--js/src/tests/ecma_3/extensions/regress-188206-02.js124
-rw-r--r--js/src/tests/ecma_3/extensions/regress-220367-002.js78
-rw-r--r--js/src/tests/ecma_3/extensions/regress-228087.js318
-rw-r--r--js/src/tests/ecma_3/extensions/regress-274152.js48
-rw-r--r--js/src/tests/ecma_3/extensions/regress-320854.js20
-rw-r--r--js/src/tests/ecma_3/extensions/regress-327170.js25
-rw-r--r--js/src/tests/ecma_3/extensions/regress-368516.js45
-rw-r--r--js/src/tests/ecma_3/extensions/regress-385393-03.js30
-rw-r--r--js/src/tests/ecma_3/extensions/regress-430740.js39
-rw-r--r--js/src/tests/ecma_3/extensions/shell.js232
15 files changed, 1352 insertions, 0 deletions
diff --git a/js/src/tests/ecma_3/extensions/10.1.3-2.js b/js/src/tests/ecma_3/extensions/10.1.3-2.js
new file mode 100644
index 000000000..5bfd0046b
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/10.1.3-2.js
@@ -0,0 +1,128 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 11 Feb 2002
+ * SUMMARY: Testing functions having duplicate formal parameter names
+ *
+ * SpiderMonkey was crashing on each case below if the parameters had
+ * the same name. But duplicate parameter names are permitted by ECMA;
+ * see ECMA-262 3rd Edition Final Section 10.1.3
+ *
+ * NOTE: Rhino does not have toSource() and uneval(); they are non-ECMA
+ * extensions to the language. So we include a test for them at the beginning -
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = '(none)';
+var summary = 'Testing functions having duplicate formal parameter names';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+var OBJ = new Object();
+var OBJ_TYPE = OBJ.toString();
+
+/*
+ * Exit if the implementation doesn't support toSource() or uneval(),
+ * since these are non-ECMA extensions to the language -
+ */
+try
+{
+ if (!OBJ.toSource || !uneval(OBJ))
+ quit();
+}
+catch(e)
+{
+ quit();
+}
+
+
+/*
+ * OK, now begin the test. Just checking that we don't crash on these -
+ */
+function f1(x,x,x,x)
+{
+ var ret = eval(arguments.toSource());
+ return ret.toString();
+}
+status = inSection(1);
+actual = f1(1,2,3,4);
+expect = OBJ_TYPE;
+addThis();
+
+
+/*
+ * Same thing, but preface |arguments| with the function name
+ */
+function f2(x,x,x,x)
+{
+ var ret = eval(f2.arguments.toSource());
+ return ret.toString();
+}
+status = inSection(2);
+actual = f2(1,2,3,4);
+expect = OBJ_TYPE;
+addThis();
+
+
+function f3(x,x,x,x)
+{
+ var ret = eval(uneval(arguments));
+ return ret.toString();
+}
+status = inSection(3);
+actual = f3(1,2,3,4);
+expect = OBJ_TYPE;
+addThis();
+
+
+/*
+ * Same thing, but preface |arguments| with the function name
+ */
+function f4(x,x,x,x)
+{
+ var ret = eval(uneval(f4.arguments));
+ return ret.toString();
+}
+status = inSection(4);
+actual = f4(1,2,3,4);
+expect = OBJ_TYPE;
+addThis();
+
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ enterFunc('test');
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+
+ exitFunc ('test');
+}
diff --git a/js/src/tests/ecma_3/extensions/7.9.1.js b/js/src/tests/ecma_3/extensions/7.9.1.js
new file mode 100644
index 000000000..e6aa6f7fd
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/7.9.1.js
@@ -0,0 +1,47 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 402386;
+var summary = 'Automatic Semicolon insertion in restricted statements';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ enterFunc ('test');
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var code;
+
+ code = '(function() { label1: for (;;) { continue \n label1; }})';
+ actual = uneval(eval(code));
+ compareSource(code, actual, summary + ': ' + code);
+
+ code = '(function() { label2: for (;;) { break \n label2; }})';
+ actual = uneval(eval(code));
+ compareSource(code, actual, summary + ': ' + code);
+
+ code = '(function() { return \n x++; })';
+ actual = uneval(eval(code));
+ compareSource(code, actual, summary + ': ' + code);
+
+ print('see bug 256617');
+ code = '(function() { throw \n x++; })';
+// expect = '(function() { throw ; x++; })';
+ expect = 'SyntaxError: no line break is allowed between \'throw\' and its expression';
+ try { uneval(eval(code)); } catch(ex) { actual = ex + ''; };
+// compareSource(expect, actual, summary + ': ' + code);
+ reportCompare(expect, actual, summary + ': ' + code);
+
+ exitFunc ('test');
+}
+
diff --git a/js/src/tests/ecma_3/extensions/browser.js b/js/src/tests/ecma_3/extensions/browser.js
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/browser.js
diff --git a/js/src/tests/ecma_3/extensions/regress-103087.js b/js/src/tests/ecma_3/extensions/regress-103087.js
new file mode 100644
index 000000000..95895c0f9
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/regress-103087.js
@@ -0,0 +1,144 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 04 October 2001
+ *
+ * SUMMARY: Arose from Bugzilla bug 103087:
+ * "The RegExp MarkupSPE in demo crashes Mozilla"
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=103087
+ * The SpiderMonkey shell crashed on some of these regexps.
+ *
+ * The reported crash was on i=24 below ('MarkupSPE' regexp)
+ * I crashed on that, and also on i=43 ('XML_SPE' regexp)
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 103087;
+var summary = "Testing that we don't crash on any of these regexps -";
+var re = '';
+var lm = '';
+var lc = '';
+var rc = '';
+
+
+// the regexps are built in pieces -
+var NameStrt = "[A-Za-z_:]|[^\\x00-\\x7F]";
+var NameChar = "[A-Za-z0-9_:.-]|[^\\x00-\\x7F]";
+var Name = "(" + NameStrt + ")(" + NameChar + ")*";
+var TextSE = "[^<]+";
+var UntilHyphen = "[^-]*-";
+var Until2Hyphens = UntilHyphen + "([^-]" + UntilHyphen + ")*-";
+var CommentCE = Until2Hyphens + ">?";
+var UntilRSBs = "[^]]*]([^]]+])*]+";
+var CDATA_CE = UntilRSBs + "([^]>]" + UntilRSBs + ")*>";
+var S = "[ \\n\\t\\r]+";
+var QuoteSE = '"[^"]' + "*" + '"' + "|'[^']*'";
+var DT_IdentSE = S + Name + "(" + S + "(" + Name + "|" + QuoteSE + "))*";
+var MarkupDeclCE = "([^]\"'><]+|" + QuoteSE + ")*>";
+var S1 = "[\\n\\r\\t ]";
+var UntilQMs = "[^?]*\\?+";
+var PI_Tail = "\\?>|" + S1 + UntilQMs + "([^>?]" + UntilQMs + ")*>";
+var DT_ItemSE = "<(!(--" + Until2Hyphens + ">|[^-]" + MarkupDeclCE + ")|\\?" + Name + "(" + PI_Tail + "))|%" + Name + ";|" + S;
+var DocTypeCE = DT_IdentSE + "(" + S + ")?(\\[(" + DT_ItemSE + ")*](" + S + ")?)?>?";
+var DeclCE = "--(" + CommentCE + ")?|\\[CDATA\\[(" + CDATA_CE + ")?|DOCTYPE(" + DocTypeCE + ")?";
+var PI_CE = Name + "(" + PI_Tail + ")?";
+var EndTagCE = Name + "(" + S + ")?>?";
+var AttValSE = '"[^<"]' + "*" + '"' + "|'[^<']*'";
+var ElemTagCE = Name + "(" + S + Name + "(" + S + ")?=(" + S + ")?(" + AttValSE + "))*(" + S + ")?/?>?";
+var MarkupSPE = "<(!(" + DeclCE + ")?|\\?(" + PI_CE + ")?|/(" + EndTagCE + ")?|(" + ElemTagCE + ")?)";
+var XML_SPE = TextSE + "|" + MarkupSPE;
+var CommentRE = "<!--" + Until2Hyphens + ">";
+var CommentSPE = "<!--(" + CommentCE + ")?";
+var PI_RE = "<\\?" + Name + "(" + PI_Tail + ")";
+var Erroneous_PI_SE = "<\\?[^?]*(\\?[^>]+)*\\?>";
+var PI_SPE = "<\\?(" + PI_CE + ")?";
+var CDATA_RE = "<!\\[CDATA\\[" + CDATA_CE;
+var CDATA_SPE = "<!\\[CDATA\\[(" + CDATA_CE + ")?";
+var ElemTagSE = "<(" + NameStrt + ")([^<>\"']+|" + AttValSE + ")*>";
+var ElemTagRE = "<" + Name + "(" + S + Name + "(" + S + ")?=(" + S + ")?(" + AttValSE + "))*(" + S + ")?/?>";
+var ElemTagSPE = "<" + ElemTagCE;
+var EndTagRE = "</" + Name + "(" + S + ")?>";
+var EndTagSPE = "</(" + EndTagCE + ")?";
+var DocTypeSPE = "<!DOCTYPE(" + DocTypeCE + ")?";
+var PERef_APE = "%(" + Name + ";?)?";
+var HexPart = "x([0-9a-fA-F]+;?)?";
+var NumPart = "#([0-9]+;?|" + HexPart + ")?";
+var CGRef_APE = "&(" + Name + ";?|" + NumPart + ")?";
+var Text_PE = CGRef_APE + "|[^&]+";
+var EntityValue_PE = CGRef_APE + "|" + PERef_APE + "|[^%&]+";
+
+
+var rePatterns = new Array(AttValSE, CDATA_CE, CDATA_RE, CDATA_SPE, CGRef_APE, CommentCE, CommentRE, CommentSPE, DT_IdentSE, DT_ItemSE, DeclCE, DocTypeCE, DocTypeSPE, ElemTagCE, ElemTagRE, ElemTagSE, ElemTagSPE, EndTagCE, EndTagRE, EndTagSPE, EntityValue_PE, Erroneous_PI_SE, HexPart, MarkupDeclCE, MarkupSPE, Name, NameChar, NameStrt, NumPart, PERef_APE, PI_CE, PI_RE, PI_SPE, PI_Tail, QuoteSE, S, S1, TextSE, Text_PE, Until2Hyphens, UntilHyphen, UntilQMs, UntilRSBs, XML_SPE);
+
+
+// here's a big string to test the regexps on -
+var str = '';
+str += '<html xmlns="http://www.w3.org/1999/xhtml"' + '\n';
+str += ' xmlns:xlink="http://www.w3.org/XML/XLink/0.9">' + '\n';
+str += ' <head><title>Three Namespaces</title></head>' + '\n';
+str += ' <body>' + '\n';
+str += ' <h1 align="center">An Ellipse and a Rectangle</h1>' + '\n';
+str += ' <svg xmlns="http://www.w3.org/Graphics/SVG/SVG-19991203.dtd" ' + '\n';
+str += ' width="12cm" height="10cm">' + '\n';
+str += ' <ellipse rx="110" ry="130" />' + '\n';
+str += ' <rect x="4cm" y="1cm" width="3cm" height="6cm" />' + '\n';
+str += ' </svg>' + '\n';
+str += ' <p xlink:type="simple" xlink:href="ellipses.html">' + '\n';
+str += ' More about ellipses' + '\n';
+str += ' </p>' + '\n';
+str += ' <p xlink:type="simple" xlink:href="rectangles.html">' + '\n';
+str += ' More about rectangles' + '\n';
+str += ' </p>' + '\n';
+str += ' <hr/>' + '\n';
+str += ' <p>Last Modified February 13, 2000</p> ' + '\n';
+str += ' </body>' + '\n';
+str += '</html>';
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function test()
+{
+ enterFunc ('test');
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ for (var i=0; i<rePatterns.length; i++)
+ {
+ status = inSection(i);
+ re = new RegExp(rePatterns[i]);
+
+ // Test that we don't crash on any of these -
+ re.exec(str);
+ getResults();
+
+ // Just for the heck of it, test the current leftContext
+ re.exec(lc);
+ getResults();
+
+ // Test the current rightContext
+ re.exec(rc);
+ getResults();
+ }
+
+ reportCompare('No Crash', 'No Crash', '');
+
+ exitFunc ('test');
+}
+
+
+function getResults()
+{
+ lm = RegExp.lastMatch;
+ lc = RegExp.leftContext;
+ rc = RegExp.rightContext;
+}
diff --git a/js/src/tests/ecma_3/extensions/regress-188206-01.js b/js/src/tests/ecma_3/extensions/regress-188206-01.js
new file mode 100644
index 000000000..b53260a80
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/regress-188206-01.js
@@ -0,0 +1,74 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 188206;
+var summary = 'Invalid use of regexp quantifiers should generate SyntaxErrors';
+var TEST_PASSED = 'SyntaxError';
+var TEST_FAILED = 'Generated an error, but NOT a SyntaxError!';
+var TEST_FAILED_BADLY = 'Did not generate ANY error!!!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Now do some weird things on the left side of the regexps -
+ */
+status = inSection(7);
+testThis(' /*a/ ');
+
+status = inSection(8);
+testThis(' /**a/ ');
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+/*
+ * Invalid syntax should generate a SyntaxError
+ */
+function testThis(sInvalidSyntax)
+{
+ expect = TEST_PASSED;
+ actual = TEST_FAILED_BADLY;
+
+ try
+ {
+ eval(sInvalidSyntax);
+ }
+ catch(e)
+ {
+ if (e instanceof SyntaxError)
+ actual = TEST_PASSED;
+ else
+ actual = TEST_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ enterFunc('test');
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+
+ exitFunc ('test');
+}
diff --git a/js/src/tests/ecma_3/extensions/regress-188206-02.js b/js/src/tests/ecma_3/extensions/regress-188206-02.js
new file mode 100644
index 000000000..ced5dd327
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/regress-188206-02.js
@@ -0,0 +1,124 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 188206;
+var summary = 'Invalid use of regexp quantifiers should generate SyntaxErrors';
+var CHECK_PASSED = 'Should not generate an error';
+var CHECK_FAILED = 'Generated an error!';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+
+/*
+ * Misusing the {DecmalDigits} quantifier - according to ECMA,
+ * but not according to Perl.
+ *
+ * ECMA-262 Edition 3 prohibits the use of unescaped braces in
+ * regexp patterns, unless they form part of a quantifier.
+ *
+ * Hovever, Perl does not prohibit this. If not used as part
+ * of a quantifer, Perl treats braces literally.
+ *
+ * We decided to follow Perl on this for backward compatibility.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=190685.
+ *
+ * Therefore NONE of the following ECMA violations should generate
+ * a SyntaxError. Note we use checkThis() instead of testThis().
+ */
+status = inSection(13);
+checkThis(' /a*{/ ');
+
+status = inSection(14);
+checkThis(' /a{}/ ');
+
+status = inSection(15);
+checkThis(' /{a/ ');
+
+status = inSection(16);
+checkThis(' /}a/ ');
+
+status = inSection(17);
+checkThis(' /x{abc}/ ');
+
+status = inSection(18);
+checkThis(' /{{0}/ ');
+
+status = inSection(19);
+checkThis(' /{{1}/ ');
+
+status = inSection(20);
+checkThis(' /x{{0}/ ');
+
+status = inSection(21);
+checkThis(' /x{{1}/ ');
+
+status = inSection(22);
+checkThis(' /x{{0}}/ ');
+
+status = inSection(23);
+checkThis(' /x{{1}}/ ');
+
+status = inSection(24);
+checkThis(' /x{{0}}/ ');
+
+status = inSection(25);
+checkThis(' /x{{1}}/ ');
+
+status = inSection(26);
+checkThis(' /x{{0}}/ ');
+
+status = inSection(27);
+checkThis(' /x{{1}}/ ');
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+/*
+ * Allowed syntax shouldn't generate any errors
+ */
+function checkThis(sAllowedSyntax)
+{
+ expect = CHECK_PASSED;
+ actual = CHECK_PASSED;
+
+ try
+ {
+ eval(sAllowedSyntax);
+ }
+ catch(e)
+ {
+ actual = CHECK_FAILED;
+ }
+
+ statusitems[UBound] = status;
+ expectedvalues[UBound] = expect;
+ actualvalues[UBound] = actual;
+ UBound++;
+}
+
+
+function test()
+{
+ enterFunc('test');
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+
+ exitFunc ('test');
+}
diff --git a/js/src/tests/ecma_3/extensions/regress-220367-002.js b/js/src/tests/ecma_3/extensions/regress-220367-002.js
new file mode 100644
index 000000000..be83c1d92
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/regress-220367-002.js
@@ -0,0 +1,78 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 26 September 2003
+ * SUMMARY: Regexp conformance test
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=220367
+ *
+ */
+//-----------------------------------------------------------------------------
+var UBound = 0;
+var BUGNUMBER = 220367;
+var summary = 'Regexp conformance test';
+var status = '';
+var statusitems = [];
+var actual = '';
+var actualvalues = [];
+var expect= '';
+var expectedvalues = [];
+
+var re = /(a)|(b)/;
+
+re.test('a');
+status = inSection(1);
+actual = RegExp.$1;
+expect = 'a';
+addThis();
+
+status = inSection(2);
+actual = RegExp.$2;
+expect = '';
+addThis();
+
+re.test('b');
+status = inSection(3);
+actual = RegExp.$1;
+expect = '';
+addThis();
+
+status = inSection(4);
+actual = RegExp.$2;
+expect = 'b';
+addThis();
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusitems[UBound] = status;
+ actualvalues[UBound] = actual;
+ expectedvalues[UBound] = expect;
+ UBound++;
+}
+
+
+function test()
+{
+ enterFunc('test');
+ printBugNumber(BUGNUMBER);
+ printStatus(summary);
+
+ for (var i=0; i<UBound; i++)
+ {
+ reportCompare(expectedvalues[i], actualvalues[i], statusitems[i]);
+ }
+
+ exitFunc ('test');
+}
diff --git a/js/src/tests/ecma_3/extensions/regress-228087.js b/js/src/tests/ecma_3/extensions/regress-228087.js
new file mode 100644
index 000000000..94473abc0
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/regress-228087.js
@@ -0,0 +1,318 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+/* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ *
+ * Date: 12 December 2003
+ * SUMMARY: Testing regexps with unescaped braces
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=228087
+ *
+ * Note: unbalanced, unescaped braces are not permitted by ECMA-262 Ed.3,
+ * but we decided to follow Perl and IE and allow this for compatibility.
+ *
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=188206 and its testcase.
+ * See http://bugzilla.mozilla.org/show_bug.cgi?id=223273 and its testcase.
+ */
+//-----------------------------------------------------------------------------
+var i = 0;
+var BUGNUMBER = 228087;
+var summary = 'Testing regexps with unescaped braces';
+var status = '';
+var statusmessages = new Array();
+var pattern = '';
+var patterns = new Array();
+var string = '';
+var strings = new Array();
+var actualmatch = '';
+var actualmatches = new Array();
+var expectedmatch = '';
+var expectedmatches = new Array();
+var e;
+
+
+string = 'foo {1} foo {2} foo';
+
+// try an example with the braces escaped
+status = inSection(1);
+try
+{
+ pattern = new RegExp('\{1.*\}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1} foo {2}');
+addThis();
+
+// just like Section 1, without the braces being escaped
+status = inSection(2);
+try
+{
+ pattern = new RegExp('{1.*}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1} foo {2}');
+addThis();
+
+// try an example with the braces escaped
+status = inSection(3);
+try
+{
+ pattern = new RegExp('\{1[.!\}]*\}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1}');
+addThis();
+
+// just like Section 3, without the braces being escaped
+status = inSection(4);
+try
+{
+ pattern = new RegExp('{1[.!}]*}', 'g');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('{1}');
+addThis();
+
+
+string = 'abccccc{3 }c{ 3}c{3, }c{3 ,}c{3 ,4}c{3, 4}c{3,4 }de';
+
+// use braces in a normal quantifier construct
+status = inSection(5);
+try
+{
+ pattern = new RegExp('c{3}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('ccc');
+addThis();
+
+// now disrupt the quantifer - the braces should now be interpreted literally
+status = inSection(6);
+try
+{
+ pattern = new RegExp('c{3 }');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(7);
+try
+{
+ pattern = new RegExp('c{3.}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(8);
+try
+{
+ // need to escape the \ in \s since
+ // this has been converted to a constructor call
+ // instead of a literal regexp
+ pattern = new RegExp('c{3\\s}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(9);
+try
+{
+ pattern = new RegExp('c{3[ ]}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 }');
+addThis();
+
+status = inSection(10);
+try
+{
+ pattern = new RegExp('c{ 3}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{ 3}');
+addThis();
+
+// using braces in a normal quantifier construct again
+status = inSection(11);
+try
+{
+ pattern = new RegExp('c{3,}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('ccccc');
+addThis();
+
+// now disrupt it - the braces should now be interpreted literally
+status = inSection(12);
+try
+{
+ pattern = new RegExp('c{3, }');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3, }');
+addThis();
+
+status = inSection(13);
+try
+{
+ pattern = new RegExp('c{3 ,}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 ,}');
+addThis();
+
+// using braces in a normal quantifier construct again
+status = inSection(14);
+try
+{
+ pattern = new RegExp('c{3,4}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('cccc');
+addThis();
+
+// now disrupt it - the braces should now be interpreted literally
+status = inSection(15);
+try
+{
+ pattern = new RegExp('c{3 ,4}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3 ,4}');
+addThis();
+
+status = inSection(16);
+try
+{
+ pattern = new RegExp('c{3, 4}');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3, 4}');
+addThis();
+
+status = inSection(17);
+try
+{
+ pattern = new RegExp('c{3,4 }');
+ actualmatch = string.match(pattern);
+}
+catch (e)
+{
+ pattern = 'error';
+ actualmatch = '';
+}
+expectedmatch = Array('c{3,4 }');
+addThis();
+
+
+
+
+//-------------------------------------------------------------------------------------------------
+test();
+//-------------------------------------------------------------------------------------------------
+
+
+
+function addThis()
+{
+ statusmessages[i] = status;
+ patterns[i] = pattern;
+ strings[i] = string;
+ actualmatches[i] = actualmatch;
+ expectedmatches[i] = expectedmatch;
+ i++;
+}
+
+
+function test()
+{
+ enterFunc ('test');
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+ testRegExp(statusmessages, patterns, strings, actualmatches, expectedmatches);
+ exitFunc ('test');
+}
diff --git a/js/src/tests/ecma_3/extensions/regress-274152.js b/js/src/tests/ecma_3/extensions/regress-274152.js
new file mode 100644
index 000000000..03ad2833b
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/regress-274152.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 274152;
+var summary = 'Do not ignore unicode format-control characters';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ enterFunc ('test');
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ expect = 'SyntaxError: illegal character';
+
+ var formatcontrolchars = ['\u200E',
+ '\u0600',
+ '\u0601',
+ '\u0602',
+ '\u0603',
+ '\u06DD',
+ '\u070F'];
+
+ for (var i = 0; i < formatcontrolchars.length; i++)
+ {
+ try
+ {
+ eval("hi" + formatcontrolchars[i] + "there = 'howdie';");
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': ' + i);
+ }
+
+ exitFunc ('test');
+}
diff --git a/js/src/tests/ecma_3/extensions/regress-320854.js b/js/src/tests/ecma_3/extensions/regress-320854.js
new file mode 100644
index 000000000..8486924d6
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/regress-320854.js
@@ -0,0 +1,20 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 320854;
+var summary = 'o.hasOwnProperty("length") should not lie when o has function in proto chain';
+var actual = '';
+var expect = '';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var o = {__proto__:function(){}};
+
+expect = false;
+actual = o.hasOwnProperty('length')
+
+ reportCompare(expect, actual, summary);
diff --git a/js/src/tests/ecma_3/extensions/regress-327170.js b/js/src/tests/ecma_3/extensions/regress-327170.js
new file mode 100644
index 000000000..f9f63be4b
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/regress-327170.js
@@ -0,0 +1,25 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 327170;
+var summary = 'Reuse of RegExp in string.replace(rx.compile(...), function() { rx.compile(...); }) causes a crash';
+var actual = 'No Crash';
+var expect = 'No Crash';
+
+printBugNumber(BUGNUMBER);
+printStatus (summary);
+
+var g_rx = /(?:)/;
+
+"this is a test-string".replace(g_rx.compile("test", "g"),
+ function()
+ {
+ // re-use of the g_rx RegExp object,
+ // that's currently in use by the replace fn.
+ g_rx.compile("string", "g");
+ });
+
+reportCompare(expect, actual, summary);
diff --git a/js/src/tests/ecma_3/extensions/regress-368516.js b/js/src/tests/ecma_3/extensions/regress-368516.js
new file mode 100644
index 000000000..8db195d8d
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/regress-368516.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 368516;
+var summary = 'Treat unicode BOM characters as whitespace';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ enterFunc ('test');
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ var bomchars = ['\uFFFE',
+ '\uFEFF'];
+
+ for (var i = 0; i < bomchars.length; i++)
+ {
+ expect = 'howdie';
+ actual = '';
+
+ try
+ {
+ eval("var" + bomchars[i] + "hithere = 'howdie';");
+ actual = hithere;
+ }
+ catch(ex)
+ {
+ actual = ex + '';
+ }
+
+ reportCompare(expect, actual, summary + ': ' + i);
+ }
+
+ exitFunc ('test');
+}
diff --git a/js/src/tests/ecma_3/extensions/regress-385393-03.js b/js/src/tests/ecma_3/extensions/regress-385393-03.js
new file mode 100644
index 000000000..17fdcf2da
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/regress-385393-03.js
@@ -0,0 +1,30 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 385393;
+var summary = 'Regression test for bug 385393';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ enterFunc ('test');
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ f = (function() { new (delete y) });
+ eval(uneval(f))
+
+ reportCompare(expect, actual, summary);
+
+ exitFunc ('test');
+}
diff --git a/js/src/tests/ecma_3/extensions/regress-430740.js b/js/src/tests/ecma_3/extensions/regress-430740.js
new file mode 100644
index 000000000..a4ad35341
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/regress-430740.js
@@ -0,0 +1,39 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+//-----------------------------------------------------------------------------
+var BUGNUMBER = 430740;
+var summary = 'Do not strip format-control characters from string literals';
+var actual = '';
+var expect = '';
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+function test()
+{
+ enterFunc ('test');
+ printBugNumber(BUGNUMBER);
+ printStatus (summary);
+
+ function doevil() {
+ print('evildone');
+ return 'evildone';
+ }
+
+ expect = 'a%E2%80%8D,+doevil()%5D)//';
+ actual += eval("(['a\\\u200d', '+doevil()])//'])");
+ actual = encodeURI(actual);
+ reportCompare(expect, actual, summary);
+
+ expect = 'a%EF%BF%BE,+doevil()%5D)//';
+ actual = eval("(['a\\\ufffe', '+doevil()])//'])");
+ actual = encodeURI(actual);
+ reportCompare(expect, actual, summary);
+
+ exitFunc ('test');
+}
diff --git a/js/src/tests/ecma_3/extensions/shell.js b/js/src/tests/ecma_3/extensions/shell.js
new file mode 100644
index 000000000..857d06c3e
--- /dev/null
+++ b/js/src/tests/ecma_3/extensions/shell.js
@@ -0,0 +1,232 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/*
+ * Date: 07 February 2001
+ *
+ * Functionality common to RegExp testing -
+ */
+//-----------------------------------------------------------------------------
+
+
+var MSG_PATTERN = '\nregexp = ';
+var MSG_STRING = '\nstring = ';
+var MSG_EXPECT = '\nExpect: ';
+var MSG_ACTUAL = '\nActual: ';
+var ERR_LENGTH = '\nERROR !!! match arrays have different lengths:';
+var ERR_MATCH = '\nERROR !!! regexp failed to give expected match array:';
+var ERR_NO_MATCH = '\nERROR !!! regexp FAILED to match anything !!!';
+var ERR_UNEXP_MATCH = '\nERROR !!! regexp MATCHED when we expected it to fail !!!';
+var CHAR_LBRACKET = '[';
+var CHAR_RBRACKET = ']';
+var CHAR_QT_DBL = '"';
+var CHAR_QT = "'";
+var CHAR_NL = '\n';
+var CHAR_COMMA = ',';
+var CHAR_SPACE = ' ';
+var TYPE_STRING = typeof 'abc';
+
+
+
+function testRegExp(statuses, patterns, strings, actualmatches, expectedmatches)
+{
+ var status = '';
+ var pattern = new RegExp();
+ var string = '';
+ var actualmatch = new Array();
+ var expectedmatch = new Array();
+ var state = '';
+ var lActual = -1;
+ var lExpect = -1;
+
+
+ for (var i=0; i != patterns.length; i++)
+ {
+ status = statuses[i];
+ pattern = patterns[i];
+ string = strings[i];
+ actualmatch=actualmatches[i];
+ expectedmatch=expectedmatches[i];
+ state = getState(status, pattern, string);
+
+ description = status;
+
+ if(actualmatch)
+ {
+ actual = formatArray(actualmatch);
+ if(expectedmatch)
+ {
+ // expectedmatch and actualmatch are arrays -
+ lExpect = expectedmatch.length;
+ lActual = actualmatch.length;
+
+ var expected = formatArray(expectedmatch);
+
+ if (lActual != lExpect)
+ {
+ reportCompare(lExpect, lActual,
+ state + ERR_LENGTH +
+ MSG_EXPECT + expected +
+ MSG_ACTUAL + actual +
+ CHAR_NL
+ );
+ continue;
+ }
+
+ // OK, the arrays have same length -
+ if (expected != actual)
+ {
+ reportCompare(expected, actual,
+ state + ERR_MATCH +
+ MSG_EXPECT + expected +
+ MSG_ACTUAL + actual +
+ CHAR_NL
+ );
+ }
+ else
+ {
+ reportCompare(expected, actual, state)
+ }
+
+ }
+ else //expectedmatch is null - that is, we did not expect a match -
+ {
+ expected = expectedmatch;
+ reportCompare(expected, actual,
+ state + ERR_UNEXP_MATCH +
+ MSG_EXPECT + expectedmatch +
+ MSG_ACTUAL + actual +
+ CHAR_NL
+ );
+ }
+
+ }
+ else // actualmatch is null
+ {
+ if (expectedmatch)
+ {
+ actual = actualmatch;
+ reportCompare(expected, actual,
+ state + ERR_NO_MATCH +
+ MSG_EXPECT + expectedmatch +
+ MSG_ACTUAL + actualmatch +
+ CHAR_NL
+ );
+ }
+ else // we did not expect a match
+ {
+ // Being ultra-cautious. Presumably expectedmatch===actualmatch===null
+ expected = expectedmatch;
+ actual = actualmatch;
+ reportCompare (expectedmatch, actualmatch, state);
+ }
+ }
+ }
+}
+
+
+function getState(status, pattern, string)
+{
+ /*
+ * Escape \n's, etc. to make them LITERAL in the presentation string.
+ * We don't have to worry about this in |pattern|; such escaping is
+ * done automatically by pattern.toString(), invoked implicitly below.
+ *
+ * One would like to simply do: string = string.replace(/(\s)/g, '\$1').
+ * However, the backreference $1 is not a literal string value,
+ * so this method doesn't work.
+ *
+ * Also tried string = string.replace(/(\s)/g, escape('$1'));
+ * but this just inserts the escape of the literal '$1', i.e. '%241'.
+ */
+ string = string.replace(/\n/g, '\\n');
+ string = string.replace(/\r/g, '\\r');
+ string = string.replace(/\t/g, '\\t');
+ string = string.replace(/\v/g, '\\v');
+ string = string.replace(/\f/g, '\\f');
+
+ return (status + MSG_PATTERN + pattern + MSG_STRING + singleQuote(string));
+}
+
+
+/*
+ * If available, arr.toSource() gives more detail than arr.toString()
+ *
+ * var arr = Array(1,2,'3');
+ *
+ * arr.toSource()
+ * [1, 2, "3"]
+ *
+ * arr.toString()
+ * 1,2,3
+ *
+ * But toSource() doesn't exist in Rhino, so use our own imitation, below -
+ *
+ */
+function formatArray(arr)
+{
+ try
+ {
+ return arr.toSource();
+ }
+ catch(e)
+ {
+ return toSource(arr);
+ }
+}
+
+
+/*
+ * Imitate SpiderMonkey's arr.toSource() method:
+ *
+ * a) Double-quote each array element that is of string type
+ * b) Represent |undefined| and |null| by empty strings
+ * c) Delimit elements by a comma + single space
+ * d) Do not add delimiter at the end UNLESS the last element is |undefined|
+ * e) Add square brackets to the beginning and end of the string
+ */
+function toSource(arr)
+{
+ var delim = CHAR_COMMA + CHAR_SPACE;
+ var elt = '';
+ var ret = '';
+ var len = arr.length;
+
+ for (i=0; i<len; i++)
+ {
+ elt = arr[i];
+
+ switch(true)
+ {
+ case (typeof elt === TYPE_STRING) :
+ ret += doubleQuote(elt);
+ break;
+
+ case (elt === undefined || elt === null) :
+ break; // add nothing but the delimiter, below -
+
+ default:
+ ret += elt.toString();
+ }
+
+ if ((i < len-1) || (elt === undefined))
+ ret += delim;
+ }
+
+ return CHAR_LBRACKET + ret + CHAR_RBRACKET;
+}
+
+
+function doubleQuote(text)
+{
+ return CHAR_QT_DBL + text + CHAR_QT_DBL;
+}
+
+
+function singleQuote(text)
+{
+ return CHAR_QT + text + CHAR_QT;
+}
+