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 {
* }
* \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.
......
......@@ -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) {
if (!i::V8::IsRunning()) return Handle<Value>();
ON_BAILOUT("v8::Debug::Call()", return Handle<Value>());
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);
}
......
......@@ -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());
}
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