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

Side by Side Diff: Source/WebCore/bindings/dart/DartUtilities.cpp

Issue 9837116: DOM wrappers that are not retained from Dart should be collected. (Closed) Base URL: svn://svn.chromium.org/multivm/trunk/webkit
Patch Set: Rebased with proper shutdown semantics. Created 8 years, 8 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
OLDNEW
1 // Copyright 2011, Google Inc. 1 // Copyright 2011, 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 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 255
256 static DartDOMData* domDataForIsolate(Dart_Isolate isolate) 256 static DartDOMData* domDataForIsolate(Dart_Isolate isolate)
257 { 257 {
258 IsolateToDartDOMDataMap::iterator it = isolateToDartDOMDataMap().find(isolat e); 258 IsolateToDartDOMDataMap::iterator it = isolateToDartDOMDataMap().find(isolat e);
259 ASSERT(it != isolateToDartDOMDataMap().end()); 259 ASSERT(it != isolateToDartDOMDataMap().end());
260 return it->second; 260 return it->second;
261 } 261 }
262 262
263 static DartDOMData* currentDOMData() 263 static DartDOMData* currentDOMData()
264 { 264 {
265 return domDataForIsolate(DartIsolate::current()->isolate()); 265 return domDataForIsolate(Dart_CurrentIsolate());
266 } 266 }
267 267
268 void DartUtilities::registerDOMIsolate(Dart_Isolate isolate, PassRefPtr<DartAppl icationLoader> applicationLoader, ScriptExecutionContext* context) 268 void DartUtilities::registerDOMIsolate(Dart_Isolate isolate, PassRefPtr<DartAppl icationLoader> applicationLoader, ScriptExecutionContext* context)
269 { 269 {
270 ASSERT(!isolateToDartDOMDataMap().contains(isolate)); 270 ASSERT(!isolateToDartDOMDataMap().contains(isolate));
271 isolateToDartDOMDataMap().set(isolate, new DartDOMData(applicationLoader, co ntext)); 271 isolateToDartDOMDataMap().set(isolate, new DartDOMData(applicationLoader, co ntext));
272 ASSERT(context->isDocument()); 272 ASSERT(context->isDocument());
273 } 273 }
274 274
275 void DartUtilities::registerPureIsolate(Dart_Isolate isolate, PassRefPtr<DartApp licationLoader> applicationLoader) 275 void DartUtilities::registerPureIsolate(Dart_Isolate isolate, PassRefPtr<DartApp licationLoader> applicationLoader)
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 } 375 }
376 376
377 PassRefPtr<ScriptCallStack> DartUtilities::createScriptCallStack() 377 PassRefPtr<ScriptCallStack> DartUtilities::createScriptCallStack()
378 { 378 {
379 // FIXME: wrap current dart call stack as ScriptCallStack. 379 // FIXME: wrap current dart call stack as ScriptCallStack.
380 Vector<ScriptCallFrame> wrappedCallFrames; 380 Vector<ScriptCallFrame> wrappedCallFrames;
381 wrappedCallFrames.append(ScriptCallFrame("undefined", "undefined", 0)); 381 wrappedCallFrames.append(ScriptCallFrame("undefined", "undefined", 0));
382 return ScriptCallStack::create(wrappedCallFrames); 382 return ScriptCallStack::create(wrappedCallFrames);
383 } 383 }
384 384
385 class WeakCallbackData
386 {
387 public:
388 void* peer;
389 Dart_WeakPersistentHandleFinalizer weakCallback;
390 Dart_Handle object;
391 };
392
393 static void weakCallbackWrapper(Dart_Handle object, void* peer)
394 {
395 WeakCallbackData* callbackData = static_cast<WeakCallbackData*>(peer);
396 DartUtilities::domDataForCurrentIsolate()->weakCallbacks()->remove(callbackD ata);
Anton Muhin 2012/03/29 19:18:45 maybe performance FIXME? linear search looks scar
podivilov 2012/03/30 10:36:28 weakCallbacks is HashSet, not vector.
397 (*callbackData->weakCallback)(object, callbackData->peer);
398 delete callbackData;
399 }
400
401 Dart_Handle DartUtilities::createWeakPersistentHandle(Dart_Handle object, void* peer, Dart_WeakPersistentHandleFinalizer weakCallback)
402 {
403 WeakCallbackData* callbackData = new WeakCallbackData;
Anton Muhin 2012/03/29 19:18:45 why not provide a ctor in the class itself?
podivilov 2012/03/30 10:36:28 Done.
404 callbackData->peer = peer;
405 callbackData->weakCallback = weakCallback;
406 callbackData->object = Dart_NewWeakPersistentHandle(object, callbackData, &w eakCallbackWrapper);
407 domDataForCurrentIsolate()->weakCallbacks()->add(callbackData);
408 return callbackData->object;
409 }
410
411 void DartUtilities::disposeWeakPersistentHandles()
412 {
413 DartWeakCallbacks* weakCallbacks = domDataForCurrentIsolate()->weakCallbacks ();
414 for (DartWeakCallbacks::iterator it = weakCallbacks->begin(); it != weakCall backs->end(); ++it) {
415 WeakCallbackData* callbackData = *it;
416 (*callbackData->weakCallback)(callbackData->object, callbackData->peer);
417 delete callbackData;
418 }
419 weakCallbacks->clear();
420 }
421
385 const uint8_t* DartUtilities::fullSnapshot() 422 const uint8_t* DartUtilities::fullSnapshot()
386 { 423 {
387 static const uint8_t snapshotBuffer[] = { 424 static const uint8_t snapshotBuffer[] = {
388 // DartSnapshot.bytes is generated by build system. 425 // DartSnapshot.bytes is generated by build system.
389 #include "DartSnapshot.bytes" 426 #include "DartSnapshot.bytes"
390 }; 427 };
391 return snapshotBuffer; 428 return snapshotBuffer;
392 } 429 }
393 430
394 void DartUtilities::reportProblem(ScriptExecutionContext* context, Dart_Handle r esult) 431 void DartUtilities::reportProblem(ScriptExecutionContext* context, Dart_Handle r esult)
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 ASSERT(!Dart_IsError(library)); 480 ASSERT(!Dart_IsError(library));
444 Dart_Handle args[2] = {0}; 481 Dart_Handle args[2] = {0};
445 args[0] = Dart_NewString(fileName); 482 args[0] = Dart_NewString(fileName);
446 args[1] = Dart_NewInteger(lineNumber); 483 args[1] = Dart_NewInteger(lineNumber);
447 Dart_Handle result = Dart_InvokeStatic(library, Dart_NewString("Utils"), Dar t_NewString("makeNotImplementedException"), 2, args); 484 Dart_Handle result = Dart_InvokeStatic(library, Dart_NewString("Utils"), Dar t_NewString("makeNotImplementedException"), 2, args);
448 ASSERT(!Dart_IsError(result)); 485 ASSERT(!Dart_IsError(result));
449 return result; 486 return result;
450 } 487 }
451 488
452 } 489 }
OLDNEW
« Source/WebCore/bindings/dart/DartDOMWrapper.h ('K') | « Source/WebCore/bindings/dart/DartUtilities.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698