Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 268 | 268 |
| 269 Scope* Parser::NewScope(Scope* parent, ScopeType scope_type) { | 269 Scope* Parser::NewScope(Scope* parent, ScopeType scope_type) { |
| 270 DCHECK(ast_value_factory()); | 270 DCHECK(ast_value_factory()); |
| 271 Scope* result = | 271 Scope* result = |
| 272 new (zone()) Scope(parent, scope_type, ast_value_factory(), zone()); | 272 new (zone()) Scope(parent, scope_type, ast_value_factory(), zone()); |
| 273 result->Initialize(); | 273 result->Initialize(); |
| 274 return result; | 274 return result; |
| 275 } | 275 } |
| 276 | 276 |
| 277 | 277 |
| 278 FunctionLiteral* Parser::DefaultConstructor(bool call_super, Scope* scope) { | |
| 279 int materialized_literal_count = -1; | |
| 280 int expected_property_count = -1; | |
| 281 int handler_count = 0; | |
| 282 int parameter_count = 0; | |
| 283 AstProperties ast_properties; | |
| 284 BailoutReason dont_optimize_reason = kNoReason; | |
| 285 const AstRawString* name = ast_value_factory()->empty_string(); | |
| 286 FunctionKind kind = call_super ? FunctionKind::kDefaultConstructorCallSuper | |
| 287 : FunctionKind::kDefaultConstructor; | |
| 288 | |
| 289 Scope* function_scope = NewScope(scope, FUNCTION_SCOPE); | |
| 290 function_scope->SetStrictMode(STRICT); | |
| 291 ZoneList<Statement*>* body = NULL; | |
| 292 int pos = RelocInfo::kNoPosition; | |
| 293 | |
| 294 { | |
| 295 AstNodeFactory<AstConstructionVisitor> function_factory( | |
| 296 ast_value_factory()); | |
| 297 FunctionState function_state(&function_state_, &scope_, function_scope, | |
| 298 &function_factory); | |
| 299 | |
| 300 body = new (zone()) ZoneList<Statement*>(1, zone()); | |
| 301 if (call_super) { | |
| 302 Expression* prop = SuperReference(function_scope, factory(), pos); | |
| 303 ZoneList<Expression*>* args = | |
| 304 new (zone()) ZoneList<Expression*>(0, zone()); | |
| 305 Call* call = factory()->NewCall(prop, args, pos); | |
| 306 | |
| 307 DCHECK(call->GetCallType(isolate()) == Call::SUPER_CALL); | |
| 308 | |
| 309 body->Add(factory()->NewExpressionStatement(call, pos), zone()); | |
| 310 } | |
| 311 | |
| 312 materialized_literal_count = function_state.materialized_literal_count(); | |
| 313 expected_property_count = function_state.expected_property_count(); | |
| 314 handler_count = function_state.handler_count(); | |
| 315 | |
| 316 ast_properties = *factory()->visitor()->ast_properties(); | |
| 317 dont_optimize_reason = factory()->visitor()->dont_optimize_reason(); | |
| 318 } | |
| 319 | |
| 320 FunctionLiteral* function_literal = factory()->NewFunctionLiteral( | |
| 321 name, ast_value_factory(), function_scope, body, | |
| 322 materialized_literal_count, expected_property_count, handler_count, | |
| 323 parameter_count, FunctionLiteral::kNoDuplicateParameters, | |
| 324 FunctionLiteral::ANONYMOUS_EXPRESSION, FunctionLiteral::kIsFunction, | |
| 325 FunctionLiteral::kNotParenthesized, kind, pos); | |
| 326 | |
| 327 function_literal->set_ast_properties(&ast_properties); | |
| 328 function_literal->set_dont_optimize_reason(dont_optimize_reason); | |
| 329 | |
| 330 return function_literal; | |
| 331 } | |
| 332 | |
| 333 | |
| 278 // ---------------------------------------------------------------------------- | 334 // ---------------------------------------------------------------------------- |
| 279 // Target is a support class to facilitate manipulation of the | 335 // Target is a support class to facilitate manipulation of the |
| 280 // Parser's target_stack_ (the stack of potential 'break' and | 336 // Parser's target_stack_ (the stack of potential 'break' and |
| 281 // 'continue' statement targets). Upon construction, a new target is | 337 // 'continue' statement targets). Upon construction, a new target is |
| 282 // added; it is removed upon destruction. | 338 // added; it is removed upon destruction. |
| 283 | 339 |
| 284 class Target BASE_EMBEDDED { | 340 class Target BASE_EMBEDDED { |
| 285 public: | 341 public: |
| 286 Target(Target** variable, AstNode* node) | 342 Target(Target** variable, AstNode* node) |
| 287 : variable_(variable), node_(node), previous_(*variable) { | 343 : variable_(variable), node_(node), previous_(*variable) { |
| (...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 641 } | 697 } |
| 642 | 698 |
| 643 Expression* ParserTraits::ClassExpression( | 699 Expression* ParserTraits::ClassExpression( |
| 644 const AstRawString* name, Expression* extends, Expression* constructor, | 700 const AstRawString* name, Expression* extends, Expression* constructor, |
| 645 ZoneList<ObjectLiteral::Property*>* properties, int start_position, | 701 ZoneList<ObjectLiteral::Property*>* properties, int start_position, |
| 646 int end_position, AstNodeFactory<AstConstructionVisitor>* factory) { | 702 int end_position, AstNodeFactory<AstConstructionVisitor>* factory) { |
| 647 return factory->NewClassLiteral(name, extends, constructor, properties, | 703 return factory->NewClassLiteral(name, extends, constructor, properties, |
| 648 start_position, end_position); | 704 start_position, end_position); |
| 649 } | 705 } |
| 650 | 706 |
| 707 | |
| 708 Expression* ParserTraits::DefaultConstructor(bool call_super, Scope* scope) { | |
| 709 return parser_->DefaultConstructor(call_super, scope); | |
| 710 } | |
| 711 | |
| 712 | |
| 651 Literal* ParserTraits::ExpressionFromLiteral( | 713 Literal* ParserTraits::ExpressionFromLiteral( |
| 652 Token::Value token, int pos, | 714 Token::Value token, int pos, |
| 653 Scanner* scanner, | 715 Scanner* scanner, |
| 654 AstNodeFactory<AstConstructionVisitor>* factory) { | 716 AstNodeFactory<AstConstructionVisitor>* factory) { |
| 655 switch (token) { | 717 switch (token) { |
| 656 case Token::NULL_LITERAL: | 718 case Token::NULL_LITERAL: |
| 657 return factory->NewNullLiteral(pos); | 719 return factory->NewNullLiteral(pos); |
| 658 case Token::TRUE_LITERAL: | 720 case Token::TRUE_LITERAL: |
| 659 return factory->NewBooleanLiteral(true, pos); | 721 return factory->NewBooleanLiteral(true, pos); |
| 660 case Token::FALSE_LITERAL: | 722 case Token::FALSE_LITERAL: |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 928 // the main thread. | 990 // the main thread. |
| 929 HistogramTimerScope timer_scope(isolate()->counters()->parse_lazy()); | 991 HistogramTimerScope timer_scope(isolate()->counters()->parse_lazy()); |
| 930 Handle<String> source(String::cast(script()->source())); | 992 Handle<String> source(String::cast(script()->source())); |
| 931 isolate()->counters()->total_parse_size()->Increment(source->length()); | 993 isolate()->counters()->total_parse_size()->Increment(source->length()); |
| 932 base::ElapsedTimer timer; | 994 base::ElapsedTimer timer; |
| 933 if (FLAG_trace_parse) { | 995 if (FLAG_trace_parse) { |
| 934 timer.Start(); | 996 timer.Start(); |
| 935 } | 997 } |
| 936 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); | 998 Handle<SharedFunctionInfo> shared_info = info()->shared_info(); |
| 937 | 999 |
| 938 // Initialize parser state. | |
| 939 source = String::Flatten(source); | |
| 940 FunctionLiteral* result; | 1000 FunctionLiteral* result; |
| 941 if (source->IsExternalTwoByteString()) { | 1001 if (shared_info->is_default_constructor() || |
| 942 ExternalTwoByteStringUtf16CharacterStream stream( | 1002 shared_info->is_default_constructor_call_super()) { |
| 943 Handle<ExternalTwoByteString>::cast(source), | 1003 ParsingModeScope parsing_mode(this, PARSE_EAGERLY); |
| 944 shared_info->start_position(), | 1004 Scope* scope = NewScope(scope_, GLOBAL_SCOPE); |
| 945 shared_info->end_position()); | 1005 info()->SetGlobalScope(scope); |
| 946 result = ParseLazy(&stream); | 1006 if (!info()->closure().is_null()) { |
| 1007 scope = Scope::DeserializeScopeChain(info()->closure()->context(), scope, | |
| 1008 zone()); | |
| 1009 } | |
| 1010 original_scope_ = scope; | |
| 1011 AstNodeFactory<AstConstructionVisitor> function_factory( | |
| 1012 ast_value_factory()); | |
| 1013 FunctionState function_state(&function_state_, &scope_, scope, | |
| 1014 &function_factory); | |
| 1015 result = DefaultConstructor( | |
| 1016 shared_info->is_default_constructor_call_super(), scope); | |
|
Dmitry Lomov (no reviews)
2014/11/07 07:01:11
I believe if you set positions correctly all this
| |
| 947 } else { | 1017 } else { |
| 948 GenericStringUtf16CharacterStream stream(source, | 1018 // Initialize parser state. |
| 949 shared_info->start_position(), | 1019 source = String::Flatten(source); |
| 950 shared_info->end_position()); | 1020 if (source->IsExternalTwoByteString()) { |
| 951 result = ParseLazy(&stream); | 1021 ExternalTwoByteStringUtf16CharacterStream stream( |
| 1022 Handle<ExternalTwoByteString>::cast(source), | |
| 1023 shared_info->start_position(), shared_info->end_position()); | |
| 1024 result = ParseLazy(&stream); | |
| 1025 } else { | |
| 1026 GenericStringUtf16CharacterStream stream( | |
| 1027 source, shared_info->start_position(), shared_info->end_position()); | |
| 1028 result = ParseLazy(&stream); | |
| 1029 } | |
| 952 } | 1030 } |
| 953 | 1031 |
| 954 if (FLAG_trace_parse && result != NULL) { | 1032 if (FLAG_trace_parse && result != NULL) { |
| 955 double ms = timer.Elapsed().InMillisecondsF(); | 1033 double ms = timer.Elapsed().InMillisecondsF(); |
| 956 SmartArrayPointer<char> name_chars = result->debug_name()->ToCString(); | 1034 SmartArrayPointer<char> name_chars = result->debug_name()->ToCString(); |
| 957 PrintF("[parsing function: %s - took %0.3f ms]\n", name_chars.get(), ms); | 1035 PrintF("[parsing function: %s - took %0.3f ms]\n", name_chars.get(), ms); |
| 958 } | 1036 } |
| 959 return result; | 1037 return result; |
| 960 } | 1038 } |
| 961 | 1039 |
| (...skipping 3993 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4955 | 5033 |
| 4956 // We cannot internalize on a background thread; a foreground task will take | 5034 // We cannot internalize on a background thread; a foreground task will take |
| 4957 // care of calling Parser::Internalize just before compilation. | 5035 // care of calling Parser::Internalize just before compilation. |
| 4958 | 5036 |
| 4959 if (compile_options() == ScriptCompiler::kProduceParserCache) { | 5037 if (compile_options() == ScriptCompiler::kProduceParserCache) { |
| 4960 if (result != NULL) *info_->cached_data() = recorder.GetScriptData(); | 5038 if (result != NULL) *info_->cached_data() = recorder.GetScriptData(); |
| 4961 log_ = NULL; | 5039 log_ = NULL; |
| 4962 } | 5040 } |
| 4963 } | 5041 } |
| 4964 } } // namespace v8::internal | 5042 } } // namespace v8::internal |
| OLD | NEW |