5#ifndef V8_INTERPRETER_CONTROL_FLOW_BUILDERS_H_
6#define V8_INTERPRETER_CONTROL_FLOW_BUILDERS_H_
20namespace interpreter {
44 break_labels_(builder->zone()),
46 block_coverage_builder_(block_coverage_builder) {}
52 void Break() { EmitJump(&break_labels_); }
54 EmitJumpIfTrue(mode, &break_labels_);
57 EmitJumpIfForInDone(&break_labels_, index, cache_length);
73 void BindBreakTarget();
103 continue_labels_(builder->zone()),
104 end_labels_(builder->zone()),
105 feedback_vector_spec_(feedback_vector_spec) {
106 if (block_coverage_builder_ !=
nullptr) {
107 block_coverage_body_slot_ =
108 block_coverage_builder_->AllocateBlockCoverageSlot(
109 node, SourceRangeKind::kBody);
117 void JumpToHeader(
int loop_depth,
LoopBuilder*
const parent_loop);
118 void BindContinueTarget();
159 case_sites_(builder->zone()),
160 default_(builder->zone()),
161 fall_through_(builder->zone()),
162 jump_table_(jump_table) {
163 case_sites_.resize(number_of_cases);
168 void BindCaseTargetForJumpTable(
int case_value,
CaseClause* clause);
170 void BindCaseTargetForCompareJump(
int index,
CaseClause* clause);
177 void EmitJumpTableIfExists(
int min_case,
int max_case,
182 void JumpToDefault();
184 void JumpToFallThroughIfFalse();
194 if (block_coverage_builder_ && clause !=
nullptr) {
195 block_coverage_builder_->IncrementBlockCounter(clause,
196 SourceRangeKind::kBody);
209 handler_id_(builder->NewHandlerEntry()),
210 catch_prediction_(catch_prediction),
211 block_coverage_builder_(block_coverage_builder),
237 handler_id_(builder->NewHandlerEntry()),
238 catch_prediction_(catch_prediction),
239 finalization_sites_(builder->zone()),
240 block_coverage_builder_(block_coverage_builder),
272 end_labels_(builder->zone()),
273 then_count_(then_count),
274 then_labels_list_(static_cast<int>(then_count_), builder->zone()),
275 else_labels_list_(static_cast<int>(then_count_), builder->zone()),
276 block_coverage_then_slots_(then_count_, builder->zone()),
277 block_coverage_else_slots_(then_count_, builder->zone()),
278 block_coverage_builder_(block_coverage_builder) {
279 DCHECK(node->IsConditionalChain());
282 for (
size_t i = 0;
i < then_count_; ++
i) {
287 if (block_coverage_builder !=
nullptr) {
289 block_coverage_then_slots_.resize(then_count_);
290 block_coverage_else_slots_.resize(then_count_);
291 for (
size_t i = 0;
i < then_count_; ++
i) {
292 block_coverage_then_slots_[
i] =
294 conditional_chain, SourceRangeKind::kThen,
i);
295 block_coverage_else_slots_[
i] =
297 conditional_chain, SourceRangeKind::kElse,
i);
305 return then_labels_list_[
static_cast<int>(
index)];
310 return else_labels_list_[
static_cast<int>(
index)];
315 return block_coverage_then_slots_[
index];
320 return block_coverage_else_slots_[
index];
323 void ThenAt(
size_t index);
324 void ElseAt(
size_t index);
346 end_labels_(builder->zone()),
347 then_labels_(builder->zone()),
348 else_labels_(builder->zone()),
350 block_coverage_builder_(block_coverage_builder) {
351 DCHECK(node->IsIfStatement() || node->IsConditional());
352 if (block_coverage_builder !=
nullptr) {
353 block_coverage_then_slot_ =
355 node, SourceRangeKind::kThen);
356 block_coverage_else_slot_ =
358 node, SourceRangeKind::kElse);
std::map< int, CaseClause * > covered_cases
BlockBuilder(BytecodeArrayBuilder *builder, BlockCoverageBuilder *block_coverage_builder, BreakableStatement *statement)
int AllocateConditionalChainBlockCoverageSlot(ConditionalChain *node, SourceRangeKind kind, size_t index)
int AllocateBlockCoverageSlot(ZoneObject *node, SourceRangeKind kind)
BytecodeLabels * break_labels()
BytecodeLabels break_labels_
BreakableControlFlowBuilder(BytecodeArrayBuilder *builder, BlockCoverageBuilder *block_coverage_builder, AstNode *node)
void BreakIfTrue(BytecodeArrayBuilder::ToBooleanMode mode)
void BreakIfForInDone(Register index, Register cache_length)
BlockCoverageBuilder * block_coverage_builder_
ZonePtrList< BytecodeLabels > then_labels_list_
ZoneVector< int > block_coverage_then_slots_
int block_coverage_else_slot_at(size_t index) const
ZonePtrList< BytecodeLabels > else_labels_list_
ZoneVector< int > block_coverage_else_slots_
ConditionalChainControlFlowBuilder(BytecodeArrayBuilder *builder, BlockCoverageBuilder *block_coverage_builder, AstNode *node, size_t then_count)
BlockCoverageBuilder * block_coverage_builder_
int block_coverage_then_slot_at(size_t index) const
BytecodeLabels end_labels_
BytecodeLabels * then_labels_at(size_t index)
BytecodeLabels * else_labels_at(size_t index)
BytecodeLabels end_labels_
int block_coverage_then_slot_
BytecodeLabels * then_labels()
BlockCoverageBuilder * block_coverage_builder_
ConditionalControlFlowBuilder(BytecodeArrayBuilder *builder, BlockCoverageBuilder *block_coverage_builder, AstNode *node)
BytecodeLabels * else_labels()
BytecodeLabels then_labels_
int block_coverage_else_slot_
BytecodeLabels else_labels_
BytecodeArrayBuilder * builder_
ControlFlowBuilder & operator=(const ControlFlowBuilder &)=delete
BytecodeArrayBuilder * builder() const
ControlFlowBuilder(const ControlFlowBuilder &)=delete
virtual ~ControlFlowBuilder()=default
ControlFlowBuilder(BytecodeArrayBuilder *builder)
void ContinueIfUndefined()
BytecodeLabels end_labels_
BytecodeLabels continue_labels_
int block_coverage_body_slot_
LoopBuilder(BytecodeArrayBuilder *builder, BlockCoverageBuilder *block_coverage_builder, AstNode *node, FeedbackVectorSpec *feedback_vector_spec)
FeedbackVectorSpec *const feedback_vector_spec_
BytecodeLoopHeader loop_header_
SwitchBuilder(BytecodeArrayBuilder *builder, BlockCoverageBuilder *block_coverage_builder, SwitchStatement *statement, int number_of_cases, BytecodeJumpTable *jump_table)
void BuildBlockCoverage(CaseClause *clause)
BytecodeJumpTable * jump_table_
BytecodeLabels fall_through_
ZoneVector< BytecodeLabel > case_sites_
HandlerTable::CatchPrediction catch_prediction_
TryCatchBuilder(BytecodeArrayBuilder *builder, BlockCoverageBuilder *block_coverage_builder, TryCatchStatement *statement, HandlerTable::CatchPrediction catch_prediction)
BlockCoverageBuilder * block_coverage_builder_
TryCatchStatement * statement_
BlockCoverageBuilder * block_coverage_builder_
TryFinallyBuilder(BytecodeArrayBuilder *builder, BlockCoverageBuilder *block_coverage_builder, TryFinallyStatement *statement, HandlerTable::CatchPrediction catch_prediction)
HandlerTable::CatchPrediction catch_prediction_
TryFinallyStatement * statement_
BytecodeLabels finalization_sites_
constexpr int kNoSourcePosition
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define V8_EXPORT_PRIVATE