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

Side by Side Diff: src/crankshaft/hydrogen.cc

Issue 1425293007: [crankshaft] Do not optimize ClassConstructor calls and apply. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: hope my magic works Created 5 years, 1 month 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
« no previous file with comments | « no previous file | src/parser.h » ('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 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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | src/parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698