Chromium Code Reviews| Index: src/api.cc |
| diff --git a/src/api.cc b/src/api.cc |
| index 9e242382c3fec54e159b723aa51c516dc8cee6f1..46cb303ebc180e06c15bdbd7aa7076c54037f1eb 100644 |
| --- a/src/api.cc |
| +++ b/src/api.cc |
| @@ -9085,6 +9085,41 @@ bool debug::HasNonBlackboxedFrameOnStack(Isolate* v8_isolate) { |
| return false; |
| } |
| +Local<debug::BreakPoint> debug::BreakPoint::New(Isolate* v8_isolate, |
| + Local<Value> condition, |
| + Local<Value> data) { |
| + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
| + ENTER_V8(isolate); |
| + i::HandleScope handle_scope(isolate); |
| + i::Handle<i::Object> condition_obj = Utils::OpenHandle(*condition); |
|
Yang
2017/02/15 13:21:10
Can we limit the condition to strings only? empty
kozy
2017/02/15 16:21:33
Done.
|
| + i::Handle<i::Object> data_obj = Utils::OpenHandle(*data); |
| + i::Handle<i::BreakPoint> break_point = |
| + isolate->factory()->NewBreakPoint(condition_obj, data_obj); |
| + return ToApiHandle<debug::BreakPoint>( |
| + handle_scope.CloseAndEscape(break_point)); |
| +} |
| + |
| +MaybeLocal<debug::BreakPoint> debug::BreakPoint::Cast( |
| + Isolate* v8_isolate, v8::Local<v8::Value> value) { |
| + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
| + ENTER_V8(isolate); |
| + i::HandleScope handle_scope(isolate); |
| + i::Handle<i::Object> break_point_obj = Utils::OpenHandle(*value); |
| + if (!break_point_obj->IsBreakPoint()) return MaybeLocal<debug::BreakPoint>(); |
| + i::Handle<i::BreakPoint> break_point(i::BreakPoint::cast(*break_point_obj), |
| + isolate); |
| + return ToApiHandle<debug::BreakPoint>( |
| + handle_scope.CloseAndEscape(break_point)); |
| +} |
| + |
| +v8::Local<v8::Value> debug::BreakPoint::Data() const { |
| + i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); |
| + i::HandleScope handle_scope(isolate); |
| + i::Handle<i::BreakPoint> break_point = Utils::OpenHandle(this); |
| + i::Handle<i::Object> data_obj(break_point->data(), isolate); |
| + return Utils::ToLocal(handle_scope.CloseAndEscape(data_obj)); |
| +} |
| + |
| v8::Isolate* debug::Script::GetIsolate() const { |
| return reinterpret_cast<v8::Isolate*>(Utils::OpenHandle(this)->GetIsolate()); |
| } |
| @@ -9239,11 +9274,30 @@ bool debug::Script::GetPossibleBreakpoints( |
| return true; |
| } |
| +debug::Location debug::Script::SetBreakPoint( |
| + const debug::Location& position, |
| + Local<debug::BreakPoint> break_point) const { |
| + i::Handle<i::Script> script = Utils::OpenHandle(this); |
| + i::Isolate* isolate = script->GetIsolate(); |
| + int offset = GetSourcePosition(position); |
| + i::Handle<i::BreakPoint> break_point_obj = Utils::OpenHandle(*break_point); |
| + int result_offset = offset; |
| + if (!isolate->debug()->SetBreakPointForScript( |
| + script, break_point_obj, &result_offset, i::BREAK_POSITION_ALIGNED)) { |
| + return debug::Location(); |
| + } |
| + i::Script::PositionInfo info; |
| + i::Script::GetPositionInfo(script, result_offset, &info, |
| + i::Script::WITH_OFFSET); |
| + return debug::Location(info.line, info.column); |
| +} |
| + |
| int debug::Script::GetSourcePosition(const debug::Location& location) const { |
| i::Handle<i::Script> script = Utils::OpenHandle(this); |
| if (script->type() == i::Script::TYPE_WASM) { |
| - // TODO(clemensh): Return the proper thing for wasm. |
| - return 0; |
| + return i::WasmCompiledModule::cast(script->wasm_compiled_module()) |
| + ->GetFunctionOffset(location.GetLineNumber()) + |
| + location.GetColumnNumber(); |
| } |
| int line = std::max(location.GetLineNumber() - script->line_offset(), 0); |
| @@ -9317,6 +9371,14 @@ debug::WasmDisassembly debug::WasmScript::DisassembleFunction( |
| return compiled_module->DisassembleFunction(function_index); |
| } |
| +void debug::ClearBreakPoint(v8::Isolate* v8_isolate, |
| + Local<BreakPoint> break_point) { |
| + i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate); |
| + ENTER_V8(isolate); |
| + i::Handle<i::Object> break_point_obj = Utils::OpenHandle(*break_point); |
| + isolate->debug()->ClearBreakPoint(break_point_obj); |
| +} |
| + |
| debug::Location::Location(int line_number, int column_number) |
| : line_number_(line_number), column_number_(column_number) { |
| CHECK(line_number >= 0); |
| @@ -9338,7 +9400,8 @@ int debug::Location::GetColumnNumber() const { |
| } |
| bool debug::Location::IsEmpty() const { |
| - return line_number_ == -1 && column_number_ == -1; |
| + return line_number_ == v8::Function::kLineOffsetNotFound && |
| + column_number_ == v8::Function::kLineOffsetNotFound; |
| } |
| void debug::GetLoadedScripts(v8::Isolate* v8_isolate, |