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

Side by Side Diff: Source/bindings/dart/DartDebugServer.cpp

Issue 23710032: Switch the DevTools to support a true Dart REPL (Closed) Base URL: svn://svn.chromium.org/multivm/trunk/webkit
Patch Set: PTAL Created 7 years, 3 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/bindings/dart/DartDebugHooks.js ('k') | Source/bindings/dart/DartHandleProxy.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved. 2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 void DartDebugServer::disable() 192 void DartDebugServer::disable()
193 { 193 {
194 V8Scope v8Scope(v8::Debug::GetDebugContext()); 194 V8Scope v8Scope(v8::Debug::GetDebugContext());
195 // Only invoke the disable method when Dart code was executed on the page. 195 // Only invoke the disable method when Dart code was executed on the page.
196 if (m_dartDebugObject.isEmpty()) 196 if (m_dartDebugObject.isEmpty())
197 return; 197 return;
198 v8::Local<v8::Function> disable = v8::Local<v8::Function>::Cast(dartDebugObj ect()->Get(v8::String::New("disable"))); 198 v8::Local<v8::Function> disable = v8::Local<v8::Function>::Cast(dartDebugObj ect()->Get(v8::String::New("disable")));
199 disable->Call(dartDebugObject(), 0, 0); 199 disable->Call(dartDebugObject(), 0, 0);
200 } 200 }
201 201
202 bool lookupTokenLineNumber(const Dart_CodeLocation& location, int* lineNumber, i nt* columnNumber)
203 {
204 Dart_Handle info = Dart_ScriptGetTokenInfo(location.library_id, location.scr ipt_url);
205 ASSERT(Dart_IsList(info));
206 intptr_t infoLength = 0;
207 Dart_Handle res = Dart_ListLength(info, &infoLength);
208 ASSERT(!Dart_IsError(res));
209 Dart_Handle elem;
210 bool lineStart = true;
211 int currentLineNumber = 0;
212 for (intptr_t i = 0; i < infoLength; i++) {
213 elem = Dart_ListGetAt(info, i);
214 if (Dart_IsNull(elem)) {
215 lineStart = true;
216 } else {
217 ASSERT(Dart_IsInteger(elem));
218 Dart_Handle exception = 0;
219 int64_t value = DartUtilities::toInteger(elem, exception);
220 ASSERT(!exception);
221 if (lineStart) {
222 // Line number.
223 currentLineNumber = value;
224 lineStart = false;
225 } else {
226 // Token offset.
227 if (value == location.token_pos) {
228 *lineNumber = currentLineNumber;
229 ASSERT(i + 1 < infoLength);
230 *columnNumber = DartUtilities::toInteger(Dart_ListGetAt(info , i + 1), exception);
231 ASSERT(!exception);
232 return true;
233 }
234 i++; // skip columnNumber.
235 }
236 }
237 }
238 return false;
239 }
240
202 v8::Handle<v8::Object> DartDebugServer::createExecutionState(Dart_StackTrace tra ce) 241 v8::Handle<v8::Object> DartDebugServer::createExecutionState(Dart_StackTrace tra ce)
203 { 242 {
204 intptr_t length = 0; 243 intptr_t length = 0;
205 Dart_Handle result = Dart_StackTraceLength(trace, &length); 244 Dart_Handle result = Dart_StackTraceLength(trace, &length);
206 ASSERT(!Dart_IsError(result)); 245 ASSERT(!Dart_IsError(result));
207 UNUSED_PARAM(result); 246 UNUSED_PARAM(result);
208 ASSERT(length); 247 ASSERT(length);
209 ASSERT(Dart_CurrentIsolate()); 248 ASSERT(Dart_CurrentIsolate());
210 int isolateHandle = isolateMap().getByValue(Dart_CurrentIsolate()); 249 int isolateHandle = isolateMap().getByValue(Dart_CurrentIsolate());
211 250
212 v8::Local<v8::Array> callFrames = v8::Array::New(length); 251 v8::Local<v8::Array> callFrames = v8::Array::New(length);
213 for (int i = length - 1; i >=0; --i) { 252 for (int i = length - 1; i >= 0; --i) {
214 Dart_ActivationFrame frame = 0; 253 Dart_ActivationFrame frame = 0;
215 result = Dart_GetActivationFrame(trace, i, &frame); 254 result = Dart_GetActivationFrame(trace, i, &frame);
216 ASSERT(!Dart_IsError(result)); 255 ASSERT(!Dart_IsError(result));
217 Dart_Handle functionName = 0; 256 Dart_Handle functionName = 0;
218 Dart_Handle scriptURL = 0; 257 Dart_Handle function = 0;
219 intptr_t lineNumber = 0;
220 intptr_t libraryId = 0;
221 258
222 result = Dart_ActivationFrameInfo(frame, &functionName, &scriptURL, &lin eNumber, &libraryId); 259 Dart_CodeLocation location;
260 result = Dart_ActivationFrameGetLocation(frame, &functionName, &function , &location);
261 int lineNumber = 0;
262 int columnNumber = 0;
263 lookupTokenLineNumber(location, &lineNumber, &columnNumber);
223 ASSERT(!Dart_IsError(result)); 264 ASSERT(!Dart_IsError(result));
224 Dart_Handle libraryURL = Dart_GetLibraryURL(libraryId); 265 Dart_Handle libraryURL = Dart_GetLibraryURL(location.library_id);
225 ASSERT(!Dart_IsError(libraryURL)); 266 ASSERT(!Dart_IsError(libraryURL));
226 Dart_Handle library = Dart_LookupLibrary(libraryURL); 267 Dart_Handle library = Dart_LookupLibrary(libraryURL);
268 Dart_Handle localVariablesHandle = Dart_GetLocalVariables(frame);
227 269
228 v8::Local<v8::Object> callFrame = v8::Object::New(); 270 v8::Local<v8::Object> callFrame = v8::Object::New();
229 callFrame->Set(v8::String::New("functionName"), V8Converter::stringToV8( functionName)); 271 callFrame->Set(v8::String::New("functionName"), V8Converter::stringToV8( functionName));
230 callFrame->Set(v8::String::New("scriptURL"), V8Converter::stringToV8(scr iptURL)); 272 callFrame->Set(v8::String::New("functionProxy"), DartHandleProxy::create (function));
273 callFrame->Set(v8::String::New("scriptURL"), V8Converter::stringToV8(loc ation.script_url));
231 callFrame->Set(v8::String::New("lineNumber"), v8::Number::New(lineNumber - 1)); 274 callFrame->Set(v8::String::New("lineNumber"), v8::Number::New(lineNumber - 1));
232 callFrame->Set(v8::String::New("libraryProxy"), DartHandleProxy::createL ibraryProxy(library, libraryId, Dart_Null())); 275 callFrame->Set(v8::String::New("columnNumber"), v8::Number::New(columnNu mber - 1));
276 callFrame->Set(v8::String::New("libraryProxy"), DartHandleProxy::createL ibraryProxy(library, location.library_id, Dart_Null()));
233 callFrame->Set(v8::String::New("localScopeProxy"), DartHandleProxy::crea teLocalScopeProxy( 277 callFrame->Set(v8::String::New("localScopeProxy"), DartHandleProxy::crea teLocalScopeProxy(
234 Dart_GetLocalVariables(frame))); 278 localVariablesHandle));
279 callFrame->Set(v8::String::New("localVariables"), DartHandleProxy::creat e(localVariablesHandle));
235 callFrame->Set(v8::String::New("isolateHandle"), v8::Number::New(isolate Handle)); 280 callFrame->Set(v8::String::New("isolateHandle"), v8::Number::New(isolate Handle));
236 callFrames->Set(i, callFrame); 281 callFrames->Set(i, callFrame);
237 } 282 }
238 283
239 ASSERT(!m_dartDebugObject.isEmpty()); 284 ASSERT(!m_dartDebugObject.isEmpty());
240 v8::Handle<v8::Function> executionStateConstructor = v8::Local<v8::Function> ::Cast(dartDebugObject()->Get(v8::String::New("ExecutionState"))); 285 v8::Handle<v8::Function> executionStateConstructor = v8::Local<v8::Function> ::Cast(dartDebugObject()->Get(v8::String::New("ExecutionState")));
241 v8::Handle<v8::Value> args[] = { callFrames }; 286 v8::Handle<v8::Value> args[] = { callFrames };
242 return v8::Local<v8::Object>::Cast(executionStateConstructor->CallAsConstruc tor(1, args)); 287 return v8::Local<v8::Object>::Cast(executionStateConstructor->CallAsConstruc tor(1, args));
243 } 288 }
244 289
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 } 444 }
400 445
401 static void stepOut(const v8::FunctionCallbackInfo<v8::Value>& args) 446 static void stepOut(const v8::FunctionCallbackInfo<v8::Value>& args)
402 { 447 {
403 Dart_SetStepOut(); 448 Dart_SetStepOut();
404 } 449 }
405 450
406 static void evaluateInScope(const v8::FunctionCallbackInfo<v8::Value>& args) 451 static void evaluateInScope(const v8::FunctionCallbackInfo<v8::Value>& args)
407 { 452 {
408 v8::Handle<v8::String> expression = args[0]->ToString(); 453 v8::Handle<v8::String> expression = args[0]->ToString();
409 v8::Handle<v8::Object> receiver = args[1].As<v8::Object>(); 454 v8::Handle<v8::Value> receiver = args[1];
410 v8::Handle<v8::Value> scopeObjectGlobal = args[2]; 455 v8::Handle<v8::Object> functionProxy = args[2].As<v8::Object>();
411 v8::Handle<v8::Value> scopeObjectLocal = args[3]; 456 v8::Handle<v8::Value> localVariablesProxy = args[3];
412 v8::Handle<v8::Value> scopes[] = { scopeObjectGlobal, scopeObjectLocal };
413 457
458 DartScopes scopes(functionProxy);
459 Dart_Handle target = 0;
414 if (receiver->IsNull() || receiver->IsUndefined()) { 460 if (receiver->IsNull() || receiver->IsUndefined()) {
415 // There is no receiver which indicates we are in a static method 461 Dart_Handle functionHandle = scopes.handle;
416 // scope in Dart. We should ignore the receiver for this case. 462 ASSERT(Dart_IsFunction(functionHandle));
417 // Using null or undefined as the receiver for a function triggers 463 target = Dart_FunctionOwner(functionHandle);
418 // asserts in V8 while running in Debug mode if an exception occurs.
419 receiver = v8::Object::New();
420 expression = v8::String::Concat(v8::String::New(
421 "(function($$scopeObjectGlobal, $$scopeObjectLocal) { "
422 "with ($$scopeObjectGlobal) with($$scopeObjectLocal) { "
423 "return "),
424 expression);
425 expression = v8::String::Concat(expression, v8::String::New("} })"));
426 } else { 464 } else {
427 expression = v8::String::Concat(v8::String::New( 465 target = DartHandleProxy::unwrapValue(receiver);
428 "(function($$scopeObjectGlobal, $$scopeObjectLocal) { "
429 "with ($$scopeObjectGlobal) with (this) with($$scopeObjectLocal) { "
430 "return "),
431 expression);
432 expression = v8::String::Concat(expression, v8::String::New("} })"));
433 } 466 }
467 ASSERT(!Dart_IsError(target));
468 Dart_Handle localVariables = DartHandleProxy::unwrapValue(localVariablesProx y);
469 ASSERT(Dart_IsList(localVariables));
470 intptr_t localVariablesLength = 0;
471 Dart_ListLength(localVariables, &localVariablesLength);
434 472
435 v8::TryCatch tryCatch; 473 Dart_Handle wrapExpressionArgs[2] = { V8Converter::stringToDart(expression), localVariables };
436 v8::Handle<v8::Function> function = V8ScriptRunner::compileAndRunInternalScr ipt(expression, args.GetIsolate()).As<v8::Function>();
437 474
438 if (tryCatch.HasCaught()) { 475 Dart_Handle wrappedExpressionTuple =
439 v8SetReturnValue(args, tryCatch.ReThrow()); 476 DartUtilities::invokeUtilsMethod("wrapExpressionAsClosure", 2, wrapExpre ssionArgs);
440 return; 477 ASSERT(Dart_IsList(wrappedExpressionTuple));
478 Dart_Handle wrappedExpression = Dart_ListGetAt(wrappedExpressionTuple, 0);
479 Dart_Handle wrappedExpressionArgs = Dart_ListGetAt(wrappedExpressionTuple, 1 );
480
481 ASSERT(Dart_IsString(wrappedExpression));
482 Dart_Handle closure = Dart_EvaluateExpr(target, wrappedExpression);
483 if (Dart_IsError(closure)) {
484 // There was a parse error. FIXME: consider cleaning up the line
485 // numbers in the error message.
486 V8ThrowException::throwError(v8::String::New(Dart_GetError(closure)));
487 } else {
488 // Invoke the closure passing in the expression arguments specified by
489 // wrappedExpressionTuple.
490 ASSERT(Dart_IsClosure(closure));
491 intptr_t length = 0;
492 Dart_ListLength(wrappedExpressionArgs, &length);
493 Vector<Dart_Handle> dartFunctionArgs;
494 for (uint32_t i = 0; i < length; i ++) {
495 dartFunctionArgs.append(Dart_ListGetAt(wrappedExpressionArgs, i));
496 }
497
498 Dart_Handle result = Dart_InvokeClosure(closure, dartFunctionArgs.size() , dartFunctionArgs.data());
499 if (Dart_IsError(result)) {
500 V8ThrowException::throwError(v8::String::New(Dart_GetError(result))) ;
501 } else {
502 v8SetReturnValue(args, DartHandleProxy::create(result));
503 }
441 } 504 }
442
443 v8::Local<v8::Value> result = V8ScriptRunner::callFunction(
444 function, getScriptExecutionContext(),
445 receiver,
446 2, scopes);
447
448 if (tryCatch.HasCaught()) {
449 v8SetReturnValue(args, tryCatch.ReThrow());
450 return;
451 }
452 crashIfV8IsDead();
453 v8SetReturnValue(args, result);
454 } 505 }
455 506
456 void DartDebugServer::ensureHooksInstalled() 507 void DartDebugServer::ensureHooksInstalled()
457 { 508 {
458 DEFINE_STATIC_LOCAL(bool, hooksInstalled, (false)); 509 DEFINE_STATIC_LOCAL(bool, hooksInstalled, (false));
459 510
460 if (hooksInstalled) 511 if (hooksInstalled)
461 return; 512 return;
462 513
463 hooksInstalled = true; 514 hooksInstalled = true;
(...skipping 16 matching lines...) Expand all
480 nativeCallbacks->Set(v8::String::New("handleDebugEvent"), v8::FunctionTempla te::New(&handleDebugEvent)->GetFunction()); 531 nativeCallbacks->Set(v8::String::New("handleDebugEvent"), v8::FunctionTempla te::New(&handleDebugEvent)->GetFunction());
481 nativeCallbacks->Set(v8::String::New("scriptsForIsolate"), v8::FunctionTempl ate::New(&scriptsForIsolate)->GetFunction()); 532 nativeCallbacks->Set(v8::String::New("scriptsForIsolate"), v8::FunctionTempl ate::New(&scriptsForIsolate)->GetFunction());
482 nativeCallbacks->Set(v8::String::New("setBreakpoint"), v8::FunctionTemplate: :New(&setBreakpoint)->GetFunction()); 533 nativeCallbacks->Set(v8::String::New("setBreakpoint"), v8::FunctionTemplate: :New(&setBreakpoint)->GetFunction());
483 nativeCallbacks->Set(v8::String::New("removeBreakpoint"), v8::FunctionTempla te::New(&removeBreakpoint)->GetFunction()); 534 nativeCallbacks->Set(v8::String::New("removeBreakpoint"), v8::FunctionTempla te::New(&removeBreakpoint)->GetFunction());
484 nativeCallbacks->Set(v8::String::New("getBreakpointLine"), v8::FunctionTempl ate::New(&getBreakpointLine)->GetFunction()); 535 nativeCallbacks->Set(v8::String::New("getBreakpointLine"), v8::FunctionTempl ate::New(&getBreakpointLine)->GetFunction());
485 nativeCallbacks->Set(v8::String::New("setExceptionPauseInfo"), v8::FunctionT emplate::New(&setExceptionPauseInfo)->GetFunction()); 536 nativeCallbacks->Set(v8::String::New("setExceptionPauseInfo"), v8::FunctionT emplate::New(&setExceptionPauseInfo)->GetFunction());
486 nativeCallbacks->Set(v8::String::New("stepInto"), v8::FunctionTemplate::New( &stepInto)->GetFunction()); 537 nativeCallbacks->Set(v8::String::New("stepInto"), v8::FunctionTemplate::New( &stepInto)->GetFunction());
487 nativeCallbacks->Set(v8::String::New("stepOver"), v8::FunctionTemplate::New( &stepOver)->GetFunction()); 538 nativeCallbacks->Set(v8::String::New("stepOver"), v8::FunctionTemplate::New( &stepOver)->GetFunction());
488 nativeCallbacks->Set(v8::String::New("stepOut"), v8::FunctionTemplate::New(& stepOut)->GetFunction()); 539 nativeCallbacks->Set(v8::String::New("stepOut"), v8::FunctionTemplate::New(& stepOut)->GetFunction());
489 nativeCallbacks->Set(v8::String::New("evaluateInScope"), evaluateInScopeFunc tion); 540 nativeCallbacks->Set(v8::String::New("evaluateInScope"), evaluateInScopeFunc tion);
541 {
542 // Trampoline script is required to properly set calling context before
543 // invoking Dart code because of security checks in console.log
544 // implementation (see InjectedScriptManager::canAccessInspectedWindow).
545 V8Scope v8scope;
546 v8::Handle<v8::String> trampolineScript = v8::String::New("(function (fu nc, args) { return func.apply(this, args); })");
547 v8::Local<v8::Function> trampoline = v8::Local<v8::Function>::Cast(v8::S cript::Compile(trampolineScript)->Run());
548 nativeCallbacks->Set(v8::String::New("invocationTrampoline"), trampoline );
549 }
490 dartDebugObject()->Set(v8::String::New("nativeCallbacks"), nativeCallbacks); 550 dartDebugObject()->Set(v8::String::New("nativeCallbacks"), nativeCallbacks);
491 } 551 }
492 552
493 v8::Local<v8::Object> DartDebugServer::dartDebugObject() 553 v8::Local<v8::Object> DartDebugServer::dartDebugObject()
494 { 554 {
495 return m_dartDebugObject.newLocal(v8::Isolate::GetCurrent()); 555 return m_dartDebugObject.newLocal(v8::Isolate::GetCurrent());
496 } 556 }
497 557
498 } 558 }
OLDNEW
« no previous file with comments | « Source/bindings/dart/DartDebugHooks.js ('k') | Source/bindings/dart/DartHandleProxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698