Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(362)

Side by Side Diff: src/parser.cc

Issue 1084983002: [strong] Implement static restrictions on switch statement (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/ast.h" 8 #include "src/ast.h"
9 #include "src/bailout-reason.h" 9 #include "src/bailout-reason.h"
10 #include "src/base/platform/platform.h" 10 #include "src/base/platform/platform.h"
(...skipping 1801 matching lines...) Expand 10 before | Expand all | Expand 10 after
1812 case Token::DO: 1812 case Token::DO:
1813 return ParseDoWhileStatement(labels, ok); 1813 return ParseDoWhileStatement(labels, ok);
1814 1814
1815 case Token::WHILE: 1815 case Token::WHILE:
1816 return ParseWhileStatement(labels, ok); 1816 return ParseWhileStatement(labels, ok);
1817 1817
1818 case Token::FOR: 1818 case Token::FOR:
1819 return ParseForStatement(labels, ok); 1819 return ParseForStatement(labels, ok);
1820 1820
1821 case Token::CONTINUE: 1821 case Token::CONTINUE:
1822 return ParseContinueStatement(ok); 1822 if (labels == NULL) {
rossberg 2015/04/14 20:19:49 To avoid the code duplication, how about introduci
conradw 2015/04/15 11:40:03 Done, with the caveat that the ordering is kind of
1823 return ParseContinueStatement(ok);
1824 } else {
1825 Block* result =
1826 factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition);
1827 Target target(&this->target_stack_, result);
1828 Statement* statement = ParseContinueStatement(CHECK_OK);
1829 if (result) result->AddStatement(statement, zone());
1830 return result;
1831 }
1823 1832
1824 case Token::BREAK: 1833 case Token::BREAK:
1825 return ParseBreakStatement(labels, ok); 1834 if (labels == NULL) {
1835 return ParseBreakStatement(labels, ok);
1836 } else {
1837 Block* result =
1838 factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition);
1839 Target target(&this->target_stack_, result);
1840 Statement* statement = ParseBreakStatement(labels, CHECK_OK);
1841 if (result) result->AddStatement(statement, zone());
1842 return result;
1843 }
1826 1844
1827 case Token::RETURN: 1845 case Token::RETURN:
1828 return ParseReturnStatement(ok); 1846 if (labels == NULL) {
1847 return ParseReturnStatement(ok);
1848 } else {
1849 Block* result =
1850 factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition);
1851 Target target(&this->target_stack_, result);
1852 Statement* statement = ParseReturnStatement(CHECK_OK);
1853 if (result) result->AddStatement(statement, zone());
1854 return result;
1855 }
1829 1856
1830 case Token::WITH: 1857 case Token::WITH:
1831 return ParseWithStatement(labels, ok); 1858 return ParseWithStatement(labels, ok);
1832 1859
1833 case Token::SWITCH: 1860 case Token::SWITCH:
1834 return ParseSwitchStatement(labels, ok); 1861 return ParseSwitchStatement(labels, ok);
1835 1862
1836 case Token::THROW: 1863 case Token::THROW:
1837 return ParseThrowStatement(ok); 1864 if (labels == NULL) {
1865 return ParseThrowStatement(ok);
1866 } else {
1867 Block* result =
1868 factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition);
1869 Target target(&this->target_stack_, result);
1870 Statement* statement = ParseThrowStatement(CHECK_OK);
1871 if (result) result->AddStatement(statement, zone());
1872 return result;
1873 }
1838 1874
1839 case Token::TRY: { 1875 case Token::TRY: {
1840 // NOTE: It is somewhat complicated to have labels on 1876 // NOTE: It is somewhat complicated to have labels on
1841 // try-statements. When breaking out of a try-finally statement, 1877 // try-statements. When breaking out of a try-finally statement,
1842 // one must take great care not to treat it as a 1878 // one must take great care not to treat it as a
1843 // fall-through. It is much easier just to wrap the entire 1879 // fall-through. It is much easier just to wrap the entire
1844 // try-statement in a statement block and put the labels there 1880 // try-statement in a statement block and put the labels there
1845 Block* result = 1881 Block* result =
1846 factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition); 1882 factory()->NewBlock(labels, 1, false, RelocInfo::kNoPosition);
1847 Target target(&this->target_stack_, result); 1883 Target target(&this->target_stack_, result);
(...skipping 990 matching lines...) Expand 10 before | Expand all | Expand 10 after
2838 ReportMessage("multiple_defaults_in_switch"); 2874 ReportMessage("multiple_defaults_in_switch");
2839 *ok = false; 2875 *ok = false;
2840 return NULL; 2876 return NULL;
2841 } 2877 }
2842 *default_seen_ptr = true; 2878 *default_seen_ptr = true;
2843 } 2879 }
2844 Expect(Token::COLON, CHECK_OK); 2880 Expect(Token::COLON, CHECK_OK);
2845 int pos = position(); 2881 int pos = position();
2846 ZoneList<Statement*>* statements = 2882 ZoneList<Statement*>* statements =
2847 new(zone()) ZoneList<Statement*>(5, zone()); 2883 new(zone()) ZoneList<Statement*>(5, zone());
2884 Statement* stat = NULL;
2848 while (peek() != Token::CASE && 2885 while (peek() != Token::CASE &&
2849 peek() != Token::DEFAULT && 2886 peek() != Token::DEFAULT &&
2850 peek() != Token::RBRACE) { 2887 peek() != Token::RBRACE) {
2851 Statement* stat = ParseStatementListItem(CHECK_OK); 2888 stat = ParseStatementListItem(CHECK_OK);
2852 statements->Add(stat, zone()); 2889 statements->Add(stat, zone());
2853 } 2890 }
2854 2891 if (is_strong(language_mode()) && stat != NULL &&
2892 !stat->IsStrongSwitchTerminatingStatement()) {
2893 ReportMessageAt(scanner()->location(), "strong_unterminated_switch");
2894 *ok = false;
2895 return NULL;
2896 }
2855 return factory()->NewCaseClause(label, statements, pos); 2897 return factory()->NewCaseClause(label, statements, pos);
2856 } 2898 }
2857 2899
2858 2900
2859 SwitchStatement* Parser::ParseSwitchStatement( 2901 SwitchStatement* Parser::ParseSwitchStatement(
2860 ZoneList<const AstRawString*>* labels, bool* ok) { 2902 ZoneList<const AstRawString*>* labels, bool* ok) {
2861 // SwitchStatement :: 2903 // SwitchStatement ::
2862 // 'switch' '(' Expression ')' '{' CaseClause* '}' 2904 // 'switch' '(' Expression ')' '{' CaseClause* '}'
2863 2905
2864 SwitchStatement* statement = 2906 SwitchStatement* statement =
(...skipping 2908 matching lines...) Expand 10 before | Expand all | Expand 10 after
5773 5815
5774 Expression* Parser::SpreadCallNew(Expression* function, 5816 Expression* Parser::SpreadCallNew(Expression* function,
5775 ZoneList<v8::internal::Expression*>* args, 5817 ZoneList<v8::internal::Expression*>* args,
5776 int pos) { 5818 int pos) {
5777 args->InsertAt(0, function, zone()); 5819 args->InsertAt(0, function, zone());
5778 5820
5779 return factory()->NewCallRuntime( 5821 return factory()->NewCallRuntime(
5780 ast_value_factory()->reflect_construct_string(), NULL, args, pos); 5822 ast_value_factory()->reflect_construct_string(), NULL, args, pos);
5781 } 5823 }
5782 } } // namespace v8::internal 5824 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698