| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/crankshaft/hydrogen.h" | 5 #include "src/crankshaft/hydrogen.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "src/allocation-site-scopes.h" | 9 #include "src/allocation-site-scopes.h" |
| 10 #include "src/ast-numbering.h" | 10 #include "src/ast-numbering.h" |
| (...skipping 8343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8354 // Parse and allocate variables. | 8354 // Parse and allocate variables. |
| 8355 // Use the same AstValueFactory for creating strings in the sub-compilation | 8355 // Use the same AstValueFactory for creating strings in the sub-compilation |
| 8356 // step, but don't transfer ownership to target_info. | 8356 // step, but don't transfer ownership to target_info. |
| 8357 ParseInfo parse_info(zone(), target); | 8357 ParseInfo parse_info(zone(), target); |
| 8358 parse_info.set_ast_value_factory( | 8358 parse_info.set_ast_value_factory( |
| 8359 top_info()->parse_info()->ast_value_factory()); | 8359 top_info()->parse_info()->ast_value_factory()); |
| 8360 parse_info.set_ast_value_factory_owned(false); | 8360 parse_info.set_ast_value_factory_owned(false); |
| 8361 | 8361 |
| 8362 CompilationInfo target_info(&parse_info); | 8362 CompilationInfo target_info(&parse_info); |
| 8363 Handle<SharedFunctionInfo> target_shared(target->shared()); | 8363 Handle<SharedFunctionInfo> target_shared(target->shared()); |
| 8364 |
| 8365 if (IsClassConstructor(target_shared->kind())) { |
| 8366 TraceInline(target, caller, "target is classConstructor"); |
| 8367 return false; |
| 8368 } |
| 8364 if (target_shared->HasDebugInfo()) { | 8369 if (target_shared->HasDebugInfo()) { |
| 8365 TraceInline(target, caller, "target is being debugged"); | 8370 TraceInline(target, caller, "target is being debugged"); |
| 8366 return false; | 8371 return false; |
| 8367 } | 8372 } |
| 8368 if (!Compiler::ParseAndAnalyze(target_info.parse_info())) { | 8373 if (!Compiler::ParseAndAnalyze(target_info.parse_info())) { |
| 8369 if (target_info.isolate()->has_pending_exception()) { | 8374 if (target_info.isolate()->has_pending_exception()) { |
| 8370 // Parse or scope error, never optimize this function. | 8375 // Parse or scope error, never optimize this function. |
| 8371 SetStackOverflow(); | 8376 SetStackOverflow(); |
| 8372 target_shared->DisableOptimization(kParseScopeError); | 8377 target_shared->DisableOptimization(kParseScopeError); |
| 8373 } | 8378 } |
| (...skipping 976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9350 | 9355 |
| 9351 BuildFunctionApply(expr); | 9356 BuildFunctionApply(expr); |
| 9352 return true; | 9357 return true; |
| 9353 } | 9358 } |
| 9354 default: { return false; } | 9359 default: { return false; } |
| 9355 } | 9360 } |
| 9356 UNREACHABLE(); | 9361 UNREACHABLE(); |
| 9357 } | 9362 } |
| 9358 | 9363 |
| 9359 | 9364 |
| 9365 // f.apply(...) |
| 9360 void HOptimizedGraphBuilder::BuildFunctionApply(Call* expr) { | 9366 void HOptimizedGraphBuilder::BuildFunctionApply(Call* expr) { |
| 9361 ZoneList<Expression*>* args = expr->arguments(); | 9367 ZoneList<Expression*>* args = expr->arguments(); |
| 9362 CHECK_ALIVE(VisitForValue(args->at(0))); | 9368 CHECK_ALIVE(VisitForValue(args->at(0))); |
| 9363 HValue* receiver = Pop(); // receiver | 9369 HValue* receiver = Pop(); // receiver |
| 9364 HValue* function = Pop(); // f | 9370 HValue* function = Pop(); // f |
| 9365 Drop(1); // apply | 9371 Drop(1); // apply |
| 9366 | 9372 |
| 9367 Handle<Map> function_map = expr->GetReceiverTypes()->first(); | 9373 Handle<Map> function_map = expr->GetReceiverTypes()->first(); |
| 9368 HValue* checked_function = AddCheckMap(function, function_map); | 9374 HValue* checked_function = AddCheckMap(function, function_map); |
| 9369 | 9375 |
| (...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9751 HConstant::cast(function)->handle(isolate())->IsJSFunction()) { | 9757 HConstant::cast(function)->handle(isolate())->IsJSFunction()) { |
| 9752 Handle<Object> constant = HConstant::cast(function)->handle(isolate()); | 9758 Handle<Object> constant = HConstant::cast(function)->handle(isolate()); |
| 9753 Handle<JSFunction> target = Handle<JSFunction>::cast(constant); | 9759 Handle<JSFunction> target = Handle<JSFunction>::cast(constant); |
| 9754 expr->SetKnownGlobalTarget(target); | 9760 expr->SetKnownGlobalTarget(target); |
| 9755 } | 9761 } |
| 9756 | 9762 |
| 9757 // Placeholder for the receiver. | 9763 // Placeholder for the receiver. |
| 9758 Push(graph()->GetConstantUndefined()); | 9764 Push(graph()->GetConstantUndefined()); |
| 9759 CHECK_ALIVE(VisitExpressions(expr->arguments())); | 9765 CHECK_ALIVE(VisitExpressions(expr->arguments())); |
| 9760 | 9766 |
| 9761 if (expr->IsMonomorphic()) { | 9767 if (expr->IsMonomorphic() && |
| 9768 !IsClassConstructor(expr->target()->shared()->kind())) { |
| 9762 Add<HCheckValue>(function, expr->target()); | 9769 Add<HCheckValue>(function, expr->target()); |
| 9763 | 9770 |
| 9764 // Patch the global object on the stack by the expected receiver. | 9771 // Patch the global object on the stack by the expected receiver. |
| 9765 HValue* receiver = ImplicitReceiverFor(function, expr->target()); | 9772 HValue* receiver = ImplicitReceiverFor(function, expr->target()); |
| 9766 const int receiver_index = argument_count - 1; | 9773 const int receiver_index = argument_count - 1; |
| 9767 environment()->SetExpressionStackAt(receiver_index, receiver); | 9774 environment()->SetExpressionStackAt(receiver_index, receiver); |
| 9768 | 9775 |
| 9769 if (TryInlineBuiltinFunctionCall(expr)) { | 9776 if (TryInlineBuiltinFunctionCall(expr)) { |
| 9770 if (FLAG_trace_inlining) { | 9777 if (FLAG_trace_inlining) { |
| 9771 PrintF("Inlining builtin "); | 9778 PrintF("Inlining builtin "); |
| (...skipping 3909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13681 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13688 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 13682 } | 13689 } |
| 13683 | 13690 |
| 13684 #ifdef DEBUG | 13691 #ifdef DEBUG |
| 13685 graph_->Verify(false); // No full verify. | 13692 graph_->Verify(false); // No full verify. |
| 13686 #endif | 13693 #endif |
| 13687 } | 13694 } |
| 13688 | 13695 |
| 13689 } // namespace internal | 13696 } // namespace internal |
| 13690 } // namespace v8 | 13697 } // namespace v8 |
| OLD | NEW |