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

Side by Side Diff: src/interpreter/bytecode-generator.cc

Issue 2190293003: [Interpreter] Collect type feedback for 'new' in the bytecode handler (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 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
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/interpreter/bytecode-generator.h" 5 #include "src/interpreter/bytecode-generator.h"
6 6
7 #include "src/ast/scopes.h" 7 #include "src/ast/scopes.h"
8 #include "src/code-stubs.h" 8 #include "src/code-stubs.h"
9 #include "src/compiler.h" 9 #include "src/compiler.h"
10 #include "src/interpreter/bytecode-flags.h" 10 #include "src/interpreter/bytecode-flags.h"
(...skipping 2568 matching lines...) Expand 10 before | Expand all | Expand 10 after
2579 ->CallRuntime(Runtime::kResolvePossiblyDirectEval, callee_for_eval, 6) 2579 ->CallRuntime(Runtime::kResolvePossiblyDirectEval, callee_for_eval, 6)
2580 .StoreAccumulatorInRegister(callee); 2580 .StoreAccumulatorInRegister(callee);
2581 } 2581 }
2582 2582
2583 builder()->SetExpressionPosition(expr); 2583 builder()->SetExpressionPosition(expr);
2584 2584
2585 int feedback_slot_index; 2585 int feedback_slot_index;
2586 if (expr->CallFeedbackICSlot().IsInvalid()) { 2586 if (expr->CallFeedbackICSlot().IsInvalid()) {
2587 DCHECK(call_type == Call::POSSIBLY_EVAL_CALL); 2587 DCHECK(call_type == Call::POSSIBLY_EVAL_CALL);
2588 // Valid type feedback slots can only be greater than kReservedIndexCount. 2588 // Valid type feedback slots can only be greater than kReservedIndexCount.
2589 // We use 0 to indicate an invalid slot it. Statically assert that 0 cannot 2589 // We use 0 to indicate an invalid slot id. Statically assert that 0 cannot
2590 // be a valid slot id. 2590 // be a valid slot id.
2591 STATIC_ASSERT(TypeFeedbackVector::kReservedIndexCount > 0); 2591 STATIC_ASSERT(TypeFeedbackVector::kReservedIndexCount > 0);
2592 feedback_slot_index = 0; 2592 feedback_slot_index = 0;
2593 } else { 2593 } else {
2594 feedback_slot_index = feedback_index(expr->CallFeedbackICSlot()); 2594 feedback_slot_index = feedback_index(expr->CallFeedbackICSlot());
2595 } 2595 }
2596 builder()->Call(callee, receiver, 1 + args->length(), feedback_slot_index, 2596 builder()->Call(callee, receiver, 1 + args->length(), feedback_slot_index,
2597 expr->tail_call_mode()); 2597 expr->tail_call_mode());
2598 execution_result()->SetResultInAccumulator(); 2598 execution_result()->SetResultInAccumulator();
2599 } 2599 }
(...skipping 14 matching lines...) Expand all
2614 2614
2615 ZoneList<Expression*>* args = expr->arguments(); 2615 ZoneList<Expression*>* args = expr->arguments();
2616 Register first_arg = VisitArguments(args); 2616 Register first_arg = VisitArguments(args);
2617 2617
2618 // The new target is loaded into the accumulator from the 2618 // The new target is loaded into the accumulator from the
2619 // {new.target} variable. 2619 // {new.target} variable.
2620 VisitForAccumulatorValue(super->new_target_var()); 2620 VisitForAccumulatorValue(super->new_target_var());
2621 2621
2622 // Call construct. 2622 // Call construct.
2623 builder()->SetExpressionPosition(expr); 2623 builder()->SetExpressionPosition(expr);
2624 builder()->New(constructor, first_arg, args->length()); 2624 // Valid type feedback slots can only be greater than kReservedIndexCount.
2625 // Assert that 0 cannot be valid a valid slot id.
2626 STATIC_ASSERT(TypeFeedbackVector::kReservedIndexCount > 0);
2627 // Type feedback is not necessary for super constructor calls. The type
2628 // information can be inferred in most cases. Slot id 0 indicates type
2629 // feedback is not required.
2630 builder()->New(constructor, first_arg, args->length(), 0);
2625 execution_result()->SetResultInAccumulator(); 2631 execution_result()->SetResultInAccumulator();
2626 } 2632 }
2627 2633
2628 void BytecodeGenerator::VisitCallNew(CallNew* expr) { 2634 void BytecodeGenerator::VisitCallNew(CallNew* expr) {
2629 Register constructor = register_allocator()->NewRegister(); 2635 Register constructor = register_allocator()->NewRegister();
2630 VisitForAccumulatorValue(expr->expression()); 2636 VisitForAccumulatorValue(expr->expression());
2631 builder()->StoreAccumulatorInRegister(constructor); 2637 builder()->StoreAccumulatorInRegister(constructor);
2632 2638
2633 ZoneList<Expression*>* args = expr->arguments(); 2639 ZoneList<Expression*>* args = expr->arguments();
2634 Register first_arg = VisitArguments(args); 2640 Register first_arg = VisitArguments(args);
2635 2641
2636 builder()->SetExpressionPosition(expr); 2642 builder()->SetExpressionPosition(expr);
2637 // The accumulator holds new target which is the same as the 2643 // The accumulator holds new target which is the same as the
2638 // constructor for CallNew. 2644 // constructor for CallNew.
2639 builder() 2645 builder()
2640 ->LoadAccumulatorWithRegister(constructor) 2646 ->LoadAccumulatorWithRegister(constructor)
2641 .New(constructor, first_arg, args->length()); 2647 .New(constructor, first_arg, args->length(),
2648 feedback_index(expr->CallNewFeedbackSlot()));
2642 execution_result()->SetResultInAccumulator(); 2649 execution_result()->SetResultInAccumulator();
2643 } 2650 }
2644 2651
2645 void BytecodeGenerator::VisitCallRuntime(CallRuntime* expr) { 2652 void BytecodeGenerator::VisitCallRuntime(CallRuntime* expr) {
2646 ZoneList<Expression*>* args = expr->arguments(); 2653 ZoneList<Expression*>* args = expr->arguments();
2647 if (expr->is_jsruntime()) { 2654 if (expr->is_jsruntime()) {
2648 // Allocate a register for the receiver and load it with undefined. 2655 // Allocate a register for the receiver and load it with undefined.
2649 register_allocator()->PrepareForConsecutiveAllocations(1 + args->length()); 2656 register_allocator()->PrepareForConsecutiveAllocations(1 + args->length());
2650 Register receiver = register_allocator()->NextConsecutiveRegister(); 2657 Register receiver = register_allocator()->NextConsecutiveRegister();
2651 builder()->LoadUndefined().StoreAccumulatorInRegister(receiver); 2658 builder()->LoadUndefined().StoreAccumulatorInRegister(receiver);
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after
3238 return execution_context()->scope()->language_mode(); 3245 return execution_context()->scope()->language_mode();
3239 } 3246 }
3240 3247
3241 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { 3248 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const {
3242 return TypeFeedbackVector::GetIndex(slot); 3249 return TypeFeedbackVector::GetIndex(slot);
3243 } 3250 }
3244 3251
3245 } // namespace interpreter 3252 } // namespace interpreter
3246 } // namespace internal 3253 } // namespace internal
3247 } // namespace v8 3254 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698