| OLD | NEW |
| 1 // Copyright (c) 2009, Google Inc. | 1 // Copyright (c) 2009, Google Inc. |
| 2 // All rights reserved. | 2 // 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 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 237 // so weak handles strong, see the corresponding logic in | 237 // so weak handles strong, see the corresponding logic in |
| 238 // DartGCController. | 238 // DartGCController. |
| 239 domData->setReachableWeakHandle(Dart_NewWeakPersistentHandle(localHandle
, 0, 0)); | 239 domData->setReachableWeakHandle(Dart_NewWeakPersistentHandle(localHandle
, 0, 0)); |
| 240 | 240 |
| 241 DartDebugServer::shared().registerIsolate(isolate); | 241 DartDebugServer::shared().registerIsolate(isolate); |
| 242 } | 242 } |
| 243 | 243 |
| 244 return isolate; | 244 return isolate; |
| 245 } | 245 } |
| 246 | 246 |
| 247 | |
| 248 void DartController::createDOMEnabledIsolateIfNeeded(const String& scriptURL, co
nst String& entryPoint, Document* document) | 247 void DartController::createDOMEnabledIsolateIfNeeded(const String& scriptURL, co
nst String& entryPoint, Document* document) |
| 249 { | 248 { |
| 250 if (m_isolate) { | 249 if (m_isolate) { |
| 251 Dart_EnterIsolate(m_isolate); | 250 Dart_EnterIsolate(m_isolate); |
| 252 return; | 251 return; |
| 253 } | 252 } |
| 254 | 253 |
| 254 // Start the service. |
| 255 bool result = DartService::Start(document); |
| 256 UNUSED_PARAM(result); |
| 257 ASSERT(result); |
| 258 ASSERT(!Dart_CurrentIsolate()); |
| 259 |
| 255 // FIXME: proper error reporting. | 260 // FIXME: proper error reporting. |
| 256 char* errorMessage = 0; | 261 char* errorMessage = 0; |
| 257 m_isolate = createIsolate(scriptURL.utf8().data(), entryPoint.utf8().data(),
document, true, &errorMessage); | 262 m_isolate = createIsolate(scriptURL.utf8().data(), entryPoint.utf8().data(),
document, true, &errorMessage); |
| 258 ASSERT(m_isolate); | 263 ASSERT(m_isolate); |
| 259 if (getenv("DARTIUM_VMSERVICE")) { | |
| 260 // createIsolate exits with current isolate set to m_isolate, we need to | |
| 261 // exit it so we can startup the service. | |
| 262 Dart_ExitIsolate(); | |
| 263 | |
| 264 bool result = DartService::Start(document); | |
| 265 UNUSED_PARAM(result); | |
| 266 ASSERT(result); | |
| 267 ASSERT(!Dart_CurrentIsolate()); | |
| 268 | |
| 269 Dart_EnterIsolate(m_isolate); | |
| 270 Dart_EnterScope(); | |
| 271 DartService::SendIsolateStartupMessage(); | |
| 272 Dart_ExitScope(); | |
| 273 } | |
| 274 | |
| 275 } | 264 } |
| 276 | 265 |
| 277 void DartController::shutdownIsolate(Dart_Isolate isolate) | 266 void DartController::shutdownIsolate(Dart_Isolate isolate) |
| 278 { | 267 { |
| 279 DartDOMData* domData = DartDOMData::current(); | 268 DartDOMData* domData = DartDOMData::current(); |
| 280 ASSERT(domData->isDOMEnabled()); | 269 ASSERT(domData->isDOMEnabled()); |
| 281 // If the following assert triggers, we have hit dartbug.com/14183 | 270 // If the following assert triggers, we have hit dartbug.com/14183 |
| 282 // FIXME: keep the isolate alive until the recursion level is 0. | 271 // FIXME: keep the isolate alive until the recursion level is 0. |
| 283 ASSERT(!*(domData->recursion())); | 272 ASSERT(!*(domData->recursion())); |
| 284 DartDebugServer::shared().unregisterIsolate(isolate); | 273 DartDebugServer::shared().unregisterIsolate(isolate); |
| 285 DartIsolateDestructionObservers* observers = domData->isolateDestructionObse
rvers(); | 274 DartIsolateDestructionObservers* observers = domData->isolateDestructionObse
rvers(); |
| 286 for (DartIsolateDestructionObservers::iterator it = observers->begin(); it !
= observers->end(); ++it) | 275 for (DartIsolateDestructionObservers::iterator it = observers->begin(); it !
= observers->end(); ++it) |
| 287 (*it)->isolateDestroyed(); | 276 (*it)->isolateDestroyed(); |
| 288 Dart_ShutdownIsolate(); | 277 Dart_ShutdownIsolate(); |
| 289 // Stop the service. | |
| 290 DartService::Stop(); | |
| 291 delete domData; | 278 delete domData; |
| 292 } | 279 } |
| 293 | 280 |
| 294 DartController::DartController(Frame* frame) | 281 DartController::DartController(Frame* frame) |
| 295 : m_frame(frame) | 282 : m_frame(frame) |
| 296 , m_isolate(0) | 283 , m_isolate(0) |
| 297 , m_asyncLoader(0) | 284 , m_asyncLoader(0) |
| 298 , m_npObjectMap() | 285 , m_npObjectMap() |
| 299 { | 286 { |
| 300 // The DartController's constructor must be called in the Frame's | 287 // The DartController's constructor must be called in the Frame's |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 | 390 |
| 404 applicationLoader->load(asyncLoader); | 391 applicationLoader->load(asyncLoader); |
| 405 Dart_IsolateMakeRunnable(m_isolate); | 392 Dart_IsolateMakeRunnable(m_isolate); |
| 406 } | 393 } |
| 407 | 394 |
| 408 private: | 395 private: |
| 409 Dart_Isolate m_isolate; | 396 Dart_Isolate m_isolate; |
| 410 String m_url; | 397 String m_url; |
| 411 }; | 398 }; |
| 412 | 399 |
| 400 |
| 401 Dart_Isolate DartController::createServiceIsolateCallback(void* callbackData, ch
ar** error) |
| 402 { |
| 403 Document* document = static_cast<Document*>(callbackData); |
| 404 Dart_Isolate serviceIsolate = DartController::createIsolate("dart:vmservice_
dartium", "main", document, true, error); |
| 405 Dart_ExitIsolate(); |
| 406 return serviceIsolate; |
| 407 } |
| 408 |
| 409 |
| 413 Dart_Isolate DartController::createPureIsolateCallback(const char* scriptURL, co
nst char* entryPoint, void* data, char** errorMsg) | 410 Dart_Isolate DartController::createPureIsolateCallback(const char* scriptURL, co
nst char* entryPoint, void* data, char** errorMsg) |
| 414 { | 411 { |
| 415 bool isSpawnUri = scriptURL ? true : false; | 412 bool isSpawnUri = scriptURL ? true : false; |
| 416 | 413 |
| 417 if (!isSpawnUri) { | 414 if (!isSpawnUri) { |
| 418 // Determine the parent Isolate's URL as we will be using the same for c
reating | 415 // Determine the parent Isolate's URL as we will be using the same for c
reating |
| 419 // the isolate being spawned using spawnFunction. | 416 // the isolate being spawned using spawnFunction. |
| 420 DartApiScope apiScope; | 417 DartApiScope apiScope; |
| 421 Dart_Handle parentIsolateRootLibrary = Dart_RootLibrary(); | 418 Dart_Handle parentIsolateRootLibrary = Dart_RootLibrary(); |
| 422 if (Dart_IsError(parentIsolateRootLibrary)) { | 419 if (Dart_IsError(parentIsolateRootLibrary)) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 444 // spawnFunction is not allowed from a DOM enabled isolate. | 441 // spawnFunction is not allowed from a DOM enabled isolate. |
| 445 // This triggers an exception in the caller. | 442 // This triggers an exception in the caller. |
| 446 *errorMsg = strdup("spawnFunction is not supported from a dom-enabled is
olate. Please use spawnUri instead."); | 443 *errorMsg = strdup("spawnFunction is not supported from a dom-enabled is
olate. Please use spawnUri instead."); |
| 447 return 0; | 444 return 0; |
| 448 } | 445 } |
| 449 | 446 |
| 450 ASSERT(context->isDocument()); | 447 ASSERT(context->isDocument()); |
| 451 Document* document = static_cast<Document*>(context); | 448 Document* document = static_cast<Document*>(context); |
| 452 | 449 |
| 453 Dart_Isolate isolate = createIsolate(scriptURL, entryPoint, document, false,
errorMsg); | 450 Dart_Isolate isolate = createIsolate(scriptURL, entryPoint, document, false,
errorMsg); |
| 454 { | |
| 455 Dart_EnterScope(); | |
| 456 DartService::SendIsolateStartupMessage(); | |
| 457 Dart_ExitScope(); | |
| 458 } | |
| 459 | 451 |
| 460 if (!isolate) { | 452 if (!isolate) { |
| 461 // This triggers an exception in the caller. | 453 // This triggers an exception in the caller. |
| 462 *errorMsg = strdup("Isolate spawn failed."); | 454 *errorMsg = strdup("Isolate spawn failed."); |
| 463 return 0; | 455 return 0; |
| 464 } | 456 } |
| 465 | 457 |
| 466 // FIXME: If a spawnFunction, we should not need to request resources again.
But, it's not clear | 458 // FIXME: If a spawnFunction, we should not need to request resources again.
But, it's not clear |
| 467 // we need this callback in the first place for spawnFunction. | 459 // we need this callback in the first place for spawnFunction. |
| 468 | 460 |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 | 587 |
| 596 char flagsProp[DartUtilities::PROP_VALUE_MAX_LEN]; | 588 char flagsProp[DartUtilities::PROP_VALUE_MAX_LEN]; |
| 597 int propLen = DartUtilities::getProp( | 589 int propLen = DartUtilities::getProp( |
| 598 "DART_FLAGS", flagsProp, DartUtilities::PROP_VALUE_MAX_LEN); | 590 "DART_FLAGS", flagsProp, DartUtilities::PROP_VALUE_MAX_LEN); |
| 599 if (propLen > 0) { | 591 if (propLen > 0) { |
| 600 setDartFlags(flagsProp); | 592 setDartFlags(flagsProp); |
| 601 } else { | 593 } else { |
| 602 setDartFlags(0); | 594 setDartFlags(0); |
| 603 } | 595 } |
| 604 | 596 |
| 605 // FIXME(antonm): implement proper shutdown callback. | |
| 606 // FIXME(antonm): implement proper unhandled exception callback. | 597 // FIXME(antonm): implement proper unhandled exception callback. |
| 607 Dart_Initialize(&createPureIsolateCallback, 0, 0, DartService::VmServiceShut
downCallback, openFileCallback, readFileCallback, writeFileCallback, closeFileCa
llback, generateEntropy); | 598 Dart_Initialize(&createPureIsolateCallback, 0, 0, 0, openFileCallback, readF
ileCallback, writeFileCallback, closeFileCallback, generateEntropy, createServic
eIsolateCallback); |
| 608 hasBeenInitialized = true; | 599 hasBeenInitialized = true; |
| 609 } | 600 } |
| 610 | 601 |
| 611 static bool checkForExpiration() | 602 static bool checkForExpiration() |
| 612 { | 603 { |
| 613 const time_t ExpirationTimeSecsSinceEpoch = | 604 const time_t ExpirationTimeSecsSinceEpoch = |
| 614 #include "bindings/dart/ExpirationTimeSecsSinceEpoch.time_t" | 605 #include "bindings/dart/ExpirationTimeSecsSinceEpoch.time_t" |
| 615 ; | 606 ; |
| 616 const char* override = getenv("DARTIUM_EXPIRATION_TIME"); | 607 const char* override = getenv("DARTIUM_EXPIRATION_TIME"); |
| 617 time_t expiration; | 608 time_t expiration; |
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 882 Dart_Handle libraryIdHandle = Dart_ListGetAt(libraryIdList, i); | 873 Dart_Handle libraryIdHandle = Dart_ListGetAt(libraryIdList, i); |
| 883 Dart_Handle exception = 0; | 874 Dart_Handle exception = 0; |
| 884 intptr_t libraryId = DartUtilities::toInteger(libraryIdHandle, exception
); | 875 intptr_t libraryId = DartUtilities::toInteger(libraryIdHandle, exception
); |
| 885 ASSERT(!exception); | 876 ASSERT(!exception); |
| 886 DartScriptState* scriptState = lookupScriptStateFromLibraryIdMap(isolate
, v8Context, libraryIdMap, libraryId); | 877 DartScriptState* scriptState = lookupScriptStateFromLibraryIdMap(isolate
, v8Context, libraryIdMap, libraryId); |
| 887 result.append(scriptState); | 878 result.append(scriptState); |
| 888 } | 879 } |
| 889 } | 880 } |
| 890 | 881 |
| 891 } | 882 } |
| OLD | NEW |