| 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 8201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8212 i::HandleScope scope(i_isolate); | 8212 i::HandleScope scope(i_isolate); |
| 8213 i::Handle<i::Object> foreign = i_isolate->factory()->undefined_value(); | 8213 i::Handle<i::Object> foreign = i_isolate->factory()->undefined_value(); |
| 8214 if (that != NULL) { | 8214 if (that != NULL) { |
| 8215 foreign = i_isolate->factory()->NewForeign(FUNCTION_ADDR(that)); | 8215 foreign = i_isolate->factory()->NewForeign(FUNCTION_ADDR(that)); |
| 8216 } | 8216 } |
| 8217 i_isolate->debug()->SetEventListener(foreign, Utils::OpenHandle(*data, true)); | 8217 i_isolate->debug()->SetEventListener(foreign, Utils::OpenHandle(*data, true)); |
| 8218 return true; | 8218 return true; |
| 8219 } | 8219 } |
| 8220 | 8220 |
| 8221 | 8221 |
| 8222 bool Debug::SetDebugEventListener(EventCallback that, Local<Value> data) { | |
| 8223 return SetDebugEventListener( | |
| 8224 reinterpret_cast<Isolate*>(i::Isolate::Current()), that, data); | |
| 8225 } | |
| 8226 | |
| 8227 | |
| 8228 void Debug::DebugBreak(Isolate* isolate) { | 8222 void Debug::DebugBreak(Isolate* isolate) { |
| 8229 reinterpret_cast<i::Isolate*>(isolate)->stack_guard()->RequestDebugBreak(); | 8223 reinterpret_cast<i::Isolate*>(isolate)->stack_guard()->RequestDebugBreak(); |
| 8230 } | 8224 } |
| 8231 | 8225 |
| 8232 | 8226 |
| 8233 void Debug::CancelDebugBreak(Isolate* isolate) { | 8227 void Debug::CancelDebugBreak(Isolate* isolate) { |
| 8234 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); | 8228 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 8235 internal_isolate->stack_guard()->ClearDebugBreak(); | 8229 internal_isolate->stack_guard()->ClearDebugBreak(); |
| 8236 } | 8230 } |
| 8237 | 8231 |
| 8238 | 8232 |
| 8239 bool Debug::CheckDebugBreak(Isolate* isolate) { | 8233 bool Debug::CheckDebugBreak(Isolate* isolate) { |
| 8240 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); | 8234 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 8241 return internal_isolate->stack_guard()->CheckDebugBreak(); | 8235 return internal_isolate->stack_guard()->CheckDebugBreak(); |
| 8242 } | 8236 } |
| 8243 | 8237 |
| 8244 | 8238 |
| 8245 void Debug::SetMessageHandler(Isolate* isolate, | 8239 void Debug::SetMessageHandler(Isolate* isolate, |
| 8246 v8::Debug::MessageHandler handler) { | 8240 v8::Debug::MessageHandler handler) { |
| 8247 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 8241 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 8248 ENTER_V8(i_isolate); | 8242 ENTER_V8(i_isolate); |
| 8249 i_isolate->debug()->SetMessageHandler(handler); | 8243 i_isolate->debug()->SetMessageHandler(handler); |
| 8250 } | 8244 } |
| 8251 | 8245 |
| 8252 | 8246 |
| 8253 void Debug::SetMessageHandler(v8::Debug::MessageHandler handler) { | |
| 8254 SetMessageHandler(reinterpret_cast<Isolate*>(i::Isolate::Current()), handler); | |
| 8255 } | |
| 8256 | |
| 8257 | |
| 8258 void Debug::SendCommand(Isolate* isolate, | 8247 void Debug::SendCommand(Isolate* isolate, |
| 8259 const uint16_t* command, | 8248 const uint16_t* command, |
| 8260 int length, | 8249 int length, |
| 8261 ClientData* client_data) { | 8250 ClientData* client_data) { |
| 8262 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); | 8251 i::Isolate* internal_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 8263 internal_isolate->debug()->EnqueueCommandMessage( | 8252 internal_isolate->debug()->EnqueueCommandMessage( |
| 8264 i::Vector<const uint16_t>(command, length), client_data); | 8253 i::Vector<const uint16_t>(command, length), client_data); |
| 8265 } | 8254 } |
| 8266 | 8255 |
| 8267 | 8256 |
| 8268 MaybeLocal<Value> Debug::Call(Local<Context> context, | 8257 MaybeLocal<Value> Debug::Call(Local<Context> context, |
| 8269 v8::Local<v8::Function> fun, | 8258 v8::Local<v8::Function> fun, |
| 8270 v8::Local<v8::Value> data) { | 8259 v8::Local<v8::Value> data) { |
| 8271 PREPARE_FOR_EXECUTION(context, Debug, Call, Value); | 8260 PREPARE_FOR_EXECUTION(context, Debug, Call, Value); |
| 8272 i::Handle<i::Object> data_obj; | 8261 i::Handle<i::Object> data_obj; |
| 8273 if (data.IsEmpty()) { | 8262 if (data.IsEmpty()) { |
| 8274 data_obj = isolate->factory()->undefined_value(); | 8263 data_obj = isolate->factory()->undefined_value(); |
| 8275 } else { | 8264 } else { |
| 8276 data_obj = Utils::OpenHandle(*data); | 8265 data_obj = Utils::OpenHandle(*data); |
| 8277 } | 8266 } |
| 8278 Local<Value> result; | 8267 Local<Value> result; |
| 8279 has_pending_exception = | 8268 has_pending_exception = |
| 8280 !ToLocal<Value>(isolate->debug()->Call(Utils::OpenHandle(*fun), data_obj), | 8269 !ToLocal<Value>(isolate->debug()->Call(Utils::OpenHandle(*fun), data_obj), |
| 8281 &result); | 8270 &result); |
| 8282 RETURN_ON_FAILED_EXECUTION(Value); | 8271 RETURN_ON_FAILED_EXECUTION(Value); |
| 8283 RETURN_ESCAPED(result); | 8272 RETURN_ESCAPED(result); |
| 8284 } | 8273 } |
| 8285 | 8274 |
| 8286 | 8275 |
| 8287 Local<Value> Debug::Call(v8::Local<v8::Function> fun, | |
| 8288 v8::Local<v8::Value> data) { | |
| 8289 auto context = ContextFromHeapObject(Utils::OpenHandle(*fun)); | |
| 8290 RETURN_TO_LOCAL_UNCHECKED(Call(context, fun, data), Value); | |
| 8291 } | |
| 8292 | |
| 8293 | |
| 8294 MaybeLocal<Value> Debug::GetMirror(Local<Context> context, | 8276 MaybeLocal<Value> Debug::GetMirror(Local<Context> context, |
| 8295 v8::Local<v8::Value> obj) { | 8277 v8::Local<v8::Value> obj) { |
| 8296 PREPARE_FOR_EXECUTION(context, Debug, GetMirror, Value); | 8278 PREPARE_FOR_EXECUTION(context, Debug, GetMirror, Value); |
| 8297 i::Debug* isolate_debug = isolate->debug(); | 8279 i::Debug* isolate_debug = isolate->debug(); |
| 8298 has_pending_exception = !isolate_debug->Load(); | 8280 has_pending_exception = !isolate_debug->Load(); |
| 8299 RETURN_ON_FAILED_EXECUTION(Value); | 8281 RETURN_ON_FAILED_EXECUTION(Value); |
| 8300 i::Handle<i::JSObject> debug(isolate_debug->debug_context()->global_object()); | 8282 i::Handle<i::JSObject> debug(isolate_debug->debug_context()->global_object()); |
| 8301 auto name = isolate->factory()->NewStringFromStaticChars("MakeMirror"); | 8283 auto name = isolate->factory()->NewStringFromStaticChars("MakeMirror"); |
| 8302 auto fun_obj = i::JSReceiver::GetProperty(debug, name).ToHandleChecked(); | 8284 auto fun_obj = i::JSReceiver::GetProperty(debug, name).ToHandleChecked(); |
| 8303 auto v8_fun = Utils::CallableToLocal(i::Handle<i::JSFunction>::cast(fun_obj)); | 8285 auto v8_fun = Utils::CallableToLocal(i::Handle<i::JSFunction>::cast(fun_obj)); |
| 8304 const int kArgc = 1; | 8286 const int kArgc = 1; |
| 8305 v8::Local<v8::Value> argv[kArgc] = {obj}; | 8287 v8::Local<v8::Value> argv[kArgc] = {obj}; |
| 8306 Local<Value> result; | 8288 Local<Value> result; |
| 8307 has_pending_exception = | 8289 has_pending_exception = |
| 8308 !v8_fun->Call(context, Utils::ToLocal(debug), kArgc, argv) | 8290 !v8_fun->Call(context, Utils::ToLocal(debug), kArgc, argv) |
| 8309 .ToLocal(&result); | 8291 .ToLocal(&result); |
| 8310 RETURN_ON_FAILED_EXECUTION(Value); | 8292 RETURN_ON_FAILED_EXECUTION(Value); |
| 8311 RETURN_ESCAPED(result); | 8293 RETURN_ESCAPED(result); |
| 8312 } | 8294 } |
| 8313 | 8295 |
| 8314 | 8296 |
| 8315 Local<Value> Debug::GetMirror(v8::Local<v8::Value> obj) { | |
| 8316 RETURN_TO_LOCAL_UNCHECKED(GetMirror(Local<Context>(), obj), Value); | |
| 8317 } | |
| 8318 | |
| 8319 | |
| 8320 void Debug::ProcessDebugMessages(Isolate* isolate) { | 8297 void Debug::ProcessDebugMessages(Isolate* isolate) { |
| 8321 reinterpret_cast<i::Isolate*>(isolate)->debug()->ProcessDebugMessages(true); | 8298 reinterpret_cast<i::Isolate*>(isolate)->debug()->ProcessDebugMessages(true); |
| 8322 } | 8299 } |
| 8323 | 8300 |
| 8324 | 8301 |
| 8325 void Debug::ProcessDebugMessages() { | |
| 8326 ProcessDebugMessages(reinterpret_cast<Isolate*>(i::Isolate::Current())); | |
| 8327 } | |
| 8328 | |
| 8329 | |
| 8330 Local<Context> Debug::GetDebugContext(Isolate* isolate) { | 8302 Local<Context> Debug::GetDebugContext(Isolate* isolate) { |
| 8331 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 8303 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 8332 ENTER_V8(i_isolate); | 8304 ENTER_V8(i_isolate); |
| 8333 return Utils::ToLocal(i_isolate->debug()->GetDebugContext()); | 8305 return Utils::ToLocal(i_isolate->debug()->GetDebugContext()); |
| 8334 } | 8306 } |
| 8335 | 8307 |
| 8336 | 8308 |
| 8337 Local<Context> Debug::GetDebugContext() { | |
| 8338 return GetDebugContext(reinterpret_cast<Isolate*>(i::Isolate::Current())); | |
| 8339 } | |
| 8340 | |
| 8341 MaybeLocal<Context> Debug::GetDebuggedContext(Isolate* isolate) { | 8309 MaybeLocal<Context> Debug::GetDebuggedContext(Isolate* isolate) { |
| 8342 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); | 8310 i::Isolate* i_isolate = reinterpret_cast<i::Isolate*>(isolate); |
| 8343 ENTER_V8(i_isolate); | 8311 ENTER_V8(i_isolate); |
| 8344 if (!i_isolate->debug()->in_debug_scope()) return MaybeLocal<Context>(); | 8312 if (!i_isolate->debug()->in_debug_scope()) return MaybeLocal<Context>(); |
| 8345 i::Handle<i::Object> calling = i_isolate->GetCallingNativeContext(); | 8313 i::Handle<i::Object> calling = i_isolate->GetCallingNativeContext(); |
| 8346 if (calling.is_null()) return MaybeLocal<Context>(); | 8314 if (calling.is_null()) return MaybeLocal<Context>(); |
| 8347 return Utils::ToLocal(i::Handle<i::Context>::cast(calling)); | 8315 return Utils::ToLocal(i::Handle<i::Context>::cast(calling)); |
| 8348 } | 8316 } |
| 8349 | 8317 |
| 8350 void Debug::SetLiveEditEnabled(Isolate* isolate, bool enable) { | 8318 void Debug::SetLiveEditEnabled(Isolate* isolate, bool enable) { |
| (...skipping 693 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9044 Address callback_address = | 9012 Address callback_address = |
| 9045 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 9013 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
| 9046 VMState<EXTERNAL> state(isolate); | 9014 VMState<EXTERNAL> state(isolate); |
| 9047 ExternalCallbackScope call_scope(isolate, callback_address); | 9015 ExternalCallbackScope call_scope(isolate, callback_address); |
| 9048 callback(info); | 9016 callback(info); |
| 9049 } | 9017 } |
| 9050 | 9018 |
| 9051 | 9019 |
| 9052 } // namespace internal | 9020 } // namespace internal |
| 9053 } // namespace v8 | 9021 } // namespace v8 |
| OLD | NEW |