| // Copyright 2019 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include 'src/builtins/builtins-regexp-gen.h' |
| |
| namespace internal_coverage { |
| |
| macro GetCoverageInfo(implicit context: Context)(function: JSFunction): |
| CoverageInfo labels IfNoCoverageInfo { |
| const shared: SharedFunctionInfo = function.shared_function_info; |
| const debugInfo = Cast<DebugInfo>(shared.script_or_debug_info) |
| otherwise goto IfNoCoverageInfo; |
| |
| if (!debugInfo.flags.has_coverage_info) goto IfNoCoverageInfo; |
| return UnsafeCast<CoverageInfo>(debugInfo.coverage_info); |
| } |
| |
| macro IncrementBlockCount(implicit context: Context)( |
| coverageInfo: CoverageInfo, slot: Smi) { |
| assert(Convert<int32>(slot) < coverageInfo.slot_count); |
| ++coverageInfo.slots[slot].block_count; |
| } |
| |
| builtin IncBlockCounter( |
| implicit context: |
| Context)(function: JSFunction, coverageArraySlotIndex: Smi): Undefined { |
| // It's quite possible that a function contains IncBlockCounter bytecodes, |
| // but no coverage info exists. This happens e.g. by selecting the |
| // best-effort coverage collection mode, which triggers deletion of all |
| // coverage infos in order to avoid memory leaks. |
| |
| const coverageInfo: CoverageInfo = |
| GetCoverageInfo(function) otherwise return Undefined; |
| IncrementBlockCount(coverageInfo, coverageArraySlotIndex); |
| return Undefined; |
| } |
| |
| } // namespace internal_coverage |