function_code, Handle code_scope_info) { Handle code_wrapper = WrapInJSValue(function_code); this->SetField(kCodeOffset_, code_wrapper); Handle scope_wrapper = WrapInJSValue(code_scope_info); this->SetField(kCodeScopeInfoOffset_, scope_wrapper); } void FunctionInfoWrapper::SetSharedFunctionInfo( Handle info) { Handle info_holder = WrapInJSValue(info); this->SetField(kSharedFunctionInfoOffset_, info_holder); } Handle FunctionInfoWrapper::GetFunctionCode() { Handle element = this->GetField(kCodeOffset_); Handle value_wrapper = Handle::cast(element); Handle raw_result = UnwrapJSValue(value_wrapper); CHECK(raw_result->IsCode()); return Handle::cast(raw_result); } Handle FunctionInfoWrapper::GetFeedbackVector() { Handle element = this->GetField(kSharedFunctionInfoOffset_); Handle result; if (element->IsJSValue()) { Handle value_wrapper = Handle::cast(element); Handle raw_result = UnwrapJSValue(value_wrapper); Handle shared = Handle::cast(raw_result); result = Handle(shared->feedback_vector(), isolate()); CHECK_EQ(result->length(), GetSlotCount()); } else { // Scripts may never have a SharedFunctionInfo created, so // create a type feedback vector here. int slot_count = GetSlotCount(); result = isolate()->factory()->NewTypeFeedbackVector(slot_count); } return result; } Handle FunctionInfoWrapper::GetCodeScopeInfo() { Handle element = this->GetField(kCodeScopeInfoOffset_); return UnwrapJSValue(Handle::cast(element)); } void SharedInfoWrapper::SetProperties(Handle name, int start_position, int end_position, Handle info) { HandleScope scope(isolate()); this->SetField(kFunctionNameOffset_, name); Handle info_holder = WrapInJSValue(info); this->SetField(kSharedInfoOffset_, info_holder); this->SetSmiValueField(kStartPositionOffset_, start_position); this->SetSmiValueField(kEndPositionOffset_, end_position); } Handle SharedInfoWrapper::GetInfo() { Handle element = this->GetField(kSharedInfoOffset_); Handle value_wrapper = Handle::cast(element); return UnwrapSharedFunctionInfoFromJSValue(value_wrapper); } class FunctionInfoListener { public: explicit FunctionInfoListener(Isolate* isolate) { current_parent_index_ = -1; len_ = 0; result_ = isolate->factory()->NewJSArray(10); } void FunctionStarted(FunctionLiteral* fun) { HandleScope scope(isolate()); FunctionInfoWrapper info = FunctionInfoWrapper::Create(isolate()); info.SetInitialProperties(fun->name(), fun->start_position(), fun->end_position(), fun->parameter_count(), fun->materialized_literal_count(), fun->slot_count(), current_parent_index_); current_parent_index_ = len_; SetElementSloppy(result_, len_, info.GetJSArray()); len_++; } void FunctionDone() { HandleScope scope(isolate()); FunctionInfoWrapper info = FunctionInfoWrapper::cast( *Object::GetElement( isolate(), result_, current_parent_index_).ToHandleChecked()); current_parent_index_ = info.GetParentIndex(); } // Saves only function code, because for a script function we // may never create a SharedFunctionInfo object. void FunctionCode(Handle function_code) { FunctionInfoWrapper info = FunctionInfoWrapper::cast( *Object::GetElement( isolate(), result_, current_parent_index_).ToHandleChecked()); info.SetFunctionCode(function_code, Handle(isolate()->heap()->null_value())); } // Saves full information about a function: its code, its scope info // and a SharedFunctionInfo object. void FunctionInfo(Handle shared, Scope* scope, Zone* zone) { if (!shared->IsSharedFunctionInfo()) { return; } FunctionInfoWrapper info = FunctionInfoWrapper::cast( *Object::GetElement( isolate(), result_, current_parent_index_).ToHandleChecked()); info.SetFunctionCode(Handle(shared->code()), Handle(shared->scope_info())); info.SetSharedFunctionInfo(shared); Handle scope_info_list = SerializeFunctionScope(scope, zone); info.SetFunctionScopeInfo(scope_info_list); } Handle GetResult() { return result_; } private: Isolate* isolate() const { return result_->GetIsolate(); } Handle SerializeFunctionScope(Scope* scope, Zone* zone) { Handle scope_info_list = isolate()->factory()->NewJSArray(10); int scope_info_length = 0; // Saves some description of scope. It stores name and indexes of // variables in the whole scope chain. Null-named slots delimit // scopes of this chain. Scope* current_scope = scope; while (current_scope != NULL) { HandleScope handle_scope(isolate()); ZoneList stack_list(current_scope->StackLocalCount(), zone); ZoneList context_list( current_scope->ContextLocalCount(), zone); current_scope->CollectStackAndContextLocals(&stack_list, &context_list); context_list.Sort(&Variable::CompareIndex); for (int i = 0; i < context_list.length(); i++) { SetElementSloppy(scope_info_list, scope_info_length, context_list[i]->name()); scope_info_length++; SetElementSloppy( scope_info_list, scope_info_length, Handle(Smi::FromInt(context_list[i]->index()), isolate())); scope_info_length++; } SetElementSloppy(scope_info_list, scope_info_length, Handle(isolate()->heap()->null_value(), isolate())); scope_info_length++; current_scope = current_scope->outer_scope(); } return scope_info_list; } Handle result_; int len_; int current_parent_index_; }; void LiveEdit::InitializeThreadLocal(Debug* debug) { debug->thread_local_.frame_drop_mode_ = LiveEdit::FRAMES_UNTOUCHED; } bool LiveEdit::SetAfterBreakTarget(Debug* debug) { Code* code = NULL; Isolate* isolate = debug->isolate_; switch (debug->thread_local_.frame_drop_mode_) { case FRAMES_UNTOUCHED: return false; case FRAME_DROPPED_IN_IC_CALL: // We must have been calling IC stub. Do not go there anymore. code = isolate->builtins()->builtin(Builtins::kPlainReturn_LiveEdit); break; case FRAME_DROPPED_IN_DEBUG_SLOT_CALL: // Debug break slot stub does not return normally, instead it manually // cleans the stack and jumps. We should patch the jump address. code = isolate->builtins()->builtin(Builtins::kFrameDropper_LiveEdit); break; case FRAME_DROPPED_IN_DIRECT_CALL: // Nothing to do, after_break_target is not used here. return true; case FRAME_DROPPED_IN_RETURN_CALL: code = isolate->builtins()->builtin(Builtins::kFrameDropper_LiveEdit); break; case CURRENTLY_SET_MODE: UNREACHABLE(); break; } debug->after_break_target_ = code->entry(); return true; } MaybeHandle LiveEdit::GatherCompileInfo(Handle 登录后可以享受更多权益 您还没有登录,登录后您可以: 收藏Android系统代码 收藏喜欢的文章 多个平台共享账号 去登录 首次使用?从这里 注册
FunctionInfoWrapper::GetFunctionCode() { Handle element = this->GetField(kCodeOffset_); Handle value_wrapper = Handle::cast(element); Handle raw_result = UnwrapJSValue(value_wrapper); CHECK(raw_result->IsCode()); return Handle::cast(raw_result); } Handle FunctionInfoWrapper::GetFeedbackVector() { Handle element = this->GetField(kSharedFunctionInfoOffset_); Handle result; if (element->IsJSValue()) { Handle value_wrapper = Handle::cast(element); Handle raw_result = UnwrapJSValue(value_wrapper); Handle shared = Handle::cast(raw_result); result = Handle(shared->feedback_vector(), isolate()); CHECK_EQ(result->length(), GetSlotCount()); } else { // Scripts may never have a SharedFunctionInfo created, so // create a type feedback vector here. int slot_count = GetSlotCount(); result = isolate()->factory()->NewTypeFeedbackVector(slot_count); } return result; } Handle FunctionInfoWrapper::GetCodeScopeInfo() { Handle element = this->GetField(kCodeScopeInfoOffset_); return UnwrapJSValue(Handle::cast(element)); } void SharedInfoWrapper::SetProperties(Handle name, int start_position, int end_position, Handle info) { HandleScope scope(isolate()); this->SetField(kFunctionNameOffset_, name); Handle info_holder = WrapInJSValue(info); this->SetField(kSharedInfoOffset_, info_holder); this->SetSmiValueField(kStartPositionOffset_, start_position); this->SetSmiValueField(kEndPositionOffset_, end_position); } Handle SharedInfoWrapper::GetInfo() { Handle element = this->GetField(kSharedInfoOffset_); Handle value_wrapper = Handle::cast(element); return UnwrapSharedFunctionInfoFromJSValue(value_wrapper); } class FunctionInfoListener { public: explicit FunctionInfoListener(Isolate* isolate) { current_parent_index_ = -1; len_ = 0; result_ = isolate->factory()->NewJSArray(10); } void FunctionStarted(FunctionLiteral* fun) { HandleScope scope(isolate()); FunctionInfoWrapper info = FunctionInfoWrapper::Create(isolate()); info.SetInitialProperties(fun->name(), fun->start_position(), fun->end_position(), fun->parameter_count(), fun->materialized_literal_count(), fun->slot_count(), current_parent_index_); current_parent_index_ = len_; SetElementSloppy(result_, len_, info.GetJSArray()); len_++; } void FunctionDone() { HandleScope scope(isolate()); FunctionInfoWrapper info = FunctionInfoWrapper::cast( *Object::GetElement( isolate(), result_, current_parent_index_).ToHandleChecked()); current_parent_index_ = info.GetParentIndex(); } // Saves only function code, because for a script function we // may never create a SharedFunctionInfo object. void FunctionCode(Handle function_code) { FunctionInfoWrapper info = FunctionInfoWrapper::cast( *Object::GetElement( isolate(), result_, current_parent_index_).ToHandleChecked()); info.SetFunctionCode(function_code, Handle(isolate()->heap()->null_value())); } // Saves full information about a function: its code, its scope info // and a SharedFunctionInfo object. void FunctionInfo(Handle shared, Scope* scope, Zone* zone) { if (!shared->IsSharedFunctionInfo()) { return; } FunctionInfoWrapper info = FunctionInfoWrapper::cast( *Object::GetElement( isolate(), result_, current_parent_index_).ToHandleChecked()); info.SetFunctionCode(Handle(shared->code()), Handle(shared->scope_info())); info.SetSharedFunctionInfo(shared); Handle scope_info_list = SerializeFunctionScope(scope, zone); info.SetFunctionScopeInfo(scope_info_list); } Handle GetResult() { return result_; } private: Isolate* isolate() const { return result_->GetIsolate(); } Handle SerializeFunctionScope(Scope* scope, Zone* zone) { Handle scope_info_list = isolate()->factory()->NewJSArray(10); int scope_info_length = 0; // Saves some description of scope. It stores name and indexes of // variables in the whole scope chain. Null-named slots delimit // scopes of this chain. Scope* current_scope = scope; while (current_scope != NULL) { HandleScope handle_scope(isolate()); ZoneList stack_list(current_scope->StackLocalCount(), zone); ZoneList context_list( current_scope->ContextLocalCount(), zone); current_scope->CollectStackAndContextLocals(&stack_list, &context_list); context_list.Sort(&Variable::CompareIndex); for (int i = 0; i < context_list.length(); i++) { SetElementSloppy(scope_info_list, scope_info_length, context_list[i]->name()); scope_info_length++; SetElementSloppy( scope_info_list, scope_info_length, Handle(Smi::FromInt(context_list[i]->index()), isolate())); scope_info_length++; } SetElementSloppy(scope_info_list, scope_info_length, Handle(isolate()->heap()->null_value(), isolate())); scope_info_length++; current_scope = current_scope->outer_scope(); } return scope_info_list; } Handle result_; int len_; int current_parent_index_; }; void LiveEdit::InitializeThreadLocal(Debug* debug) { debug->thread_local_.frame_drop_mode_ = LiveEdit::FRAMES_UNTOUCHED; } bool LiveEdit::SetAfterBreakTarget(Debug* debug) { Code* code = NULL; Isolate* isolate = debug->isolate_; switch (debug->thread_local_.frame_drop_mode_) { case FRAMES_UNTOUCHED: return false; case FRAME_DROPPED_IN_IC_CALL: // We must have been calling IC stub. Do not go there anymore. code = isolate->builtins()->builtin(Builtins::kPlainReturn_LiveEdit); break; case FRAME_DROPPED_IN_DEBUG_SLOT_CALL: // Debug break slot stub does not return normally, instead it manually // cleans the stack and jumps. We should patch the jump address. code = isolate->builtins()->builtin(Builtins::kFrameDropper_LiveEdit); break; case FRAME_DROPPED_IN_DIRECT_CALL: // Nothing to do, after_break_target is not used here. return true; case FRAME_DROPPED_IN_RETURN_CALL: code = isolate->builtins()->builtin(Builtins::kFrameDropper_LiveEdit); break; case CURRENTLY_SET_MODE: UNREACHABLE(); break; } debug->after_break_target_ = code->entry(); return true; } MaybeHandle LiveEdit::GatherCompileInfo(Handle 登录后可以享受更多权益 您还没有登录,登录后您可以: 收藏Android系统代码 收藏喜欢的文章 多个平台共享账号 去登录 首次使用?从这里 注册
::cast(raw_result); } Handle FunctionInfoWrapper::GetFeedbackVector() { Handle element = this->GetField(kSharedFunctionInfoOffset_); Handle result; if (element->IsJSValue()) { Handle value_wrapper = Handle::cast(element); Handle raw_result = UnwrapJSValue(value_wrapper); Handle shared = Handle::cast(raw_result); result = Handle(shared->feedback_vector(), isolate()); CHECK_EQ(result->length(), GetSlotCount()); } else { // Scripts may never have a SharedFunctionInfo created, so // create a type feedback vector here. int slot_count = GetSlotCount(); result = isolate()->factory()->NewTypeFeedbackVector(slot_count); } return result; } Handle FunctionInfoWrapper::GetCodeScopeInfo() { Handle element = this->GetField(kCodeScopeInfoOffset_); return UnwrapJSValue(Handle::cast(element)); } void SharedInfoWrapper::SetProperties(Handle name, int start_position, int end_position, Handle info) { HandleScope scope(isolate()); this->SetField(kFunctionNameOffset_, name); Handle info_holder = WrapInJSValue(info); this->SetField(kSharedInfoOffset_, info_holder); this->SetSmiValueField(kStartPositionOffset_, start_position); this->SetSmiValueField(kEndPositionOffset_, end_position); } Handle SharedInfoWrapper::GetInfo() { Handle element = this->GetField(kSharedInfoOffset_); Handle value_wrapper = Handle::cast(element); return UnwrapSharedFunctionInfoFromJSValue(value_wrapper); } class FunctionInfoListener { public: explicit FunctionInfoListener(Isolate* isolate) { current_parent_index_ = -1; len_ = 0; result_ = isolate->factory()->NewJSArray(10); } void FunctionStarted(FunctionLiteral* fun) { HandleScope scope(isolate()); FunctionInfoWrapper info = FunctionInfoWrapper::Create(isolate()); info.SetInitialProperties(fun->name(), fun->start_position(), fun->end_position(), fun->parameter_count(), fun->materialized_literal_count(), fun->slot_count(), current_parent_index_); current_parent_index_ = len_; SetElementSloppy(result_, len_, info.GetJSArray()); len_++; } void FunctionDone() { HandleScope scope(isolate()); FunctionInfoWrapper info = FunctionInfoWrapper::cast( *Object::GetElement( isolate(), result_, current_parent_index_).ToHandleChecked()); current_parent_index_ = info.GetParentIndex(); } // Saves only function code, because for a script function we // may never create a SharedFunctionInfo object. void FunctionCode(Handle function_code) { FunctionInfoWrapper info = FunctionInfoWrapper::cast( *Object::GetElement( isolate(), result_, current_parent_index_).ToHandleChecked()); info.SetFunctionCode(function_code, Handle(isolate()->heap()->null_value())); } // Saves full information about a function: its code, its scope info // and a SharedFunctionInfo object. void FunctionInfo(Handle shared, Scope* scope, Zone* zone) { if (!shared->IsSharedFunctionInfo()) { return; } FunctionInfoWrapper info = FunctionInfoWrapper::cast( *Object::GetElement( isolate(), result_, current_parent_index_).ToHandleChecked()); info.SetFunctionCode(Handle(shared->code()), Handle(shared->scope_info())); info.SetSharedFunctionInfo(shared); Handle scope_info_list = SerializeFunctionScope(scope, zone); info.SetFunctionScopeInfo(scope_info_list); } Handle GetResult() { return result_; } private: Isolate* isolate() const { return result_->GetIsolate(); } Handle SerializeFunctionScope(Scope* scope, Zone* zone) { Handle scope_info_list = isolate()->factory()->NewJSArray(10); int scope_info_length = 0; // Saves some description of scope. It stores name and indexes of // variables in the whole scope chain. Null-named slots delimit // scopes of this chain. Scope* current_scope = scope; while (current_scope != NULL) { HandleScope handle_scope(isolate()); ZoneList stack_list(current_scope->StackLocalCount(), zone); ZoneList context_list( current_scope->ContextLocalCount(), zone); current_scope->CollectStackAndContextLocals(&stack_list, &context_list); context_list.Sort(&Variable::CompareIndex); for (int i = 0; i < context_list.length(); i++) { SetElementSloppy(scope_info_list, scope_info_length, context_list[i]->name()); scope_info_length++; SetElementSloppy( scope_info_list, scope_info_length, Handle(Smi::FromInt(context_list[i]->index()), isolate())); scope_info_length++; } SetElementSloppy(scope_info_list, scope_info_length, Handle(isolate()->heap()->null_value(), isolate())); scope_info_length++; current_scope = current_scope->outer_scope(); } return scope_info_list; } Handle result_; int len_; int current_parent_index_; }; void LiveEdit::InitializeThreadLocal(Debug* debug) { debug->thread_local_.frame_drop_mode_ = LiveEdit::FRAMES_UNTOUCHED; } bool LiveEdit::SetAfterBreakTarget(Debug* debug) { Code* code = NULL; Isolate* isolate = debug->isolate_; switch (debug->thread_local_.frame_drop_mode_) { case FRAMES_UNTOUCHED: return false; case FRAME_DROPPED_IN_IC_CALL: // We must have been calling IC stub. Do not go there anymore. code = isolate->builtins()->builtin(Builtins::kPlainReturn_LiveEdit); break; case FRAME_DROPPED_IN_DEBUG_SLOT_CALL: // Debug break slot stub does not return normally, instead it manually // cleans the stack and jumps. We should patch the jump address. code = isolate->builtins()->builtin(Builtins::kFrameDropper_LiveEdit); break; case FRAME_DROPPED_IN_DIRECT_CALL: // Nothing to do, after_break_target is not used here. return true; case FRAME_DROPPED_IN_RETURN_CALL: code = isolate->builtins()->builtin(Builtins::kFrameDropper_LiveEdit); break; case CURRENTLY_SET_MODE: UNREACHABLE(); break; } debug->after_break_target_ = code->entry(); return true; } MaybeHandle LiveEdit::GatherCompileInfo(Handle 登录后可以享受更多权益 您还没有登录,登录后您可以: 收藏Android系统代码 收藏喜欢的文章 多个平台共享账号 去登录 首次使用?从这里 注册
function_code) { FunctionInfoWrapper info = FunctionInfoWrapper::cast( *Object::GetElement( isolate(), result_, current_parent_index_).ToHandleChecked()); info.SetFunctionCode(function_code, Handle(isolate()->heap()->null_value())); } // Saves full information about a function: its code, its scope info // and a SharedFunctionInfo object. void FunctionInfo(Handle shared, Scope* scope, Zone* zone) { if (!shared->IsSharedFunctionInfo()) { return; } FunctionInfoWrapper info = FunctionInfoWrapper::cast( *Object::GetElement( isolate(), result_, current_parent_index_).ToHandleChecked()); info.SetFunctionCode(Handle(shared->code()), Handle(shared->scope_info())); info.SetSharedFunctionInfo(shared); Handle scope_info_list = SerializeFunctionScope(scope, zone); info.SetFunctionScopeInfo(scope_info_list); } Handle GetResult() { return result_; } private: Isolate* isolate() const { return result_->GetIsolate(); } Handle SerializeFunctionScope(Scope* scope, Zone* zone) { Handle scope_info_list = isolate()->factory()->NewJSArray(10); int scope_info_length = 0; // Saves some description of scope. It stores name and indexes of // variables in the whole scope chain. Null-named slots delimit // scopes of this chain. Scope* current_scope = scope; while (current_scope != NULL) { HandleScope handle_scope(isolate()); ZoneList stack_list(current_scope->StackLocalCount(), zone); ZoneList context_list( current_scope->ContextLocalCount(), zone); current_scope->CollectStackAndContextLocals(&stack_list, &context_list); context_list.Sort(&Variable::CompareIndex); for (int i = 0; i < context_list.length(); i++) { SetElementSloppy(scope_info_list, scope_info_length, context_list[i]->name()); scope_info_length++; SetElementSloppy( scope_info_list, scope_info_length, Handle(Smi::FromInt(context_list[i]->index()), isolate())); scope_info_length++; } SetElementSloppy(scope_info_list, scope_info_length, Handle(isolate()->heap()->null_value(), isolate())); scope_info_length++; current_scope = current_scope->outer_scope(); } return scope_info_list; } Handle result_; int len_; int current_parent_index_; }; void LiveEdit::InitializeThreadLocal(Debug* debug) { debug->thread_local_.frame_drop_mode_ = LiveEdit::FRAMES_UNTOUCHED; } bool LiveEdit::SetAfterBreakTarget(Debug* debug) { Code* code = NULL; Isolate* isolate = debug->isolate_; switch (debug->thread_local_.frame_drop_mode_) { case FRAMES_UNTOUCHED: return false; case FRAME_DROPPED_IN_IC_CALL: // We must have been calling IC stub. Do not go there anymore. code = isolate->builtins()->builtin(Builtins::kPlainReturn_LiveEdit); break; case FRAME_DROPPED_IN_DEBUG_SLOT_CALL: // Debug break slot stub does not return normally, instead it manually // cleans the stack and jumps. We should patch the jump address. code = isolate->builtins()->builtin(Builtins::kFrameDropper_LiveEdit); break; case FRAME_DROPPED_IN_DIRECT_CALL: // Nothing to do, after_break_target is not used here. return true; case FRAME_DROPPED_IN_RETURN_CALL: code = isolate->builtins()->builtin(Builtins::kFrameDropper_LiveEdit); break; case CURRENTLY_SET_MODE: UNREACHABLE(); break; } debug->after_break_target_ = code->entry(); return true; } MaybeHandle LiveEdit::GatherCompileInfo(Handle 登录后可以享受更多权益 您还没有登录,登录后您可以: 收藏Android系统代码 收藏喜欢的文章 多个平台共享账号 去登录 首次使用?从这里 注册
(shared->code()), Handle(shared->scope_info())); info.SetSharedFunctionInfo(shared); Handle scope_info_list = SerializeFunctionScope(scope, zone); info.SetFunctionScopeInfo(scope_info_list); } Handle GetResult() { return result_; } private: Isolate* isolate() const { return result_->GetIsolate(); } Handle SerializeFunctionScope(Scope* scope, Zone* zone) { Handle scope_info_list = isolate()->factory()->NewJSArray(10); int scope_info_length = 0; // Saves some description of scope. It stores name and indexes of // variables in the whole scope chain. Null-named slots delimit // scopes of this chain. Scope* current_scope = scope; while (current_scope != NULL) { HandleScope handle_scope(isolate()); ZoneList stack_list(current_scope->StackLocalCount(), zone); ZoneList context_list( current_scope->ContextLocalCount(), zone); current_scope->CollectStackAndContextLocals(&stack_list, &context_list); context_list.Sort(&Variable::CompareIndex); for (int i = 0; i < context_list.length(); i++) { SetElementSloppy(scope_info_list, scope_info_length, context_list[i]->name()); scope_info_length++; SetElementSloppy( scope_info_list, scope_info_length, Handle(Smi::FromInt(context_list[i]->index()), isolate())); scope_info_length++; } SetElementSloppy(scope_info_list, scope_info_length, Handle(isolate()->heap()->null_value(), isolate())); scope_info_length++; current_scope = current_scope->outer_scope(); } return scope_info_list; } Handle result_; int len_; int current_parent_index_; }; void LiveEdit::InitializeThreadLocal(Debug* debug) { debug->thread_local_.frame_drop_mode_ = LiveEdit::FRAMES_UNTOUCHED; } bool LiveEdit::SetAfterBreakTarget(Debug* debug) { Code* code = NULL; Isolate* isolate = debug->isolate_; switch (debug->thread_local_.frame_drop_mode_) { case FRAMES_UNTOUCHED: return false; case FRAME_DROPPED_IN_IC_CALL: // We must have been calling IC stub. Do not go there anymore. code = isolate->builtins()->builtin(Builtins::kPlainReturn_LiveEdit); break; case FRAME_DROPPED_IN_DEBUG_SLOT_CALL: // Debug break slot stub does not return normally, instead it manually // cleans the stack and jumps. We should patch the jump address. code = isolate->builtins()->builtin(Builtins::kFrameDropper_LiveEdit); break; case FRAME_DROPPED_IN_DIRECT_CALL: // Nothing to do, after_break_target is not used here. return true; case FRAME_DROPPED_IN_RETURN_CALL: code = isolate->builtins()->builtin(Builtins::kFrameDropper_LiveEdit); break; case CURRENTLY_SET_MODE: UNREACHABLE(); break; } debug->after_break_target_ = code->entry(); return true; } MaybeHandle LiveEdit::GatherCompileInfo(Handle 登录后可以享受更多权益 您还没有登录,登录后您可以: 收藏Android系统代码 收藏喜欢的文章 多个平台共享账号 去登录 首次使用?从这里 注册
您还没有登录,登录后您可以:
首次使用?从这里 注册