| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 641 } | 641 } |
| 642 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16); | 642 ZoneList<Statement*>* body = new(zone()) ZoneList<Statement*>(16); |
| 643 bool ok = true; | 643 bool ok = true; |
| 644 int beg_loc = scanner().location().beg_pos; | 644 int beg_loc = scanner().location().beg_pos; |
| 645 ParseSourceElements(body, Token::EOS, &ok); | 645 ParseSourceElements(body, Token::EOS, &ok); |
| 646 if (ok && top_scope_->is_strict_mode()) { | 646 if (ok && top_scope_->is_strict_mode()) { |
| 647 CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok); | 647 CheckOctalLiteral(beg_loc, scanner().location().end_pos, &ok); |
| 648 } | 648 } |
| 649 if (ok) { | 649 if (ok) { |
| 650 result = new(zone()) FunctionLiteral( | 650 result = new(zone()) FunctionLiteral( |
| 651 isolate(), |
| 651 no_name, | 652 no_name, |
| 652 top_scope_, | 653 top_scope_, |
| 653 body, | 654 body, |
| 654 lexical_scope.materialized_literal_count(), | 655 lexical_scope.materialized_literal_count(), |
| 655 lexical_scope.expected_property_count(), | 656 lexical_scope.expected_property_count(), |
| 656 lexical_scope.only_simple_this_property_assignments(), | 657 lexical_scope.only_simple_this_property_assignments(), |
| 657 lexical_scope.this_property_assignments(), | 658 lexical_scope.this_property_assignments(), |
| 658 0, | 659 0, |
| 659 0, | 660 0, |
| 660 source->length(), | 661 source->length(), |
| (...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1255 case Token::THROW: | 1256 case Token::THROW: |
| 1256 stmt = ParseThrowStatement(ok); | 1257 stmt = ParseThrowStatement(ok); |
| 1257 break; | 1258 break; |
| 1258 | 1259 |
| 1259 case Token::TRY: { | 1260 case Token::TRY: { |
| 1260 // NOTE: It is somewhat complicated to have labels on | 1261 // NOTE: It is somewhat complicated to have labels on |
| 1261 // try-statements. When breaking out of a try-finally statement, | 1262 // try-statements. When breaking out of a try-finally statement, |
| 1262 // one must take great care not to treat it as a | 1263 // one must take great care not to treat it as a |
| 1263 // fall-through. It is much easier just to wrap the entire | 1264 // fall-through. It is much easier just to wrap the entire |
| 1264 // try-statement in a statement block and put the labels there | 1265 // try-statement in a statement block and put the labels there |
| 1265 Block* result = new(zone()) Block(labels, 1, false); | 1266 Block* result = new(zone()) Block(isolate(), labels, 1, false); |
| 1266 Target target(&this->target_stack_, result); | 1267 Target target(&this->target_stack_, result); |
| 1267 TryStatement* statement = ParseTryStatement(CHECK_OK); | 1268 TryStatement* statement = ParseTryStatement(CHECK_OK); |
| 1268 if (statement) { | 1269 if (statement) { |
| 1269 statement->set_statement_pos(statement_pos); | 1270 statement->set_statement_pos(statement_pos); |
| 1270 } | 1271 } |
| 1271 if (result) result->AddStatement(statement); | 1272 if (result) result->AddStatement(statement); |
| 1272 return result; | 1273 return result; |
| 1273 } | 1274 } |
| 1274 | 1275 |
| 1275 case Token::FUNCTION: { | 1276 case Token::FUNCTION: { |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1446 | 1447 |
| 1447 // Copy the function data to the shared function info. | 1448 // Copy the function data to the shared function info. |
| 1448 shared->set_function_data(fun->shared()->function_data()); | 1449 shared->set_function_data(fun->shared()->function_data()); |
| 1449 int parameters = fun->shared()->formal_parameter_count(); | 1450 int parameters = fun->shared()->formal_parameter_count(); |
| 1450 shared->set_formal_parameter_count(parameters); | 1451 shared->set_formal_parameter_count(parameters); |
| 1451 | 1452 |
| 1452 // TODO(1240846): It's weird that native function declarations are | 1453 // TODO(1240846): It's weird that native function declarations are |
| 1453 // introduced dynamically when we meet their declarations, whereas | 1454 // introduced dynamically when we meet their declarations, whereas |
| 1454 // other functions are setup when entering the surrounding scope. | 1455 // other functions are setup when entering the surrounding scope. |
| 1455 SharedFunctionInfoLiteral* lit = | 1456 SharedFunctionInfoLiteral* lit = |
| 1456 new(zone()) SharedFunctionInfoLiteral(shared); | 1457 new(zone()) SharedFunctionInfoLiteral(isolate(), shared); |
| 1457 VariableProxy* var = Declare(name, Variable::VAR, NULL, true, CHECK_OK); | 1458 VariableProxy* var = Declare(name, Variable::VAR, NULL, true, CHECK_OK); |
| 1458 return new(zone()) ExpressionStatement(new(zone()) Assignment( | 1459 return new(zone()) ExpressionStatement(new(zone()) Assignment( |
| 1459 Token::INIT_VAR, var, lit, RelocInfo::kNoPosition)); | 1460 isolate(), Token::INIT_VAR, var, lit, RelocInfo::kNoPosition)); |
| 1460 } | 1461 } |
| 1461 | 1462 |
| 1462 | 1463 |
| 1463 Statement* Parser::ParseFunctionDeclaration(bool* ok) { | 1464 Statement* Parser::ParseFunctionDeclaration(bool* ok) { |
| 1464 // FunctionDeclaration :: | 1465 // FunctionDeclaration :: |
| 1465 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' | 1466 // 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}' |
| 1466 Expect(Token::FUNCTION, CHECK_OK); | 1467 Expect(Token::FUNCTION, CHECK_OK); |
| 1467 int function_token_position = scanner().location().beg_pos; | 1468 int function_token_position = scanner().location().beg_pos; |
| 1468 bool is_strict_reserved = false; | 1469 bool is_strict_reserved = false; |
| 1469 Handle<String> name = ParseIdentifierOrStrictReservedWord( | 1470 Handle<String> name = ParseIdentifierOrStrictReservedWord( |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1482 | 1483 |
| 1483 | 1484 |
| 1484 Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) { | 1485 Block* Parser::ParseBlock(ZoneStringList* labels, bool* ok) { |
| 1485 // Block :: | 1486 // Block :: |
| 1486 // '{' Statement* '}' | 1487 // '{' Statement* '}' |
| 1487 | 1488 |
| 1488 // Note that a Block does not introduce a new execution scope! | 1489 // Note that a Block does not introduce a new execution scope! |
| 1489 // (ECMA-262, 3rd, 12.2) | 1490 // (ECMA-262, 3rd, 12.2) |
| 1490 // | 1491 // |
| 1491 // Construct block expecting 16 statements. | 1492 // Construct block expecting 16 statements. |
| 1492 Block* result = new(zone()) Block(labels, 16, false); | 1493 Block* result = new(zone()) Block(isolate(), labels, 16, false); |
| 1493 Target target(&this->target_stack_, result); | 1494 Target target(&this->target_stack_, result); |
| 1494 Expect(Token::LBRACE, CHECK_OK); | 1495 Expect(Token::LBRACE, CHECK_OK); |
| 1495 InitializationBlockFinder block_finder(top_scope_, target_stack_); | 1496 InitializationBlockFinder block_finder(top_scope_, target_stack_); |
| 1496 while (peek() != Token::RBRACE) { | 1497 while (peek() != Token::RBRACE) { |
| 1497 Statement* stat = ParseStatement(NULL, CHECK_OK); | 1498 Statement* stat = ParseStatement(NULL, CHECK_OK); |
| 1498 if (stat && !stat->IsEmpty()) { | 1499 if (stat && !stat->IsEmpty()) { |
| 1499 result->AddStatement(stat); | 1500 result->AddStatement(stat); |
| 1500 block_finder.Update(stat); | 1501 block_finder.Update(stat); |
| 1501 } | 1502 } |
| 1502 } | 1503 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1557 // Scope declaration, and rewrite the source-level initialization into an | 1558 // Scope declaration, and rewrite the source-level initialization into an |
| 1558 // assignment statement. We use a block to collect multiple assignments. | 1559 // assignment statement. We use a block to collect multiple assignments. |
| 1559 // | 1560 // |
| 1560 // We mark the block as initializer block because we don't want the | 1561 // We mark the block as initializer block because we don't want the |
| 1561 // rewriter to add a '.result' assignment to such a block (to get compliant | 1562 // rewriter to add a '.result' assignment to such a block (to get compliant |
| 1562 // behavior for code such as print(eval('var x = 7')), and for cosmetic | 1563 // behavior for code such as print(eval('var x = 7')), and for cosmetic |
| 1563 // reasons when pretty-printing. Also, unless an assignment (initialization) | 1564 // reasons when pretty-printing. Also, unless an assignment (initialization) |
| 1564 // is inside an initializer block, it is ignored. | 1565 // is inside an initializer block, it is ignored. |
| 1565 // | 1566 // |
| 1566 // Create new block with one expected declaration. | 1567 // Create new block with one expected declaration. |
| 1567 Block* block = new(zone()) Block(NULL, 1, true); | 1568 Block* block = new(zone()) Block(isolate(), NULL, 1, true); |
| 1568 int nvars = 0; // the number of variables declared | 1569 int nvars = 0; // the number of variables declared |
| 1569 Handle<String> name; | 1570 Handle<String> name; |
| 1570 do { | 1571 do { |
| 1571 if (fni_ != NULL) fni_->Enter(); | 1572 if (fni_ != NULL) fni_->Enter(); |
| 1572 | 1573 |
| 1573 // Parse variable name. | 1574 // Parse variable name. |
| 1574 if (nvars > 0) Consume(Token::COMMA); | 1575 if (nvars > 0) Consume(Token::COMMA); |
| 1575 name = ParseIdentifier(CHECK_OK); | 1576 name = ParseIdentifier(CHECK_OK); |
| 1576 if (fni_ != NULL) fni_->PushVariableName(name); | 1577 if (fni_ != NULL) fni_->PushVariableName(name); |
| 1577 | 1578 |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1669 // prototype. This way, global variable declarations can shadow | 1670 // prototype. This way, global variable declarations can shadow |
| 1670 // properties in the prototype chain, but only after the variable | 1671 // properties in the prototype chain, but only after the variable |
| 1671 // declaration statement has been executed. This is important in | 1672 // declaration statement has been executed. This is important in |
| 1672 // browsers where the global object (window) has lots of | 1673 // browsers where the global object (window) has lots of |
| 1673 // properties defined in prototype objects. | 1674 // properties defined in prototype objects. |
| 1674 | 1675 |
| 1675 if (initialization_scope->is_global_scope()) { | 1676 if (initialization_scope->is_global_scope()) { |
| 1676 // Compute the arguments for the runtime call. | 1677 // Compute the arguments for the runtime call. |
| 1677 ZoneList<Expression*>* arguments = new(zone()) ZoneList<Expression*>(3); | 1678 ZoneList<Expression*>* arguments = new(zone()) ZoneList<Expression*>(3); |
| 1678 // We have at least 1 parameter. | 1679 // We have at least 1 parameter. |
| 1679 arguments->Add(new(zone()) Literal(name)); | 1680 arguments->Add(NewLiteral(name)); |
| 1680 CallRuntime* initialize; | 1681 CallRuntime* initialize; |
| 1681 | 1682 |
| 1682 if (is_const) { | 1683 if (is_const) { |
| 1683 arguments->Add(value); | 1684 arguments->Add(value); |
| 1684 value = NULL; // zap the value to avoid the unnecessary assignment | 1685 value = NULL; // zap the value to avoid the unnecessary assignment |
| 1685 | 1686 |
| 1686 // Construct the call to Runtime_InitializeConstGlobal | 1687 // Construct the call to Runtime_InitializeConstGlobal |
| 1687 // and add it to the initialization statement block. | 1688 // and add it to the initialization statement block. |
| 1688 // Note that the function does different things depending on | 1689 // Note that the function does different things depending on |
| 1689 // the number of arguments (1 or 2). | 1690 // the number of arguments (1 or 2). |
| 1690 initialize = | 1691 initialize = |
| 1691 new(zone()) CallRuntime( | 1692 new(zone()) CallRuntime( |
| 1692 isolate()->factory()->InitializeConstGlobal_symbol(), | 1693 isolate(), |
| 1693 Runtime::FunctionForId(Runtime::kInitializeConstGlobal), | 1694 isolate()->factory()->InitializeConstGlobal_symbol(), |
| 1694 arguments); | 1695 Runtime::FunctionForId(Runtime::kInitializeConstGlobal), |
| 1696 arguments); |
| 1695 } else { | 1697 } else { |
| 1696 // Add strict mode. | 1698 // Add strict mode. |
| 1697 // We may want to pass singleton to avoid Literal allocations. | 1699 // We may want to pass singleton to avoid Literal allocations. |
| 1698 StrictModeFlag flag = initialization_scope->is_strict_mode() | 1700 StrictModeFlag flag = initialization_scope->is_strict_mode() |
| 1699 ? kStrictMode | 1701 ? kStrictMode |
| 1700 : kNonStrictMode; | 1702 : kNonStrictMode; |
| 1701 arguments->Add(NewNumberLiteral(flag)); | 1703 arguments->Add(NewNumberLiteral(flag)); |
| 1702 | 1704 |
| 1703 // Be careful not to assign a value to the global variable if | 1705 // Be careful not to assign a value to the global variable if |
| 1704 // we're in a with. The initialization value should not | 1706 // we're in a with. The initialization value should not |
| 1705 // necessarily be stored in the global object in that case, | 1707 // necessarily be stored in the global object in that case, |
| 1706 // which is why we need to generate a separate assignment node. | 1708 // which is why we need to generate a separate assignment node. |
| 1707 if (value != NULL && !inside_with()) { | 1709 if (value != NULL && !inside_with()) { |
| 1708 arguments->Add(value); | 1710 arguments->Add(value); |
| 1709 value = NULL; // zap the value to avoid the unnecessary assignment | 1711 value = NULL; // zap the value to avoid the unnecessary assignment |
| 1710 } | 1712 } |
| 1711 | 1713 |
| 1712 // Construct the call to Runtime_InitializeVarGlobal | 1714 // Construct the call to Runtime_InitializeVarGlobal |
| 1713 // and add it to the initialization statement block. | 1715 // and add it to the initialization statement block. |
| 1714 // Note that the function does different things depending on | 1716 // Note that the function does different things depending on |
| 1715 // the number of arguments (2 or 3). | 1717 // the number of arguments (2 or 3). |
| 1716 initialize = | 1718 initialize = |
| 1717 new(zone()) CallRuntime( | 1719 new(zone()) CallRuntime( |
| 1718 isolate()->factory()->InitializeVarGlobal_symbol(), | 1720 isolate(), |
| 1719 Runtime::FunctionForId(Runtime::kInitializeVarGlobal), | 1721 isolate()->factory()->InitializeVarGlobal_symbol(), |
| 1720 arguments); | 1722 Runtime::FunctionForId(Runtime::kInitializeVarGlobal), |
| 1723 arguments); |
| 1721 } | 1724 } |
| 1722 | 1725 |
| 1723 block->AddStatement(new(zone()) ExpressionStatement(initialize)); | 1726 block->AddStatement(new(zone()) ExpressionStatement(initialize)); |
| 1724 } | 1727 } |
| 1725 | 1728 |
| 1726 // Add an assignment node to the initialization statement block if | 1729 // Add an assignment node to the initialization statement block if |
| 1727 // we still have a pending initialization value. We must distinguish | 1730 // we still have a pending initialization value. We must distinguish |
| 1728 // between variables and constants: Variable initializations are simply | 1731 // between variables and constants: Variable initializations are simply |
| 1729 // assignments (with all the consequences if they are inside a 'with' | 1732 // assignments (with all the consequences if they are inside a 'with' |
| 1730 // statement - they may change a 'with' object property). Constant | 1733 // statement - they may change a 'with' object property). Constant |
| 1731 // initializations always assign to the declared constant which is | 1734 // initializations always assign to the declared constant which is |
| 1732 // always at the function scope level. This is only relevant for | 1735 // always at the function scope level. This is only relevant for |
| 1733 // dynamically looked-up variables and constants (the start context | 1736 // dynamically looked-up variables and constants (the start context |
| 1734 // for constant lookups is always the function context, while it is | 1737 // for constant lookups is always the function context, while it is |
| 1735 // the top context for variables). Sigh... | 1738 // the top context for variables). Sigh... |
| 1736 if (value != NULL) { | 1739 if (value != NULL) { |
| 1737 Token::Value op = (is_const ? Token::INIT_CONST : Token::INIT_VAR); | 1740 Token::Value op = (is_const ? Token::INIT_CONST : Token::INIT_VAR); |
| 1738 bool in_with = is_const ? false : inside_with(); | 1741 bool in_with = is_const ? false : inside_with(); |
| 1739 VariableProxy* proxy = | 1742 VariableProxy* proxy = |
| 1740 initialization_scope->NewUnresolved(name, in_with); | 1743 initialization_scope->NewUnresolved(name, in_with); |
| 1741 Assignment* assignment = | 1744 Assignment* assignment = |
| 1742 new(zone()) Assignment(op, proxy, value, position); | 1745 new(zone()) Assignment(isolate(), op, proxy, value, position); |
| 1743 if (block) { | 1746 if (block) { |
| 1744 block->AddStatement(new(zone()) ExpressionStatement(assignment)); | 1747 block->AddStatement(new(zone()) ExpressionStatement(assignment)); |
| 1745 } | 1748 } |
| 1746 } | 1749 } |
| 1747 | 1750 |
| 1748 if (fni_ != NULL) fni_->Leave(); | 1751 if (fni_ != NULL) fni_->Leave(); |
| 1749 } while (peek() == Token::COMMA); | 1752 } while (peek() == Token::COMMA); |
| 1750 | 1753 |
| 1751 // If there was a single non-const declaration, return it in the output | 1754 // If there was a single non-const declaration, return it in the output |
| 1752 // parameter for possible use by for/in. | 1755 // parameter for possible use by for/in. |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1835 Expression* condition = ParseExpression(true, CHECK_OK); | 1838 Expression* condition = ParseExpression(true, CHECK_OK); |
| 1836 Expect(Token::RPAREN, CHECK_OK); | 1839 Expect(Token::RPAREN, CHECK_OK); |
| 1837 Statement* then_statement = ParseStatement(labels, CHECK_OK); | 1840 Statement* then_statement = ParseStatement(labels, CHECK_OK); |
| 1838 Statement* else_statement = NULL; | 1841 Statement* else_statement = NULL; |
| 1839 if (peek() == Token::ELSE) { | 1842 if (peek() == Token::ELSE) { |
| 1840 Next(); | 1843 Next(); |
| 1841 else_statement = ParseStatement(labels, CHECK_OK); | 1844 else_statement = ParseStatement(labels, CHECK_OK); |
| 1842 } else { | 1845 } else { |
| 1843 else_statement = EmptyStatement(); | 1846 else_statement = EmptyStatement(); |
| 1844 } | 1847 } |
| 1845 return new(zone()) IfStatement(condition, then_statement, else_statement); | 1848 return new(zone()) IfStatement( |
| 1849 isolate(), condition, then_statement, else_statement); |
| 1846 } | 1850 } |
| 1847 | 1851 |
| 1848 | 1852 |
| 1849 Statement* Parser::ParseContinueStatement(bool* ok) { | 1853 Statement* Parser::ParseContinueStatement(bool* ok) { |
| 1850 // ContinueStatement :: | 1854 // ContinueStatement :: |
| 1851 // 'continue' Identifier? ';' | 1855 // 'continue' Identifier? ';' |
| 1852 | 1856 |
| 1853 Expect(Token::CONTINUE, CHECK_OK); | 1857 Expect(Token::CONTINUE, CHECK_OK); |
| 1854 Handle<String> label = Handle<String>::null(); | 1858 Handle<String> label = Handle<String>::null(); |
| 1855 Token::Value tok = peek(); | 1859 Token::Value tok = peek(); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1954 Statement* stat; | 1958 Statement* stat; |
| 1955 { Target target(&this->target_stack_, &collector); | 1959 { Target target(&this->target_stack_, &collector); |
| 1956 with_nesting_level_++; | 1960 with_nesting_level_++; |
| 1957 top_scope_->DeclarationScope()->RecordWithStatement(); | 1961 top_scope_->DeclarationScope()->RecordWithStatement(); |
| 1958 stat = ParseStatement(labels, CHECK_OK); | 1962 stat = ParseStatement(labels, CHECK_OK); |
| 1959 with_nesting_level_--; | 1963 with_nesting_level_--; |
| 1960 } | 1964 } |
| 1961 // Create resulting block with two statements. | 1965 // Create resulting block with two statements. |
| 1962 // 1: Evaluate the with expression. | 1966 // 1: Evaluate the with expression. |
| 1963 // 2: The try-finally block evaluating the body. | 1967 // 2: The try-finally block evaluating the body. |
| 1964 Block* result = new(zone()) Block(NULL, 2, false); | 1968 Block* result = new(zone()) Block(isolate(), NULL, 2, false); |
| 1965 | 1969 |
| 1966 if (result != NULL) { | 1970 if (result != NULL) { |
| 1967 result->AddStatement(new(zone()) EnterWithContextStatement(obj)); | 1971 result->AddStatement(new(zone()) EnterWithContextStatement(obj)); |
| 1968 | 1972 |
| 1969 // Create body block. | 1973 // Create body block. |
| 1970 Block* body = new(zone()) Block(NULL, 1, false); | 1974 Block* body = new(zone()) Block(isolate(), NULL, 1, false); |
| 1971 body->AddStatement(stat); | 1975 body->AddStatement(stat); |
| 1972 | 1976 |
| 1973 // Create exit block. | 1977 // Create exit block. |
| 1974 Block* exit = new(zone()) Block(NULL, 1, false); | 1978 Block* exit = new(zone()) Block(isolate(), NULL, 1, false); |
| 1975 exit->AddStatement(new(zone()) ExitContextStatement()); | 1979 exit->AddStatement(new(zone()) ExitContextStatement()); |
| 1976 | 1980 |
| 1977 // Return a try-finally statement. | 1981 // Return a try-finally statement. |
| 1978 TryFinallyStatement* wrapper = new(zone()) TryFinallyStatement(body, exit); | 1982 TryFinallyStatement* wrapper = new(zone()) TryFinallyStatement(body, exit); |
| 1979 wrapper->set_escaping_targets(collector.targets()); | 1983 wrapper->set_escaping_targets(collector.targets()); |
| 1980 result->AddStatement(wrapper); | 1984 result->AddStatement(wrapper); |
| 1981 } | 1985 } |
| 1982 return result; | 1986 return result; |
| 1983 } | 1987 } |
| 1984 | 1988 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2025 Expect(Token::COLON, CHECK_OK); | 2029 Expect(Token::COLON, CHECK_OK); |
| 2026 int pos = scanner().location().beg_pos; | 2030 int pos = scanner().location().beg_pos; |
| 2027 ZoneList<Statement*>* statements = new(zone()) ZoneList<Statement*>(5); | 2031 ZoneList<Statement*>* statements = new(zone()) ZoneList<Statement*>(5); |
| 2028 while (peek() != Token::CASE && | 2032 while (peek() != Token::CASE && |
| 2029 peek() != Token::DEFAULT && | 2033 peek() != Token::DEFAULT && |
| 2030 peek() != Token::RBRACE) { | 2034 peek() != Token::RBRACE) { |
| 2031 Statement* stat = ParseStatement(NULL, CHECK_OK); | 2035 Statement* stat = ParseStatement(NULL, CHECK_OK); |
| 2032 statements->Add(stat); | 2036 statements->Add(stat); |
| 2033 } | 2037 } |
| 2034 | 2038 |
| 2035 return new(zone()) CaseClause(label, statements, pos); | 2039 return new(zone()) CaseClause(isolate(), label, statements, pos); |
| 2036 } | 2040 } |
| 2037 | 2041 |
| 2038 | 2042 |
| 2039 SwitchStatement* Parser::ParseSwitchStatement(ZoneStringList* labels, | 2043 SwitchStatement* Parser::ParseSwitchStatement(ZoneStringList* labels, |
| 2040 bool* ok) { | 2044 bool* ok) { |
| 2041 // SwitchStatement :: | 2045 // SwitchStatement :: |
| 2042 // 'switch' '(' Expression ')' '{' CaseClause* '}' | 2046 // 'switch' '(' Expression ')' '{' CaseClause* '}' |
| 2043 | 2047 |
| 2044 SwitchStatement* statement = new(zone()) SwitchStatement(labels); | 2048 SwitchStatement* statement = new(zone()) SwitchStatement(isolate(), labels); |
| 2045 Target target(&this->target_stack_, statement); | 2049 Target target(&this->target_stack_, statement); |
| 2046 | 2050 |
| 2047 Expect(Token::SWITCH, CHECK_OK); | 2051 Expect(Token::SWITCH, CHECK_OK); |
| 2048 Expect(Token::LPAREN, CHECK_OK); | 2052 Expect(Token::LPAREN, CHECK_OK); |
| 2049 Expression* tag = ParseExpression(true, CHECK_OK); | 2053 Expression* tag = ParseExpression(true, CHECK_OK); |
| 2050 Expect(Token::RPAREN, CHECK_OK); | 2054 Expect(Token::RPAREN, CHECK_OK); |
| 2051 | 2055 |
| 2052 bool default_seen = false; | 2056 bool default_seen = false; |
| 2053 ZoneList<CaseClause*>* cases = new(zone()) ZoneList<CaseClause*>(4); | 2057 ZoneList<CaseClause*>* cases = new(zone()) ZoneList<CaseClause*>(4); |
| 2054 Expect(Token::LBRACE, CHECK_OK); | 2058 Expect(Token::LBRACE, CHECK_OK); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2070 Expect(Token::THROW, CHECK_OK); | 2074 Expect(Token::THROW, CHECK_OK); |
| 2071 int pos = scanner().location().beg_pos; | 2075 int pos = scanner().location().beg_pos; |
| 2072 if (scanner().HasAnyLineTerminatorBeforeNext()) { | 2076 if (scanner().HasAnyLineTerminatorBeforeNext()) { |
| 2073 ReportMessage("newline_after_throw", Vector<const char*>::empty()); | 2077 ReportMessage("newline_after_throw", Vector<const char*>::empty()); |
| 2074 *ok = false; | 2078 *ok = false; |
| 2075 return NULL; | 2079 return NULL; |
| 2076 } | 2080 } |
| 2077 Expression* exception = ParseExpression(true, CHECK_OK); | 2081 Expression* exception = ParseExpression(true, CHECK_OK); |
| 2078 ExpectSemicolon(CHECK_OK); | 2082 ExpectSemicolon(CHECK_OK); |
| 2079 | 2083 |
| 2080 return new(zone()) ExpressionStatement(new(zone()) Throw(exception, pos)); | 2084 return new(zone()) ExpressionStatement( |
| 2085 new(zone()) Throw(isolate(), exception, pos)); |
| 2081 } | 2086 } |
| 2082 | 2087 |
| 2083 | 2088 |
| 2084 TryStatement* Parser::ParseTryStatement(bool* ok) { | 2089 TryStatement* Parser::ParseTryStatement(bool* ok) { |
| 2085 // TryStatement :: | 2090 // TryStatement :: |
| 2086 // 'try' Block Catch | 2091 // 'try' Block Catch |
| 2087 // 'try' Block Finally | 2092 // 'try' Block Finally |
| 2088 // 'try' Block Catch Finally | 2093 // 'try' Block Catch Finally |
| 2089 // | 2094 // |
| 2090 // Catch :: | 2095 // Catch :: |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2149 catch_variable = catch_scope->DeclareLocal(name, Variable::VAR); | 2154 catch_variable = catch_scope->DeclareLocal(name, Variable::VAR); |
| 2150 | 2155 |
| 2151 Scope* saved_scope = top_scope_; | 2156 Scope* saved_scope = top_scope_; |
| 2152 top_scope_ = catch_scope; | 2157 top_scope_ = catch_scope; |
| 2153 inner_body = ParseBlock(NULL, CHECK_OK); | 2158 inner_body = ParseBlock(NULL, CHECK_OK); |
| 2154 top_scope_ = saved_scope; | 2159 top_scope_ = saved_scope; |
| 2155 } | 2160 } |
| 2156 } | 2161 } |
| 2157 | 2162 |
| 2158 // Create exit block. | 2163 // Create exit block. |
| 2159 Block* inner_finally = new(zone()) Block(NULL, 1, false); | 2164 Block* inner_finally = new(zone()) Block(isolate(), NULL, 1, false); |
| 2160 inner_finally->AddStatement(new(zone()) ExitContextStatement()); | 2165 inner_finally->AddStatement(new(zone()) ExitContextStatement()); |
| 2161 | 2166 |
| 2162 // Create a try/finally statement. | 2167 // Create a try/finally statement. |
| 2163 TryFinallyStatement* inner_try_finally = | 2168 TryFinallyStatement* inner_try_finally = |
| 2164 new(zone()) TryFinallyStatement(inner_body, inner_finally); | 2169 new(zone()) TryFinallyStatement(inner_body, inner_finally); |
| 2165 inner_try_finally->set_escaping_targets(inner_collector.targets()); | 2170 inner_try_finally->set_escaping_targets(inner_collector.targets()); |
| 2166 | 2171 |
| 2167 catch_block = new(zone()) Block(NULL, 1, false); | 2172 catch_block = new(zone()) Block(isolate(), NULL, 1, false); |
| 2168 catch_block->AddStatement(inner_try_finally); | 2173 catch_block->AddStatement(inner_try_finally); |
| 2169 } else { | 2174 } else { |
| 2170 Expect(Token::LBRACE, CHECK_OK); | 2175 Expect(Token::LBRACE, CHECK_OK); |
| 2171 } | 2176 } |
| 2172 | 2177 |
| 2173 tok = peek(); | 2178 tok = peek(); |
| 2174 } | 2179 } |
| 2175 | 2180 |
| 2176 Block* finally_block = NULL; | 2181 Block* finally_block = NULL; |
| 2177 if (tok == Token::FINALLY || catch_block == NULL) { | 2182 if (tok == Token::FINALLY || catch_block == NULL) { |
| 2178 Consume(Token::FINALLY); | 2183 Consume(Token::FINALLY); |
| 2179 finally_block = ParseBlock(NULL, CHECK_OK); | 2184 finally_block = ParseBlock(NULL, CHECK_OK); |
| 2180 } | 2185 } |
| 2181 | 2186 |
| 2182 // Simplify the AST nodes by converting: | 2187 // Simplify the AST nodes by converting: |
| 2183 // 'try B0 catch B1 finally B2' | 2188 // 'try B0 catch B1 finally B2' |
| 2184 // to: | 2189 // to: |
| 2185 // 'try { try B0 catch B1 } finally B2' | 2190 // 'try { try B0 catch B1 } finally B2' |
| 2186 | 2191 |
| 2187 if (catch_block != NULL && finally_block != NULL) { | 2192 if (catch_block != NULL && finally_block != NULL) { |
| 2188 // If we have both, create an inner try/catch. | 2193 // If we have both, create an inner try/catch. |
| 2189 ASSERT(catch_scope != NULL && catch_variable != NULL); | 2194 ASSERT(catch_scope != NULL && catch_variable != NULL); |
| 2190 TryCatchStatement* statement = | 2195 TryCatchStatement* statement = |
| 2191 new(zone()) TryCatchStatement(try_block, | 2196 new(zone()) TryCatchStatement(try_block, |
| 2192 catch_scope, | 2197 catch_scope, |
| 2193 catch_variable, | 2198 catch_variable, |
| 2194 catch_block); | 2199 catch_block); |
| 2195 statement->set_escaping_targets(try_collector.targets()); | 2200 statement->set_escaping_targets(try_collector.targets()); |
| 2196 try_block = new(zone()) Block(NULL, 1, false); | 2201 try_block = new(zone()) Block(isolate(), NULL, 1, false); |
| 2197 try_block->AddStatement(statement); | 2202 try_block->AddStatement(statement); |
| 2198 catch_block = NULL; // Clear to indicate it's been handled. | 2203 catch_block = NULL; // Clear to indicate it's been handled. |
| 2199 } | 2204 } |
| 2200 | 2205 |
| 2201 TryStatement* result = NULL; | 2206 TryStatement* result = NULL; |
| 2202 if (catch_block != NULL) { | 2207 if (catch_block != NULL) { |
| 2203 ASSERT(finally_block == NULL); | 2208 ASSERT(finally_block == NULL); |
| 2204 ASSERT(catch_scope != NULL && catch_variable != NULL); | 2209 ASSERT(catch_scope != NULL && catch_variable != NULL); |
| 2205 result = | 2210 result = |
| 2206 new(zone()) TryCatchStatement(try_block, | 2211 new(zone()) TryCatchStatement(try_block, |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2217 result->set_escaping_targets(try_collector.targets()); | 2222 result->set_escaping_targets(try_collector.targets()); |
| 2218 return result; | 2223 return result; |
| 2219 } | 2224 } |
| 2220 | 2225 |
| 2221 | 2226 |
| 2222 DoWhileStatement* Parser::ParseDoWhileStatement(ZoneStringList* labels, | 2227 DoWhileStatement* Parser::ParseDoWhileStatement(ZoneStringList* labels, |
| 2223 bool* ok) { | 2228 bool* ok) { |
| 2224 // DoStatement :: | 2229 // DoStatement :: |
| 2225 // 'do' Statement 'while' '(' Expression ')' ';' | 2230 // 'do' Statement 'while' '(' Expression ')' ';' |
| 2226 | 2231 |
| 2227 DoWhileStatement* loop = new(zone()) DoWhileStatement(labels); | 2232 DoWhileStatement* loop = new(zone()) DoWhileStatement(isolate(), labels); |
| 2228 Target target(&this->target_stack_, loop); | 2233 Target target(&this->target_stack_, loop); |
| 2229 | 2234 |
| 2230 Expect(Token::DO, CHECK_OK); | 2235 Expect(Token::DO, CHECK_OK); |
| 2231 Statement* body = ParseStatement(NULL, CHECK_OK); | 2236 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2232 Expect(Token::WHILE, CHECK_OK); | 2237 Expect(Token::WHILE, CHECK_OK); |
| 2233 Expect(Token::LPAREN, CHECK_OK); | 2238 Expect(Token::LPAREN, CHECK_OK); |
| 2234 | 2239 |
| 2235 if (loop != NULL) { | 2240 if (loop != NULL) { |
| 2236 int position = scanner().location().beg_pos; | 2241 int position = scanner().location().beg_pos; |
| 2237 loop->set_condition_position(position); | 2242 loop->set_condition_position(position); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2248 | 2253 |
| 2249 if (loop != NULL) loop->Initialize(cond, body); | 2254 if (loop != NULL) loop->Initialize(cond, body); |
| 2250 return loop; | 2255 return loop; |
| 2251 } | 2256 } |
| 2252 | 2257 |
| 2253 | 2258 |
| 2254 WhileStatement* Parser::ParseWhileStatement(ZoneStringList* labels, bool* ok) { | 2259 WhileStatement* Parser::ParseWhileStatement(ZoneStringList* labels, bool* ok) { |
| 2255 // WhileStatement :: | 2260 // WhileStatement :: |
| 2256 // 'while' '(' Expression ')' Statement | 2261 // 'while' '(' Expression ')' Statement |
| 2257 | 2262 |
| 2258 WhileStatement* loop = new(zone()) WhileStatement(labels); | 2263 WhileStatement* loop = new(zone()) WhileStatement(isolate(), labels); |
| 2259 Target target(&this->target_stack_, loop); | 2264 Target target(&this->target_stack_, loop); |
| 2260 | 2265 |
| 2261 Expect(Token::WHILE, CHECK_OK); | 2266 Expect(Token::WHILE, CHECK_OK); |
| 2262 Expect(Token::LPAREN, CHECK_OK); | 2267 Expect(Token::LPAREN, CHECK_OK); |
| 2263 Expression* cond = ParseExpression(true, CHECK_OK); | 2268 Expression* cond = ParseExpression(true, CHECK_OK); |
| 2264 Expect(Token::RPAREN, CHECK_OK); | 2269 Expect(Token::RPAREN, CHECK_OK); |
| 2265 Statement* body = ParseStatement(NULL, CHECK_OK); | 2270 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2266 | 2271 |
| 2267 if (loop != NULL) loop->Initialize(cond, body); | 2272 if (loop != NULL) loop->Initialize(cond, body); |
| 2268 return loop; | 2273 return loop; |
| 2269 } | 2274 } |
| 2270 | 2275 |
| 2271 | 2276 |
| 2272 Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { | 2277 Statement* Parser::ParseForStatement(ZoneStringList* labels, bool* ok) { |
| 2273 // ForStatement :: | 2278 // ForStatement :: |
| 2274 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement | 2279 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement |
| 2275 | 2280 |
| 2276 Statement* init = NULL; | 2281 Statement* init = NULL; |
| 2277 | 2282 |
| 2278 Expect(Token::FOR, CHECK_OK); | 2283 Expect(Token::FOR, CHECK_OK); |
| 2279 Expect(Token::LPAREN, CHECK_OK); | 2284 Expect(Token::LPAREN, CHECK_OK); |
| 2280 if (peek() != Token::SEMICOLON) { | 2285 if (peek() != Token::SEMICOLON) { |
| 2281 if (peek() == Token::VAR || peek() == Token::CONST) { | 2286 if (peek() == Token::VAR || peek() == Token::CONST) { |
| 2282 Handle<String> name; | 2287 Handle<String> name; |
| 2283 Block* variable_statement = | 2288 Block* variable_statement = |
| 2284 ParseVariableDeclarations(false, &name, CHECK_OK); | 2289 ParseVariableDeclarations(false, &name, CHECK_OK); |
| 2285 | 2290 |
| 2286 if (peek() == Token::IN && !name.is_null()) { | 2291 if (peek() == Token::IN && !name.is_null()) { |
| 2287 VariableProxy* each = top_scope_->NewUnresolved(name, inside_with()); | 2292 VariableProxy* each = top_scope_->NewUnresolved(name, inside_with()); |
| 2288 ForInStatement* loop = new(zone()) ForInStatement(labels); | 2293 ForInStatement* loop = new(zone()) ForInStatement(isolate(), labels); |
| 2289 Target target(&this->target_stack_, loop); | 2294 Target target(&this->target_stack_, loop); |
| 2290 | 2295 |
| 2291 Expect(Token::IN, CHECK_OK); | 2296 Expect(Token::IN, CHECK_OK); |
| 2292 Expression* enumerable = ParseExpression(true, CHECK_OK); | 2297 Expression* enumerable = ParseExpression(true, CHECK_OK); |
| 2293 Expect(Token::RPAREN, CHECK_OK); | 2298 Expect(Token::RPAREN, CHECK_OK); |
| 2294 | 2299 |
| 2295 Statement* body = ParseStatement(NULL, CHECK_OK); | 2300 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2296 loop->Initialize(each, enumerable, body); | 2301 loop->Initialize(each, enumerable, body); |
| 2297 Block* result = new(zone()) Block(NULL, 2, false); | 2302 Block* result = new(zone()) Block(isolate(), NULL, 2, false); |
| 2298 result->AddStatement(variable_statement); | 2303 result->AddStatement(variable_statement); |
| 2299 result->AddStatement(loop); | 2304 result->AddStatement(loop); |
| 2300 // Parsed for-in loop w/ variable/const declaration. | 2305 // Parsed for-in loop w/ variable/const declaration. |
| 2301 return result; | 2306 return result; |
| 2302 } else { | 2307 } else { |
| 2303 init = variable_statement; | 2308 init = variable_statement; |
| 2304 } | 2309 } |
| 2305 | 2310 |
| 2306 } else { | 2311 } else { |
| 2307 Expression* expression = ParseExpression(false, CHECK_OK); | 2312 Expression* expression = ParseExpression(false, CHECK_OK); |
| 2308 if (peek() == Token::IN) { | 2313 if (peek() == Token::IN) { |
| 2309 // Signal a reference error if the expression is an invalid | 2314 // Signal a reference error if the expression is an invalid |
| 2310 // left-hand side expression. We could report this as a syntax | 2315 // left-hand side expression. We could report this as a syntax |
| 2311 // error here but for compatibility with JSC we choose to report | 2316 // error here but for compatibility with JSC we choose to report |
| 2312 // the error at runtime. | 2317 // the error at runtime. |
| 2313 if (expression == NULL || !expression->IsValidLeftHandSide()) { | 2318 if (expression == NULL || !expression->IsValidLeftHandSide()) { |
| 2314 Handle<String> type = | 2319 Handle<String> type = |
| 2315 isolate()->factory()->invalid_lhs_in_for_in_symbol(); | 2320 isolate()->factory()->invalid_lhs_in_for_in_symbol(); |
| 2316 expression = NewThrowReferenceError(type); | 2321 expression = NewThrowReferenceError(type); |
| 2317 } | 2322 } |
| 2318 ForInStatement* loop = new(zone()) ForInStatement(labels); | 2323 ForInStatement* loop = new(zone()) ForInStatement(isolate(), labels); |
| 2319 Target target(&this->target_stack_, loop); | 2324 Target target(&this->target_stack_, loop); |
| 2320 | 2325 |
| 2321 Expect(Token::IN, CHECK_OK); | 2326 Expect(Token::IN, CHECK_OK); |
| 2322 Expression* enumerable = ParseExpression(true, CHECK_OK); | 2327 Expression* enumerable = ParseExpression(true, CHECK_OK); |
| 2323 Expect(Token::RPAREN, CHECK_OK); | 2328 Expect(Token::RPAREN, CHECK_OK); |
| 2324 | 2329 |
| 2325 Statement* body = ParseStatement(NULL, CHECK_OK); | 2330 Statement* body = ParseStatement(NULL, CHECK_OK); |
| 2326 if (loop) loop->Initialize(expression, enumerable, body); | 2331 if (loop) loop->Initialize(expression, enumerable, body); |
| 2327 // Parsed for-in loop. | 2332 // Parsed for-in loop. |
| 2328 return loop; | 2333 return loop; |
| 2329 | 2334 |
| 2330 } else { | 2335 } else { |
| 2331 init = new(zone()) ExpressionStatement(expression); | 2336 init = new(zone()) ExpressionStatement(expression); |
| 2332 } | 2337 } |
| 2333 } | 2338 } |
| 2334 } | 2339 } |
| 2335 | 2340 |
| 2336 // Standard 'for' loop | 2341 // Standard 'for' loop |
| 2337 ForStatement* loop = new(zone()) ForStatement(labels); | 2342 ForStatement* loop = new(zone()) ForStatement(isolate(), labels); |
| 2338 Target target(&this->target_stack_, loop); | 2343 Target target(&this->target_stack_, loop); |
| 2339 | 2344 |
| 2340 // Parsed initializer at this point. | 2345 // Parsed initializer at this point. |
| 2341 Expect(Token::SEMICOLON, CHECK_OK); | 2346 Expect(Token::SEMICOLON, CHECK_OK); |
| 2342 | 2347 |
| 2343 Expression* cond = NULL; | 2348 Expression* cond = NULL; |
| 2344 if (peek() != Token::SEMICOLON) { | 2349 if (peek() != Token::SEMICOLON) { |
| 2345 cond = ParseExpression(true, CHECK_OK); | 2350 cond = ParseExpression(true, CHECK_OK); |
| 2346 } | 2351 } |
| 2347 Expect(Token::SEMICOLON, CHECK_OK); | 2352 Expect(Token::SEMICOLON, CHECK_OK); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2363 Expression* Parser::ParseExpression(bool accept_IN, bool* ok) { | 2368 Expression* Parser::ParseExpression(bool accept_IN, bool* ok) { |
| 2364 // Expression :: | 2369 // Expression :: |
| 2365 // AssignmentExpression | 2370 // AssignmentExpression |
| 2366 // Expression ',' AssignmentExpression | 2371 // Expression ',' AssignmentExpression |
| 2367 | 2372 |
| 2368 Expression* result = ParseAssignmentExpression(accept_IN, CHECK_OK); | 2373 Expression* result = ParseAssignmentExpression(accept_IN, CHECK_OK); |
| 2369 while (peek() == Token::COMMA) { | 2374 while (peek() == Token::COMMA) { |
| 2370 Expect(Token::COMMA, CHECK_OK); | 2375 Expect(Token::COMMA, CHECK_OK); |
| 2371 int position = scanner().location().beg_pos; | 2376 int position = scanner().location().beg_pos; |
| 2372 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); | 2377 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); |
| 2373 result = new(zone()) BinaryOperation(Token::COMMA, result, right, position); | 2378 result = new(zone()) BinaryOperation( |
| 2379 isolate(), Token::COMMA, result, right, position); |
| 2374 } | 2380 } |
| 2375 return result; | 2381 return result; |
| 2376 } | 2382 } |
| 2377 | 2383 |
| 2378 | 2384 |
| 2379 // Precedence = 2 | 2385 // Precedence = 2 |
| 2380 Expression* Parser::ParseAssignmentExpression(bool accept_IN, bool* ok) { | 2386 Expression* Parser::ParseAssignmentExpression(bool accept_IN, bool* ok) { |
| 2381 // AssignmentExpression :: | 2387 // AssignmentExpression :: |
| 2382 // ConditionalExpression | 2388 // ConditionalExpression |
| 2383 // LeftHandSideExpression AssignmentOperator AssignmentExpression | 2389 // LeftHandSideExpression AssignmentOperator AssignmentExpression |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2435 // expression. | 2441 // expression. |
| 2436 if ((op == Token::INIT_VAR | 2442 if ((op == Token::INIT_VAR |
| 2437 || op == Token::INIT_CONST | 2443 || op == Token::INIT_CONST |
| 2438 || op == Token::ASSIGN) | 2444 || op == Token::ASSIGN) |
| 2439 && (right->AsCall() == NULL && right->AsCallNew() == NULL)) { | 2445 && (right->AsCall() == NULL && right->AsCallNew() == NULL)) { |
| 2440 fni_->Infer(); | 2446 fni_->Infer(); |
| 2441 } | 2447 } |
| 2442 fni_->Leave(); | 2448 fni_->Leave(); |
| 2443 } | 2449 } |
| 2444 | 2450 |
| 2445 return new(zone()) Assignment(op, expression, right, pos); | 2451 return new(zone()) Assignment(isolate(), op, expression, right, pos); |
| 2446 } | 2452 } |
| 2447 | 2453 |
| 2448 | 2454 |
| 2449 // Precedence = 3 | 2455 // Precedence = 3 |
| 2450 Expression* Parser::ParseConditionalExpression(bool accept_IN, bool* ok) { | 2456 Expression* Parser::ParseConditionalExpression(bool accept_IN, bool* ok) { |
| 2451 // ConditionalExpression :: | 2457 // ConditionalExpression :: |
| 2452 // LogicalOrExpression | 2458 // LogicalOrExpression |
| 2453 // LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression | 2459 // LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression |
| 2454 | 2460 |
| 2455 // We start using the binary expression parser for prec >= 4 only! | 2461 // We start using the binary expression parser for prec >= 4 only! |
| 2456 Expression* expression = ParseBinaryExpression(4, accept_IN, CHECK_OK); | 2462 Expression* expression = ParseBinaryExpression(4, accept_IN, CHECK_OK); |
| 2457 if (peek() != Token::CONDITIONAL) return expression; | 2463 if (peek() != Token::CONDITIONAL) return expression; |
| 2458 Consume(Token::CONDITIONAL); | 2464 Consume(Token::CONDITIONAL); |
| 2459 // In parsing the first assignment expression in conditional | 2465 // In parsing the first assignment expression in conditional |
| 2460 // expressions we always accept the 'in' keyword; see ECMA-262, | 2466 // expressions we always accept the 'in' keyword; see ECMA-262, |
| 2461 // section 11.12, page 58. | 2467 // section 11.12, page 58. |
| 2462 int left_position = scanner().peek_location().beg_pos; | 2468 int left_position = scanner().peek_location().beg_pos; |
| 2463 Expression* left = ParseAssignmentExpression(true, CHECK_OK); | 2469 Expression* left = ParseAssignmentExpression(true, CHECK_OK); |
| 2464 Expect(Token::COLON, CHECK_OK); | 2470 Expect(Token::COLON, CHECK_OK); |
| 2465 int right_position = scanner().peek_location().beg_pos; | 2471 int right_position = scanner().peek_location().beg_pos; |
| 2466 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); | 2472 Expression* right = ParseAssignmentExpression(accept_IN, CHECK_OK); |
| 2467 return new(zone()) Conditional(expression, left, right, | 2473 return new(zone()) Conditional( |
| 2468 left_position, right_position); | 2474 isolate(), expression, left, right, left_position, right_position); |
| 2469 } | 2475 } |
| 2470 | 2476 |
| 2471 | 2477 |
| 2472 static int Precedence(Token::Value tok, bool accept_IN) { | 2478 static int Precedence(Token::Value tok, bool accept_IN) { |
| 2473 if (tok == Token::IN && !accept_IN) | 2479 if (tok == Token::IN && !accept_IN) |
| 2474 return 0; // 0 precedence will terminate binary expression parsing | 2480 return 0; // 0 precedence will terminate binary expression parsing |
| 2475 | 2481 |
| 2476 return Token::Precedence(tok); | 2482 return Token::Precedence(tok); |
| 2477 } | 2483 } |
| 2478 | 2484 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2545 // We have a comparison. | 2551 // We have a comparison. |
| 2546 Token::Value cmp = op; | 2552 Token::Value cmp = op; |
| 2547 switch (op) { | 2553 switch (op) { |
| 2548 case Token::NE: cmp = Token::EQ; break; | 2554 case Token::NE: cmp = Token::EQ; break; |
| 2549 case Token::NE_STRICT: cmp = Token::EQ_STRICT; break; | 2555 case Token::NE_STRICT: cmp = Token::EQ_STRICT; break; |
| 2550 default: break; | 2556 default: break; |
| 2551 } | 2557 } |
| 2552 x = NewCompareNode(cmp, x, y, position); | 2558 x = NewCompareNode(cmp, x, y, position); |
| 2553 if (cmp != op) { | 2559 if (cmp != op) { |
| 2554 // The comparison was negated - add a NOT. | 2560 // The comparison was negated - add a NOT. |
| 2555 x = new(zone()) UnaryOperation(Token::NOT, x, position); | 2561 x = new(zone()) UnaryOperation(isolate(), Token::NOT, x, position); |
| 2556 } | 2562 } |
| 2557 | 2563 |
| 2558 } else { | 2564 } else { |
| 2559 // We have a "normal" binary operation. | 2565 // We have a "normal" binary operation. |
| 2560 x = new(zone()) BinaryOperation(op, x, y, position); | 2566 x = new(zone()) BinaryOperation(isolate(), op, x, y, position); |
| 2561 } | 2567 } |
| 2562 } | 2568 } |
| 2563 } | 2569 } |
| 2564 return x; | 2570 return x; |
| 2565 } | 2571 } |
| 2566 | 2572 |
| 2567 | 2573 |
| 2568 Expression* Parser::NewCompareNode(Token::Value op, | 2574 Expression* Parser::NewCompareNode(Token::Value op, |
| 2569 Expression* x, | 2575 Expression* x, |
| 2570 Expression* y, | 2576 Expression* y, |
| 2571 int position) { | 2577 int position) { |
| 2572 ASSERT(op != Token::NE && op != Token::NE_STRICT); | 2578 ASSERT(op != Token::NE && op != Token::NE_STRICT); |
| 2573 if (op == Token::EQ || op == Token::EQ_STRICT) { | 2579 if (op == Token::EQ || op == Token::EQ_STRICT) { |
| 2574 bool is_strict = (op == Token::EQ_STRICT); | 2580 bool is_strict = (op == Token::EQ_STRICT); |
| 2575 Literal* x_literal = x->AsLiteral(); | 2581 Literal* x_literal = x->AsLiteral(); |
| 2576 if (x_literal != NULL && x_literal->IsNull()) { | 2582 if (x_literal != NULL && x_literal->IsNull()) { |
| 2577 return new(zone()) CompareToNull(is_strict, y); | 2583 return new(zone()) CompareToNull(isolate(), is_strict, y); |
| 2578 } | 2584 } |
| 2579 | 2585 |
| 2580 Literal* y_literal = y->AsLiteral(); | 2586 Literal* y_literal = y->AsLiteral(); |
| 2581 if (y_literal != NULL && y_literal->IsNull()) { | 2587 if (y_literal != NULL && y_literal->IsNull()) { |
| 2582 return new(zone()) CompareToNull(is_strict, x); | 2588 return new(zone()) CompareToNull(isolate(), is_strict, x); |
| 2583 } | 2589 } |
| 2584 } | 2590 } |
| 2585 return new(zone()) CompareOperation(op, x, y, position); | 2591 return new(zone()) CompareOperation(isolate(), op, x, y, position); |
| 2586 } | 2592 } |
| 2587 | 2593 |
| 2588 | 2594 |
| 2589 Expression* Parser::ParseUnaryExpression(bool* ok) { | 2595 Expression* Parser::ParseUnaryExpression(bool* ok) { |
| 2590 // UnaryExpression :: | 2596 // UnaryExpression :: |
| 2591 // PostfixExpression | 2597 // PostfixExpression |
| 2592 // 'delete' UnaryExpression | 2598 // 'delete' UnaryExpression |
| 2593 // 'void' UnaryExpression | 2599 // 'void' UnaryExpression |
| 2594 // 'typeof' UnaryExpression | 2600 // 'typeof' UnaryExpression |
| 2595 // '++' UnaryExpression | 2601 // '++' UnaryExpression |
| 2596 // '--' UnaryExpression | 2602 // '--' UnaryExpression |
| 2597 // '+' UnaryExpression | 2603 // '+' UnaryExpression |
| 2598 // '-' UnaryExpression | 2604 // '-' UnaryExpression |
| 2599 // '~' UnaryExpression | 2605 // '~' UnaryExpression |
| 2600 // '!' UnaryExpression | 2606 // '!' UnaryExpression |
| 2601 | 2607 |
| 2602 Token::Value op = peek(); | 2608 Token::Value op = peek(); |
| 2603 if (Token::IsUnaryOp(op)) { | 2609 if (Token::IsUnaryOp(op)) { |
| 2604 op = Next(); | 2610 op = Next(); |
| 2605 int position = scanner().location().beg_pos; | 2611 int position = scanner().location().beg_pos; |
| 2606 Expression* expression = ParseUnaryExpression(CHECK_OK); | 2612 Expression* expression = ParseUnaryExpression(CHECK_OK); |
| 2607 | 2613 |
| 2608 if (expression != NULL && (expression->AsLiteral() != NULL)) { | 2614 if (expression != NULL && (expression->AsLiteral() != NULL)) { |
| 2609 Handle<Object> literal = expression->AsLiteral()->handle(); | 2615 Handle<Object> literal = expression->AsLiteral()->handle(); |
| 2610 if (op == Token::NOT) { | 2616 if (op == Token::NOT) { |
| 2611 // Convert the literal to a boolean condition and negate it. | 2617 // Convert the literal to a boolean condition and negate it. |
| 2612 bool condition = literal->ToBoolean()->IsTrue(); | 2618 bool condition = literal->ToBoolean()->IsTrue(); |
| 2613 Handle<Object> result(isolate()->heap()->ToBoolean(!condition)); | 2619 Handle<Object> result(isolate()->heap()->ToBoolean(!condition)); |
| 2614 return new(zone()) Literal(result); | 2620 return NewLiteral(result); |
| 2615 } else if (literal->IsNumber()) { | 2621 } else if (literal->IsNumber()) { |
| 2616 // Compute some expressions involving only number literals. | 2622 // Compute some expressions involving only number literals. |
| 2617 double value = literal->Number(); | 2623 double value = literal->Number(); |
| 2618 switch (op) { | 2624 switch (op) { |
| 2619 case Token::ADD: | 2625 case Token::ADD: |
| 2620 return expression; | 2626 return expression; |
| 2621 case Token::SUB: | 2627 case Token::SUB: |
| 2622 return NewNumberLiteral(-value); | 2628 return NewNumberLiteral(-value); |
| 2623 case Token::BIT_NOT: | 2629 case Token::BIT_NOT: |
| 2624 return NewNumberLiteral(~DoubleToInt32(value)); | 2630 return NewNumberLiteral(~DoubleToInt32(value)); |
| 2625 default: | 2631 default: |
| 2626 break; | 2632 break; |
| 2627 } | 2633 } |
| 2628 } | 2634 } |
| 2629 } | 2635 } |
| 2630 | 2636 |
| 2631 // "delete identifier" is a syntax error in strict mode. | 2637 // "delete identifier" is a syntax error in strict mode. |
| 2632 if (op == Token::DELETE && top_scope_->is_strict_mode()) { | 2638 if (op == Token::DELETE && top_scope_->is_strict_mode()) { |
| 2633 VariableProxy* operand = expression->AsVariableProxy(); | 2639 VariableProxy* operand = expression->AsVariableProxy(); |
| 2634 if (operand != NULL && !operand->is_this()) { | 2640 if (operand != NULL && !operand->is_this()) { |
| 2635 ReportMessage("strict_delete", Vector<const char*>::empty()); | 2641 ReportMessage("strict_delete", Vector<const char*>::empty()); |
| 2636 *ok = false; | 2642 *ok = false; |
| 2637 return NULL; | 2643 return NULL; |
| 2638 } | 2644 } |
| 2639 } | 2645 } |
| 2640 | 2646 |
| 2641 return new(zone()) UnaryOperation(op, expression, position); | 2647 return new(zone()) UnaryOperation(isolate(), op, expression, position); |
| 2642 | 2648 |
| 2643 } else if (Token::IsCountOp(op)) { | 2649 } else if (Token::IsCountOp(op)) { |
| 2644 op = Next(); | 2650 op = Next(); |
| 2645 Expression* expression = ParseUnaryExpression(CHECK_OK); | 2651 Expression* expression = ParseUnaryExpression(CHECK_OK); |
| 2646 // Signal a reference error if the expression is an invalid | 2652 // Signal a reference error if the expression is an invalid |
| 2647 // left-hand side expression. We could report this as a syntax | 2653 // left-hand side expression. We could report this as a syntax |
| 2648 // error here but for compatibility with JSC we choose to report the | 2654 // error here but for compatibility with JSC we choose to report the |
| 2649 // error at runtime. | 2655 // error at runtime. |
| 2650 if (expression == NULL || !expression->IsValidLeftHandSide()) { | 2656 if (expression == NULL || !expression->IsValidLeftHandSide()) { |
| 2651 Handle<String> type = | 2657 Handle<String> type = |
| 2652 isolate()->factory()->invalid_lhs_in_prefix_op_symbol(); | 2658 isolate()->factory()->invalid_lhs_in_prefix_op_symbol(); |
| 2653 expression = NewThrowReferenceError(type); | 2659 expression = NewThrowReferenceError(type); |
| 2654 } | 2660 } |
| 2655 | 2661 |
| 2656 if (top_scope_->is_strict_mode()) { | 2662 if (top_scope_->is_strict_mode()) { |
| 2657 // Prefix expression operand in strict mode may not be eval or arguments. | 2663 // Prefix expression operand in strict mode may not be eval or arguments. |
| 2658 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); | 2664 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); |
| 2659 } | 2665 } |
| 2660 | 2666 |
| 2661 int position = scanner().location().beg_pos; | 2667 int position = scanner().location().beg_pos; |
| 2662 return new(zone()) CountOperation(op, | 2668 return new(zone()) CountOperation(isolate(), |
| 2669 op, |
| 2663 true /* prefix */, | 2670 true /* prefix */, |
| 2664 expression, | 2671 expression, |
| 2665 position); | 2672 position); |
| 2666 | 2673 |
| 2667 } else { | 2674 } else { |
| 2668 return ParsePostfixExpression(ok); | 2675 return ParsePostfixExpression(ok); |
| 2669 } | 2676 } |
| 2670 } | 2677 } |
| 2671 | 2678 |
| 2672 | 2679 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2688 } | 2695 } |
| 2689 | 2696 |
| 2690 if (top_scope_->is_strict_mode()) { | 2697 if (top_scope_->is_strict_mode()) { |
| 2691 // Postfix expression operand in strict mode may not be eval or arguments. | 2698 // Postfix expression operand in strict mode may not be eval or arguments. |
| 2692 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); | 2699 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); |
| 2693 } | 2700 } |
| 2694 | 2701 |
| 2695 Token::Value next = Next(); | 2702 Token::Value next = Next(); |
| 2696 int position = scanner().location().beg_pos; | 2703 int position = scanner().location().beg_pos; |
| 2697 expression = | 2704 expression = |
| 2698 new(zone()) CountOperation(next, | 2705 new(zone()) CountOperation(isolate(), |
| 2706 next, |
| 2699 false /* postfix */, | 2707 false /* postfix */, |
| 2700 expression, | 2708 expression, |
| 2701 position); | 2709 position); |
| 2702 } | 2710 } |
| 2703 return expression; | 2711 return expression; |
| 2704 } | 2712 } |
| 2705 | 2713 |
| 2706 | 2714 |
| 2707 Expression* Parser::ParseLeftHandSideExpression(bool* ok) { | 2715 Expression* Parser::ParseLeftHandSideExpression(bool* ok) { |
| 2708 // LeftHandSideExpression :: | 2716 // LeftHandSideExpression :: |
| 2709 // (NewExpression | MemberExpression) ... | 2717 // (NewExpression | MemberExpression) ... |
| 2710 | 2718 |
| 2711 Expression* result; | 2719 Expression* result; |
| 2712 if (peek() == Token::NEW) { | 2720 if (peek() == Token::NEW) { |
| 2713 result = ParseNewExpression(CHECK_OK); | 2721 result = ParseNewExpression(CHECK_OK); |
| 2714 } else { | 2722 } else { |
| 2715 result = ParseMemberExpression(CHECK_OK); | 2723 result = ParseMemberExpression(CHECK_OK); |
| 2716 } | 2724 } |
| 2717 | 2725 |
| 2718 while (true) { | 2726 while (true) { |
| 2719 switch (peek()) { | 2727 switch (peek()) { |
| 2720 case Token::LBRACK: { | 2728 case Token::LBRACK: { |
| 2721 Consume(Token::LBRACK); | 2729 Consume(Token::LBRACK); |
| 2722 int pos = scanner().location().beg_pos; | 2730 int pos = scanner().location().beg_pos; |
| 2723 Expression* index = ParseExpression(true, CHECK_OK); | 2731 Expression* index = ParseExpression(true, CHECK_OK); |
| 2724 result = new(zone()) Property(result, index, pos); | 2732 result = new(zone()) Property(isolate(), result, index, pos); |
| 2725 Expect(Token::RBRACK, CHECK_OK); | 2733 Expect(Token::RBRACK, CHECK_OK); |
| 2726 break; | 2734 break; |
| 2727 } | 2735 } |
| 2728 | 2736 |
| 2729 case Token::LPAREN: { | 2737 case Token::LPAREN: { |
| 2730 int pos = scanner().location().beg_pos; | 2738 int pos = scanner().location().beg_pos; |
| 2731 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); | 2739 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); |
| 2732 | 2740 |
| 2733 // Keep track of eval() calls since they disable all local variable | 2741 // Keep track of eval() calls since they disable all local variable |
| 2734 // optimizations. | 2742 // optimizations. |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2752 } | 2760 } |
| 2753 } | 2761 } |
| 2754 result = NewCall(result, args, pos); | 2762 result = NewCall(result, args, pos); |
| 2755 break; | 2763 break; |
| 2756 } | 2764 } |
| 2757 | 2765 |
| 2758 case Token::PERIOD: { | 2766 case Token::PERIOD: { |
| 2759 Consume(Token::PERIOD); | 2767 Consume(Token::PERIOD); |
| 2760 int pos = scanner().location().beg_pos; | 2768 int pos = scanner().location().beg_pos; |
| 2761 Handle<String> name = ParseIdentifierName(CHECK_OK); | 2769 Handle<String> name = ParseIdentifierName(CHECK_OK); |
| 2762 result = new(zone()) Property(result, new(zone()) Literal(name), pos); | 2770 result = new(zone()) Property(isolate(), |
| 2771 result, |
| 2772 NewLiteral(name), |
| 2773 pos); |
| 2763 if (fni_ != NULL) fni_->PushLiteralName(name); | 2774 if (fni_ != NULL) fni_->PushLiteralName(name); |
| 2764 break; | 2775 break; |
| 2765 } | 2776 } |
| 2766 | 2777 |
| 2767 default: | 2778 default: |
| 2768 return result; | 2779 return result; |
| 2769 } | 2780 } |
| 2770 } | 2781 } |
| 2771 } | 2782 } |
| 2772 | 2783 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2788 | 2799 |
| 2789 Expression* result; | 2800 Expression* result; |
| 2790 if (peek() == Token::NEW) { | 2801 if (peek() == Token::NEW) { |
| 2791 result = ParseNewPrefix(stack, CHECK_OK); | 2802 result = ParseNewPrefix(stack, CHECK_OK); |
| 2792 } else { | 2803 } else { |
| 2793 result = ParseMemberWithNewPrefixesExpression(stack, CHECK_OK); | 2804 result = ParseMemberWithNewPrefixesExpression(stack, CHECK_OK); |
| 2794 } | 2805 } |
| 2795 | 2806 |
| 2796 if (!stack->is_empty()) { | 2807 if (!stack->is_empty()) { |
| 2797 int last = stack->pop(); | 2808 int last = stack->pop(); |
| 2798 result = new(zone()) CallNew(result, | 2809 result = new(zone()) CallNew(isolate(), |
| 2810 result, |
| 2799 new(zone()) ZoneList<Expression*>(0), | 2811 new(zone()) ZoneList<Expression*>(0), |
| 2800 last); | 2812 last); |
| 2801 } | 2813 } |
| 2802 return result; | 2814 return result; |
| 2803 } | 2815 } |
| 2804 | 2816 |
| 2805 | 2817 |
| 2806 Expression* Parser::ParseNewExpression(bool* ok) { | 2818 Expression* Parser::ParseNewExpression(bool* ok) { |
| 2807 PositionStack stack(ok); | 2819 PositionStack stack(ok); |
| 2808 return ParseNewPrefix(&stack, ok); | 2820 return ParseNewPrefix(&stack, ok); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2836 } else { | 2848 } else { |
| 2837 result = ParsePrimaryExpression(CHECK_OK); | 2849 result = ParsePrimaryExpression(CHECK_OK); |
| 2838 } | 2850 } |
| 2839 | 2851 |
| 2840 while (true) { | 2852 while (true) { |
| 2841 switch (peek()) { | 2853 switch (peek()) { |
| 2842 case Token::LBRACK: { | 2854 case Token::LBRACK: { |
| 2843 Consume(Token::LBRACK); | 2855 Consume(Token::LBRACK); |
| 2844 int pos = scanner().location().beg_pos; | 2856 int pos = scanner().location().beg_pos; |
| 2845 Expression* index = ParseExpression(true, CHECK_OK); | 2857 Expression* index = ParseExpression(true, CHECK_OK); |
| 2846 result = new(zone()) Property(result, index, pos); | 2858 result = new(zone()) Property(isolate(), result, index, pos); |
| 2847 if (fni_ != NULL) { | 2859 if (fni_ != NULL) { |
| 2848 if (index->IsPropertyName()) { | 2860 if (index->IsPropertyName()) { |
| 2849 fni_->PushLiteralName(index->AsLiteral()->AsPropertyName()); | 2861 fni_->PushLiteralName(index->AsLiteral()->AsPropertyName()); |
| 2850 } else { | 2862 } else { |
| 2851 fni_->PushLiteralName( | 2863 fni_->PushLiteralName( |
| 2852 isolate()->factory()->anonymous_function_symbol()); | 2864 isolate()->factory()->anonymous_function_symbol()); |
| 2853 } | 2865 } |
| 2854 } | 2866 } |
| 2855 Expect(Token::RBRACK, CHECK_OK); | 2867 Expect(Token::RBRACK, CHECK_OK); |
| 2856 break; | 2868 break; |
| 2857 } | 2869 } |
| 2858 case Token::PERIOD: { | 2870 case Token::PERIOD: { |
| 2859 Consume(Token::PERIOD); | 2871 Consume(Token::PERIOD); |
| 2860 int pos = scanner().location().beg_pos; | 2872 int pos = scanner().location().beg_pos; |
| 2861 Handle<String> name = ParseIdentifierName(CHECK_OK); | 2873 Handle<String> name = ParseIdentifierName(CHECK_OK); |
| 2862 result = new(zone()) Property(result, new(zone()) Literal(name), pos); | 2874 result = new(zone()) Property(isolate(), |
| 2875 result, |
| 2876 NewLiteral(name), |
| 2877 pos); |
| 2863 if (fni_ != NULL) fni_->PushLiteralName(name); | 2878 if (fni_ != NULL) fni_->PushLiteralName(name); |
| 2864 break; | 2879 break; |
| 2865 } | 2880 } |
| 2866 case Token::LPAREN: { | 2881 case Token::LPAREN: { |
| 2867 if ((stack == NULL) || stack->is_empty()) return result; | 2882 if ((stack == NULL) || stack->is_empty()) return result; |
| 2868 // Consume one of the new prefixes (already parsed). | 2883 // Consume one of the new prefixes (already parsed). |
| 2869 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); | 2884 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); |
| 2870 int last = stack->pop(); | 2885 int last = stack->pop(); |
| 2871 result = new(zone()) CallNew(result, args, last); | 2886 result = new(zone()) CallNew(isolate(), result, args, last); |
| 2872 break; | 2887 break; |
| 2873 } | 2888 } |
| 2874 default: | 2889 default: |
| 2875 return result; | 2890 return result; |
| 2876 } | 2891 } |
| 2877 } | 2892 } |
| 2878 } | 2893 } |
| 2879 | 2894 |
| 2880 | 2895 |
| 2881 DebuggerStatement* Parser::ParseDebuggerStatement(bool* ok) { | 2896 DebuggerStatement* Parser::ParseDebuggerStatement(bool* ok) { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2945 // String | 2960 // String |
| 2946 // ArrayLiteral | 2961 // ArrayLiteral |
| 2947 // ObjectLiteral | 2962 // ObjectLiteral |
| 2948 // RegExpLiteral | 2963 // RegExpLiteral |
| 2949 // '(' Expression ')' | 2964 // '(' Expression ')' |
| 2950 | 2965 |
| 2951 Expression* result = NULL; | 2966 Expression* result = NULL; |
| 2952 switch (peek()) { | 2967 switch (peek()) { |
| 2953 case Token::THIS: { | 2968 case Token::THIS: { |
| 2954 Consume(Token::THIS); | 2969 Consume(Token::THIS); |
| 2955 result = new(zone()) VariableProxy(top_scope_->receiver()); | 2970 result = new(zone()) VariableProxy(isolate(), top_scope_->receiver()); |
| 2956 break; | 2971 break; |
| 2957 } | 2972 } |
| 2958 | 2973 |
| 2959 case Token::NULL_LITERAL: | 2974 case Token::NULL_LITERAL: |
| 2960 Consume(Token::NULL_LITERAL); | 2975 Consume(Token::NULL_LITERAL); |
| 2961 result = new(zone()) Literal(isolate()->factory()->null_value()); | 2976 result = new(zone()) Literal( |
| 2977 isolate(), isolate()->factory()->null_value()); |
| 2962 break; | 2978 break; |
| 2963 | 2979 |
| 2964 case Token::TRUE_LITERAL: | 2980 case Token::TRUE_LITERAL: |
| 2965 Consume(Token::TRUE_LITERAL); | 2981 Consume(Token::TRUE_LITERAL); |
| 2966 result = new(zone()) Literal(isolate()->factory()->true_value()); | 2982 result = new(zone()) Literal( |
| 2983 isolate(), isolate()->factory()->true_value()); |
| 2967 break; | 2984 break; |
| 2968 | 2985 |
| 2969 case Token::FALSE_LITERAL: | 2986 case Token::FALSE_LITERAL: |
| 2970 Consume(Token::FALSE_LITERAL); | 2987 Consume(Token::FALSE_LITERAL); |
| 2971 result = new(zone()) Literal(isolate()->factory()->false_value()); | 2988 result = new(zone()) Literal( |
| 2989 isolate(), isolate()->factory()->false_value()); |
| 2972 break; | 2990 break; |
| 2973 | 2991 |
| 2974 case Token::IDENTIFIER: | 2992 case Token::IDENTIFIER: |
| 2975 case Token::FUTURE_STRICT_RESERVED_WORD: { | 2993 case Token::FUTURE_STRICT_RESERVED_WORD: { |
| 2976 Handle<String> name = ParseIdentifier(CHECK_OK); | 2994 Handle<String> name = ParseIdentifier(CHECK_OK); |
| 2977 if (fni_ != NULL) fni_->PushVariableName(name); | 2995 if (fni_ != NULL) fni_->PushVariableName(name); |
| 2978 result = top_scope_->NewUnresolved(name, | 2996 result = top_scope_->NewUnresolved(name, |
| 2979 inside_with(), | 2997 inside_with(), |
| 2980 scanner().location().beg_pos); | 2998 scanner().location().beg_pos); |
| 2981 break; | 2999 break; |
| 2982 } | 3000 } |
| 2983 | 3001 |
| 2984 case Token::NUMBER: { | 3002 case Token::NUMBER: { |
| 2985 Consume(Token::NUMBER); | 3003 Consume(Token::NUMBER); |
| 2986 ASSERT(scanner().is_literal_ascii()); | 3004 ASSERT(scanner().is_literal_ascii()); |
| 2987 double value = StringToDouble(isolate()->unicode_cache(), | 3005 double value = StringToDouble(isolate()->unicode_cache(), |
| 2988 scanner().literal_ascii_string(), | 3006 scanner().literal_ascii_string(), |
| 2989 ALLOW_HEX | ALLOW_OCTALS); | 3007 ALLOW_HEX | ALLOW_OCTALS); |
| 2990 result = NewNumberLiteral(value); | 3008 result = NewNumberLiteral(value); |
| 2991 break; | 3009 break; |
| 2992 } | 3010 } |
| 2993 | 3011 |
| 2994 case Token::STRING: { | 3012 case Token::STRING: { |
| 2995 Consume(Token::STRING); | 3013 Consume(Token::STRING); |
| 2996 Handle<String> symbol = GetSymbol(CHECK_OK); | 3014 Handle<String> symbol = GetSymbol(CHECK_OK); |
| 2997 result = new(zone()) Literal(symbol); | 3015 result = NewLiteral(symbol); |
| 2998 if (fni_ != NULL) fni_->PushLiteralName(symbol); | 3016 if (fni_ != NULL) fni_->PushLiteralName(symbol); |
| 2999 break; | 3017 break; |
| 3000 } | 3018 } |
| 3001 | 3019 |
| 3002 case Token::ASSIGN_DIV: | 3020 case Token::ASSIGN_DIV: |
| 3003 result = ParseRegExpLiteral(true, CHECK_OK); | 3021 result = ParseRegExpLiteral(true, CHECK_OK); |
| 3004 break; | 3022 break; |
| 3005 | 3023 |
| 3006 case Token::DIV: | 3024 case Token::DIV: |
| 3007 result = ParseRegExpLiteral(false, CHECK_OK); | 3025 result = ParseRegExpLiteral(false, CHECK_OK); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3114 literals->set(i, *boilerplate_value); | 3132 literals->set(i, *boilerplate_value); |
| 3115 } | 3133 } |
| 3116 } | 3134 } |
| 3117 | 3135 |
| 3118 // Simple and shallow arrays can be lazily copied, we transform the | 3136 // Simple and shallow arrays can be lazily copied, we transform the |
| 3119 // elements array to a copy-on-write array. | 3137 // elements array to a copy-on-write array. |
| 3120 if (is_simple && depth == 1 && values->length() > 0) { | 3138 if (is_simple && depth == 1 && values->length() > 0) { |
| 3121 literals->set_map(isolate()->heap()->fixed_cow_array_map()); | 3139 literals->set_map(isolate()->heap()->fixed_cow_array_map()); |
| 3122 } | 3140 } |
| 3123 | 3141 |
| 3124 return new(zone()) ArrayLiteral(literals, values, | 3142 return new(zone()) ArrayLiteral( |
| 3125 literal_index, is_simple, depth); | 3143 isolate(), literals, values, literal_index, is_simple, depth); |
| 3126 } | 3144 } |
| 3127 | 3145 |
| 3128 | 3146 |
| 3129 bool Parser::IsBoilerplateProperty(ObjectLiteral::Property* property) { | 3147 bool Parser::IsBoilerplateProperty(ObjectLiteral::Property* property) { |
| 3130 return property != NULL && | 3148 return property != NULL && |
| 3131 property->kind() != ObjectLiteral::Property::PROTOTYPE; | 3149 property->kind() != ObjectLiteral::Property::PROTOTYPE; |
| 3132 } | 3150 } |
| 3133 | 3151 |
| 3134 | 3152 |
| 3135 bool CompileTimeValue::IsCompileTimeValue(Expression* expression) { | 3153 bool CompileTimeValue::IsCompileTimeValue(Expression* expression) { |
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3460 if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK); | 3478 if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK); |
| 3461 | 3479 |
| 3462 if (fni_ != NULL) { | 3480 if (fni_ != NULL) { |
| 3463 fni_->Infer(); | 3481 fni_->Infer(); |
| 3464 fni_->Leave(); | 3482 fni_->Leave(); |
| 3465 } | 3483 } |
| 3466 continue; // restart the while | 3484 continue; // restart the while |
| 3467 } | 3485 } |
| 3468 // Failed to parse as get/set property, so it's just a property | 3486 // Failed to parse as get/set property, so it's just a property |
| 3469 // called "get" or "set". | 3487 // called "get" or "set". |
| 3470 key = new(zone()) Literal(id); | 3488 key = NewLiteral(id); |
| 3471 break; | 3489 break; |
| 3472 } | 3490 } |
| 3473 case Token::STRING: { | 3491 case Token::STRING: { |
| 3474 Consume(Token::STRING); | 3492 Consume(Token::STRING); |
| 3475 Handle<String> string = GetSymbol(CHECK_OK); | 3493 Handle<String> string = GetSymbol(CHECK_OK); |
| 3476 if (fni_ != NULL) fni_->PushLiteralName(string); | 3494 if (fni_ != NULL) fni_->PushLiteralName(string); |
| 3477 uint32_t index; | 3495 uint32_t index; |
| 3478 if (!string.is_null() && string->AsArrayIndex(&index)) { | 3496 if (!string.is_null() && string->AsArrayIndex(&index)) { |
| 3479 key = NewNumberLiteral(index); | 3497 key = NewNumberLiteral(index); |
| 3480 break; | 3498 break; |
| 3481 } | 3499 } |
| 3482 key = new(zone()) Literal(string); | 3500 key = NewLiteral(string); |
| 3483 break; | 3501 break; |
| 3484 } | 3502 } |
| 3485 case Token::NUMBER: { | 3503 case Token::NUMBER: { |
| 3486 Consume(Token::NUMBER); | 3504 Consume(Token::NUMBER); |
| 3487 ASSERT(scanner().is_literal_ascii()); | 3505 ASSERT(scanner().is_literal_ascii()); |
| 3488 double value = StringToDouble(isolate()->unicode_cache(), | 3506 double value = StringToDouble(isolate()->unicode_cache(), |
| 3489 scanner().literal_ascii_string(), | 3507 scanner().literal_ascii_string(), |
| 3490 ALLOW_HEX | ALLOW_OCTALS); | 3508 ALLOW_HEX | ALLOW_OCTALS); |
| 3491 key = NewNumberLiteral(value); | 3509 key = NewNumberLiteral(value); |
| 3492 break; | 3510 break; |
| 3493 } | 3511 } |
| 3494 default: | 3512 default: |
| 3495 if (Token::IsKeyword(next)) { | 3513 if (Token::IsKeyword(next)) { |
| 3496 Consume(next); | 3514 Consume(next); |
| 3497 Handle<String> string = GetSymbol(CHECK_OK); | 3515 Handle<String> string = GetSymbol(CHECK_OK); |
| 3498 key = new(zone()) Literal(string); | 3516 key = NewLiteral(string); |
| 3499 } else { | 3517 } else { |
| 3500 // Unexpected token. | 3518 // Unexpected token. |
| 3501 Token::Value next = Next(); | 3519 Token::Value next = Next(); |
| 3502 ReportUnexpectedToken(next); | 3520 ReportUnexpectedToken(next); |
| 3503 *ok = false; | 3521 *ok = false; |
| 3504 return NULL; | 3522 return NULL; |
| 3505 } | 3523 } |
| 3506 } | 3524 } |
| 3507 | 3525 |
| 3508 Expect(Token::COLON, CHECK_OK); | 3526 Expect(Token::COLON, CHECK_OK); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3541 number_of_boilerplate_properties * 2, TENURED); | 3559 number_of_boilerplate_properties * 2, TENURED); |
| 3542 | 3560 |
| 3543 bool is_simple = true; | 3561 bool is_simple = true; |
| 3544 bool fast_elements = true; | 3562 bool fast_elements = true; |
| 3545 int depth = 1; | 3563 int depth = 1; |
| 3546 BuildObjectLiteralConstantProperties(properties, | 3564 BuildObjectLiteralConstantProperties(properties, |
| 3547 constant_properties, | 3565 constant_properties, |
| 3548 &is_simple, | 3566 &is_simple, |
| 3549 &fast_elements, | 3567 &fast_elements, |
| 3550 &depth); | 3568 &depth); |
| 3551 return new(zone()) ObjectLiteral(constant_properties, | 3569 return new(zone()) ObjectLiteral(isolate(), |
| 3552 properties, | 3570 constant_properties, |
| 3553 literal_index, | 3571 properties, |
| 3554 is_simple, | 3572 literal_index, |
| 3555 fast_elements, | 3573 is_simple, |
| 3556 depth, | 3574 fast_elements, |
| 3557 has_function); | 3575 depth, |
| 3576 has_function); |
| 3558 } | 3577 } |
| 3559 | 3578 |
| 3560 | 3579 |
| 3561 Expression* Parser::ParseRegExpLiteral(bool seen_equal, bool* ok) { | 3580 Expression* Parser::ParseRegExpLiteral(bool seen_equal, bool* ok) { |
| 3562 if (!scanner().ScanRegExpPattern(seen_equal)) { | 3581 if (!scanner().ScanRegExpPattern(seen_equal)) { |
| 3563 Next(); | 3582 Next(); |
| 3564 ReportMessage("unterminated_regexp", Vector<const char*>::empty()); | 3583 ReportMessage("unterminated_regexp", Vector<const char*>::empty()); |
| 3565 *ok = false; | 3584 *ok = false; |
| 3566 return NULL; | 3585 return NULL; |
| 3567 } | 3586 } |
| 3568 | 3587 |
| 3569 int literal_index = lexical_scope_->NextMaterializedLiteralIndex(); | 3588 int literal_index = lexical_scope_->NextMaterializedLiteralIndex(); |
| 3570 | 3589 |
| 3571 Handle<String> js_pattern = NextLiteralString(TENURED); | 3590 Handle<String> js_pattern = NextLiteralString(TENURED); |
| 3572 scanner().ScanRegExpFlags(); | 3591 scanner().ScanRegExpFlags(); |
| 3573 Handle<String> js_flags = NextLiteralString(TENURED); | 3592 Handle<String> js_flags = NextLiteralString(TENURED); |
| 3574 Next(); | 3593 Next(); |
| 3575 | 3594 |
| 3576 return new(zone()) RegExpLiteral(js_pattern, js_flags, literal_index); | 3595 return new(zone()) RegExpLiteral( |
| 3596 isolate(), js_pattern, js_flags, literal_index); |
| 3577 } | 3597 } |
| 3578 | 3598 |
| 3579 | 3599 |
| 3580 ZoneList<Expression*>* Parser::ParseArguments(bool* ok) { | 3600 ZoneList<Expression*>* Parser::ParseArguments(bool* ok) { |
| 3581 // Arguments :: | 3601 // Arguments :: |
| 3582 // '(' (AssignmentExpression)*[','] ')' | 3602 // '(' (AssignmentExpression)*[','] ')' |
| 3583 | 3603 |
| 3584 ZoneList<Expression*>* result = new(zone()) ZoneList<Expression*>(4); | 3604 ZoneList<Expression*>* result = new(zone()) ZoneList<Expression*>(4); |
| 3585 Expect(Token::LPAREN, CHECK_OK); | 3605 Expect(Token::LPAREN, CHECK_OK); |
| 3586 bool done = (peek() == Token::RPAREN); | 3606 bool done = (peek() == Token::RPAREN); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3683 // function and let it refer to the function itself (closure). | 3703 // function and let it refer to the function itself (closure). |
| 3684 // NOTE: We create a proxy and resolve it here so that in the | 3704 // NOTE: We create a proxy and resolve it here so that in the |
| 3685 // future we can change the AST to only refer to VariableProxies | 3705 // future we can change the AST to only refer to VariableProxies |
| 3686 // instead of Variables and Proxis as is the case now. | 3706 // instead of Variables and Proxis as is the case now. |
| 3687 if (!function_name.is_null() && function_name->length() > 0) { | 3707 if (!function_name.is_null() && function_name->length() > 0) { |
| 3688 Variable* fvar = top_scope_->DeclareFunctionVar(function_name); | 3708 Variable* fvar = top_scope_->DeclareFunctionVar(function_name); |
| 3689 VariableProxy* fproxy = | 3709 VariableProxy* fproxy = |
| 3690 top_scope_->NewUnresolved(function_name, inside_with()); | 3710 top_scope_->NewUnresolved(function_name, inside_with()); |
| 3691 fproxy->BindTo(fvar); | 3711 fproxy->BindTo(fvar); |
| 3692 body->Add(new(zone()) ExpressionStatement( | 3712 body->Add(new(zone()) ExpressionStatement( |
| 3693 new(zone()) Assignment(Token::INIT_CONST, fproxy, | 3713 new(zone()) Assignment(isolate(), |
| 3694 new(zone()) ThisFunction(), | 3714 Token::INIT_CONST, |
| 3695 RelocInfo::kNoPosition))); | 3715 fproxy, |
| 3716 new(zone()) ThisFunction(isolate()), |
| 3717 RelocInfo::kNoPosition))); |
| 3696 } | 3718 } |
| 3697 | 3719 |
| 3698 // Determine if the function will be lazily compiled. The mode can | 3720 // Determine if the function will be lazily compiled. The mode can |
| 3699 // only be PARSE_LAZILY if the --lazy flag is true. | 3721 // only be PARSE_LAZILY if the --lazy flag is true. |
| 3700 bool is_lazily_compiled = (mode() == PARSE_LAZILY && | 3722 bool is_lazily_compiled = (mode() == PARSE_LAZILY && |
| 3701 top_scope_->outer_scope()->is_global_scope() && | 3723 top_scope_->outer_scope()->is_global_scope() && |
| 3702 top_scope_->HasTrivialOuterContext() && | 3724 top_scope_->HasTrivialOuterContext() && |
| 3703 !parenthesized_function_); | 3725 !parenthesized_function_); |
| 3704 parenthesized_function_ = false; // The bit was set for this function only. | 3726 parenthesized_function_ = false; // The bit was set for this function only. |
| 3705 | 3727 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3775 ReportMessageAt(reserved_loc, "strict_reserved_word", | 3797 ReportMessageAt(reserved_loc, "strict_reserved_word", |
| 3776 Vector<const char*>::empty()); | 3798 Vector<const char*>::empty()); |
| 3777 *ok = false; | 3799 *ok = false; |
| 3778 return NULL; | 3800 return NULL; |
| 3779 } | 3801 } |
| 3780 CheckOctalLiteral(start_pos, end_pos, CHECK_OK); | 3802 CheckOctalLiteral(start_pos, end_pos, CHECK_OK); |
| 3781 } | 3803 } |
| 3782 } | 3804 } |
| 3783 | 3805 |
| 3784 FunctionLiteral* function_literal = | 3806 FunctionLiteral* function_literal = |
| 3785 new(zone()) FunctionLiteral(name, | 3807 new(zone()) FunctionLiteral(isolate(), |
| 3808 name, |
| 3786 scope, | 3809 scope, |
| 3787 body, | 3810 body, |
| 3788 materialized_literal_count, | 3811 materialized_literal_count, |
| 3789 expected_property_count, | 3812 expected_property_count, |
| 3790 only_simple_this_property_assignments, | 3813 only_simple_this_property_assignments, |
| 3791 this_property_assignments, | 3814 this_property_assignments, |
| 3792 num_parameters, | 3815 num_parameters, |
| 3793 start_pos, | 3816 start_pos, |
| 3794 end_pos, | 3817 end_pos, |
| 3795 (function_name->length() > 0), | 3818 (function_name->length() > 0), |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3836 // Check that the expected number of arguments are being passed. | 3859 // Check that the expected number of arguments are being passed. |
| 3837 if (function != NULL && | 3860 if (function != NULL && |
| 3838 function->nargs != -1 && | 3861 function->nargs != -1 && |
| 3839 function->nargs != args->length()) { | 3862 function->nargs != args->length()) { |
| 3840 ReportMessage("illegal_access", Vector<const char*>::empty()); | 3863 ReportMessage("illegal_access", Vector<const char*>::empty()); |
| 3841 *ok = false; | 3864 *ok = false; |
| 3842 return NULL; | 3865 return NULL; |
| 3843 } | 3866 } |
| 3844 | 3867 |
| 3845 // We have a valid intrinsics call or a call to a builtin. | 3868 // We have a valid intrinsics call or a call to a builtin. |
| 3846 return new(zone()) CallRuntime(name, function, args); | 3869 return new(zone()) CallRuntime(isolate(), name, function, args); |
| 3847 } | 3870 } |
| 3848 | 3871 |
| 3849 | 3872 |
| 3850 bool Parser::peek_any_identifier() { | 3873 bool Parser::peek_any_identifier() { |
| 3851 Token::Value next = peek(); | 3874 Token::Value next = peek(); |
| 3852 return next == Token::IDENTIFIER || | 3875 return next == Token::IDENTIFIER || |
| 3853 next == Token::FUTURE_RESERVED_WORD || | 3876 next == Token::FUTURE_RESERVED_WORD || |
| 3854 next == Token::FUTURE_STRICT_RESERVED_WORD; | 3877 next == Token::FUTURE_STRICT_RESERVED_WORD; |
| 3855 } | 3878 } |
| 3856 | 3879 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3892 if (scanner().HasAnyLineTerminatorBeforeNext() || | 3915 if (scanner().HasAnyLineTerminatorBeforeNext() || |
| 3893 tok == Token::RBRACE || | 3916 tok == Token::RBRACE || |
| 3894 tok == Token::EOS) { | 3917 tok == Token::EOS) { |
| 3895 return; | 3918 return; |
| 3896 } | 3919 } |
| 3897 Expect(Token::SEMICOLON, ok); | 3920 Expect(Token::SEMICOLON, ok); |
| 3898 } | 3921 } |
| 3899 | 3922 |
| 3900 | 3923 |
| 3901 Literal* Parser::GetLiteralUndefined() { | 3924 Literal* Parser::GetLiteralUndefined() { |
| 3902 return new(zone()) Literal(isolate()->factory()->undefined_value()); | 3925 return NewLiteral(isolate()->factory()->undefined_value()); |
| 3903 } | 3926 } |
| 3904 | 3927 |
| 3905 | 3928 |
| 3906 Literal* Parser::GetLiteralTheHole() { | 3929 Literal* Parser::GetLiteralTheHole() { |
| 3907 return new(zone()) Literal(isolate()->factory()->the_hole_value()); | 3930 return NewLiteral(isolate()->factory()->the_hole_value()); |
| 3908 } | 3931 } |
| 3909 | 3932 |
| 3910 | 3933 |
| 3911 Literal* Parser::GetLiteralNumber(double value) { | 3934 Literal* Parser::GetLiteralNumber(double value) { |
| 3912 return NewNumberLiteral(value); | 3935 return NewNumberLiteral(value); |
| 3913 } | 3936 } |
| 3914 | 3937 |
| 3915 | 3938 |
| 3916 // Parses and identifier that is valid for the current scope, in particular it | 3939 // Parses and identifier that is valid for the current scope, in particular it |
| 3917 // fails on strict mode future reserved keywords in a strict scope. | 3940 // fails on strict mode future reserved keywords in a strict scope. |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4053 // target stack has been used from the top of the target stack. Add | 4076 // target stack has been used from the top of the target stack. Add |
| 4054 // the break target to any TargetCollectors passed on the stack. | 4077 // the break target to any TargetCollectors passed on the stack. |
| 4055 for (Target* t = target_stack_; t != stop; t = t->previous()) { | 4078 for (Target* t = target_stack_; t != stop; t = t->previous()) { |
| 4056 TargetCollector* collector = t->node()->AsTargetCollector(); | 4079 TargetCollector* collector = t->node()->AsTargetCollector(); |
| 4057 if (collector != NULL) collector->AddTarget(target); | 4080 if (collector != NULL) collector->AddTarget(target); |
| 4058 } | 4081 } |
| 4059 } | 4082 } |
| 4060 | 4083 |
| 4061 | 4084 |
| 4062 Literal* Parser::NewNumberLiteral(double number) { | 4085 Literal* Parser::NewNumberLiteral(double number) { |
| 4063 return new(zone()) Literal(isolate()->factory()->NewNumber(number, TENURED)); | 4086 return NewLiteral(isolate()->factory()->NewNumber(number, TENURED)); |
| 4064 } | 4087 } |
| 4065 | 4088 |
| 4066 | 4089 |
| 4067 Expression* Parser::NewThrowReferenceError(Handle<String> type) { | 4090 Expression* Parser::NewThrowReferenceError(Handle<String> type) { |
| 4068 return NewThrowError(isolate()->factory()->MakeReferenceError_symbol(), | 4091 return NewThrowError(isolate()->factory()->MakeReferenceError_symbol(), |
| 4069 type, HandleVector<Object>(NULL, 0)); | 4092 type, HandleVector<Object>(NULL, 0)); |
| 4070 } | 4093 } |
| 4071 | 4094 |
| 4072 | 4095 |
| 4073 Expression* Parser::NewThrowSyntaxError(Handle<String> type, | 4096 Expression* Parser::NewThrowSyntaxError(Handle<String> type, |
| (...skipping 26 matching lines...) Expand all Loading... |
| 4100 for (int i = 0; i < argc; i++) { | 4123 for (int i = 0; i < argc; i++) { |
| 4101 Handle<Object> element = arguments[i]; | 4124 Handle<Object> element = arguments[i]; |
| 4102 if (!element.is_null()) { | 4125 if (!element.is_null()) { |
| 4103 elements->set(i, *element); | 4126 elements->set(i, *element); |
| 4104 } | 4127 } |
| 4105 } | 4128 } |
| 4106 Handle<JSArray> array = isolate()->factory()->NewJSArrayWithElements(elements, | 4129 Handle<JSArray> array = isolate()->factory()->NewJSArrayWithElements(elements, |
| 4107 TENURED); | 4130 TENURED); |
| 4108 | 4131 |
| 4109 ZoneList<Expression*>* args = new(zone()) ZoneList<Expression*>(2); | 4132 ZoneList<Expression*>* args = new(zone()) ZoneList<Expression*>(2); |
| 4110 args->Add(new(zone()) Literal(type)); | 4133 args->Add(NewLiteral(type)); |
| 4111 args->Add(new(zone()) Literal(array)); | 4134 args->Add(NewLiteral(array)); |
| 4112 return new(zone()) Throw(new(zone()) CallRuntime(constructor, NULL, args), | 4135 CallRuntime* call_constructor = new(zone()) CallRuntime(isolate(), |
| 4113 scanner().location().beg_pos); | 4136 constructor, |
| 4137 NULL, |
| 4138 args); |
| 4139 return new(zone()) Throw(isolate(), |
| 4140 call_constructor, |
| 4141 scanner().location().beg_pos); |
| 4114 } | 4142 } |
| 4115 | 4143 |
| 4116 // ---------------------------------------------------------------------------- | 4144 // ---------------------------------------------------------------------------- |
| 4117 // Regular expressions | 4145 // Regular expressions |
| 4118 | 4146 |
| 4119 | 4147 |
| 4120 RegExpParser::RegExpParser(FlatStringReader* in, | 4148 RegExpParser::RegExpParser(FlatStringReader* in, |
| 4121 Handle<String>* error, | 4149 Handle<String>* error, |
| 4122 bool multiline) | 4150 bool multiline) |
| 4123 : isolate_(Isolate::Current()), | 4151 : isolate_(Isolate::Current()), |
| (...skipping 961 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5085 info->is_global(), | 5113 info->is_global(), |
| 5086 info->StrictMode()); | 5114 info->StrictMode()); |
| 5087 } | 5115 } |
| 5088 } | 5116 } |
| 5089 | 5117 |
| 5090 info->SetFunction(result); | 5118 info->SetFunction(result); |
| 5091 return (result != NULL); | 5119 return (result != NULL); |
| 5092 } | 5120 } |
| 5093 | 5121 |
| 5094 } } // namespace v8::internal | 5122 } } // namespace v8::internal |
| OLD | NEW |