27#if V8_ENABLE_WEBASSEMBLY
48 isolate->debug()->set_return_value(*value);
53 isolate->debug()->Break(it.frame(),
59 if (isolate->debug()->IsRestartFrameScheduled()) {
66 DCHECK(it.frame()->is_interpreted());
70 bool side_effect_check_failed =
false;
72 side_effect_check_failed =
73 !isolate->debug()->PerformSideEffectCheckAtBytecode(interpreted_frame);
81 Bytecode bytecode = Bytecodes::FromByte(bytecode_array->get(bytecode_offset));
83 if (Bytecodes::Returns(bytecode)) {
96 OperandScale operand_scale = OperandScale::kSingle;
97 isolate->interpreter()->GetBytecodeHandler(bytecode, operand_scale);
99 if (side_effect_check_failed) {
103 Tagged<Object> interrupt_object = isolate->stack_guard()->HandleInterrupts();
104 if (IsException(interrupt_object, isolate)) {
108 return MakePair(isolate->debug()->return_value(),
117 DCHECK(function->shared()->BreakAtEntry(isolate));
121 DCHECK_EQ(*function, it.frame()->function());
127 it.frame()->fp() < isolate->thread_local_top()->last_api_entry_) {
128 isolate->debug()->Break(it.frame(), function);
137 if (isolate->debug()->break_points_active()) {
138 isolate->debug()->HandleDebugBreak(
141 if (isolate->debug()->IsRestartFrameScheduled()) {
142 return isolate->TerminateExecution();
145 return isolate->stack_guard()->HandleInterrupts();
151 isolate->RequestInterrupt(
163template <
class IteratorType>
164static DirectHandle<ArrayList> AddIteratorInternalProperties(
166 DirectHandle<IteratorType> iterator) {
167 const char*
kind =
nullptr;
168 switch (iterator->map()->instance_type()) {
169 case JS_MAP_KEY_ITERATOR_TYPE:
172 case JS_MAP_KEY_VALUE_ITERATOR_TYPE:
173 case JS_SET_KEY_VALUE_ITERATOR_TYPE:
176 case JS_MAP_VALUE_ITERATOR_TYPE:
177 case JS_SET_VALUE_ITERATOR_TYPE:
186 isolate->factory()->NewStringFromAsciiChecked(
"[[IteratorHasMore]]"),
187 isolate->factory()->ToBoolean(iterator->HasMore()));
190 isolate->factory()->NewStringFromAsciiChecked(
"[[IteratorIndex]]"),
194 isolate->factory()->NewStringFromAsciiChecked(
"[[IteratorKind]]"),
195 isolate->factory()->NewStringFromAsciiChecked(
kind));
204 if (IsJSObject(*
object)) {
211 DCHECK(IsJSGlobalObject(*prototype));
215 if (!
IsNull(*prototype, isolate)) {
218 isolate->factory()->NewStringFromStaticChars(
"[[Prototype]]"),
223 if (IsJSBoundFunction(*
object)) {
228 isolate->factory()->NewStringFromAsciiChecked(
"[[TargetFunction]]"),
232 isolate->factory()->NewStringFromAsciiChecked(
"[[BoundThis]]"),
236 isolate->factory()->NewStringFromAsciiChecked(
"[[BoundArgs]]"),
237 isolate->factory()->NewJSArrayWithElements(
238 isolate->factory()->CopyFixedArray(
239 handle(function->bound_arguments(), isolate))));
240 }
else if (IsJSMapIterator(*
object)) {
242 result = AddIteratorInternalProperties(isolate,
result, iterator);
243 }
else if (IsJSSetIterator(*
object)) {
245 result = AddIteratorInternalProperties(isolate,
result, iterator);
246 }
else if (IsJSGeneratorObject(*
object)) {
249 const char* status =
"suspended";
250 if (generator->is_closed()) {
252 }
else if (generator->is_executing()) {
255 DCHECK(generator->is_suspended());
260 isolate->factory()->NewStringFromAsciiChecked(
"[[GeneratorState]]"),
261 isolate->factory()->NewStringFromAsciiChecked(status));
264 isolate->factory()->NewStringFromAsciiChecked(
"[[GeneratorFunction]]"),
268 isolate->factory()->NewStringFromAsciiChecked(
"[[GeneratorReceiver]]"),
270 }
else if (IsJSPromise(*
object)) {
275 isolate->factory()->NewStringFromAsciiChecked(
"[[PromiseState]]"),
276 isolate->factory()->NewStringFromAsciiChecked(
280 isolate->factory()->NewStringFromAsciiChecked(
"[[PromiseResult]]"),
282 ? isolate->factory()->undefined_value()
284 }
else if (IsJSProxy(*
object)) {
289 isolate->factory()->NewStringFromAsciiChecked(
"[[Handler]]"),
293 isolate->factory()->NewStringFromAsciiChecked(
"[[Target]]"),
297 isolate->factory()->NewStringFromAsciiChecked(
"[[IsRevoked]]"),
298 isolate->factory()->ToBoolean(js_proxy->IsRevoked()));
299 }
else if (IsJSPrimitiveWrapper(*
object)) {
304 isolate->factory()->NewStringFromAsciiChecked(
"[[PrimitiveValue]]"),
306 }
else if (IsJSWeakRef(*
object)) {
311 isolate->factory()->NewStringFromAsciiChecked(
"[[WeakRefTarget]]"),
313 }
else if (IsJSArrayBuffer(*
object)) {
315 if (js_array_buffer->was_detached()) {
321 isolate->factory()->NewStringFromAsciiChecked(
"[[IsDetached]]"),
322 isolate->factory()->true_value());
324 const size_t byte_length = js_array_buffer->byte_length();
327 using DataView = std::tuple<const char*, ExternalArrayType, size_t>;
328 for (
auto [name, type, elem_size] :
333 if ((byte_length % elem_size) != 0)
continue;
334 size_t length = byte_length / elem_size;
337 isolate->factory()->NewStringFromAsciiChecked(name),
338 isolate->factory()->NewJSTypedArray(
339 type, js_array_buffer, 0, length));
343 isolate->factory()->NewStringFromAsciiChecked(
344 "[[ArrayBufferByteLength]]"),
345 isolate->factory()->NewNumberFromSize(byte_length));
347 auto backing_store = js_array_buffer->GetBackingStore();
351 isolate->factory()->NewNumberFromUint(backing_store->id());
353 array_buffer_data = isolate->factory()->null_value();
357 isolate->factory()->NewStringFromAsciiChecked(
"[[ArrayBufferData]]"),
361 isolate->factory()->array_buffer_wasm_memory_symbol();
363 JSObject::GetDataProperty(isolate, js_array_buffer, memory_symbol);
364 if (!IsUndefined(*memory_object, isolate)) {
366 isolate->factory()->NewStringFromAsciiChecked(
367 "[[WebAssemblyMemory]]"),
371#if V8_ENABLE_WEBASSEMBLY
372 }
else if (IsWasmInstanceObject(*
object)) {
375 }
else if (IsWasmModuleObject(*
object)) {
378 }
else if (IsWasmTableObject(*
object)) {
383 return isolate->factory()->NewJSArrayWithElements(
397 if (!
gen->is_suspended()) {
414 if (!IsJSGeneratorObject(
args[0])) {
423 if (!
gen->is_suspended()) {
430 for (; !it.Done() && n < index; it.Next()) {
437 return *it.MaterializeScopeDetails();
449 return it->SetVariableValue(variable_name, new_value);
468 return isolate->heap()->ToBoolean(res);
474 CHECK(isolate->debug()->is_active());
481 if (IsUndefined(*break_locations, isolate)) {
485 return *isolate->factory()->NewJSArrayWithElements(
497 bool result = isolate->debug()->IsBreakOnException(type);
505 CHECK(isolate->debug()->is_active());
506 isolate->debug()->ClearStepping();
518 instances = isolate->debug()->GetLoadedScripts();
522 for (
int i = 0;
i < instances->length();
i++) {
528 return *isolate->factory()->NewJSArrayWithElements(instances);
536 if (IsJSFunction(f)) {
554int ScriptLinePosition(DirectHandle<Script> script,
int line) {
555 if (line < 0)
return -1;
557#if V8_ENABLE_WEBASSEMBLY
558 if (script->type() == Script::Type::kWasm) {
567 const int line_count = line_ends_array->length();
570 if (line == 0)
return 0;
572 if (line > line_count)
return -1;
573 return Smi::ToInt(line_ends_array->get(line - 1)) + 1;
576int ScriptLinePositionWithOffset(DirectHandle<Script> script,
int line,
578 if (line < 0 ||
offset < 0)
return -1;
580 if (line == 0 ||
offset == 0)
581 return ScriptLinePosition(script, line) +
offset;
583 Script::PositionInfo
info;
589 const int total_line = info.line + line;
590 return ScriptLinePosition(script, total_line);
593DirectHandle<Object> GetJSPositionInfo(DirectHandle<Script> script,
597 Script::PositionInfo
info;
599 return isolate->factory()->null_value();
602#if V8_ENABLE_WEBASSEMBLY
603 const bool is_wasm_script = script->type() == Script::Type::kWasm;
605 const bool is_wasm_script =
false;
607 DirectHandle<String> sourceText =
608 is_wasm_script ? isolate->factory()->empty_string()
609 : isolate->factory()->NewSubString(
611 info.line_start, info.line_end);
613 DirectHandle<JSObject> jsinfo =
614 isolate->factory()->NewJSObject(isolate->object_function());
626 isolate->factory()->sourceText_string(), sourceText,
632DirectHandle<Object> ScriptLocationFromLine(Isolate* isolate,
633 DirectHandle<Script> script,
634 DirectHandle<Object> opt_line,
635 DirectHandle<Object> opt_column,
650 if (line == 0) column -= script->column_offset();
653 int line_position = ScriptLinePositionWithOffset(script, line,
offset);
654 if (line_position < 0 || column < 0)
return isolate->factory()->null_value();
656 return GetJSPositionInfo(script, line_position + column,
661bool GetScriptById(Isolate* isolate,
int needle, DirectHandle<Script>*
result) {
662 Script::Iterator iterator(isolate);
664 script = iterator.Next()) {
665 if (script->id() == needle) {
686 CHECK(GetScriptById(isolate, scriptid, &script));
688 return *ScriptLocationFromLine(isolate, script, opt_line, opt_column,
offset);
698 if (isolate->debug()->needs_check_on_function_call()) {
701 isolate->debug()->DeoptimizeFunction(shared);
702 if (isolate->debug()->last_step_action() >=
StepInto ||
703 isolate->debug()->break_on_next_function_call()) {
705 isolate->debug()->PrepareStepIn(fun);
708 !isolate->debug()->PerformSideEffectCheck(fun,
receiver)) {
719 isolate->debug()->PrepareStepInSuspendedGenerator();
724DirectHandle<JSObject> MakeRangeObject(
Isolate* isolate,
725 const CoverageBlock& range) {
726 Factory* factory = isolate->factory();
728 DirectHandle<String> start_string = factory->InternalizeUtf8String(
"start");
729 DirectHandle<String> end_string = factory->InternalizeUtf8String(
"end");
730 DirectHandle<String> count_string = factory->InternalizeUtf8String(
"count");
732 DirectHandle<JSObject> range_obj = factory->NewJSObjectWithNullProto();
734 factory->NewNumberFromInt(range.start),
NONE);
736 factory->NewNumberFromInt(range.end),
NONE);
738 factory->NewNumberFromUint(range.count),
NONE);
748 std::unique_ptr<Coverage> coverage;
749 if (isolate->is_best_effort_code_coverage()) {
754 Factory* factory = isolate->factory();
757 int num_scripts =
static_cast<int>(coverage->size());
761 for (
int i = 0;
i < num_scripts;
i++) {
762 const auto& script_data = coverage->at(
i);
765 std::vector<CoverageBlock> ranges;
766 int num_functions =
static_cast<int>(script_data.functions.size());
767 for (
int j = 0; j < num_functions; j++) {
768 const auto& function_data = script_data.functions[j];
769 ranges.emplace_back(function_data.start, function_data.end,
770 function_data.count);
771 for (
size_t k = 0; k < function_data.blocks.size(); k++) {
772 const auto& block_data = function_data.blocks[k];
773 ranges.emplace_back(block_data.start, block_data.end, block_data.count);
777 int num_ranges =
static_cast<int>(ranges.size());
779 for (
int j = 0; j < num_ranges; j++) {
781 ranges_array->set(j, *range_object);
789 scripts_array->set(
i, *script_obj);
826 isolate->factory()->NewJSPromiseWithoutHook();
827 isolate->OnAsyncFunctionSuspended(throwaway, promise);
831 throwaway->set_has_handler(
true);
834 if (isolate->debug()->is_active()) {
836 isolate->factory()->promise_forwarding_handler_symbol(),
837 isolate->factory()->true_value(),
845 isolate->factory()->promise_handled_by_symbol(),
851 isolate->factory()->NewWeakFixedArray(1));
852 awaited_by_holder->set(0,
MakeWeak(*generator));
854 isolate->factory()->promise_awaited_by_symbol(),
867 if (IsJSPromise(*promise)) {
886 return isolate->Throw(*isolate->factory()->NewStringFromAsciiChecked(
887 "LiveEdit failed: COMPILE_ERROR"));
889 return isolate->Throw(*isolate->factory()->NewStringFromAsciiChecked(
890 "LiveEdit failed: BLOCKED_BY_RUNNING_GENERATOR"));
892 return isolate->Throw(*isolate->factory()->NewStringFromAsciiChecked(
893 "LiveEdit failed: BLOCKED_BY_ACTIVE_FUNCTION"));
895 return isolate->Throw(*isolate->factory()->NewStringFromAsciiChecked(
896 "LiveEdit failed: BLOCKED_BY_TOP_LEVEL_ES_MODULE_CHANGE"));
914 static constexpr char* kNoEmbeddedSource =
nullptr;
927 PrintF(
"Embedded blob is %d bytes\n",
928 static_cast<int>(d.code_size() + d.data_size()));
static V8_EXPORT_PRIVATE DirectHandle< ArrayList > Add(Isolate *isolate, DirectHandle< ArrayList > array, Tagged< Smi > obj, AllocationType allocation=AllocationType::kYoung)
static V8_EXPORT_PRIVATE DirectHandle< FixedArray > ToFixedArray(Isolate *isolate, DirectHandle< ArrayList > array, AllocationType allocation=AllocationType::kYoung)
static DirectHandle< ArrayList > New(IsolateT *isolate, int capacity, AllocationType allocation=AllocationType::kYoung)
static std::unique_ptr< Coverage > CollectPrecise(Isolate *isolate)
static V8_EXPORT_PRIVATE void SelectMode(Isolate *isolate, debug::CoverageMode mode)
static std::unique_ptr< Coverage > CollectBestEffort(Isolate *isolate)
static DirectHandle< Object > GetSourceBreakLocations(Isolate *isolate, DirectHandle< SharedFunctionInfo > shared)
Handle< FixedArray > NewFixedArray(int length, AllocationType allocation=AllocationType::kYoung)
Handle< JSArray > NewJSArrayWithElements(DirectHandle< FixedArrayBase > elements, ElementsKind elements_kind, int length, AllocationType allocation=AllocationType::kYoung)
void PatchBytecodeArray(Tagged< BytecodeArray > bytecode_array)
int GetBytecodeOffset() const override
static constexpr size_t kMaxByteLength
static V8_EXPORT_PRIVATE void AddProperty(Isolate *isolate, DirectHandle< JSObject > object, DirectHandle< Name > name, DirectHandle< Object > value, PropertyAttributes attributes)
static const char * Status(Promise::PromiseState status)
static constexpr size_t kMaxByteLength
Tagged< JSFunction > function() const override
static void PatchScript(Isolate *isolate, Handle< Script > script, Handle< String > source, bool preview, bool allow_top_frame_live_editing, debug::LiveEditResult *result)
V8_EXPORT_PRIVATE static V8_WARN_UNUSED_RESULT Maybe< bool > SetProperty(LookupIterator *it, DirectHandle< Object > value, StoreOrigin store_origin, Maybe< ShouldThrow > should_throw=Nothing< ShouldThrow >())
Tagged< T > GetCurrent() const
V8_EXPORT_PRIVATE static V8_WARN_UNUSED_RESULT MaybeHandle< JSArray > GetInternalProperties(Isolate *isolate, DirectHandle< Object >)
static void InitLineEnds(Isolate *isolate, DirectHandle< Script > script)
static bool GetPositionInfo(DirectHandle< Script > script, int position, PositionInfo *info, OffsetFlag offset_flag=OffsetFlag::kWithOffset)
static constexpr int ToInt(const Tagged< Object > object)
static constexpr Tagged< Smi > FromInt(int value)
static constexpr Tagged< Smi > zero()
@ kAllowActiveIsolateForTesting
Handle< SharedFunctionInfo > info
#define RUNTIME_FUNCTION_RETURN_PAIR(Name)
#define RUNTIME_FUNCTION(Name)
base::Vector< const DirectHandle< Object > > args
SharedFunctionInfoRef shared
ZoneVector< RpoNumber > & result
void BreakRightNow(Isolate *v8_isolate, base::EnumSet< debug::BreakReason > break_reasons)
V8_INLINE IndirectHandle< T > handle(Tagged< T > object, Isolate *isolate)
@ kIgnoreIfTopFrameBlackboxed
void FreeCurrentEmbeddedBlob()
DirectHandle< ArrayList > AddWasmModuleObjectInternalProperties(Isolate *isolate, DirectHandle< ArrayList > result, DirectHandle< WasmModuleObject > module_object)
bool IsNumber(Tagged< Object > obj)
void PrintF(const char *format,...)
Tagged(T object) -> Tagged< T >
static ObjectPair MakePair(Tagged< Object > x, Tagged< Object > y)
kStaticElementsTemplateOffset kInstancePropertiesTemplateOffset Tagged< FixedArray >
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
bool IsNullOrUndefined(Tagged< Object > obj, Isolate *isolate)
uint32_t NumberToUint32(Tagged< Object > number)
DirectHandle< ArrayList > AddWasmInstanceObjectInternalProperties(Isolate *isolate, DirectHandle< ArrayList > result, DirectHandle< WasmInstanceObject > instance)
int32_t NumberToInt32(Tagged< Object > number)
Tagged< MaybeWeak< T > > MakeWeak(Tagged< T > value)
DirectHandle< ArrayList > AddWasmTableObjectInternalProperties(Isolate *isolate, DirectHandle< ArrayList > result, DirectHandle< WasmTableObject > table)
static bool SetScopeVariableValue(ScopeIterator *it, int index, Handle< String > variable_name, DirectHandle< Object > new_value)
V8_EXPORT_PRIVATE FlagValues v8_flags
void DisableEmbeddedBlobRefcounting()
kInstanceDescriptorsOffset kTransitionsOrPrototypeInfoOffset IsNull(value)||IsJSProxy(value)||IsWasmObject(value)||(IsJSObject(value) &&(HeapLayout
v8::StartupData CreateSnapshotDataBlobInternal(v8::SnapshotCreator::FunctionCodeHandling function_code_handling, const char *embedded_source, SnapshotCreator &snapshot_creator, Snapshot::SerializerFlags serializer_flags)
kInterpreterTrampolineOffset script
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
Maybe< T > Just(const T &t)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
@ BLOCKED_BY_RUNNING_GENERATOR
@ BLOCKED_BY_TOP_LEVEL_ES_MODULE_CHANGE
@ BLOCKED_BY_ACTIVE_FUNCTION