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

Side by Side Diff: src/parser.cc

Issue 16549002: Add type field to AST expression nodes (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « src/parser.h ('k') | src/runtime.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 if (num_alternatives == 0) { 195 if (num_alternatives == 0) {
196 return RegExpEmpty::GetInstance(); 196 return RegExpEmpty::GetInstance();
197 } 197 }
198 if (num_alternatives == 1) { 198 if (num_alternatives == 1) {
199 return alternatives_.last(); 199 return alternatives_.last();
200 } 200 }
201 return new(zone()) RegExpDisjunction(alternatives_.GetList(zone())); 201 return new(zone()) RegExpDisjunction(alternatives_.GetList(zone()));
202 } 202 }
203 203
204 204
205 void RegExpBuilder::AddQuantifierToAtom(int min, 205 void RegExpBuilder::AddQuantifierToAtom(
206 int max, 206 int min, int max, RegExpQuantifier::QuantifierType quantifier_type) {
207 RegExpQuantifier::Type type) {
208 if (pending_empty_) { 207 if (pending_empty_) {
209 pending_empty_ = false; 208 pending_empty_ = false;
210 return; 209 return;
211 } 210 }
212 RegExpTree* atom; 211 RegExpTree* atom;
213 if (characters_ != NULL) { 212 if (characters_ != NULL) {
214 ASSERT(last_added_ == ADD_CHAR); 213 ASSERT(last_added_ == ADD_CHAR);
215 // Last atom was character. 214 // Last atom was character.
216 Vector<const uc16> char_vector = characters_->ToConstVector(); 215 Vector<const uc16> char_vector = characters_->ToConstVector();
217 int num_chars = char_vector.length(); 216 int num_chars = char_vector.length();
(...skipping 19 matching lines...) Expand all
237 return; 236 return;
238 } 237 }
239 terms_.Add(atom, zone()); 238 terms_.Add(atom, zone());
240 return; 239 return;
241 } 240 }
242 } else { 241 } else {
243 // Only call immediately after adding an atom or character! 242 // Only call immediately after adding an atom or character!
244 UNREACHABLE(); 243 UNREACHABLE();
245 return; 244 return;
246 } 245 }
247 terms_.Add(new(zone()) RegExpQuantifier(min, max, type, atom), zone()); 246 terms_.Add(
247 new(zone()) RegExpQuantifier(min, max, quantifier_type, atom), zone());
248 LAST(ADD_TERM); 248 LAST(ADD_TERM);
249 } 249 }
250 250
251 251
252 Handle<String> Parser::LookupSymbol(int symbol_id) { 252 Handle<String> Parser::LookupSymbol(int symbol_id) {
253 // Length of symbol cache is the number of identified symbols. 253 // Length of symbol cache is the number of identified symbols.
254 // If we are larger than that, or negative, it's not a cached symbol. 254 // If we are larger than that, or negative, it's not a cached symbol.
255 // This might also happen if there is no preparser symbol data, even 255 // This might also happen if there is no preparser symbol data, even
256 // if there is some preparser data. 256 // if there is some preparser data.
257 if (static_cast<unsigned>(symbol_id) 257 if (static_cast<unsigned>(symbol_id)
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 unsigned ScriptDataImpl::Read(int position) { 403 unsigned ScriptDataImpl::Read(int position) {
404 return store_[PreparseDataConstants::kHeaderSize + position]; 404 return store_[PreparseDataConstants::kHeaderSize + position];
405 } 405 }
406 406
407 407
408 unsigned* ScriptDataImpl::ReadAddress(int position) { 408 unsigned* ScriptDataImpl::ReadAddress(int position) {
409 return &store_[PreparseDataConstants::kHeaderSize + position]; 409 return &store_[PreparseDataConstants::kHeaderSize + position];
410 } 410 }
411 411
412 412
413 Scope* Parser::NewScope(Scope* parent, ScopeType type) { 413 Scope* Parser::NewScope(Scope* parent, ScopeType scope_type) {
414 Scope* result = new(zone()) Scope(parent, type, zone()); 414 Scope* result = new(zone()) Scope(parent, scope_type, zone());
415 result->Initialize(); 415 result->Initialize();
416 return result; 416 return result;
417 } 417 }
418 418
419 419
420 // ---------------------------------------------------------------------------- 420 // ----------------------------------------------------------------------------
421 // Target is a support class to facilitate manipulation of the 421 // Target is a support class to facilitate manipulation of the
422 // Parser's target_stack_ (the stack of potential 'break' and 422 // Parser's target_stack_ (the stack of potential 'break' and
423 // 'continue' statement targets). Upon construction, a new target is 423 // 'continue' statement targets). Upon construction, a new target is
424 // added; it is removed upon destruction. 424 // added; it is removed upon destruction.
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 if (!info()->closure().is_null()) { 751 if (!info()->closure().is_null()) {
752 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, 752 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope,
753 zone()); 753 zone());
754 } 754 }
755 FunctionState function_state(this, scope, isolate()); 755 FunctionState function_state(this, scope, isolate());
756 ASSERT(scope->language_mode() != STRICT_MODE || !info()->is_classic_mode()); 756 ASSERT(scope->language_mode() != STRICT_MODE || !info()->is_classic_mode());
757 ASSERT(scope->language_mode() != EXTENDED_MODE || 757 ASSERT(scope->language_mode() != EXTENDED_MODE ||
758 info()->is_extended_mode()); 758 info()->is_extended_mode());
759 ASSERT(info()->language_mode() == shared_info->language_mode()); 759 ASSERT(info()->language_mode() == shared_info->language_mode());
760 scope->SetLanguageMode(shared_info->language_mode()); 760 scope->SetLanguageMode(shared_info->language_mode());
761 FunctionLiteral::Type type = shared_info->is_expression() 761 FunctionLiteral::FunctionType function_type = shared_info->is_expression()
762 ? (shared_info->is_anonymous() 762 ? (shared_info->is_anonymous()
763 ? FunctionLiteral::ANONYMOUS_EXPRESSION 763 ? FunctionLiteral::ANONYMOUS_EXPRESSION
764 : FunctionLiteral::NAMED_EXPRESSION) 764 : FunctionLiteral::NAMED_EXPRESSION)
765 : FunctionLiteral::DECLARATION; 765 : FunctionLiteral::DECLARATION;
766 bool ok = true; 766 bool ok = true;
767 result = ParseFunctionLiteral(name, 767 result = ParseFunctionLiteral(name,
768 false, // Strict mode name already checked. 768 false, // Strict mode name already checked.
769 shared_info->is_generator(), 769 shared_info->is_generator(),
770 RelocInfo::kNoPosition, 770 RelocInfo::kNoPosition,
771 type, 771 function_type,
772 &ok); 772 &ok);
773 // Make sure the results agree. 773 // Make sure the results agree.
774 ASSERT(ok == (result != NULL)); 774 ASSERT(ok == (result != NULL));
775 } 775 }
776 776
777 // Make sure the target stack is empty. 777 // Make sure the target stack is empty.
778 ASSERT(target_stack_ == NULL); 778 ASSERT(target_stack_ == NULL);
779 779
780 // If there was a stack overflow we have to get rid of AST and it is 780 // If there was a stack overflow we have to get rid of AST and it is
781 // not safe to do before scope has been deleted. 781 // not safe to do before scope has been deleted.
(...skipping 10 matching lines...) Expand all
792 792
793 Handle<String> Parser::GetSymbol() { 793 Handle<String> Parser::GetSymbol() {
794 int symbol_id = -1; 794 int symbol_id = -1;
795 if (pre_parse_data() != NULL) { 795 if (pre_parse_data() != NULL) {
796 symbol_id = pre_parse_data()->GetSymbolIdentifier(); 796 symbol_id = pre_parse_data()->GetSymbolIdentifier();
797 } 797 }
798 return LookupSymbol(symbol_id); 798 return LookupSymbol(symbol_id);
799 } 799 }
800 800
801 801
802 void Parser::ReportMessage(const char* type, Vector<const char*> args) { 802 void Parser::ReportMessage(const char* message, Vector<const char*> args) {
803 Scanner::Location source_location = scanner().location(); 803 Scanner::Location source_location = scanner().location();
804 ReportMessageAt(source_location, type, args); 804 ReportMessageAt(source_location, message, args);
805 } 805 }
806 806
807 807
808 void Parser::ReportMessage(const char* type, Vector<Handle<String> > args) { 808 void Parser::ReportMessage(const char* message, Vector<Handle<String> > args) {
809 Scanner::Location source_location = scanner().location(); 809 Scanner::Location source_location = scanner().location();
810 ReportMessageAt(source_location, type, args); 810 ReportMessageAt(source_location, message, args);
811 } 811 }
812 812
813 813
814 void Parser::ReportMessageAt(Scanner::Location source_location, 814 void Parser::ReportMessageAt(Scanner::Location source_location,
815 const char* type, 815 const char* message,
816 Vector<const char*> args) { 816 Vector<const char*> args) {
817 MessageLocation location(script_, 817 MessageLocation location(script_,
818 source_location.beg_pos, 818 source_location.beg_pos,
819 source_location.end_pos); 819 source_location.end_pos);
820 Factory* factory = isolate()->factory(); 820 Factory* factory = isolate()->factory();
821 Handle<FixedArray> elements = factory->NewFixedArray(args.length()); 821 Handle<FixedArray> elements = factory->NewFixedArray(args.length());
822 for (int i = 0; i < args.length(); i++) { 822 for (int i = 0; i < args.length(); i++) {
823 Handle<String> arg_string = factory->NewStringFromUtf8(CStrVector(args[i])); 823 Handle<String> arg_string = factory->NewStringFromUtf8(CStrVector(args[i]));
824 elements->set(i, *arg_string); 824 elements->set(i, *arg_string);
825 } 825 }
826 Handle<JSArray> array = factory->NewJSArrayWithElements(elements); 826 Handle<JSArray> array = factory->NewJSArrayWithElements(elements);
827 Handle<Object> result = factory->NewSyntaxError(type, array); 827 Handle<Object> result = factory->NewSyntaxError(message, array);
828 isolate()->Throw(*result, &location); 828 isolate()->Throw(*result, &location);
829 } 829 }
830 830
831 831
832 void Parser::ReportMessageAt(Scanner::Location source_location, 832 void Parser::ReportMessageAt(Scanner::Location source_location,
833 const char* type, 833 const char* message,
834 Vector<Handle<String> > args) { 834 Vector<Handle<String> > args) {
835 MessageLocation location(script_, 835 MessageLocation location(script_,
836 source_location.beg_pos, 836 source_location.beg_pos,
837 source_location.end_pos); 837 source_location.end_pos);
838 Factory* factory = isolate()->factory(); 838 Factory* factory = isolate()->factory();
839 Handle<FixedArray> elements = factory->NewFixedArray(args.length()); 839 Handle<FixedArray> elements = factory->NewFixedArray(args.length());
840 for (int i = 0; i < args.length(); i++) { 840 for (int i = 0; i < args.length(); i++) {
841 elements->set(i, *args[i]); 841 elements->set(i, *args[i]);
842 } 842 }
843 Handle<JSArray> array = factory->NewJSArrayWithElements(elements); 843 Handle<JSArray> array = factory->NewJSArrayWithElements(elements);
844 Handle<Object> result = factory->NewSyntaxError(type, array); 844 Handle<Object> result = factory->NewSyntaxError(message, array);
845 isolate()->Throw(*result, &location); 845 isolate()->Throw(*result, &location);
846 } 846 }
847 847
848 848
849 void* Parser::ParseSourceElements(ZoneList<Statement*>* processor, 849 void* Parser::ParseSourceElements(ZoneList<Statement*>* processor,
850 int end_token, 850 int end_token,
851 bool is_eval, 851 bool is_eval,
852 bool is_global, 852 bool is_global,
853 bool* ok) { 853 bool* ok) {
854 // SourceElements :: 854 // SourceElements ::
(...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after
1531 if (is_extended_mode()) { 1531 if (is_extended_mode()) {
1532 // In harmony mode we treat re-declarations as early errors. See 1532 // In harmony mode we treat re-declarations as early errors. See
1533 // ES5 16 for a definition of early errors. 1533 // ES5 16 for a definition of early errors.
1534 SmartArrayPointer<char> c_string = name->ToCString(DISALLOW_NULLS); 1534 SmartArrayPointer<char> c_string = name->ToCString(DISALLOW_NULLS);
1535 const char* elms[2] = { "Variable", *c_string }; 1535 const char* elms[2] = { "Variable", *c_string };
1536 Vector<const char*> args(elms, 2); 1536 Vector<const char*> args(elms, 2);
1537 ReportMessage("redeclaration", args); 1537 ReportMessage("redeclaration", args);
1538 *ok = false; 1538 *ok = false;
1539 return; 1539 return;
1540 } 1540 }
1541 Handle<String> type_string = 1541 Handle<String> message_string =
1542 isolate()->factory()->NewStringFromUtf8(CStrVector("Variable"), 1542 isolate()->factory()->NewStringFromUtf8(CStrVector("Variable"),
1543 TENURED); 1543 TENURED);
1544 Expression* expression = 1544 Expression* expression =
1545 NewThrowTypeError(isolate()->factory()->redeclaration_string(), 1545 NewThrowTypeError(isolate()->factory()->redeclaration_string(),
1546 type_string, name); 1546 message_string, name);
1547 declaration_scope->SetIllegalRedeclaration(expression); 1547 declaration_scope->SetIllegalRedeclaration(expression);
1548 } 1548 }
1549 } 1549 }
1550 1550
1551 // We add a declaration node for every declaration. The compiler 1551 // We add a declaration node for every declaration. The compiler
1552 // will only generate code if necessary. In particular, declarations 1552 // will only generate code if necessary. In particular, declarations
1553 // for inner local variables that do not represent functions won't 1553 // for inner local variables that do not represent functions won't
1554 // result in any generated code. 1554 // result in any generated code.
1555 // 1555 //
1556 // Note that we always add an unresolved proxy even if it's not 1556 // Note that we always add an unresolved proxy even if it's not
(...skipping 781 matching lines...) Expand 10 before | Expand all | Expand 10 after
2338 } 2338 }
2339 2339
2340 // An ECMAScript program is considered syntactically incorrect if it 2340 // An ECMAScript program is considered syntactically incorrect if it
2341 // contains a return statement that is not within the body of a 2341 // contains a return statement that is not within the body of a
2342 // function. See ECMA-262, section 12.9, page 67. 2342 // function. See ECMA-262, section 12.9, page 67.
2343 // 2343 //
2344 // To be consistent with KJS we report the syntax error at runtime. 2344 // To be consistent with KJS we report the syntax error at runtime.
2345 Scope* declaration_scope = top_scope_->DeclarationScope(); 2345 Scope* declaration_scope = top_scope_->DeclarationScope();
2346 if (declaration_scope->is_global_scope() || 2346 if (declaration_scope->is_global_scope() ||
2347 declaration_scope->is_eval_scope()) { 2347 declaration_scope->is_eval_scope()) {
2348 Handle<String> type = isolate()->factory()->illegal_return_string(); 2348 Handle<String> message = isolate()->factory()->illegal_return_string();
2349 Expression* throw_error = NewThrowSyntaxError(type, Handle<Object>::null()); 2349 Expression* throw_error =
2350 NewThrowSyntaxError(message, Handle<Object>::null());
2350 return factory()->NewExpressionStatement(throw_error); 2351 return factory()->NewExpressionStatement(throw_error);
2351 } 2352 }
2352 return result; 2353 return result;
2353 } 2354 }
2354 2355
2355 2356
2356 Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) { 2357 Statement* Parser::ParseWithStatement(ZoneStringList* labels, bool* ok) {
2357 // WithStatement :: 2358 // WithStatement ::
2358 // 'with' '(' Expression ')' Statement 2359 // 'with' '(' Expression ')' Statement
2359 2360
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
2730 init = variable_statement; 2731 init = variable_statement;
2731 } 2732 }
2732 } else { 2733 } else {
2733 Expression* expression = ParseExpression(false, CHECK_OK); 2734 Expression* expression = ParseExpression(false, CHECK_OK);
2734 if (peek() == Token::IN) { 2735 if (peek() == Token::IN) {
2735 // Signal a reference error if the expression is an invalid 2736 // Signal a reference error if the expression is an invalid
2736 // left-hand side expression. We could report this as a syntax 2737 // left-hand side expression. We could report this as a syntax
2737 // error here but for compatibility with JSC we choose to report 2738 // error here but for compatibility with JSC we choose to report
2738 // the error at runtime. 2739 // the error at runtime.
2739 if (expression == NULL || !expression->IsValidLeftHandSide()) { 2740 if (expression == NULL || !expression->IsValidLeftHandSide()) {
2740 Handle<String> type = 2741 Handle<String> message =
2741 isolate()->factory()->invalid_lhs_in_for_in_string(); 2742 isolate()->factory()->invalid_lhs_in_for_in_string();
2742 expression = NewThrowReferenceError(type); 2743 expression = NewThrowReferenceError(message);
2743 } 2744 }
2744 ForInStatement* loop = factory()->NewForInStatement(labels); 2745 ForInStatement* loop = factory()->NewForInStatement(labels);
2745 Target target(&this->target_stack_, loop); 2746 Target target(&this->target_stack_, loop);
2746 2747
2747 Expect(Token::IN, CHECK_OK); 2748 Expect(Token::IN, CHECK_OK);
2748 Expression* enumerable = ParseExpression(true, CHECK_OK); 2749 Expression* enumerable = ParseExpression(true, CHECK_OK);
2749 Expect(Token::RPAREN, CHECK_OK); 2750 Expect(Token::RPAREN, CHECK_OK);
2750 2751
2751 Statement* body = ParseStatement(NULL, CHECK_OK); 2752 Statement* body = ParseStatement(NULL, CHECK_OK);
2752 if (loop) loop->Initialize(expression, enumerable, body); 2753 if (loop) loop->Initialize(expression, enumerable, body);
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
2849 // Parsed conditional expression only (no assignment). 2850 // Parsed conditional expression only (no assignment).
2850 return expression; 2851 return expression;
2851 } 2852 }
2852 2853
2853 // Signal a reference error if the expression is an invalid left-hand 2854 // Signal a reference error if the expression is an invalid left-hand
2854 // side expression. We could report this as a syntax error here but 2855 // side expression. We could report this as a syntax error here but
2855 // for compatibility with JSC we choose to report the error at 2856 // for compatibility with JSC we choose to report the error at
2856 // runtime. 2857 // runtime.
2857 // TODO(ES5): Should change parsing for spec conformance. 2858 // TODO(ES5): Should change parsing for spec conformance.
2858 if (expression == NULL || !expression->IsValidLeftHandSide()) { 2859 if (expression == NULL || !expression->IsValidLeftHandSide()) {
2859 Handle<String> type = 2860 Handle<String> message =
2860 isolate()->factory()->invalid_lhs_in_assignment_string(); 2861 isolate()->factory()->invalid_lhs_in_assignment_string();
2861 expression = NewThrowReferenceError(type); 2862 expression = NewThrowReferenceError(message);
2862 } 2863 }
2863 2864
2864 if (!top_scope_->is_classic_mode()) { 2865 if (!top_scope_->is_classic_mode()) {
2865 // Assignment to eval or arguments is disallowed in strict mode. 2866 // Assignment to eval or arguments is disallowed in strict mode.
2866 CheckStrictModeLValue(expression, "strict_lhs_assignment", CHECK_OK); 2867 CheckStrictModeLValue(expression, "strict_lhs_assignment", CHECK_OK);
2867 } 2868 }
2868 MarkAsLValue(expression); 2869 MarkAsLValue(expression);
2869 2870
2870 Token::Value op = Next(); // Get assignment operator. 2871 Token::Value op = Next(); // Get assignment operator.
2871 int pos = scanner().location().beg_pos; 2872 int pos = scanner().location().beg_pos;
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
3119 return factory()->NewUnaryOperation(op, expression, position); 3120 return factory()->NewUnaryOperation(op, expression, position);
3120 3121
3121 } else if (Token::IsCountOp(op)) { 3122 } else if (Token::IsCountOp(op)) {
3122 op = Next(); 3123 op = Next();
3123 Expression* expression = ParseUnaryExpression(CHECK_OK); 3124 Expression* expression = ParseUnaryExpression(CHECK_OK);
3124 // Signal a reference error if the expression is an invalid 3125 // Signal a reference error if the expression is an invalid
3125 // left-hand side expression. We could report this as a syntax 3126 // left-hand side expression. We could report this as a syntax
3126 // error here but for compatibility with JSC we choose to report the 3127 // error here but for compatibility with JSC we choose to report the
3127 // error at runtime. 3128 // error at runtime.
3128 if (expression == NULL || !expression->IsValidLeftHandSide()) { 3129 if (expression == NULL || !expression->IsValidLeftHandSide()) {
3129 Handle<String> type = 3130 Handle<String> message =
3130 isolate()->factory()->invalid_lhs_in_prefix_op_string(); 3131 isolate()->factory()->invalid_lhs_in_prefix_op_string();
3131 expression = NewThrowReferenceError(type); 3132 expression = NewThrowReferenceError(message);
3132 } 3133 }
3133 3134
3134 if (!top_scope_->is_classic_mode()) { 3135 if (!top_scope_->is_classic_mode()) {
3135 // Prefix expression operand in strict mode may not be eval or arguments. 3136 // Prefix expression operand in strict mode may not be eval or arguments.
3136 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); 3137 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK);
3137 } 3138 }
3138 MarkAsLValue(expression); 3139 MarkAsLValue(expression);
3139 3140
3140 int position = scanner().location().beg_pos; 3141 int position = scanner().location().beg_pos;
3141 return factory()->NewCountOperation(op, 3142 return factory()->NewCountOperation(op,
(...skipping 12 matching lines...) Expand all
3154 // LeftHandSideExpression ('++' | '--')? 3155 // LeftHandSideExpression ('++' | '--')?
3155 3156
3156 Expression* expression = ParseLeftHandSideExpression(CHECK_OK); 3157 Expression* expression = ParseLeftHandSideExpression(CHECK_OK);
3157 if (!scanner().HasAnyLineTerminatorBeforeNext() && 3158 if (!scanner().HasAnyLineTerminatorBeforeNext() &&
3158 Token::IsCountOp(peek())) { 3159 Token::IsCountOp(peek())) {
3159 // Signal a reference error if the expression is an invalid 3160 // Signal a reference error if the expression is an invalid
3160 // left-hand side expression. We could report this as a syntax 3161 // left-hand side expression. We could report this as a syntax
3161 // error here but for compatibility with JSC we choose to report the 3162 // error here but for compatibility with JSC we choose to report the
3162 // error at runtime. 3163 // error at runtime.
3163 if (expression == NULL || !expression->IsValidLeftHandSide()) { 3164 if (expression == NULL || !expression->IsValidLeftHandSide()) {
3164 Handle<String> type = 3165 Handle<String> message =
3165 isolate()->factory()->invalid_lhs_in_postfix_op_string(); 3166 isolate()->factory()->invalid_lhs_in_postfix_op_string();
3166 expression = NewThrowReferenceError(type); 3167 expression = NewThrowReferenceError(message);
3167 } 3168 }
3168 3169
3169 if (!top_scope_->is_classic_mode()) { 3170 if (!top_scope_->is_classic_mode()) {
3170 // Postfix expression operand in strict mode may not be eval or arguments. 3171 // Postfix expression operand in strict mode may not be eval or arguments.
3171 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK); 3172 CheckStrictModeLValue(expression, "strict_lhs_prefix", CHECK_OK);
3172 } 3173 }
3173 MarkAsLValue(expression); 3174 MarkAsLValue(expression);
3174 3175
3175 Token::Value next = Next(); 3176 Token::Value next = Next();
3176 int position = scanner().location().beg_pos; 3177 int position = scanner().location().beg_pos;
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
3315 if (peek() == Token::FUNCTION) { 3316 if (peek() == Token::FUNCTION) {
3316 Expect(Token::FUNCTION, CHECK_OK); 3317 Expect(Token::FUNCTION, CHECK_OK);
3317 int function_token_position = scanner().location().beg_pos; 3318 int function_token_position = scanner().location().beg_pos;
3318 bool is_generator = allow_generators() && Check(Token::MUL); 3319 bool is_generator = allow_generators() && Check(Token::MUL);
3319 Handle<String> name; 3320 Handle<String> name;
3320 bool is_strict_reserved_name = false; 3321 bool is_strict_reserved_name = false;
3321 if (peek_any_identifier()) { 3322 if (peek_any_identifier()) {
3322 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name, 3323 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved_name,
3323 CHECK_OK); 3324 CHECK_OK);
3324 } 3325 }
3325 FunctionLiteral::Type type = name.is_null() 3326 FunctionLiteral::FunctionType function_type = name.is_null()
3326 ? FunctionLiteral::ANONYMOUS_EXPRESSION 3327 ? FunctionLiteral::ANONYMOUS_EXPRESSION
3327 : FunctionLiteral::NAMED_EXPRESSION; 3328 : FunctionLiteral::NAMED_EXPRESSION;
3328 result = ParseFunctionLiteral(name, 3329 result = ParseFunctionLiteral(name,
3329 is_strict_reserved_name, 3330 is_strict_reserved_name,
3330 is_generator, 3331 is_generator,
3331 function_token_position, 3332 function_token_position,
3332 type, 3333 function_type,
3333 CHECK_OK); 3334 CHECK_OK);
3334 } else { 3335 } else {
3335 result = ParsePrimaryExpression(CHECK_OK); 3336 result = ParsePrimaryExpression(CHECK_OK);
3336 } 3337 }
3337 3338
3338 while (true) { 3339 while (true) {
3339 switch (peek()) { 3340 switch (peek()) {
3340 case Token::LBRACK: { 3341 case Token::LBRACK: {
3341 Consume(Token::LBRACK); 3342 Consume(Token::LBRACK);
3342 int pos = scanner().location().beg_pos; 3343 int pos = scanner().location().beg_pos;
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
3651 3652
3652 3653
3653 Handle<FixedArray> CompileTimeValue::GetValue(Expression* expression) { 3654 Handle<FixedArray> CompileTimeValue::GetValue(Expression* expression) {
3654 Factory* factory = Isolate::Current()->factory(); 3655 Factory* factory = Isolate::Current()->factory();
3655 ASSERT(IsCompileTimeValue(expression)); 3656 ASSERT(IsCompileTimeValue(expression));
3656 Handle<FixedArray> result = factory->NewFixedArray(2, TENURED); 3657 Handle<FixedArray> result = factory->NewFixedArray(2, TENURED);
3657 ObjectLiteral* object_literal = expression->AsObjectLiteral(); 3658 ObjectLiteral* object_literal = expression->AsObjectLiteral();
3658 if (object_literal != NULL) { 3659 if (object_literal != NULL) {
3659 ASSERT(object_literal->is_simple()); 3660 ASSERT(object_literal->is_simple());
3660 if (object_literal->fast_elements()) { 3661 if (object_literal->fast_elements()) {
3661 result->set(kTypeSlot, Smi::FromInt(OBJECT_LITERAL_FAST_ELEMENTS)); 3662 result->set(kLiteralTypeSlot, Smi::FromInt(OBJECT_LITERAL_FAST_ELEMENTS));
3662 } else { 3663 } else {
3663 result->set(kTypeSlot, Smi::FromInt(OBJECT_LITERAL_SLOW_ELEMENTS)); 3664 result->set(kLiteralTypeSlot, Smi::FromInt(OBJECT_LITERAL_SLOW_ELEMENTS));
3664 } 3665 }
3665 result->set(kElementsSlot, *object_literal->constant_properties()); 3666 result->set(kElementsSlot, *object_literal->constant_properties());
3666 } else { 3667 } else {
3667 ArrayLiteral* array_literal = expression->AsArrayLiteral(); 3668 ArrayLiteral* array_literal = expression->AsArrayLiteral();
3668 ASSERT(array_literal != NULL && array_literal->is_simple()); 3669 ASSERT(array_literal != NULL && array_literal->is_simple());
3669 result->set(kTypeSlot, Smi::FromInt(ARRAY_LITERAL)); 3670 result->set(kLiteralTypeSlot, Smi::FromInt(ARRAY_LITERAL));
3670 result->set(kElementsSlot, *array_literal->constant_elements()); 3671 result->set(kElementsSlot, *array_literal->constant_elements());
3671 } 3672 }
3672 return result; 3673 return result;
3673 } 3674 }
3674 3675
3675 3676
3676 CompileTimeValue::Type CompileTimeValue::GetType(Handle<FixedArray> value) { 3677 CompileTimeValue::LiteralType CompileTimeValue::GetLiteralType(
3677 Smi* type_value = Smi::cast(value->get(kTypeSlot)); 3678 Handle<FixedArray> value) {
3678 return static_cast<Type>(type_value->value()); 3679 Smi* literal_type = Smi::cast(value->get(kLiteralTypeSlot));
3680 return static_cast<LiteralType>(literal_type->value());
3679 } 3681 }
3680 3682
3681 3683
3682 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) { 3684 Handle<FixedArray> CompileTimeValue::GetElements(Handle<FixedArray> value) {
3683 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot))); 3685 return Handle<FixedArray>(FixedArray::cast(value->get(kElementsSlot)));
3684 } 3686 }
3685 3687
3686 3688
3687 Handle<Object> Parser::GetBoilerplateValue(Expression* expression) { 3689 Handle<Object> Parser::GetBoilerplateValue(Expression* expression) {
3688 if (expression->AsLiteral() != NULL) { 3690 if (expression->AsLiteral() != NULL) {
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after
4156 // For function entries. 4158 // For function entries.
4157 int literals_; 4159 int literals_;
4158 int properties_; 4160 int properties_;
4159 LanguageMode mode_; 4161 LanguageMode mode_;
4160 // For error messages. 4162 // For error messages.
4161 const char* message_; 4163 const char* message_;
4162 const char* argument_opt_; 4164 const char* argument_opt_;
4163 }; 4165 };
4164 4166
4165 4167
4166 FunctionLiteral* Parser::ParseFunctionLiteral(Handle<String> function_name, 4168 FunctionLiteral* Parser::ParseFunctionLiteral(
4167 bool name_is_strict_reserved, 4169 Handle<String> function_name,
4168 bool is_generator, 4170 bool name_is_strict_reserved,
4169 int function_token_position, 4171 bool is_generator,
4170 FunctionLiteral::Type type, 4172 int function_token_position,
4171 bool* ok) { 4173 FunctionLiteral::FunctionType function_type,
4174 bool* ok) {
4172 // Function :: 4175 // Function ::
4173 // '(' FormalParameterList? ')' '{' FunctionBody '}' 4176 // '(' FormalParameterList? ')' '{' FunctionBody '}'
4174 4177
4175 // Anonymous functions were passed either the empty symbol or a null 4178 // Anonymous functions were passed either the empty symbol or a null
4176 // handle as the function name. Remember if we were passed a non-empty 4179 // handle as the function name. Remember if we were passed a non-empty
4177 // handle to decide whether to invoke function name inference. 4180 // handle to decide whether to invoke function name inference.
4178 bool should_infer_name = function_name.is_null(); 4181 bool should_infer_name = function_name.is_null();
4179 4182
4180 // We want a non-null handle as the function name. 4183 // We want a non-null handle as the function name.
4181 if (should_infer_name) { 4184 if (should_infer_name) {
4182 function_name = isolate()->factory()->empty_string(); 4185 function_name = isolate()->factory()->empty_string();
4183 } 4186 }
4184 4187
4185 int num_parameters = 0; 4188 int num_parameters = 0;
4186 // Function declarations are function scoped in normal mode, so they are 4189 // Function declarations are function scoped in normal mode, so they are
4187 // hoisted. In harmony block scoping mode they are block scoped, so they 4190 // hoisted. In harmony block scoping mode they are block scoped, so they
4188 // are not hoisted. 4191 // are not hoisted.
4189 Scope* scope = (type == FunctionLiteral::DECLARATION && !is_extended_mode()) 4192 Scope* scope =
4193 (function_type == FunctionLiteral::DECLARATION && !is_extended_mode())
4190 ? NewScope(top_scope_->DeclarationScope(), FUNCTION_SCOPE) 4194 ? NewScope(top_scope_->DeclarationScope(), FUNCTION_SCOPE)
4191 : NewScope(top_scope_, FUNCTION_SCOPE); 4195 : NewScope(top_scope_, FUNCTION_SCOPE);
4192 ZoneList<Statement*>* body = NULL; 4196 ZoneList<Statement*>* body = NULL;
4193 int materialized_literal_count = -1; 4197 int materialized_literal_count = -1;
4194 int expected_property_count = -1; 4198 int expected_property_count = -1;
4195 int handler_count = 0; 4199 int handler_count = 0;
4196 FunctionLiteral::ParameterFlag duplicate_parameters = 4200 FunctionLiteral::ParameterFlag duplicate_parameters =
4197 FunctionLiteral::kNoDuplicateParameters; 4201 FunctionLiteral::kNoDuplicateParameters;
4198 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_ 4202 FunctionLiteral::IsParenthesizedFlag parenthesized = parenthesized_function_
4199 ? FunctionLiteral::kIsParenthesized 4203 ? FunctionLiteral::kIsParenthesized
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
4265 Expect(Token::LBRACE, CHECK_OK); 4269 Expect(Token::LBRACE, CHECK_OK);
4266 4270
4267 // If we have a named function expression, we add a local variable 4271 // If we have a named function expression, we add a local variable
4268 // declaration to the body of the function with the name of the 4272 // declaration to the body of the function with the name of the
4269 // function and let it refer to the function itself (closure). 4273 // function and let it refer to the function itself (closure).
4270 // NOTE: We create a proxy and resolve it here so that in the 4274 // NOTE: We create a proxy and resolve it here so that in the
4271 // future we can change the AST to only refer to VariableProxies 4275 // future we can change the AST to only refer to VariableProxies
4272 // instead of Variables and Proxis as is the case now. 4276 // instead of Variables and Proxis as is the case now.
4273 Variable* fvar = NULL; 4277 Variable* fvar = NULL;
4274 Token::Value fvar_init_op = Token::INIT_CONST; 4278 Token::Value fvar_init_op = Token::INIT_CONST;
4275 if (type == FunctionLiteral::NAMED_EXPRESSION) { 4279 if (function_type == FunctionLiteral::NAMED_EXPRESSION) {
4276 if (is_extended_mode()) fvar_init_op = Token::INIT_CONST_HARMONY; 4280 if (is_extended_mode()) fvar_init_op = Token::INIT_CONST_HARMONY;
4277 VariableMode fvar_mode = is_extended_mode() ? CONST_HARMONY : CONST; 4281 VariableMode fvar_mode = is_extended_mode() ? CONST_HARMONY : CONST;
4278 fvar = new(zone()) Variable(top_scope_, 4282 fvar = new(zone()) Variable(top_scope_,
4279 function_name, fvar_mode, true /* is valid LHS */, 4283 function_name, fvar_mode, true /* is valid LHS */,
4280 Variable::NORMAL, kCreatedInitialized, Interface::NewConst()); 4284 Variable::NORMAL, kCreatedInitialized, Interface::NewConst());
4281 VariableProxy* proxy = factory()->NewVariableProxy(fvar); 4285 VariableProxy* proxy = factory()->NewVariableProxy(fvar);
4282 VariableDeclaration* fvar_declaration = 4286 VariableDeclaration* fvar_declaration =
4283 factory()->NewVariableDeclaration(proxy, fvar_mode, top_scope_); 4287 factory()->NewVariableDeclaration(proxy, fvar_mode, top_scope_);
4284 top_scope_->DeclareFunctionVar(fvar_declaration); 4288 top_scope_->DeclareFunctionVar(fvar_declaration);
4285 } 4289 }
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
4469 4473
4470 FunctionLiteral* function_literal = 4474 FunctionLiteral* function_literal =
4471 factory()->NewFunctionLiteral(function_name, 4475 factory()->NewFunctionLiteral(function_name,
4472 scope, 4476 scope,
4473 body, 4477 body,
4474 materialized_literal_count, 4478 materialized_literal_count,
4475 expected_property_count, 4479 expected_property_count,
4476 handler_count, 4480 handler_count,
4477 num_parameters, 4481 num_parameters,
4478 duplicate_parameters, 4482 duplicate_parameters,
4479 type, 4483 function_type,
4480 FunctionLiteral::kIsFunction, 4484 FunctionLiteral::kIsFunction,
4481 parenthesized, 4485 parenthesized,
4482 generator); 4486 generator);
4483 function_literal->set_function_token_position(function_token_position); 4487 function_literal->set_function_token_position(function_token_position);
4484 function_literal->set_ast_properties(&ast_properties); 4488 function_literal->set_ast_properties(&ast_properties);
4485 4489
4486 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal); 4490 if (fni_ != NULL && should_infer_name) fni_->AddFunction(function_literal);
4487 return function_literal; 4491 return function_literal;
4488 } 4492 }
4489 4493
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
4815 // Register that a break target found at the given stop in the 4819 // Register that a break target found at the given stop in the
4816 // target stack has been used from the top of the target stack. Add 4820 // target stack has been used from the top of the target stack. Add
4817 // the break target to any TargetCollectors passed on the stack. 4821 // the break target to any TargetCollectors passed on the stack.
4818 for (Target* t = target_stack_; t != stop; t = t->previous()) { 4822 for (Target* t = target_stack_; t != stop; t = t->previous()) {
4819 TargetCollector* collector = t->node()->AsTargetCollector(); 4823 TargetCollector* collector = t->node()->AsTargetCollector();
4820 if (collector != NULL) collector->AddTarget(target, zone()); 4824 if (collector != NULL) collector->AddTarget(target, zone());
4821 } 4825 }
4822 } 4826 }
4823 4827
4824 4828
4825 Expression* Parser::NewThrowReferenceError(Handle<String> type) { 4829 Expression* Parser::NewThrowReferenceError(Handle<String> message) {
4826 return NewThrowError(isolate()->factory()->MakeReferenceError_string(), 4830 return NewThrowError(isolate()->factory()->MakeReferenceError_string(),
4827 type, HandleVector<Object>(NULL, 0)); 4831 message, HandleVector<Object>(NULL, 0));
4828 } 4832 }
4829 4833
4830 4834
4831 Expression* Parser::NewThrowSyntaxError(Handle<String> type, 4835 Expression* Parser::NewThrowSyntaxError(Handle<String> message,
4832 Handle<Object> first) { 4836 Handle<Object> first) {
4833 int argc = first.is_null() ? 0 : 1; 4837 int argc = first.is_null() ? 0 : 1;
4834 Vector< Handle<Object> > arguments = HandleVector<Object>(&first, argc); 4838 Vector< Handle<Object> > arguments = HandleVector<Object>(&first, argc);
4835 return NewThrowError( 4839 return NewThrowError(
4836 isolate()->factory()->MakeSyntaxError_string(), type, arguments); 4840 isolate()->factory()->MakeSyntaxError_string(), message, arguments);
4837 } 4841 }
4838 4842
4839 4843
4840 Expression* Parser::NewThrowTypeError(Handle<String> type, 4844 Expression* Parser::NewThrowTypeError(Handle<String> message,
4841 Handle<Object> first, 4845 Handle<Object> first,
4842 Handle<Object> second) { 4846 Handle<Object> second) {
4843 ASSERT(!first.is_null() && !second.is_null()); 4847 ASSERT(!first.is_null() && !second.is_null());
4844 Handle<Object> elements[] = { first, second }; 4848 Handle<Object> elements[] = { first, second };
4845 Vector< Handle<Object> > arguments = 4849 Vector< Handle<Object> > arguments =
4846 HandleVector<Object>(elements, ARRAY_SIZE(elements)); 4850 HandleVector<Object>(elements, ARRAY_SIZE(elements));
4847 return NewThrowError( 4851 return NewThrowError(
4848 isolate()->factory()->MakeTypeError_string(), type, arguments); 4852 isolate()->factory()->MakeTypeError_string(), message, arguments);
4849 } 4853 }
4850 4854
4851 4855
4852 Expression* Parser::NewThrowError(Handle<String> constructor, 4856 Expression* Parser::NewThrowError(Handle<String> constructor,
4853 Handle<String> type, 4857 Handle<String> message,
4854 Vector< Handle<Object> > arguments) { 4858 Vector< Handle<Object> > arguments) {
4855 int argc = arguments.length(); 4859 int argc = arguments.length();
4856 Handle<FixedArray> elements = isolate()->factory()->NewFixedArray(argc, 4860 Handle<FixedArray> elements = isolate()->factory()->NewFixedArray(argc,
4857 TENURED); 4861 TENURED);
4858 for (int i = 0; i < argc; i++) { 4862 for (int i = 0; i < argc; i++) {
4859 Handle<Object> element = arguments[i]; 4863 Handle<Object> element = arguments[i];
4860 if (!element.is_null()) { 4864 if (!element.is_null()) {
4861 elements->set(i, *element); 4865 elements->set(i, *element);
4862 } 4866 }
4863 } 4867 }
4864 Handle<JSArray> array = isolate()->factory()->NewJSArrayWithElements( 4868 Handle<JSArray> array = isolate()->factory()->NewJSArrayWithElements(
4865 elements, FAST_ELEMENTS, TENURED); 4869 elements, FAST_ELEMENTS, TENURED);
4866 4870
4867 ZoneList<Expression*>* args = new(zone()) ZoneList<Expression*>(2, zone()); 4871 ZoneList<Expression*>* args = new(zone()) ZoneList<Expression*>(2, zone());
4868 args->Add(factory()->NewLiteral(type), zone()); 4872 args->Add(factory()->NewLiteral(message), zone());
4869 args->Add(factory()->NewLiteral(array), zone()); 4873 args->Add(factory()->NewLiteral(array), zone());
4870 CallRuntime* call_constructor = 4874 CallRuntime* call_constructor =
4871 factory()->NewCallRuntime(constructor, NULL, args); 4875 factory()->NewCallRuntime(constructor, NULL, args);
4872 return factory()->NewThrow(call_constructor, scanner().location().beg_pos); 4876 return factory()->NewThrow(call_constructor, scanner().location().beg_pos);
4873 } 4877 }
4874 4878
4875 // ---------------------------------------------------------------------------- 4879 // ----------------------------------------------------------------------------
4876 // Regular expressions 4880 // Regular expressions
4877 4881
4878 4882
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
4999 ASSERT_NE(INITIAL, stored_state->group_type()); 5003 ASSERT_NE(INITIAL, stored_state->group_type());
5000 5004
5001 Advance(); 5005 Advance();
5002 // End disjunction parsing and convert builder content to new single 5006 // End disjunction parsing and convert builder content to new single
5003 // regexp atom. 5007 // regexp atom.
5004 RegExpTree* body = builder->ToRegExp(); 5008 RegExpTree* body = builder->ToRegExp();
5005 5009
5006 int end_capture_index = captures_started(); 5010 int end_capture_index = captures_started();
5007 5011
5008 int capture_index = stored_state->capture_index(); 5012 int capture_index = stored_state->capture_index();
5009 SubexpressionType type = stored_state->group_type(); 5013 SubexpressionType group_type = stored_state->group_type();
5010 5014
5011 // Restore previous state. 5015 // Restore previous state.
5012 stored_state = stored_state->previous_state(); 5016 stored_state = stored_state->previous_state();
5013 builder = stored_state->builder(); 5017 builder = stored_state->builder();
5014 5018
5015 // Build result of subexpression. 5019 // Build result of subexpression.
5016 if (type == CAPTURE) { 5020 if (group_type == CAPTURE) {
5017 RegExpCapture* capture = new(zone()) RegExpCapture(body, capture_index); 5021 RegExpCapture* capture = new(zone()) RegExpCapture(body, capture_index);
5018 captures_->at(capture_index - 1) = capture; 5022 captures_->at(capture_index - 1) = capture;
5019 body = capture; 5023 body = capture;
5020 } else if (type != GROUPING) { 5024 } else if (group_type != GROUPING) {
5021 ASSERT(type == POSITIVE_LOOKAHEAD || type == NEGATIVE_LOOKAHEAD); 5025 ASSERT(group_type == POSITIVE_LOOKAHEAD ||
5022 bool is_positive = (type == POSITIVE_LOOKAHEAD); 5026 group_type == NEGATIVE_LOOKAHEAD);
5027 bool is_positive = (group_type == POSITIVE_LOOKAHEAD);
5023 body = new(zone()) RegExpLookahead(body, 5028 body = new(zone()) RegExpLookahead(body,
5024 is_positive, 5029 is_positive,
5025 end_capture_index - capture_index, 5030 end_capture_index - capture_index,
5026 capture_index); 5031 capture_index);
5027 } 5032 }
5028 builder->AddAtom(body); 5033 builder->AddAtom(body);
5029 // For compatability with JSC and ES3, we allow quantifiers after 5034 // For compatability with JSC and ES3, we allow quantifiers after
5030 // lookaheads, and break in all cases. 5035 // lookaheads, and break in all cases.
5031 break; 5036 break;
5032 } 5037 }
(...skipping 13 matching lines...) Expand all
5046 new(zone()) RegExpAssertion(RegExpAssertion::START_OF_LINE)); 5051 new(zone()) RegExpAssertion(RegExpAssertion::START_OF_LINE));
5047 } else { 5052 } else {
5048 builder->AddAssertion( 5053 builder->AddAssertion(
5049 new(zone()) RegExpAssertion(RegExpAssertion::START_OF_INPUT)); 5054 new(zone()) RegExpAssertion(RegExpAssertion::START_OF_INPUT));
5050 set_contains_anchor(); 5055 set_contains_anchor();
5051 } 5056 }
5052 continue; 5057 continue;
5053 } 5058 }
5054 case '$': { 5059 case '$': {
5055 Advance(); 5060 Advance();
5056 RegExpAssertion::Type type = 5061 RegExpAssertion::AssertionType assertion_type =
5057 multiline_ ? RegExpAssertion::END_OF_LINE : 5062 multiline_ ? RegExpAssertion::END_OF_LINE :
5058 RegExpAssertion::END_OF_INPUT; 5063 RegExpAssertion::END_OF_INPUT;
5059 builder->AddAssertion(new(zone()) RegExpAssertion(type)); 5064 builder->AddAssertion(new(zone()) RegExpAssertion(assertion_type));
5060 continue; 5065 continue;
5061 } 5066 }
5062 case '.': { 5067 case '.': {
5063 Advance(); 5068 Advance();
5064 // everything except \x0a, \x0d, \u2028 and \u2029 5069 // everything except \x0a, \x0d, \u2028 and \u2029
5065 ZoneList<CharacterRange>* ranges = 5070 ZoneList<CharacterRange>* ranges =
5066 new(zone()) ZoneList<CharacterRange>(2, zone()); 5071 new(zone()) ZoneList<CharacterRange>(2, zone());
5067 CharacterRange::AddClassEscape('.', ranges, zone()); 5072 CharacterRange::AddClassEscape('.', ranges, zone());
5068 RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false); 5073 RegExpTree* atom = new(zone()) RegExpCharacterClass(ranges, false);
5069 builder->AddAtom(atom); 5074 builder->AddAtom(atom);
5070 break; 5075 break;
5071 } 5076 }
5072 case '(': { 5077 case '(': {
5073 SubexpressionType type = CAPTURE; 5078 SubexpressionType subexpr_type = CAPTURE;
5074 Advance(); 5079 Advance();
5075 if (current() == '?') { 5080 if (current() == '?') {
5076 switch (Next()) { 5081 switch (Next()) {
5077 case ':': 5082 case ':':
5078 type = GROUPING; 5083 subexpr_type = GROUPING;
5079 break; 5084 break;
5080 case '=': 5085 case '=':
5081 type = POSITIVE_LOOKAHEAD; 5086 subexpr_type = POSITIVE_LOOKAHEAD;
5082 break; 5087 break;
5083 case '!': 5088 case '!':
5084 type = NEGATIVE_LOOKAHEAD; 5089 subexpr_type = NEGATIVE_LOOKAHEAD;
5085 break; 5090 break;
5086 default: 5091 default:
5087 ReportError(CStrVector("Invalid group") CHECK_FAILED); 5092 ReportError(CStrVector("Invalid group") CHECK_FAILED);
5088 break; 5093 break;
5089 } 5094 }
5090 Advance(2); 5095 Advance(2);
5091 } else { 5096 } else {
5092 if (captures_ == NULL) { 5097 if (captures_ == NULL) {
5093 captures_ = new(zone()) ZoneList<RegExpCapture*>(2, zone()); 5098 captures_ = new(zone()) ZoneList<RegExpCapture*>(2, zone());
5094 } 5099 }
5095 if (captures_started() >= kMaxCaptures) { 5100 if (captures_started() >= kMaxCaptures) {
5096 ReportError(CStrVector("Too many captures") CHECK_FAILED); 5101 ReportError(CStrVector("Too many captures") CHECK_FAILED);
5097 } 5102 }
5098 captures_->Add(NULL, zone()); 5103 captures_->Add(NULL, zone());
5099 } 5104 }
5100 // Store current state and begin new disjunction parsing. 5105 // Store current state and begin new disjunction parsing.
5101 stored_state = new(zone()) RegExpParserState(stored_state, type, 5106 stored_state = new(zone()) RegExpParserState(stored_state, subexpr_type,
5102 captures_started(), zone()); 5107 captures_started(), zone());
5103 builder = stored_state->builder(); 5108 builder = stored_state->builder();
5104 continue; 5109 continue;
5105 } 5110 }
5106 case '[': { 5111 case '[': {
5107 RegExpTree* atom = ParseCharacterClass(CHECK_FAILED); 5112 RegExpTree* atom = ParseCharacterClass(CHECK_FAILED);
5108 builder->AddAtom(atom); 5113 builder->AddAtom(atom);
5109 break; 5114 break;
5110 } 5115 }
5111 // Atom :: 5116 // Atom ::
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
5279 ReportError(CStrVector("numbers out of order in {} quantifier.") 5284 ReportError(CStrVector("numbers out of order in {} quantifier.")
5280 CHECK_FAILED); 5285 CHECK_FAILED);
5281 } 5286 }
5282 break; 5287 break;
5283 } else { 5288 } else {
5284 continue; 5289 continue;
5285 } 5290 }
5286 default: 5291 default:
5287 continue; 5292 continue;
5288 } 5293 }
5289 RegExpQuantifier::Type type = RegExpQuantifier::GREEDY; 5294 RegExpQuantifier::QuantifierType quantifier_type = RegExpQuantifier::GREEDY;
5290 if (current() == '?') { 5295 if (current() == '?') {
5291 type = RegExpQuantifier::NON_GREEDY; 5296 quantifier_type = RegExpQuantifier::NON_GREEDY;
5292 Advance(); 5297 Advance();
5293 } else if (FLAG_regexp_possessive_quantifier && current() == '+') { 5298 } else if (FLAG_regexp_possessive_quantifier && current() == '+') {
5294 // FLAG_regexp_possessive_quantifier is a debug-only flag. 5299 // FLAG_regexp_possessive_quantifier is a debug-only flag.
5295 type = RegExpQuantifier::POSSESSIVE; 5300 quantifier_type = RegExpQuantifier::POSSESSIVE;
5296 Advance(); 5301 Advance();
5297 } 5302 }
5298 builder->AddQuantifierToAtom(min, max, type); 5303 builder->AddQuantifierToAtom(min, max, quantifier_type);
5299 } 5304 }
5300 } 5305 }
5301 5306
5302 5307
5303 #ifdef DEBUG 5308 #ifdef DEBUG
5304 // Currently only used in an ASSERT. 5309 // Currently only used in an ASSERT.
5305 static bool IsSpecialClassEscape(uc32 c) { 5310 static bool IsSpecialClassEscape(uc32 c) {
5306 switch (c) { 5311 switch (c) {
5307 case 'd': case 'D': 5312 case 'd': case 'D':
5308 case 's': case 'S': 5313 case 's': case 'S':
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after
5823 ASSERT(info()->isolate()->has_pending_exception()); 5828 ASSERT(info()->isolate()->has_pending_exception());
5824 } else { 5829 } else {
5825 result = ParseProgram(); 5830 result = ParseProgram();
5826 } 5831 }
5827 } 5832 }
5828 info()->SetFunction(result); 5833 info()->SetFunction(result);
5829 return (result != NULL); 5834 return (result != NULL);
5830 } 5835 }
5831 5836
5832 } } // namespace v8::internal 5837 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/parser.h ('k') | src/runtime.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698