|
|
|
Lines 1863-1879
Parser::statements()
|
Link Here
|
|---|
|
| 1863 |
pn->pn_pos.end = tokenStream.currentToken().pos.end; |
1863 |
pn->pn_pos.end = tokenStream.currentToken().pos.end; |
| 1864 |
return pn; |
1864 |
return pn; |
| 1865 |
} |
1865 |
} |
| 1866 |
|
1866 |
|
| 1867 |
ParseNode * |
1867 |
ParseNode * |
| 1868 |
Parser::condition() |
1868 |
Parser::condition() |
| 1869 |
{ |
1869 |
{ |
| 1870 |
MUST_MATCH_TOKEN(TOK_LP, JSMSG_PAREN_BEFORE_COND); |
1870 |
MUST_MATCH_TOKEN(TOK_LP, JSMSG_PAREN_BEFORE_COND); |
| 1871 |
ParseNode *pn = parenExpr(); |
1871 |
bool isGenerator = false; |
|
|
1872 |
ParseNode *pn = parenExpr(isGenerator); |
| 1872 |
if (!pn) |
1873 |
if (!pn) |
| 1873 |
return NULL; |
1874 |
return NULL; |
| 1874 |
MUST_MATCH_TOKEN(TOK_RP, JSMSG_PAREN_AFTER_COND); |
1875 |
MUST_MATCH_TOKEN(TOK_RP, JSMSG_PAREN_AFTER_COND); |
| 1875 |
|
1876 |
|
| 1876 |
/* Check for (a = b) and warn about possible (a == b) mistype. */ |
1877 |
/* Check for (a = b) and warn about possible (a == b) mistype. */ |
| 1877 |
JS_ASSERT_IF(pn->isKind(PNK_ASSIGN), pn->isOp(JSOP_NOP)); |
1878 |
JS_ASSERT_IF(pn->isKind(PNK_ASSIGN), pn->isOp(JSOP_NOP)); |
| 1878 |
if (pn->isKind(PNK_ASSIGN) && |
1879 |
if (pn->isKind(PNK_ASSIGN) && |
| 1879 |
!pn->isInParens() && |
1880 |
!pn->isInParens() && |
|
Lines 3019-3035
Parser::switchStatement()
|
Link Here
|
|---|
|
| 3019 |
{ |
3020 |
{ |
| 3020 |
JS_ASSERT(tc->parser->tokenStream.currentToken().type == TOK_SWITCH); |
3021 |
JS_ASSERT(tc->parser->tokenStream.currentToken().type == TOK_SWITCH); |
| 3021 |
ParseNode *pn = BinaryNode::create(PNK_SWITCH, tc); |
3022 |
ParseNode *pn = BinaryNode::create(PNK_SWITCH, tc); |
| 3022 |
if (!pn) |
3023 |
if (!pn) |
| 3023 |
return NULL; |
3024 |
return NULL; |
| 3024 |
MUST_MATCH_TOKEN(TOK_LP, JSMSG_PAREN_BEFORE_SWITCH); |
3025 |
MUST_MATCH_TOKEN(TOK_LP, JSMSG_PAREN_BEFORE_SWITCH); |
| 3025 |
|
3026 |
|
| 3026 |
/* pn1 points to the switch's discriminant. */ |
3027 |
/* pn1 points to the switch's discriminant. */ |
| 3027 |
ParseNode *pn1 = parenExpr(); |
3028 |
bool isGenerator = false; |
|
|
3029 |
ParseNode *pn1 = parenExpr(isGenerator); |
| 3028 |
if (!pn1) |
3030 |
if (!pn1) |
| 3029 |
return NULL; |
3031 |
return NULL; |
| 3030 |
|
3032 |
|
| 3031 |
MUST_MATCH_TOKEN(TOK_RP, JSMSG_PAREN_AFTER_SWITCH); |
3033 |
MUST_MATCH_TOKEN(TOK_RP, JSMSG_PAREN_AFTER_SWITCH); |
| 3032 |
MUST_MATCH_TOKEN(TOK_LC, JSMSG_CURLY_BEFORE_SWITCH); |
3034 |
MUST_MATCH_TOKEN(TOK_LC, JSMSG_CURLY_BEFORE_SWITCH); |
| 3033 |
|
3035 |
|
| 3034 |
/* |
3036 |
/* |
| 3035 |
* NB: we must push stmtInfo before calling GenerateBlockIdForStmtNode |
3037 |
* NB: we must push stmtInfo before calling GenerateBlockIdForStmtNode |
|
Lines 3677-3693
Parser::withStatement()
|
Link Here
|
|---|
|
| 3677 |
reportErrorNumber(NULL, JSREPORT_ERROR, JSMSG_STRICT_CODE_WITH); |
3679 |
reportErrorNumber(NULL, JSREPORT_ERROR, JSMSG_STRICT_CODE_WITH); |
| 3678 |
return NULL; |
3680 |
return NULL; |
| 3679 |
} |
3681 |
} |
| 3680 |
|
3682 |
|
| 3681 |
ParseNode *pn = BinaryNode::create(PNK_WITH, tc); |
3683 |
ParseNode *pn = BinaryNode::create(PNK_WITH, tc); |
| 3682 |
if (!pn) |
3684 |
if (!pn) |
| 3683 |
return NULL; |
3685 |
return NULL; |
| 3684 |
MUST_MATCH_TOKEN(TOK_LP, JSMSG_PAREN_BEFORE_WITH); |
3686 |
MUST_MATCH_TOKEN(TOK_LP, JSMSG_PAREN_BEFORE_WITH); |
| 3685 |
ParseNode *pn2 = parenExpr(); |
3687 |
bool isGenerator = false; |
|
|
3688 |
ParseNode *pn2 = parenExpr(isGenerator); |
| 3686 |
if (!pn2) |
3689 |
if (!pn2) |
| 3687 |
return NULL; |
3690 |
return NULL; |
| 3688 |
MUST_MATCH_TOKEN(TOK_RP, JSMSG_PAREN_AFTER_WITH); |
3691 |
MUST_MATCH_TOKEN(TOK_RP, JSMSG_PAREN_AFTER_WITH); |
| 3689 |
pn->pn_left = pn2; |
3692 |
pn->pn_left = pn2; |
| 3690 |
|
3693 |
|
| 3691 |
ParseNode *oldWith = tc->innermostWith; |
3694 |
ParseNode *oldWith = tc->innermostWith; |
| 3692 |
tc->innermostWith = pn; |
3695 |
tc->innermostWith = pn; |
| 3693 |
|
3696 |
|
|
Lines 4568-4593
EqualityTokenToParseNodeKind(const Token
|
Link Here
|
|---|
|
| 4568 |
case TOK_STRICTNE: |
4571 |
case TOK_STRICTNE: |
| 4569 |
return PNK_STRICTNE; |
4572 |
return PNK_STRICTNE; |
| 4570 |
default: |
4573 |
default: |
| 4571 |
JS_ASSERT(token.type == TOK_NE); |
4574 |
JS_ASSERT(token.type == TOK_NE); |
| 4572 |
return PNK_NE; |
4575 |
return PNK_NE; |
| 4573 |
} |
4576 |
} |
| 4574 |
} |
4577 |
} |
| 4575 |
|
4578 |
|
|
|
4579 |
bool |
| 4580 |
TokenIsHarmonyEquality(const Token &token, JSContext *cx) |
| 4581 |
{ |
| 4582 |
if (token.type != TOK_NAME) |
| 4583 |
return false; |
| 4584 |
if (token.name() == cx->runtime->atomState.isAtom) |
| 4585 |
return true; |
| 4586 |
if (token.name() == cx->runtime->atomState.isntAtom) |
| 4587 |
return true; |
| 4588 |
return false; |
| 4589 |
} |
| 4590 |
|
| 4576 |
BEGIN_EXPR_PARSER(eqExpr1) |
4591 |
BEGIN_EXPR_PARSER(eqExpr1) |
| 4577 |
{ |
4592 |
{ |
| 4578 |
ParseNode *left = relExpr1i(); |
4593 |
ParseNode *left = relExpr1i(); |
| 4579 |
while (left && tokenStream.isCurrentTokenEquality()) { |
4594 |
while (left) { |
| 4580 |
ParseNodeKind kind = EqualityTokenToParseNodeKind(tokenStream.currentToken()); |
4595 |
if (TokenIsHarmonyEquality(tokenStream.currentToken(), context)) { |
| 4581 |
JSOp op = tokenStream.currentToken().t_op; |
4596 |
/* Is defined as [no LineTerminator here]. */ |
| 4582 |
ParseNode *right = relExpr1n(); |
4597 |
if (left->pn_pos.end.lineno < tokenStream.currentToken().pos.begin.lineno) { |
| 4583 |
if (!right) |
4598 |
reportErrorNumber(NULL, JSREPORT_ERROR, JSMSG_NEW_LINE_BEFORE_IS); |
| 4584 |
return NULL; |
4599 |
return NULL; |
| 4585 |
left = tc->parser->new_<BinaryNode>(kind, op, left, right); |
4600 |
} |
|
|
4601 |
|
| 4602 |
JSOp op; |
| 4603 |
ParseNodeKind kind; |
| 4604 |
if (tokenStream.currentToken().name() == context->runtime->atomState.isAtom) { |
| 4605 |
op = JSOP_IS; |
| 4606 |
kind = PNK_IS; |
| 4607 |
} else { |
| 4608 |
op = JSOP_ISNT; |
| 4609 |
kind = PNK_ISNT; |
| 4610 |
} |
| 4611 |
|
| 4612 |
ParseNode *right = relExpr1n(); |
| 4613 |
if (!right) |
| 4614 |
return NULL; |
| 4615 |
left = tc->parser->new_<BinaryNode>(kind, op, left, right); |
| 4616 |
} else if (tokenStream.isCurrentTokenEquality()) { |
| 4617 |
ParseNodeKind kind = EqualityTokenToParseNodeKind(tokenStream.currentToken()); |
| 4618 |
JSOp op = tokenStream.currentToken().t_op; |
| 4619 |
ParseNode *right = relExpr1n(); |
| 4620 |
if (!right) |
| 4621 |
return NULL; |
| 4622 |
left = tc->parser->new_<BinaryNode>(kind, op, left, right); |
| 4623 |
} else { |
| 4624 |
break; |
| 4625 |
} |
| 4586 |
} |
4626 |
} |
| 4587 |
return left; |
4627 |
return left; |
| 4588 |
} |
4628 |
} |
| 4589 |
END_EXPR_PARSER(eqExpr1) |
4629 |
END_EXPR_PARSER(eqExpr1) |
| 4590 |
|
4630 |
|
| 4591 |
BEGIN_EXPR_PARSER(bitAndExpr1) |
4631 |
BEGIN_EXPR_PARSER(bitAndExpr1) |
| 4592 |
{ |
4632 |
{ |
| 4593 |
ParseNode *pn = eqExpr1i(); |
4633 |
ParseNode *pn = eqExpr1i(); |
|
Lines 7157-7180
Parser::primaryExpr(TokenKind tt, JSBool
|
Link Here
|
|---|
|
| 7157 |
if (!pn) |
7197 |
if (!pn) |
| 7158 |
return NULL; |
7198 |
return NULL; |
| 7159 |
break; |
7199 |
break; |
| 7160 |
} |
7200 |
} |
| 7161 |
#endif /* JS_HAS_SHARP_VARS */ |
7201 |
#endif /* JS_HAS_SHARP_VARS */ |
| 7162 |
|
7202 |
|
| 7163 |
case TOK_LP: |
7203 |
case TOK_LP: |
| 7164 |
{ |
7204 |
{ |
| 7165 |
JSBool genexp; |
7205 |
bool isGenerator = false; |
| 7166 |
|
7206 |
pn = parenExpr(isGenerator); |
| 7167 |
pn = parenExpr(&genexp); |
|
|
| 7168 |
if (!pn) |
7207 |
if (!pn) |
| 7169 |
return NULL; |
7208 |
return NULL; |
| 7170 |
pn->setInParens(true); |
7209 |
pn->setInParens(true); |
| 7171 |
if (!genexp) |
7210 |
if (!isGenerator) { |
| 7172 |
MUST_MATCH_TOKEN(TOK_RP, JSMSG_PAREN_IN_PAREN); |
7211 |
MUST_MATCH_TOKEN(TOK_RP, JSMSG_PAREN_IN_PAREN); |
|
|
7212 |
pn->pn_pos.end = tokenStream.currentToken().pos.end; |
| 7213 |
} |
| 7173 |
break; |
7214 |
break; |
| 7174 |
} |
7215 |
} |
| 7175 |
|
7216 |
|
| 7176 |
case TOK_STRING: |
7217 |
case TOK_STRING: |
| 7177 |
pn = atomNode(PNK_STRING, JSOP_STRING); |
7218 |
pn = atomNode(PNK_STRING, JSOP_STRING); |
| 7178 |
if (!pn) |
7219 |
if (!pn) |
| 7179 |
return NULL; |
7220 |
return NULL; |
| 7180 |
break; |
7221 |
break; |
|
Lines 7278-7334
Parser::primaryExpr(TokenKind tt, JSBool
|
Link Here
|
|---|
|
| 7278 |
default: |
7319 |
default: |
| 7279 |
reportErrorNumber(NULL, JSREPORT_ERROR, JSMSG_SYNTAX_ERROR); |
7320 |
reportErrorNumber(NULL, JSREPORT_ERROR, JSMSG_SYNTAX_ERROR); |
| 7280 |
return NULL; |
7321 |
return NULL; |
| 7281 |
} |
7322 |
} |
| 7282 |
return pn; |
7323 |
return pn; |
| 7283 |
} |
7324 |
} |
| 7284 |
|
7325 |
|
| 7285 |
ParseNode * |
7326 |
ParseNode * |
| 7286 |
Parser::parenExpr(JSBool *genexp) |
7327 |
Parser::parenExpr(bool &isGenerator) |
| 7287 |
{ |
7328 |
{ |
| 7288 |
TokenPtr begin; |
|
|
| 7289 |
ParseNode *pn; |
| 7290 |
|
| 7291 |
JS_ASSERT(tokenStream.currentToken().type == TOK_LP); |
7329 |
JS_ASSERT(tokenStream.currentToken().type == TOK_LP); |
| 7292 |
begin = tokenStream.currentToken().pos.begin; |
7330 |
TokenPtr begin = tokenStream.currentToken().pos.begin; |
| 7293 |
|
7331 |
|
| 7294 |
if (genexp) |
|
|
| 7295 |
*genexp = JS_FALSE; |
| 7296 |
|
| 7297 |
GenexpGuard guard(tc); |
7332 |
GenexpGuard guard(tc); |
| 7298 |
|
7333 |
ParseNode *pn = bracketedExpr(); |
| 7299 |
pn = bracketedExpr(); |
|
|
| 7300 |
if (!pn) |
7334 |
if (!pn) |
| 7301 |
return NULL; |
7335 |
return NULL; |
| 7302 |
guard.endBody(); |
7336 |
guard.endBody(); |
| 7303 |
|
7337 |
|
|
|
7338 |
pn->pn_pos.begin = begin; |
| 7339 |
|
| 7304 |
#if JS_HAS_GENERATOR_EXPRS |
7340 |
#if JS_HAS_GENERATOR_EXPRS |
| 7305 |
if (tokenStream.matchToken(TOK_FOR)) { |
7341 |
if (tokenStream.matchToken(TOK_FOR)) { |
| 7306 |
if (!guard.checkValidBody(pn)) |
7342 |
if (!guard.checkValidBody(pn)) |
| 7307 |
return NULL; |
7343 |
return NULL; |
|
|
7344 |
|
| 7308 |
JS_ASSERT(!pn->isKind(PNK_YIELD)); |
7345 |
JS_ASSERT(!pn->isKind(PNK_YIELD)); |
|
|
7346 |
|
| 7309 |
if (pn->isKind(PNK_COMMA) && !pn->isInParens()) { |
7347 |
if (pn->isKind(PNK_COMMA) && !pn->isInParens()) { |
| 7310 |
reportErrorNumber(pn->last(), JSREPORT_ERROR, JSMSG_BAD_GENERATOR_SYNTAX, |
7348 |
reportErrorNumber(pn->last(), JSREPORT_ERROR, JSMSG_BAD_GENERATOR_SYNTAX, |
| 7311 |
js_generator_str); |
7349 |
js_generator_str); |
| 7312 |
return NULL; |
7350 |
return NULL; |
| 7313 |
} |
7351 |
} |
| 7314 |
pn = generatorExpr(pn); |
7352 |
pn = generatorExpr(pn); |
| 7315 |
if (!pn) |
7353 |
if (!pn) |
| 7316 |
return NULL; |
7354 |
return NULL; |
| 7317 |
pn->pn_pos.begin = begin; |
7355 |
|
| 7318 |
if (genexp) { |
7356 |
pn->pn_pos.end = tokenStream.currentToken().pos.end; |
| 7319 |
if (tokenStream.getToken() != TOK_RP) { |
7357 |
|
| 7320 |
reportErrorNumber(NULL, JSREPORT_ERROR, JSMSG_BAD_GENERATOR_SYNTAX, |
7358 |
if (tokenStream.getToken() != TOK_RP) { |
| 7321 |
js_generator_str); |
7359 |
reportErrorNumber(NULL, JSREPORT_ERROR, JSMSG_BAD_GENERATOR_SYNTAX, js_generator_str); |
| 7322 |
return NULL; |
7360 |
return NULL; |
| 7323 |
} |
|
|
| 7324 |
pn->pn_pos.end = tokenStream.currentToken().pos.end; |
| 7325 |
*genexp = JS_TRUE; |
| 7326 |
} |
7361 |
} |
|
|
7362 |
|
| 7363 |
isGenerator = true; |
| 7327 |
} else |
7364 |
} else |
| 7328 |
#endif /* JS_HAS_GENERATOR_EXPRS */ |
7365 |
#endif /* JS_HAS_GENERATOR_EXPRS */ |
| 7329 |
|
|
|
| 7330 |
if (!guard.maybeNoteGenerator(pn)) |
7366 |
if (!guard.maybeNoteGenerator(pn)) |
| 7331 |
return NULL; |
7367 |
return NULL; |
| 7332 |
|
7368 |
|
| 7333 |
return pn; |
7369 |
return pn; |
| 7334 |
} |
7370 |
} |