OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/api.h" | 5 #include "src/api.h" |
6 | 6 |
7 #include <string.h> // For memcpy, strlen. | 7 #include <string.h> // For memcpy, strlen. |
8 #ifdef V8_USE_ADDRESS_SANITIZER | 8 #ifdef V8_USE_ADDRESS_SANITIZER |
9 #include <sanitizer/asan_interface.h> | 9 #include <sanitizer/asan_interface.h> |
10 #endif // V8_USE_ADDRESS_SANITIZER | 10 #endif // V8_USE_ADDRESS_SANITIZER |
(...skipping 8940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8951 } else { | 8951 } else { |
8952 i::Handle<i::Object> i_data = i_isolate->factory()->undefined_value(); | 8952 i::Handle<i::Object> i_data = i_isolate->factory()->undefined_value(); |
8953 if (!data.IsEmpty()) i_data = Utils::OpenHandle(*data); | 8953 if (!data.IsEmpty()) i_data = Utils::OpenHandle(*data); |
8954 i::NativeDebugDelegate* delegate = | 8954 i::NativeDebugDelegate* delegate = |
8955 new i::NativeDebugDelegate(i_isolate, that, i_data); | 8955 new i::NativeDebugDelegate(i_isolate, that, i_data); |
8956 i_isolate->debug()->SetDebugDelegate(delegate, true); | 8956 i_isolate->debug()->SetDebugDelegate(delegate, true); |
8957 } | 8957 } |
8958 return true; | 8958 return true; |
8959 } | 8959 } |
8960 | 8960 |
8961 void Debug::DebugBreak(Isolate* isolate) { | 8961 void Debug::DebugBreak(Isolate* isolate) { debug::DebugBreak(isolate); } |
8962 reinterpret_cast<i::Isolate*>(isolate)->stack_guard()->RequestDebugBreak(); | 8962 |
| 8963 void Debug::CancelDebugBreak(Isolate* isolate) { |
| 8964 debug::CancelDebugBreak(isolate); |
8963 } | 8965 } |
8964 | 8966 |
8965 | 8967 |
8966 void Debug::CancelDebugBreak(Isolate* isolate) { | |
8967 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); | |
8968 internal_isolate->stack_guard()->ClearDebugBreak(); | |
8969 } | |
8970 | |
8971 | |
8972 bool Debug::CheckDebugBreak(Isolate* isolate) { | 8968 bool Debug::CheckDebugBreak(Isolate* isolate) { |
8973 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); | 8969 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); |
8974 return internal_isolate->stack_guard()->CheckDebugBreak(); | 8970 return internal_isolate->stack_guard()->CheckDebugBreak(); |
8975 } | 8971 } |
8976 | 8972 |
8977 void Debug::SetMessageHandler(Isolate* isolate, | 8973 void Debug::SetMessageHandler(Isolate* isolate, |
8978 v8::Debug::MessageHandler handler) {} | 8974 v8::Debug::MessageHandler handler) {} |
8979 | 8975 |
8980 void Debug::SendCommand(Isolate* isolate, const uint16_t* command, int length, | 8976 void Debug::SendCommand(Isolate* isolate, const uint16_t* command, int length, |
8981 ClientData* client_data) {} | 8977 ClientData* client_data) {} |
8982 | 8978 |
8983 MaybeLocal<Value> Debug::Call(Local<Context> context, | 8979 MaybeLocal<Value> Debug::Call(Local<Context> context, |
8984 v8::Local<v8::Function> fun, | 8980 v8::Local<v8::Function> fun, |
8985 v8::Local<v8::Value> data) { | 8981 v8::Local<v8::Value> data) { |
8986 PREPARE_FOR_EXECUTION(context, Debug, Call, Value); | 8982 return debug::Call(context, fun, data); |
8987 i::Handle<i::Object> data_obj; | |
8988 if (data.IsEmpty()) { | |
8989 data_obj = isolate->factory()->undefined_value(); | |
8990 } else { | |
8991 data_obj = Utils::OpenHandle(*data); | |
8992 } | |
8993 Local<Value> result; | |
8994 has_pending_exception = | |
8995 !ToLocal<Value>(isolate->debug()->Call(Utils::OpenHandle(*fun), data_obj), | |
8996 &result); | |
8997 RETURN_ON_FAILED_EXECUTION(Value); | |
8998 RETURN_ESCAPED(result); | |
8999 } | 8983 } |
9000 | 8984 |
9001 | |
9002 void Debug::ProcessDebugMessages(Isolate* isolate) {} | 8985 void Debug::ProcessDebugMessages(Isolate* isolate) {} |
9003 | 8986 |
9004 Local<Context> Debug::GetDebugContext(Isolate* isolate) { | 8987 Local<Context> Debug::GetDebugContext(Isolate* isolate) { |
9005 return debug::GetDebugContext(isolate); | 8988 return debug::GetDebugContext(isolate); |
9006 } | 8989 } |
9007 | 8990 |
9008 | |
9009 MaybeLocal<Context> Debug::GetDebuggedContext(Isolate* isolate) { | 8991 MaybeLocal<Context> Debug::GetDebuggedContext(Isolate* isolate) { |
9010 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 8992 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
9011 ENTER_V8(i_isolate); | 8993 ENTER_V8(i_isolate); |
9012 if (!i_isolate->debug()->in_debug_scope()) return MaybeLocal<Context>(); | 8994 if (!i_isolate->debug()->in_debug_scope()) return MaybeLocal<Context>(); |
9013 i::Handle<i::Object> calling = i_isolate->GetCallingNativeContext(); | 8995 i::Handle<i::Object> calling = i_isolate->GetCallingNativeContext(); |
9014 if (calling.is_null()) return MaybeLocal<Context>(); | 8996 if (calling.is_null()) return MaybeLocal<Context>(); |
9015 return Utils::ToLocal(i::Handle<i::Context>::cast(calling)); | 8997 return Utils::ToLocal(i::Handle<i::Context>::cast(calling)); |
9016 } | 8998 } |
9017 | 8999 |
9018 void Debug::SetLiveEditEnabled(Isolate* isolate, bool enable) { | 9000 void Debug::SetLiveEditEnabled(Isolate* isolate, bool enable) { |
9019 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); | 9001 debug::SetLiveEditEnabled(isolate, enable); |
9020 internal_isolate->debug()->set_live_edit_enabled(enable); | |
9021 } | 9002 } |
9022 | 9003 |
9023 bool Debug::IsTailCallEliminationEnabled(Isolate* isolate) { | 9004 bool Debug::IsTailCallEliminationEnabled(Isolate* isolate) { |
9024 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); | 9005 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); |
9025 return internal_isolate->is_tail_call_elimination_enabled(); | 9006 return internal_isolate->is_tail_call_elimination_enabled(); |
9026 } | 9007 } |
9027 | 9008 |
9028 void Debug::SetTailCallEliminationEnabled(Isolate* isolate, bool enabled) { | 9009 void Debug::SetTailCallEliminationEnabled(Isolate* isolate, bool enabled) { |
9029 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); | 9010 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); |
9030 internal_isolate->SetTailCallEliminationEnabled(enabled); | 9011 internal_isolate->SetTailCallEliminationEnabled(enabled); |
9031 } | 9012 } |
9032 | 9013 |
9033 MaybeLocal<Array> Debug::GetInternalProperties(Isolate* v8_isolate, | 9014 MaybeLocal<Array> Debug::GetInternalProperties(Isolate* v8_isolate, |
9034 Local<Value> value) { | 9015 Local<Value> value) { |
9035 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); | 9016 return debug::GetInternalProperties(v8_isolate, value); |
9036 ENTER_V8(isolate); | |
9037 i::Handle<i::Object> val = Utils::OpenHandle(*value); | |
9038 i::Handle<i::JSArray> result; | |
9039 if (!i::Runtime::GetInternalProperties(isolate, val).ToHandle(&result)) | |
9040 return MaybeLocal<Array>(); | |
9041 return Utils::ToLocal(result); | |
9042 } | 9017 } |
9043 | 9018 |
9044 Local<Context> debug::GetDebugContext(Isolate* isolate) { | 9019 Local<Context> debug::GetDebugContext(Isolate* isolate) { |
9045 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 9020 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
9046 ENTER_V8(i_isolate); | 9021 ENTER_V8(i_isolate); |
9047 return Utils::ToLocal(i_isolate->debug()->GetDebugContext()); | 9022 return Utils::ToLocal(i_isolate->debug()->GetDebugContext()); |
9048 } | 9023 } |
9049 | 9024 |
9050 MaybeLocal<Value> debug::Call(Local<Context> context, | 9025 MaybeLocal<Value> debug::Call(Local<Context> context, |
9051 v8::Local<v8::Function> fun, | 9026 v8::Local<v8::Function> fun, |
9052 v8::Local<v8::Value> data) { | 9027 v8::Local<v8::Value> data) { |
9053 return Debug::Call(context, fun, data); | 9028 PREPARE_FOR_EXECUTION(context, Debug, Call, Value); |
| 9029 i::Handle<i::Object> data_obj; |
| 9030 if (data.IsEmpty()) { |
| 9031 data_obj = isolate->factory()->undefined_value(); |
| 9032 } else { |
| 9033 data_obj = Utils::OpenHandle(*data); |
| 9034 } |
| 9035 Local<Value> result; |
| 9036 has_pending_exception = !ToLocal<Value>( |
| 9037 isolate->debug()->Call(Utils::OpenHandle(*fun), data_obj), &result); |
| 9038 RETURN_ON_FAILED_EXECUTION(Value); |
| 9039 RETURN_ESCAPED(result); |
9054 } | 9040 } |
9055 | 9041 |
9056 void debug::SetLiveEditEnabled(Isolate* isolate, bool enable) { | 9042 void debug::SetLiveEditEnabled(Isolate* isolate, bool enable) { |
9057 Debug::SetLiveEditEnabled(isolate, enable); | 9043 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 9044 internal_isolate->debug()->set_live_edit_enabled(enable); |
9058 } | 9045 } |
9059 | 9046 |
9060 void debug::DebugBreak(Isolate* isolate) { Debug::DebugBreak(isolate); } | 9047 void debug::DebugBreak(Isolate* isolate) { |
| 9048 reinterpret_cast<i::Isolate*>(isolate)->stack_guard()->RequestDebugBreak(); |
| 9049 } |
9061 | 9050 |
9062 void debug::CancelDebugBreak(Isolate* isolate) { | 9051 void debug::CancelDebugBreak(Isolate* isolate) { |
9063 Debug::CancelDebugBreak(isolate); | 9052 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 9053 internal_isolate->stack_guard()->ClearDebugBreak(); |
9064 } | 9054 } |
9065 | 9055 |
9066 MaybeLocal<Array> debug::GetInternalProperties(Isolate* isolate, | 9056 MaybeLocal<Array> debug::GetInternalProperties(Isolate* v8_isolate, |
9067 Local<Value> value) { | 9057 Local<Value> value) { |
9068 return Debug::GetInternalProperties(isolate, value); | 9058 i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
| 9059 ENTER_V8(isolate); |
| 9060 i::Handle<i::Object> val = Utils::OpenHandle(*value); |
| 9061 i::Handle<i::JSArray> result; |
| 9062 if (!i::Runtime::GetInternalProperties(isolate, val).ToHandle(&result)) |
| 9063 return MaybeLocal<Array>(); |
| 9064 return Utils::ToLocal(result); |
9069 } | 9065 } |
9070 | 9066 |
9071 void debug::ChangeBreakOnException(Isolate* isolate, ExceptionBreakState type) { | 9067 void debug::ChangeBreakOnException(Isolate* isolate, ExceptionBreakState type) { |
9072 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); | 9068 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); |
9073 internal_isolate->debug()->ChangeBreakOnException( | 9069 internal_isolate->debug()->ChangeBreakOnException( |
9074 i::BreakException, type == BreakOnAnyException); | 9070 i::BreakException, type == BreakOnAnyException); |
9075 internal_isolate->debug()->ChangeBreakOnException(i::BreakUncaughtException, | 9071 internal_isolate->debug()->ChangeBreakOnException(i::BreakUncaughtException, |
9076 type != NoBreakOnException); | 9072 type != NoBreakOnException); |
9077 } | 9073 } |
9078 | 9074 |
(...skipping 1168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10247 Address callback_address = | 10243 Address callback_address = |
10248 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 10244 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
10249 VMState<EXTERNAL> state(isolate); | 10245 VMState<EXTERNAL> state(isolate); |
10250 ExternalCallbackScope call_scope(isolate, callback_address); | 10246 ExternalCallbackScope call_scope(isolate, callback_address); |
10251 callback(info); | 10247 callback(info); |
10252 } | 10248 } |
10253 | 10249 |
10254 | 10250 |
10255 } // namespace internal | 10251 } // namespace internal |
10256 } // namespace v8 | 10252 } // namespace v8 |
OLD | NEW |