Reviewers: Søren Gjesse, Description: Added API for getting object mirrors Added Debug::GetMirror call to get a mirror for a given object.
Please review this at http://codereview.chromium.org/172045 Affected files: M include/v8-debug.h M src/api.cc M test/cctest/test-debug.cc Index: include/v8-debug.h diff --git a/include/v8-debug.h b/include/v8-debug.h index 345d331a12f95132b76199ae9a5ed3e15ff02e34..3c5c923b3d580971fe7e6f266fea0d86735428a1 100644 --- a/include/v8-debug.h +++ b/include/v8-debug.h @@ -228,9 +228,14 @@ class EXPORT Debug { * } * \endcode */ - static Handle<Value> Call(v8::Handle<v8::Function> fun, + static Local<Value> Call(v8::Handle<v8::Function> fun, Handle<Value> data = Handle<Value>()); + /** + * Returns a mirror object for the given object. + */ + static Local<Value> GetMirror(v8::Handle<v8::Value> obj); + /** * Enable the V8 builtin debug agent. The debugger agent will listen on the * supplied TCP/IP port for remote debugger connection. Index: src/api.cc diff --git a/src/api.cc b/src/api.cc index c6068214de3368e0f2b26d8126aca5983969826f..23f934751ebfbb4c1787b6c0d745655b5c7b2c25 100644 --- a/src/api.cc +++ b/src/api.cc @@ -3595,10 +3595,10 @@ void Debug::SetHostDispatchHandler(HostDispatchHandler handler, } -Handle<Value> Debug::Call(v8::Handle<v8::Function> fun, - v8::Handle<v8::Value> data) { - if (!i::V8::IsRunning()) return Handle<Value>(); - ON_BAILOUT("v8::Debug::Call()", return Handle<Value>()); +Local<Value> Debug::Call(v8::Handle<v8::Function> fun, + v8::Handle<v8::Value> data) { + if (!i::V8::IsRunning()) return Local<Value>(); + ON_BAILOUT("v8::Debug::Call()", return Local<Value>()); ENTER_V8; i::Handle<i::Object> result; EXCEPTION_PREAMBLE(); @@ -3616,6 +3616,28 @@ Handle<Value> Debug::Call(v8::Handle<v8::Function> fun, } +Local<Value> Debug::GetMirror(v8::Handle<v8::Value> obj) { + if (!i::V8::IsRunning()) return Local<Value>(); + ON_BAILOUT("v8::Debug::GetMirror()", return Local<Value>()); + ENTER_V8; + v8::HandleScope scope; + i::Debug::Load(); + i::Handle<i::JSObject> debug(i::Debug::debug_context()->global()); + i::Handle<i::String> name = i::Factory::LookupAsciiSymbol("MakeMirror"); + i::Handle<i::Object> fun_obj = i::GetProperty(debug, name); + i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(fun_obj); + v8::Handle<v8::Function> v8_fun = Utils::ToLocal(fun); + const int kArgc = 1; + v8::Handle<v8::Value> argv[kArgc] = { obj }; + EXCEPTION_PREAMBLE(); + v8::Handle<v8::Value> result = v8_fun->Call(Utils::ToLocal(debug), + kArgc, + argv); + EXCEPTION_BAILOUT_CHECK(Local<Value>()); + return scope.Close(result); +} + + bool Debug::EnableAgent(const char* name, int port) { return i::Debugger::StartAgent(name, port); } Index: test/cctest/test-debug.cc diff --git a/test/cctest/test-debug.cc b/test/cctest/test-debug.cc index 9e2c38dbeeda4eae13a9fd83bc7df966e9eaefea..a86317ad3861582b9a0e62fc4fe41018f8dd7d9c 100644 --- a/test/cctest/test-debug.cc +++ b/test/cctest/test-debug.cc @@ -5357,3 +5357,20 @@ TEST(NoDebugBreakInAfterCompileMessageHandler) { v8::Debug::SetMessageHandler2(NULL); CheckDebuggerUnloaded(); } + + +TEST(GetMirror) { + v8::HandleScope scope; + DebugLocalContext env; + v8::Handle<v8::Value> obj = v8::Debug::GetMirror(v8::String::New("hodja")); + v8::Handle<v8::Function> run_test = v8::Handle<v8::Function>::Cast( + v8::Script::New( + v8::String::New( + "function runTest(mirror) {" + " return mirror.isString() && (mirror.length() == 5);" + "}" + "" + "runTest;"))->Run()); + v8::Handle<v8::Value> result = run_test->Call(env->Global(), 1, &obj); + CHECK(result->IsTrue()); +} --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
