OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
593 script_(script), | 593 script_(script), |
594 scanner_(), | 594 scanner_(), |
595 top_scope_(NULL), | 595 top_scope_(NULL), |
596 with_nesting_level_(0), | 596 with_nesting_level_(0), |
597 temp_scope_(NULL), | 597 temp_scope_(NULL), |
598 target_stack_(NULL), | 598 target_stack_(NULL), |
599 allow_natives_syntax_(allow_natives_syntax), | 599 allow_natives_syntax_(allow_natives_syntax), |
600 extension_(extension), | 600 extension_(extension), |
601 pre_data_(pre_data), | 601 pre_data_(pre_data), |
602 fni_(NULL), | 602 fni_(NULL), |
603 stack_overflow_(false) { | 603 stack_overflow_(false), |
| 604 parenthesized_function_(false) { |
604 AstNode::ResetIds(); | 605 AstNode::ResetIds(); |
605 } | 606 } |
606 | 607 |
607 | 608 |
608 FunctionLiteral* Parser::ParseProgram(Handle<String> source, | 609 FunctionLiteral* Parser::ParseProgram(Handle<String> source, |
609 bool in_global_context) { | 610 bool in_global_context) { |
610 CompilationZoneScope zone_scope(DONT_DELETE_ON_EXIT); | 611 CompilationZoneScope zone_scope(DONT_DELETE_ON_EXIT); |
611 | 612 |
612 HistogramTimerScope timer(&Counters::parse); | 613 HistogramTimerScope timer(&Counters::parse); |
613 Counters::total_parse_size.Increment(source->length()); | 614 Counters::total_parse_size.Increment(source->length()); |
(...skipping 1861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2475 | 2476 |
2476 case Token::LPAREN: { | 2477 case Token::LPAREN: { |
2477 int pos = scanner().location().beg_pos; | 2478 int pos = scanner().location().beg_pos; |
2478 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); | 2479 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); |
2479 | 2480 |
2480 // Keep track of eval() calls since they disable all local variable | 2481 // Keep track of eval() calls since they disable all local variable |
2481 // optimizations. | 2482 // optimizations. |
2482 // The calls that need special treatment are the | 2483 // The calls that need special treatment are the |
2483 // direct (i.e. not aliased) eval calls. These calls are all of the | 2484 // direct (i.e. not aliased) eval calls. These calls are all of the |
2484 // form eval(...) with no explicit receiver object where eval is not | 2485 // form eval(...) with no explicit receiver object where eval is not |
2485 // declared in the current scope chain. These calls are marked as | 2486 // declared in the current scope chain. |
2486 // potentially direct eval calls. Whether they are actually direct calls | 2487 // These calls are marked as potentially direct eval calls. Whether |
2487 // to eval is determined at run time. | 2488 // they are actually direct calls to eval is determined at run time. |
| 2489 // TODO(994): In ES5, it doesn't matter if the "eval" var is declared |
| 2490 // in the local scope chain. It only matters that it's called "eval", |
| 2491 // is called without a receiver and it refers to the original eval |
| 2492 // function. |
2488 VariableProxy* callee = result->AsVariableProxy(); | 2493 VariableProxy* callee = result->AsVariableProxy(); |
2489 if (callee != NULL && callee->IsVariable(Factory::eval_symbol())) { | 2494 if (callee != NULL && callee->IsVariable(Factory::eval_symbol())) { |
2490 Handle<String> name = callee->name(); | 2495 Handle<String> name = callee->name(); |
2491 Variable* var = top_scope_->Lookup(name); | 2496 Variable* var = top_scope_->Lookup(name); |
2492 if (var == NULL) { | 2497 if (var == NULL) { |
2493 top_scope_->RecordEvalCall(); | 2498 top_scope_->RecordEvalCall(); |
2494 } | 2499 } |
2495 } | 2500 } |
2496 result = NewCall(result, args, pos); | 2501 result = NewCall(result, args, pos); |
2497 break; | 2502 break; |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2727 case Token::LBRACK: | 2732 case Token::LBRACK: |
2728 result = ParseArrayLiteral(CHECK_OK); | 2733 result = ParseArrayLiteral(CHECK_OK); |
2729 break; | 2734 break; |
2730 | 2735 |
2731 case Token::LBRACE: | 2736 case Token::LBRACE: |
2732 result = ParseObjectLiteral(CHECK_OK); | 2737 result = ParseObjectLiteral(CHECK_OK); |
2733 break; | 2738 break; |
2734 | 2739 |
2735 case Token::LPAREN: | 2740 case Token::LPAREN: |
2736 Consume(Token::LPAREN); | 2741 Consume(Token::LPAREN); |
| 2742 // Heuristically try to detect immediately called functions before |
| 2743 // seeing the call parentheses. |
| 2744 parenthesized_function_ = (peek() == Token::FUNCTION); |
2737 result = ParseExpression(true, CHECK_OK); | 2745 result = ParseExpression(true, CHECK_OK); |
2738 Expect(Token::RPAREN, CHECK_OK); | 2746 Expect(Token::RPAREN, CHECK_OK); |
2739 break; | 2747 break; |
2740 | 2748 |
2741 case Token::MOD: | 2749 case Token::MOD: |
2742 if (allow_natives_syntax_ || extension_ != NULL) { | 2750 if (allow_natives_syntax_ || extension_ != NULL) { |
2743 result = ParseV8Intrinsic(CHECK_OK); | 2751 result = ParseV8Intrinsic(CHECK_OK); |
2744 break; | 2752 break; |
2745 } | 2753 } |
2746 // If we're not allowing special syntax we fall-through to the | 2754 // If we're not allowing special syntax we fall-through to the |
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3218 top_scope_->NewUnresolved(function_name, inside_with()); | 3226 top_scope_->NewUnresolved(function_name, inside_with()); |
3219 fproxy->BindTo(fvar); | 3227 fproxy->BindTo(fvar); |
3220 body->Add(new ExpressionStatement( | 3228 body->Add(new ExpressionStatement( |
3221 new Assignment(Token::INIT_CONST, fproxy, | 3229 new Assignment(Token::INIT_CONST, fproxy, |
3222 new ThisFunction(), | 3230 new ThisFunction(), |
3223 RelocInfo::kNoPosition))); | 3231 RelocInfo::kNoPosition))); |
3224 } | 3232 } |
3225 | 3233 |
3226 // Determine if the function will be lazily compiled. The mode can | 3234 // Determine if the function will be lazily compiled. The mode can |
3227 // only be PARSE_LAZILY if the --lazy flag is true. | 3235 // only be PARSE_LAZILY if the --lazy flag is true. |
3228 bool is_lazily_compiled = | 3236 bool is_lazily_compiled = (mode() == PARSE_LAZILY && |
3229 mode() == PARSE_LAZILY && top_scope_->HasTrivialOuterContext(); | 3237 top_scope_->outer_scope()->is_global_scope() && |
| 3238 top_scope_->HasTrivialOuterContext() && |
| 3239 !parenthesized_function_); |
| 3240 parenthesized_function_ = false; // The bit was set for this function only. |
3230 | 3241 |
3231 int function_block_pos = scanner().location().beg_pos; | 3242 int function_block_pos = scanner().location().beg_pos; |
3232 int materialized_literal_count; | 3243 int materialized_literal_count; |
3233 int expected_property_count; | 3244 int expected_property_count; |
3234 int end_pos; | 3245 int end_pos; |
3235 bool only_simple_this_property_assignments; | 3246 bool only_simple_this_property_assignments; |
3236 Handle<FixedArray> this_property_assignments; | 3247 Handle<FixedArray> this_property_assignments; |
3237 if (is_lazily_compiled && pre_data() != NULL) { | 3248 if (is_lazily_compiled && pre_data() != NULL) { |
3238 FunctionEntry entry = pre_data()->GetFunctionEntry(function_block_pos); | 3249 FunctionEntry entry = pre_data()->GetFunctionEntry(function_block_pos); |
3239 if (!entry.is_valid()) { | 3250 if (!entry.is_valid()) { |
(...skipping 1455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4695 Handle<String> source = Handle<String>(String::cast(script->source())); | 4706 Handle<String> source = Handle<String>(String::cast(script->source())); |
4696 result = parser.ParseProgram(source, info->is_global()); | 4707 result = parser.ParseProgram(source, info->is_global()); |
4697 } | 4708 } |
4698 } | 4709 } |
4699 | 4710 |
4700 info->SetFunction(result); | 4711 info->SetFunction(result); |
4701 return (result != NULL); | 4712 return (result != NULL); |
4702 } | 4713 } |
4703 | 4714 |
4704 } } // namespace v8::internal | 4715 } } // namespace v8::internal |
OLD | NEW |