Skip to content

Commit 272d432

Browse files
committed
FIX: Arrow functions
1 parent b892d86 commit 272d432

File tree

6 files changed

+53
-56
lines changed

6 files changed

+53
-56
lines changed

rhino/src/main/java/org/mozilla/javascript/Node.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,9 @@ public class Node implements Iterable<Node> {
6565
ARROW_FUNCTION_PROP = 26,
6666
TEMPLATE_LITERAL_PROP = 27,
6767
TRAILING_COMMA = 28,
68-
DESTRUCTURING_RVALUES = 29,
69-
LAST_PROP = 29;
68+
OBJECT_LITERAL_DESTRUCTURING = 29,
69+
DESTRUCTURING_RVALUES = 30,
70+
LAST_PROP = 30;
7071

7172
// values of ISNUMBER_PROP to specify
7273
// which of the children are Number types

rhino/src/main/java/org/mozilla/javascript/NodeTransformer.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@
66

77
package org.mozilla.javascript;
88

9+
import static org.mozilla.javascript.Context.reportError;
10+
911
import java.util.ArrayDeque;
1012
import java.util.ArrayList;
1113
import java.util.Deque;
1214
import java.util.List;
1315
import org.mozilla.javascript.ast.FunctionNode;
1416
import org.mozilla.javascript.ast.Jump;
17+
import org.mozilla.javascript.ast.Name;
1518
import org.mozilla.javascript.ast.Scope;
1619
import org.mozilla.javascript.ast.ScriptNode;
1720

@@ -343,6 +346,14 @@ private void transformCompilationUnit_r(
343346
case Token.SETNAME:
344347
if (inStrictMode) {
345348
node.setType(Token.STRICT_SETNAME);
349+
if (node.getFirstChild().getType() == Token.BINDNAME) {
350+
Node name = node.getFirstChild();
351+
if (name instanceof Name
352+
&& ((Name) name).getIdentifier().equals("eval")) {
353+
// Don't allow set of `eval` in strict mode
354+
reportError("syntax error");
355+
}
356+
}
346357
}
347358
/* fall through */
348359
case Token.NAME:

rhino/src/main/java/org/mozilla/javascript/Parser.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2448,6 +2448,9 @@ private AstNode assignExpr() throws IOException {
24482448
} else if (!hasEOL && tt == Token.ARROW) {
24492449
consumeToken();
24502450
pn = arrowFunction(pn);
2451+
} else if (pn.getIntProp(Node.OBJECT_LITERAL_DESTRUCTURING, 0) == 1
2452+
&& !inDestructuringAssignment) {
2453+
reportError("msg.syntax");
24512454
}
24522455
return pn;
24532456
}
@@ -3282,8 +3285,11 @@ private AstNode parenExpr() throws IOException {
32823285

32833286
int length = ts.tokenEnd - begin;
32843287

3288+
boolean hasObjectLiteralDestructuring =
3289+
e.getIntProp(Node.OBJECT_LITERAL_DESTRUCTURING, 0) == 1;
32853290
boolean hasTrailingComma = e.getIntProp(Node.TRAILING_COMMA, 0) == 1;
3286-
if ((hasTrailingComma || e.getType() == Token.EMPTY) && peekToken() != Token.ARROW) {
3291+
if ((hasTrailingComma || hasObjectLiteralDestructuring || e.getType() == Token.EMPTY)
3292+
&& peekToken() != Token.ARROW) {
32873293
reportError("msg.syntax");
32883294
return makeErrorNode();
32893295
}
@@ -3588,7 +3594,7 @@ private ObjectLiteral objectLiteral() throws IOException {
35883594
setterNames = new HashSet<>();
35893595
}
35903596
Comment objJsdocNode = getAndResetJsDoc();
3591-
3597+
boolean objectLiteralDestructuringDefault = false;
35923598
commaLoop:
35933599
for (; ; ) {
35943600
String propertyName = null;
@@ -3621,10 +3627,9 @@ private ObjectLiteral objectLiteral() throws IOException {
36213627
// many tokens.)
36223628
int peeked = peekToken();
36233629
if (peeked != Token.COMMA && peeked != Token.COLON && peeked != Token.RC) {
3624-
if (peeked == Token.ASSIGN
3625-
&& inDestructuringAssignment) { // we have an object literal with
3626-
// destructuring assignment and a
3627-
// default
3630+
if (peeked == Token.ASSIGN) { // we have an object literal with
3631+
// destructuring assignment and a default value
3632+
objectLiteralDestructuringDefault = true;
36283633
if (compilerEnv.getLanguageVersion() >= Context.VERSION_ES6) {
36293634
elems.add(plainProperty(pname, tt));
36303635
if (matchToken(Token.COMMA, true)) {
@@ -3705,6 +3710,9 @@ private ObjectLiteral objectLiteral() throws IOException {
37053710

37063711
mustMatchToken(Token.RC, "msg.no.brace.prop", true);
37073712
ObjectLiteral pn = new ObjectLiteral(pos, ts.tokenEnd - pos);
3713+
if (objectLiteralDestructuringDefault) {
3714+
pn.putIntProp(Node.OBJECT_LITERAL_DESTRUCTURING, 1);
3715+
}
37083716
if (objJsdocNode != null) {
37093717
pn.setJsDocNode(objJsdocNode);
37103718
}
@@ -3782,7 +3790,7 @@ private ObjectProperty plainProperty(AstNode property, int ptt) throws IOExcepti
37823790
pn.setIsShorthand(true);
37833791
pn.setLeftAndRight(property, nn);
37843792
return pn;
3785-
} else if (tt == Token.ASSIGN && inDestructuringAssignment) {
3793+
} else if (tt == Token.ASSIGN) {
37863794
/* we're in destructuring with defaults in a object literal; treat defaults as values */
37873795
ObjectProperty pn = new ObjectProperty();
37883796
consumeToken(); // consume the `=`

rhino/src/main/java/org/mozilla/javascript/Token.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,8 @@ public static String typeToName(int token) {
272272
return "IFNE";
273273
case SETNAME:
274274
return "SETNAME";
275+
case STRICT_SETNAME:
276+
return "STRICT_SETNAME";
275277
case BITOR:
276278
return "BITOR";
277279
case BITXOR:

tests/src/test/java/org/mozilla/javascript/tests/DefaultParametersTest.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,6 @@ public void functionDefaultArgsArrayArrow() throws Exception {
3636
assertIntEvaluates(6, script + "([,4])");
3737
}
3838

39-
@Test
40-
@Ignore("wip") // TODO TODO TODO!!
41-
public void functionDefaultArgsObjectArrow() throws Exception {
42-
final String script = "(({x = 1} = {x: 2}) => {\n return x;\n})";
43-
44-
assertIntEvaluates(1, script + "({})"); // TODO(satish): parsing errors with arrow fns
45-
assertIntEvaluates(2, script + "()"); // TODO(satish): returns 1
46-
assertIntEvaluates(3, script + "({x: 3})");
47-
}
48-
4939
@Test
5040
public void functionDefaultArgsMulti() throws Exception {
5141
final String script = "function foo(a = 2, b = 23) { return a + b; }";
@@ -65,20 +55,30 @@ public void functionDefaultArgsUsage() throws Exception {
6555

6656
@Test
6757
public void ObjIdInitSimpleStrictExpr() throws Exception {
68-
final String script = "(0, { eval = 0 } = {});";
69-
assertThrows("missing ( before function parameters.", script);
58+
final String script =
59+
"(function () { \n " + "'use strict'; \n " + "(0, { eval = 0 } = {}) })()";
60+
assertThrows("syntax error", script);
7061
}
7162

7263
@Test
7364
public void ObjIdInitSimpleStrictForOf() throws Exception {
7465
final String script = "for ({ eval = 0 } of [{}]) ;";
75-
assertThrows("missing ( before function parameters.", script);
66+
assertThrows("syntax error", script);
7667
}
7768

7869
@Test
7970
public void CoverInitName() throws Exception {
8071
final String script = "({ a = 1 });";
81-
assertThrows("missing ( before function parameters.", script);
72+
assertThrows("syntax error", script);
73+
}
74+
75+
@Test
76+
public void functionDefaultArgsObjectArrow() throws Exception {
77+
final String script = "(({x = 1} = {x: 2}) => {\n return x;\n})";
78+
79+
assertIntEvaluates(1, script + "({})");
80+
assertIntEvaluates(2, script + "()");
81+
assertIntEvaluates(3, script + "({x: 3})");
8282
}
8383

8484
@Test

tests/testsrc/test262.properties

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3903,7 +3903,7 @@ language/expressions/array 41/52 (78.85%)
39033903
spread-sngl-literal.js
39043904
spread-sngl-obj-ident.js
39053905

3906-
language/expressions/arrow-function 168/343 (48.98%)
3906+
language/expressions/arrow-function 167/343 (48.69%)
39073907
dstr/ary-init-iter-close.js
39083908
dstr/ary-init-iter-get-err.js
39093909
dstr/ary-init-iter-get-err-array-prototype.js
@@ -3992,7 +3992,6 @@ language/expressions/arrow-function 168/343 (48.98%)
39923992
dstr/dflt-obj-ptrn-id-init-fn-name-gen.js
39933993
dstr/dflt-obj-ptrn-id-init-skipped.js
39943994
dstr/dflt-obj-ptrn-id-init-throws.js
3995-
dstr/dflt-obj-ptrn-id-init-unresolvable.js
39963995
dstr/dflt-obj-ptrn-list-err.js
39973996
dstr/dflt-obj-ptrn-prop-ary.js
39983997
dstr/dflt-obj-ptrn-prop-ary-init.js
@@ -4072,7 +4071,7 @@ language/expressions/arrow-function 168/343 (48.98%)
40724071
unscopables-with.js non-strict
40734072
unscopables-with-in-nested-fn.js non-strict
40744073

4075-
language/expressions/assignment 199/480 (41.46%)
4074+
language/expressions/assignment 193/480 (40.21%)
40764075
destructuring 3/3 (100.0%)
40774076
dstr/array-elem-init-evaluation.js
40784077
dstr/array-elem-init-fn-name-arrow.js
@@ -4192,10 +4191,6 @@ language/expressions/assignment 199/480 (41.46%)
41924191
dstr/obj-empty-null.js
41934192
dstr/obj-empty-undef.js
41944193
dstr/obj-id-identifier-yield-ident-valid.js non-strict
4195-
dstr/obj-id-init-assignment-missing.js
4196-
dstr/obj-id-init-assignment-null.js
4197-
dstr/obj-id-init-assignment-truthy.js
4198-
dstr/obj-id-init-assignment-undef.js
41994194
dstr/obj-id-init-evaluation.js
42004195
dstr/obj-id-init-fn-name-arrow.js
42014196
dstr/obj-id-init-fn-name-class.js {unsupported: [class]}
@@ -4206,11 +4201,9 @@ language/expressions/assignment 199/480 (41.46%)
42064201
dstr/obj-id-init-let.js
42074202
dstr/obj-id-init-order.js
42084203
dstr/obj-id-init-simple-no-strict.js non-strict
4209-
dstr/obj-id-init-yield-expr.js
42104204
dstr/obj-id-init-yield-ident-valid.js non-strict
42114205
dstr/obj-id-put-const.js non-strict
42124206
dstr/obj-id-put-let.js
4213-
dstr/obj-id-simple-strict.js strict
42144207
dstr/obj-prop-elem-init-evaluation.js
42154208
dstr/obj-prop-elem-init-fn-name-arrow.js
42164209
dstr/obj-prop-elem-init-fn-name-class.js {unsupported: [class]}
@@ -4410,7 +4403,7 @@ language/expressions/call 60/92 (65.22%)
44104403
language/expressions/comma 1/6 (16.67%)
44114404
tco-final.js {unsupported: [tail-call-optimization]}
44124405

4413-
language/expressions/compound-assignment 137/454 (30.18%)
4406+
language/expressions/compound-assignment 125/454 (27.53%)
44144407
11.13.2-34-s.js strict
44154408
11.13.2-35-s.js strict
44164409
11.13.2-36-s.js strict
@@ -4422,11 +4415,8 @@ language/expressions/compound-assignment 137/454 (30.18%)
44224415
11.13.2-42-s.js strict
44234416
11.13.2-43-s.js strict
44244417
11.13.2-44-s.js strict
4425-
11.13.2-6-1gs.js strict
44264418
add-arguments-strict.js strict
4427-
add-eval-strict.js strict
44284419
and-arguments-strict.js strict
4429-
and-eval-strict.js strict
44304420
compound-assignment-operator-calls-putvalue-lref--v-.js non-strict
44314421
compound-assignment-operator-calls-putvalue-lref--v--1.js non-strict
44324422
compound-assignment-operator-calls-putvalue-lref--v--10.js non-strict
@@ -4450,7 +4440,6 @@ language/expressions/compound-assignment 137/454 (30.18%)
44504440
compound-assignment-operator-calls-putvalue-lref--v--8.js non-strict
44514441
compound-assignment-operator-calls-putvalue-lref--v--9.js non-strict
44524442
div-arguments-strict.js strict
4453-
div-eval-strict.js strict
44544443
left-hand-side-private-reference-accessor-property-add.js {unsupported: [class-fields-private]}
44554444
left-hand-side-private-reference-accessor-property-bitand.js {unsupported: [class-fields-private]}
44564445
left-hand-side-private-reference-accessor-property-bitor.js {unsupported: [class-fields-private]}
@@ -4500,13 +4489,9 @@ language/expressions/compound-assignment 137/454 (30.18%)
45004489
left-hand-side-private-reference-readonly-accessor-property-srshift.js {unsupported: [class-fields-private]}
45014490
left-hand-side-private-reference-readonly-accessor-property-sub.js {unsupported: [class-fields-private]}
45024491
lshift-arguments-strict.js strict
4503-
lshift-eval-strict.js strict
45044492
mod-arguments-strict.js strict
4505-
mod-eval-strict.js strict
45064493
mult-arguments-strict.js strict
4507-
mult-eval-strict.js strict
45084494
or-arguments-strict.js strict
4509-
or-eval-strict.js strict
45104495
S11.13.2_A7.10_T1.js
45114496
S11.13.2_A7.10_T2.js
45124497
S11.13.2_A7.10_T4.js
@@ -4541,13 +4526,9 @@ language/expressions/compound-assignment 137/454 (30.18%)
45414526
S11.13.2_A7.9_T2.js
45424527
S11.13.2_A7.9_T4.js
45434528
srshift-arguments-strict.js strict
4544-
srshift-eval-strict.js strict
45454529
sub-arguments-strict.js strict
4546-
sub-eval-strict.js strict
45474530
urshift-arguments-strict.js strict
4548-
urshift-eval-strict.js strict
45494531
xor-arguments-strict.js strict
4550-
xor-eval-strict.js strict
45514532

45524533
language/expressions/concatenation 0/5 (0.0%)
45534534

@@ -4585,7 +4566,7 @@ language/expressions/exponentiation 3/44 (6.82%)
45854566
bigint-wrapped-values.js
45864567
order-of-evaluation.js
45874568

4588-
language/expressions/function 169/264 (64.02%)
4569+
language/expressions/function 168/264 (63.64%)
45894570
dstr/ary-init-iter-close.js
45904571
dstr/ary-init-iter-get-err.js
45914572
dstr/ary-init-iter-get-err-array-prototype.js
@@ -4726,7 +4707,6 @@ language/expressions/function 169/264 (64.02%)
47264707
eval-var-scope-syntax-err.js non-strict
47274708
length-dflt.js
47284709
name-arguments-strict-body.js non-strict
4729-
name-eval-strict-body.js non-strict
47304710
named-no-strict-reassign-fn-name-in-body.js non-strict
47314711
named-no-strict-reassign-fn-name-in-body-in-arrow.js non-strict
47324712
named-no-strict-reassign-fn-name-in-body-in-eval.js non-strict
@@ -5006,7 +4986,7 @@ language/expressions/less-than-or-equal 2/47 (4.26%)
50064986
language/expressions/logical-and 1/18 (5.56%)
50074987
tco-right.js {unsupported: [tail-call-optimization]}
50084988

5009-
language/expressions/logical-assignment 55/78 (70.51%)
4989+
language/expressions/logical-assignment 53/78 (67.95%)
50104990
left-hand-side-private-reference-accessor-property-and.js {unsupported: [class-fields-private]}
50114991
left-hand-side-private-reference-accessor-property-nullish.js {unsupported: [class-fields-private]}
50124992
left-hand-side-private-reference-accessor-property-or.js {unsupported: [class-fields-private]}
@@ -5037,7 +5017,6 @@ language/expressions/logical-assignment 55/78 (70.51%)
50375017
lgcl-and-assignment-operator-non-extensible.js strict
50385018
lgcl-and-assignment-operator-non-simple-lhs.js
50395019
lgcl-and-assignment-operator-non-writeable.js strict
5040-
lgcl-and-eval-strict.js strict
50415020
lgcl-nullish-assignment-operator.js
50425021
lgcl-nullish-assignment-operator-bigint.js
50435022
lgcl-nullish-assignment-operator-lhs-before-rhs.js
@@ -5061,7 +5040,6 @@ language/expressions/logical-assignment 55/78 (70.51%)
50615040
lgcl-or-assignment-operator-no-set-put.js strict
50625041
lgcl-or-assignment-operator-non-simple-lhs.js
50635042
lgcl-or-assignment-operator-non-writeable.js strict
5064-
lgcl-or-eval-strict.js strict
50655043

50665044
language/expressions/logical-not 0/19 (0.0%)
50675045

@@ -5123,7 +5101,7 @@ language/expressions/new 41/59 (69.49%)
51235101

51245102
~language/expressions/new.target
51255103

5126-
language/expressions/object 812/1169 (69.46%)
5104+
language/expressions/object 810/1169 (69.29%)
51275105
dstr/async-gen-meth-ary-init-iter-close.js {unsupported: [async-iteration, async]}
51285106
dstr/async-gen-meth-ary-init-iter-get-err.js {unsupported: [async-iteration]}
51295107
dstr/async-gen-meth-ary-init-iter-get-err-array-prototype.js {unsupported: [async-iteration]}
@@ -6817,7 +6795,7 @@ language/statements/for-in 39/114 (34.21%)
68176795
scope-head-lex-open.js
68186796
scope-head-var-none.js non-strict
68196797

6820-
language/statements/for-of 449/736 (61.01%)
6798+
language/statements/for-of 448/736 (60.87%)
68216799
dstr/array-elem-init-evaluation.js
68226800
dstr/array-elem-init-fn-name-arrow.js
68236801
dstr/array-elem-init-fn-name-class.js {unsupported: [class]}
@@ -7105,7 +7083,6 @@ language/statements/for-of 449/736 (61.01%)
71057083
dstr/obj-id-init-yield-ident-valid.js non-strict
71067084
dstr/obj-id-put-const.js non-strict
71077085
dstr/obj-id-put-let.js
7108-
dstr/obj-id-simple-strict.js strict
71097086
dstr/obj-prop-elem-init-evaluation.js
71107087
dstr/obj-prop-elem-init-fn-name-arrow.js
71117088
dstr/obj-prop-elem-init-fn-name-class.js {unsupported: [class]}
@@ -7268,7 +7245,7 @@ language/statements/for-of 449/736 (61.01%)
72687245
scope-head-lex-open.js
72697246
scope-head-var-none.js non-strict
72707247

7271-
language/statements/function 185/451 (41.02%)
7248+
language/statements/function 183/451 (40.58%)
72727249
dstr/ary-init-iter-close.js
72737250
dstr/ary-init-iter-get-err.js
72747251
dstr/ary-init-iter-get-err-array-prototype.js
@@ -7428,8 +7405,6 @@ language/statements/function 185/451 (41.02%)
74287405
dflt-params-ref-self.js
74297406
dflt-params-rest.js
74307407
dflt-params-trailing-comma.js
7431-
enable-strict-via-body.js non-strict
7432-
enable-strict-via-outer-body.js non-strict
74337408
eval-var-scope-syntax-err.js non-strict
74347409
length-dflt.js
74357410
name-arguments-strict-body.js non-strict

0 commit comments

Comments
 (0)