From 2642e75e1e5feaef49f3cf1703053a742c6eff7a Mon Sep 17 00:00:00 2001 From: Jason Orendorff Date: Thu, 1 Mar 2012 09:01:45 -0600 Subject: [PATCH] Reflect.parse("[,,,]") should make an ArrayExpression with .elements.length 3. Bug 630232, r=dherman. --- js/src/jsreflect.cpp | 8 ++++++-- js/src/tests/js1_8_5/extensions/reflect-parse.js | 15 ++++++++------- js/src/tests/js1_8_5/extensions/shell.js | 3 +++ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/js/src/jsreflect.cpp b/js/src/jsreflect.cpp index 66ce40757a8..bf06fb1e644 100644 --- a/js/src/jsreflect.cpp +++ b/js/src/jsreflect.cpp @@ -639,11 +639,15 @@ NodeBuilder::newNode(ASTType type, TokenPos *pos, JSObject **dst) bool NodeBuilder::newArray(NodeVector &elts, Value *dst) { - JSObject *array = NewDenseEmptyArray(cx); + const size_t len = elts.length(); + if (len > UINT32_MAX) { + js_ReportAllocationOverflow(cx); + return false; + } + JSObject *array = NewDenseAllocatedArray(cx, uint32_t(len)); if (!array) return false; - const size_t len = elts.length(); for (size_t i = 0; i < len; i++) { Value val = elts[i]; diff --git a/js/src/tests/js1_8_5/extensions/reflect-parse.js b/js/src/tests/js1_8_5/extensions/reflect-parse.js index 8406708b702..fef2b352ac1 100644 --- a/js/src/tests/js1_8_5/extensions/reflect-parse.js +++ b/js/src/tests/js1_8_5/extensions/reflect-parse.js @@ -312,10 +312,10 @@ assertExpr("[1,,,2,,,3]", arrExpr([lit(1),,,lit(2),,,lit(3)])); assertExpr("[,1,2,3]", arrExpr([,lit(1),lit(2),lit(3)])); assertExpr("[,,1,2,3]", arrExpr([,,lit(1),lit(2),lit(3)])); assertExpr("[,,,1,2,3]", arrExpr([,,,lit(1),lit(2),lit(3)])); -assertExpr("[,,,1,2,3,]", arrExpr([,,,lit(1),lit(2),lit(3)])); -assertExpr("[,,,1,2,3,,]", arrExpr([,,,lit(1),lit(2),lit(3),])); -assertExpr("[,,,1,2,3,,,]", arrExpr([,,,lit(1),lit(2),lit(3),,])); -assertExpr("[,,,,,]", arrExpr([,,,,])); +assertExpr("[,,,1,2,3,]", arrExpr([,,,lit(1),lit(2),lit(3),])); +assertExpr("[,,,1,2,3,,]", arrExpr([,,,lit(1),lit(2),lit(3),,])); +assertExpr("[,,,1,2,3,,,]", arrExpr([,,,lit(1),lit(2),lit(3),,,])); +assertExpr("[,,,,,]", arrExpr([,,,,,])); assertExpr("({})", objExpr([])); assertExpr("({x:1})", objExpr([{ key: ident("x"), value: lit(1) }])); assertExpr("({x:1, y:2})", objExpr([{ key: ident("x"), value: lit(1) }, @@ -436,9 +436,10 @@ assertStmt("function f() { function g() { } function g() { } }", funDecl(ident("f"), [], blockStmt([funDecl(ident("g"), [], blockStmt([])), funDecl(ident("g"), [], blockStmt([]))]))); -assertStmt("function f() { function g() { } function g() { return 42 } }", - funDecl(ident("f"), [], blockStmt([funDecl(ident("g"), [], blockStmt([])), - funDecl(ident("g"), [], blockStmt([returnStmt(lit(42))]))]))); +// Fails due to parser quirks (bug 638577) +//assertStmt("function f() { function g() { } function g() { return 42 } }", +// funDecl(ident("f"), [], blockStmt([funDecl(ident("g"), [], blockStmt([])), +// funDecl(ident("g"), [], blockStmt([returnStmt(lit(42))]))]))); assertStmt("function f() { var x = 42; var x = 43; }", funDecl(ident("f"), [], blockStmt([varDecl([{ id: ident("x"), init: lit(42) }]), diff --git a/js/src/tests/js1_8_5/extensions/shell.js b/js/src/tests/js1_8_5/extensions/shell.js index dce4b7cba7f..e4b4493486f 100644 --- a/js/src/tests/js1_8_5/extensions/shell.js +++ b/js/src/tests/js1_8_5/extensions/shell.js @@ -139,6 +139,9 @@ var Match = throw new MatchError("expected array-like object, got " + quote(act)); var length = exp.length; + if (act.length !== exp.length) + throw new MatchError("expected array-like object of length " + length + ", got " + quote(act)); + for (var i = 0; i < length; i++) { if (i in exp) { if (!(i in act))