Added API for getting object mirrors

Added Debug::GetMirror call to get a mirror for a given object.

Review URL: http://codereview.chromium.org/172045


git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2700 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent d87f83c5
...@@ -228,9 +228,14 @@ class EXPORT Debug { ...@@ -228,9 +228,14 @@ class EXPORT Debug {
* } * }
* \endcode * \endcode
*/ */
static Handle<Value> Call(v8::Handle<v8::Function> fun, static Local<Value> Call(v8::Handle<v8::Function> fun,
Handle<Value> data = Handle<Value>()); 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 * Enable the V8 builtin debug agent. The debugger agent will listen on the
* supplied TCP/IP port for remote debugger connection. * supplied TCP/IP port for remote debugger connection.
......
...@@ -3595,10 +3595,10 @@ void Debug::SetHostDispatchHandler(HostDispatchHandler handler, ...@@ -3595,10 +3595,10 @@ void Debug::SetHostDispatchHandler(HostDispatchHandler handler,
} }
Handle<Value> Debug::Call(v8::Handle<v8::Function> fun, Local<Value> Debug::Call(v8::Handle<v8::Function> fun,
v8::Handle<v8::Value> data) { v8::Handle<v8::Value> data) {
if (!i::V8::IsRunning()) return Handle<Value>(); if (!i::V8::IsRunning()) return Local<Value>();
ON_BAILOUT("v8::Debug::Call()", return Handle<Value>()); ON_BAILOUT("v8::Debug::Call()", return Local<Value>());
ENTER_V8; ENTER_V8;
i::Handle<i::Object> result; i::Handle<i::Object> result;
EXCEPTION_PREAMBLE(); EXCEPTION_PREAMBLE();
...@@ -3616,6 +3616,28 @@ Handle<Value> Debug::Call(v8::Handle<v8::Function> fun, ...@@ -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) { bool Debug::EnableAgent(const char* name, int port) {
return i::Debugger::StartAgent(name, port); return i::Debugger::StartAgent(name, port);
} }
......
...@@ -5357,3 +5357,20 @@ TEST(NoDebugBreakInAfterCompileMessageHandler) { ...@@ -5357,3 +5357,20 @@ TEST(NoDebugBreakInAfterCompileMessageHandler) {
v8::Debug::SetMessageHandler2(NULL); v8::Debug::SetMessageHandler2(NULL);
CheckDebuggerUnloaded(); 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());
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment