Skip to content

Commit 1dae687

Browse files
Alexey AndreevAlexey Andreev
Alexey Andreev
authored and
Alexey Andreev
committed
Fix support of - and + prefix operators in JS parser
Treat number literal that represents minimum integer as integer node in JS AST. Treat +<number_literal> JS AST as unary node (+) containing single number literal
1 parent 590954e commit 1dae687

File tree

5 files changed

+28
-32
lines changed

5 files changed

+28
-32
lines changed

js/js.parser/src/com/google/gwt/dev/js/JsAstMapper.java

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -681,7 +681,13 @@ private JsNew mapNew(Node newNode) throws JsParserException {
681681
}
682682

683683
private static JsExpression mapIntNumber(Node numberNode) {
684-
return new JsIntLiteral((int) numberNode.getDouble());
684+
double value = numberNode.getDouble();
685+
if (value <= Integer.MAX_VALUE && value >= Integer.MIN_VALUE) {
686+
return new JsIntLiteral((int) numberNode.getDouble());
687+
}
688+
else {
689+
return new JsDoubleLiteral(numberNode.getDouble());
690+
}
685691
}
686692

687693
private static JsExpression mapDoubleNumber(Node numberNode) {
@@ -1032,8 +1038,17 @@ private JsTry mapTryStatement(Node tryNode) throws JsParserException {
10321038

10331039
private JsExpression mapUnaryVariant(Node unOp) throws JsParserException {
10341040
switch (unOp.getOperation()) {
1035-
case TokenStream.SUB:
1041+
case TokenStream.SUB: {
1042+
Node operand = unOp.getFirstChild();
1043+
if (operand.getType() == TokenStream.NUMBER_INT) {
1044+
double value = operand.getDouble();
1045+
if (-value >= Integer.MIN_VALUE) {
1046+
return new JsIntLiteral((int) -value);
1047+
}
1048+
}
1049+
10361050
return mapPrefixOperation(JsUnaryOperator.NEG, unOp);
1051+
}
10371052

10381053
case TokenStream.NOT:
10391054
return mapPrefixOperation(JsUnaryOperator.NOT, unOp);
@@ -1045,13 +1060,7 @@ private JsExpression mapUnaryVariant(Node unOp) throws JsParserException {
10451060
return mapPrefixOperation(JsUnaryOperator.TYPEOF, unOp);
10461061

10471062
case TokenStream.ADD:
1048-
if (!isJsNumber(unOp.getFirstChild())) {
1049-
return mapPrefixOperation(JsUnaryOperator.POS, unOp);
1050-
}
1051-
else {
1052-
// Pretend we didn't see it.
1053-
return mapExpression(unOp.getFirstChild());
1054-
}
1063+
return mapPrefixOperation(JsUnaryOperator.POS, unOp);
10551064

10561065
case TokenStream.VOID:
10571066
return mapPrefixOperation(JsUnaryOperator.VOID, unOp);
@@ -1098,11 +1107,6 @@ private JsNode mapWithStatement(Node withNode) throws JsParserException {
10981107
withNode);
10991108
}
11001109

1101-
private boolean isJsNumber(Node jsNode) {
1102-
int type = jsNode.getType();
1103-
return type == TokenStream.NUMBER || type == TokenStream.NUMBER;
1104-
}
1105-
11061110
private <T extends JsNode> T withLocation(T astNode, Node node) {
11071111
CodePosition location = node.getPosition();
11081112
if (location != null) {

js/js.parser/src/com/google/gwt/dev/js/rhino/IRFactory.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ public Node createString(String string, CodePosition location) {
106106
/**
107107
* Number (for literals)
108108
*/
109-
public Node createNumber(int number, CodePosition location) {
110-
return Node.newNumber(number, location);
109+
public Node createIntNumber(double number, CodePosition location) {
110+
return Node.newIntNumber(number, location);
111111
}
112112

113113
public Node createNumber(double number, CodePosition location) {

js/js.parser/src/com/google/gwt/dev/js/rhino/Node.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,8 @@
4545
public class Node implements Cloneable {
4646

4747
private static class NumberNode extends Node {
48-
49-
NumberNode(int number, CodePosition location) {
50-
super(TokenStream.NUMBER_INT, location);
51-
this.number = number;
52-
}
53-
54-
NumberNode(double number, CodePosition position) {
55-
super(TokenStream.NUMBER, position);
48+
NumberNode(int type, double number, CodePosition position) {
49+
super(type, position);
5650
this.number = number;
5751
}
5852

@@ -181,12 +175,12 @@ public Node(int nodeType, int operation, CodePosition position) {
181175
this.position = position;
182176
}
183177

184-
public static Node newNumber(int number, CodePosition position) {
185-
return new NumberNode(number, position);
178+
public static Node newIntNumber(double number, CodePosition position) {
179+
return new NumberNode(TokenStream.NUMBER_INT, number, position);
186180
}
187181

188182
public static Node newNumber(double number, CodePosition position) {
189-
return new NumberNode(number, position);
183+
return new NumberNode(TokenStream.NUMBER, number, position);
190184
}
191185

192186
public static Node newString(String str, CodePosition position) {

js/js.parser/src/com/google/gwt/dev/js/rhino/Parser.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1068,8 +1068,7 @@ public Node primaryExpr(TokenStream ts) throws IOException, JavaScriptException
10681068
property = nf.createString(ts.getString(), ts.tokenPosition);
10691069
break;
10701070
case TokenStream.NUMBER_INT:
1071-
int n = (int) ts.getNumber();
1072-
property = nf.createNumber(n, ts.tokenPosition);
1071+
property = nf.createIntNumber(ts.getNumber(), ts.tokenPosition);
10731072
break;
10741073
case TokenStream.NUMBER:
10751074
double d = ts.getNumber();
@@ -1114,8 +1113,7 @@ public Node primaryExpr(TokenStream ts) throws IOException, JavaScriptException
11141113
return nf.createName(name, position);
11151114

11161115
case TokenStream.NUMBER_INT:
1117-
int n = (int) ts.getNumber();
1118-
return nf.createNumber(n, position);
1116+
return nf.createIntNumber(ts.getNumber(), position);
11191117

11201118
case TokenStream.NUMBER:
11211119
double d = ts.getNumber();

js/js.parser/src/com/google/gwt/dev/js/rhino/TokenStream.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,7 @@ private int getTokenHelper() throws IOException {
802802

803803
this.number = dval;
804804

805-
if (isInteger && this.number >= Integer.MIN_VALUE && this.number <= Integer.MAX_VALUE) {
805+
if (isInteger) {
806806
return NUMBER_INT;
807807
}
808808

0 commit comments

Comments
 (0)