Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(148)

Unified Diff: Source/bindings/dart/DartDebugServer.cpp

Issue 18169002: Improve Dart Debugger performance and robustness by creating Dart wrappers using the standard SetNa… (Closed) Base URL: svn://svn.chromium.org/multivm/trunk/webkit
Patch Set: code review fixes Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/bindings/dart/DartDebugServer.cpp
diff --git a/Source/bindings/dart/DartDebugServer.cpp b/Source/bindings/dart/DartDebugServer.cpp
index 67500c6b6b94b64c7902e90bbb23625d00c033e6..df6894c694ab1245d0560e71b71a292cc459529c 100644
--- a/Source/bindings/dart/DartDebugServer.cpp
+++ b/Source/bindings/dart/DartDebugServer.cpp
@@ -44,11 +44,13 @@
#include "core/inspector/InstrumentingAgents.h"
#include "core/page/DOMWindow.h"
#include "core/page/Page.h"
+#include "core/platform/Logging.h"
#include <v8-debug.h>
#include <wtf/HashMap.h>
#include <wtf/Vector.h>
+
namespace WebCore {
class V8EventDetails : public v8::Debug::EventDetails {
@@ -190,13 +192,6 @@ void DartDebugServer::disable()
disable->Call(m_dartDebugObject.get(), 0, 0);
}
-v8::Handle<v8::Value> DartDebugServer::convertInspectedValue(Dart_Handle object)
-{
- v8::Handle<v8::Function> wrapValue = v8::Handle<v8::Function>::Cast(shared().m_dartDebugObject.get()->Get(v8::String::New("wrapValue")));
- v8::Handle<v8::Value> args[] = { DartHandleProxy::create(object) };
- return wrapValue->Call(shared().m_dartDebugObject.get(), 1, args);
-}
-
v8::Handle<v8::Object> DartDebugServer::createExecutionState(Dart_StackTrace trace)
{
intptr_t length = 0;
@@ -204,6 +199,9 @@ v8::Handle<v8::Object> DartDebugServer::createExecutionState(Dart_StackTrace tra
ASSERT(!Dart_IsError(result));
UNUSED_PARAM(result);
ASSERT(length);
+ ASSERT(Dart_CurrentIsolate());
+ int isolateHandle = isolateMap().getByValue(Dart_CurrentIsolate());
+
v8::Local<v8::Array> callFrames = v8::Array::New(length);
for (int i = length - 1; i >=0; --i) {
Dart_ActivationFrame frame = 0;
@@ -213,15 +211,21 @@ v8::Handle<v8::Object> DartDebugServer::createExecutionState(Dart_StackTrace tra
Dart_Handle scriptURL = 0;
intptr_t lineNumber = 0;
intptr_t libraryId = 0;
+
result = Dart_ActivationFrameInfo(frame, &functionName, &scriptURL, &lineNumber, &libraryId);
ASSERT(!Dart_IsError(result));
+ Dart_Handle libraryURL = Dart_GetLibraryURL(libraryId);
+ ASSERT(!Dart_IsError(libraryURL));
+ Dart_Handle library = Dart_LookupLibrary(libraryURL);
v8::Local<v8::Object> callFrame = v8::Object::New();
callFrame->Set(v8::String::New("functionName"), V8Converter::stringToV8(functionName));
callFrame->Set(v8::String::New("scriptURL"), V8Converter::stringToV8(scriptURL));
callFrame->Set(v8::String::New("lineNumber"), v8::Number::New(lineNumber - 1));
- callFrame->Set(v8::String::New("libraryProxy"), DartHandleProxy::createForLibrary(libraryId));
- callFrame->Set(v8::String::New("localVariables"), convertInspectedValue(Dart_GetLocalVariables(frame)));
+ callFrame->Set(v8::String::New("libraryProxy"), DartHandleProxy::createLibraryProxy(library, libraryId, Dart_Null()));
+ callFrame->Set(v8::String::New("localScopeProxy"), DartHandleProxy::createLocalScopeProxy(
+ Dart_GetLocalVariables(frame)));
+ callFrame->Set(v8::String::New("isolateHandle"), v8::Number::New(isolateHandle));
callFrames->Set(i, callFrame);
}
@@ -253,7 +257,7 @@ void DartDebugServer::handleException(Dart_Handle exception, Dart_StackTrace tra
V8Scope v8Scope(v8::Debug::GetDebugContext());
V8Scope v8WorldScope(DartUtilities::currentV8Context());
v8::Handle<v8::Function> eventDataConstructor = v8::Local<v8::Function>::Cast(m_dartDebugObject.get()->Get(v8::String::New("EventData")));
- v8::Handle<v8::Value> args[] = { convertInspectedValue(exception) };
+ v8::Handle<v8::Value> args[] = { DartHandleProxy::create(exception) };
v8::Handle<v8::Object> eventData = v8::Local<v8::Object>::Cast(eventDataConstructor->CallAsConstructor(1, args));
V8EventDetails eventDetails(v8::Exception, createExecutionState(trace), eventData);
PageScriptDebugServer::shared().handleV8DebugEvent(eventDetails);
@@ -408,87 +412,23 @@ static v8::Handle<v8::Value> evaluateInScope(const v8::Arguments& args)
{
v8::Handle<v8::String> expression = args[0]->ToString();
v8::Handle<v8::Object> receiver = args[1].As<v8::Object>();
- v8::Handle<v8::Value> scopeObject = args[2];
-
- expression = v8::String::Concat(v8::String::New("(function(scopeObject) { with(scopeObject) { return "), expression);
+ v8::Handle<v8::Value> scopeObjectGlobal = args[2];
+ v8::Handle<v8::Value> scopeObjectLocal = args[3];
+ v8::Handle<v8::Value> scopes[] = { scopeObjectGlobal, scopeObjectLocal };
+
+ expression = v8::String::Concat(v8::String::New(
+ "(function($$scopeObjectGlobal, $$scopeObjectLocal) { "
+ "var $$scopeObjectLocalThis = $$scopeObjectLocal.this;"
+ "with ($$scopeObjectGlobal) with ($$scopeObjectLocalThis || {}) with($$scopeObjectLocal) { "
+ "return "),
+ expression);
expression = v8::String::Concat(expression, v8::String::New("} })"));
v8::Handle<v8::Script> script = v8::Script::Compile(expression);
if (script.IsEmpty()) // Return immediately in case of exception to let the caller handle it.
return v8::Handle<v8::Value>();
v8::Handle<v8::Function> function = script->Run().As<v8::Function>();
- return function->Call(receiver, 1, &scopeObject);
-}
-
-static v8::Handle<v8::Value> accessorGetter(v8::Local<v8::String> property, const v8::AccessorInfo& info)
-{
- v8::Handle<v8::Value> getter = info.Data()->ToObject()->Get(v8::String::New("getter"));
- return v8::Handle<v8::Function>::Cast(getter)->Call(v8::Object::New(), 0, 0);
-}
-
-static void accessorSetter(v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
-{
- v8::Handle<v8::Value> setter = info.Data()->ToObject()->Get(v8::String::New("setter"));
- if (!setter->IsUndefined())
- v8::Handle<v8::Function>::Cast(setter)->Call(v8::Object::New(), 1, &value);
-}
-
-static v8::Handle<v8::Value> setAccessor(const v8::Arguments& args)
-{
- v8::Handle<v8::Object> descriptor = v8::Object::New();
- descriptor->Set(v8::String::New("getter"), args[2]);
- descriptor->Set(v8::String::New("setter"), args[3]);
- args[0]->ToObject()->SetAccessor(args[1]->ToString(), accessorGetter, accessorSetter, descriptor);
- return v8::Undefined();
-}
-
-static v8::Handle<v8::Value> indexedGetter(uint32_t index, const v8::AccessorInfo& info)
-{
- v8::Handle<v8::Function> getter = v8::Handle<v8::Function>::Cast(info.Holder()->GetHiddenValue(v8::String::New("getter")));
- v8::Handle<v8::Value> args[] = { v8::Integer::New(index) };
- return getter->Call(info.Holder(), 1, args);
-}
-
-static v8::Handle<v8::Value> indexedSetter(uint32_t index, v8::Local<v8::Value> value, const v8::AccessorInfo& info)
-{
- v8::Handle<v8::Function> setter = v8::Handle<v8::Function>::Cast(info.Holder()->GetHiddenValue(v8::String::New("setter")));
- v8::Handle<v8::Value> args[] = { v8::Integer::New(index), value };
- return setter->Call(info.Holder(), 2, args);
-}
-
-static v8::Handle<v8::Array> indexedEnumerator(const v8::AccessorInfo& info)
-{
- v8::Handle<v8::Function> enumerator = v8::Handle<v8::Function>::Cast(info.Holder()->GetHiddenValue(v8::String::New("enumerator")));
- return enumerator->Call(info.Holder(), 0, 0).As<v8::Array>();
-}
-
-static v8::Handle<v8::Value> createArrayWithIndexedPropertyHandler(const v8::Arguments& args)
-{
- static v8::Persistent<v8::FunctionTemplate> arrayTemplate;
- if (arrayTemplate.IsEmpty()) {
- arrayTemplate = v8::Persistent<v8::FunctionTemplate>::New(args.GetIsolate(), v8::FunctionTemplate::New());
- v8::Local<v8::ObjectTemplate> instanceTemplate = arrayTemplate->InstanceTemplate();
- instanceTemplate->SetIndexedPropertyHandler(&indexedGetter, &indexedSetter, 0, 0, &indexedEnumerator);
- }
-
- v8::Local<v8::Object> array = arrayTemplate->InstanceTemplate()->NewInstance();
- v8::Handle<v8::Value> arrayConstructor = v8::Context::GetCurrent()->Global()->Get(v8::String::New("Array"));
- v8::Handle<v8::Value> arrayPrototype = arrayConstructor.As<v8::Object>()->Get(v8::String::New("prototype"));
- array->Set(v8::String::New("__proto__"), arrayPrototype);
- array->SetHiddenValue(v8::String::New("getter"), args[0]);
- array->SetHiddenValue(v8::String::New("setter"), args[1]);
- array->SetHiddenValue(v8::String::New("enumerator"), args[2]);
- return array;
-}
-
-static v8::Handle<v8::Value> setHiddenValue(const v8::Arguments& args)
-{
- return v8::Boolean::New(args[0]->ToObject()->SetHiddenValue(args[1]->ToString(), args[2]));
-}
-
-static v8::Handle<v8::Value> getHiddenValue(const v8::Arguments& args)
-{
- return args[0]->ToObject()->GetHiddenValue(args[1]->ToString());
+ return function->Call(receiver, 2, scopes);
}
void DartDebugServer::ensureHooksInstalled()
@@ -519,25 +459,7 @@ void DartDebugServer::ensureHooksInstalled()
nativeCallbacks->Set(v8::String::New("stepOver"), v8::FunctionTemplate::New(&stepOver)->GetFunction());
nativeCallbacks->Set(v8::String::New("stepOut"), v8::FunctionTemplate::New(&stepOut)->GetFunction());
nativeCallbacks->Set(v8::String::New("evaluateInScope"), v8::FunctionTemplate::New(&evaluateInScope)->GetFunction());
- nativeCallbacks->Set(v8::String::New("createArrayWithIndexedPropertyHandler"), v8::FunctionTemplate::New(&createArrayWithIndexedPropertyHandler)->GetFunction());
- nativeCallbacks->Set(v8::String::New("setAccessor"), v8::FunctionTemplate::New(&setAccessor)->GetFunction());
- nativeCallbacks->Set(v8::String::New("setHiddenValue"), v8::FunctionTemplate::New(&setHiddenValue)->GetFunction());
- nativeCallbacks->Set(v8::String::New("getHiddenValue"), v8::FunctionTemplate::New(&getHiddenValue)->GetFunction());
- {
- // Trampoline script is required to properly set calling context before
- // invoking Dart code because of security checks in console.log
- // implementation (see InjectedScriptManager::canAccessInspectedWindow).
- V8Scope v8scope;
- v8::Handle<v8::String> trampolineScript = v8::String::New("(function (func, args) { return func.apply(this, args); })");
- v8::Local<v8::Function> trampoline = v8::Local<v8::Function>::Cast(v8::Script::Compile(trampolineScript)->Run());
- nativeCallbacks->Set(v8::String::New("invocationTrampoline"), trampoline);
- }
m_dartDebugObject.get()->Set(v8::String::New("nativeCallbacks"), nativeCallbacks);
-
- v8::Local<v8::Object> mirrorAPI = v8::Object::New();
- DartHandleProxy::getMirrorAPI(mirrorAPI);
- m_dartDebugObject.get()->Set(v8::String::New("mirrorAPI"), mirrorAPI);
-
}
}

Powered by Google App Engine
This is Rietveld 408576698