// 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