| Index: src/debug.cc
 | 
| diff --git a/src/debug.cc b/src/debug.cc
 | 
| index 25be003f707c06a068ec7f84813e0b8eb3790e24..dbbfe7e76f4e6956bffad2d5d17e970ecda6582c 100644
 | 
| --- a/src/debug.cc
 | 
| +++ b/src/debug.cc
 | 
| @@ -646,11 +646,10 @@ void ScriptCache::Add(Handle<Script> script) {
 | 
|    // Globalize the script object, make it weak and use the location of the
 | 
|    // global handle as the value in the hash map.
 | 
|    Handle<Script> script_ =
 | 
| -      Handle<Script>::cast(
 | 
| -          (global_handles->Create(*script)));
 | 
| -  global_handles->MakeWeak(reinterpret_cast<Object**>(script_.location()),
 | 
| -                           this,
 | 
| -                           ScriptCache::HandleWeakScript);
 | 
| +      Handle<Script>::cast(global_handles->Create(*script));
 | 
| +  GlobalHandles::MakeWeak(reinterpret_cast<Object**>(script_.location()),
 | 
| +                          this,
 | 
| +                          ScriptCache::HandleWeakScript);
 | 
|    entry->value = script_.location();
 | 
|  }
 | 
|  
 | 
| @@ -680,36 +679,37 @@ void ScriptCache::ProcessCollectedScripts() {
 | 
|  
 | 
|  
 | 
|  void ScriptCache::Clear() {
 | 
| -  GlobalHandles* global_handles = isolate_->global_handles();
 | 
|    // Iterate the script cache to get rid of all the weak handles.
 | 
|    for (HashMap::Entry* entry = Start(); entry != NULL; entry = Next(entry)) {
 | 
|      ASSERT(entry != NULL);
 | 
|      Object** location = reinterpret_cast<Object**>(entry->value);
 | 
|      ASSERT((*location)->IsScript());
 | 
| -    global_handles->ClearWeakness(location);
 | 
| -    global_handles->Destroy(location);
 | 
| +    GlobalHandles::ClearWeakness(location);
 | 
| +    GlobalHandles::Destroy(location);
 | 
|    }
 | 
|    // Clear the content of the hash map.
 | 
|    HashMap::Clear();
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void ScriptCache::HandleWeakScript(v8::Isolate* isolate,
 | 
| -                                   v8::Persistent<v8::Value>* obj,
 | 
| -                                   void* data) {
 | 
| -  ScriptCache* script_cache = reinterpret_cast<ScriptCache*>(data);
 | 
| -  // Find the location of the global handle.
 | 
| -  Script** location =
 | 
| -      reinterpret_cast<Script**>(Utils::OpenPersistent(*obj).location());
 | 
| -  ASSERT((*location)->IsScript());
 | 
| +void ScriptCache::HandleWeakScript(
 | 
| +    const v8::WeakCallbackData<v8::Value, void>& data) {
 | 
| +  // Retrieve the script identifier.
 | 
| +  Handle<Object> object = Utils::OpenHandle(*data.GetValue());
 | 
| +  int id = Handle<Script>::cast(object)->id()->value();
 | 
| +  void* key = reinterpret_cast<void*>(id);
 | 
| +  uint32_t hash = Hash(id);
 | 
|  
 | 
| -  // Remove the entry from the cache.
 | 
| -  int id = (*location)->id()->value();
 | 
| -  script_cache->Remove(reinterpret_cast<void*>(id), Hash(id));
 | 
| +  // Remove the corresponding entry from the cache.
 | 
| +  ScriptCache* script_cache =
 | 
| +      reinterpret_cast<ScriptCache*>(data.GetParameter());
 | 
| +  HashMap::Entry* entry = script_cache->Lookup(key, hash, false);
 | 
| +  Object** location = reinterpret_cast<Object**>(entry->value);
 | 
| +  script_cache->Remove(key, hash);
 | 
|    script_cache->collected_scripts_.Add(id);
 | 
|  
 | 
|    // Clear the weak handle.
 | 
| -  obj->Reset();
 | 
| +  GlobalHandles::Destroy(location);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -728,11 +728,11 @@ void Debug::SetUp(bool create_heap_objects) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void Debug::HandleWeakDebugInfo(v8::Isolate* isolate,
 | 
| -                                v8::Persistent<v8::Value>* obj,
 | 
| -                                void* data) {
 | 
| -  Debug* debug = reinterpret_cast<Isolate*>(isolate)->debug();
 | 
| -  DebugInfoListNode* node = reinterpret_cast<DebugInfoListNode*>(data);
 | 
| +void Debug::HandleWeakDebugInfo(
 | 
| +    const v8::WeakCallbackData<v8::Value, void>& data) {
 | 
| +  Debug* debug = reinterpret_cast<Isolate*>(data.GetIsolate())->debug();
 | 
| +  DebugInfoListNode* node =
 | 
| +      reinterpret_cast<DebugInfoListNode*>(data.GetParameter());
 | 
|    // We need to clear all breakpoints associated with the function to restore
 | 
|    // original code and avoid patching the code twice later because
 | 
|    // the function will live in the heap until next gc, and can be found by
 | 
| @@ -741,29 +741,27 @@ void Debug::HandleWeakDebugInfo(v8::Isolate* isolate,
 | 
|    it.ClearAllDebugBreak();
 | 
|    debug->RemoveDebugInfo(node->debug_info());
 | 
|  #ifdef DEBUG
 | 
| -  node = debug->debug_info_list_;
 | 
| -  while (node != NULL) {
 | 
| -    ASSERT(node != reinterpret_cast<DebugInfoListNode*>(data));
 | 
| -    node = node->next();
 | 
| +  for (DebugInfoListNode* n = debug->debug_info_list_;
 | 
| +       n != NULL;
 | 
| +       n = n->next()) {
 | 
| +    ASSERT(n != node);
 | 
|    }
 | 
|  #endif
 | 
|  }
 | 
|  
 | 
|  
 | 
|  DebugInfoListNode::DebugInfoListNode(DebugInfo* debug_info): next_(NULL) {
 | 
| -  GlobalHandles* global_handles = debug_info->GetIsolate()->global_handles();
 | 
|    // Globalize the request debug info object and make it weak.
 | 
| -  debug_info_ = Handle<DebugInfo>::cast(
 | 
| -      (global_handles->Create(debug_info)));
 | 
| -  global_handles->MakeWeak(reinterpret_cast<Object**>(debug_info_.location()),
 | 
| -                           this,
 | 
| -                           Debug::HandleWeakDebugInfo);
 | 
| +  GlobalHandles* global_handles = debug_info->GetIsolate()->global_handles();
 | 
| +  debug_info_ = Handle<DebugInfo>::cast(global_handles->Create(debug_info));
 | 
| +  GlobalHandles::MakeWeak(reinterpret_cast<Object**>(debug_info_.location()),
 | 
| +                          this,
 | 
| +                          Debug::HandleWeakDebugInfo);
 | 
|  }
 | 
|  
 | 
|  
 | 
|  DebugInfoListNode::~DebugInfoListNode() {
 | 
| -  debug_info_->GetIsolate()->global_handles()->Destroy(
 | 
| -      reinterpret_cast<Object**>(debug_info_.location()));
 | 
| +  GlobalHandles::Destroy(reinterpret_cast<Object**>(debug_info_.location()));
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -921,8 +919,7 @@ void Debug::Unload() {
 | 
|    DestroyScriptCache();
 | 
|  
 | 
|    // Clear debugger context global handle.
 | 
| -  isolate_->global_handles()->Destroy(
 | 
| -      reinterpret_cast<Object**>(debug_context_.location()));
 | 
| +  GlobalHandles::Destroy(reinterpret_cast<Object**>(debug_context_.location()));
 | 
|    debug_context_ = Handle<Context>();
 | 
|  }
 | 
|  
 | 
| @@ -3249,12 +3246,12 @@ void Debugger::SetEventListener(Handle<Object> callback,
 | 
|    // Clear the global handles for the event listener and the event listener data
 | 
|    // object.
 | 
|    if (!event_listener_.is_null()) {
 | 
| -    global_handles->Destroy(
 | 
| +    GlobalHandles::Destroy(
 | 
|          reinterpret_cast<Object**>(event_listener_.location()));
 | 
|      event_listener_ = Handle<Object>();
 | 
|    }
 | 
|    if (!event_listener_data_.is_null()) {
 | 
| -    global_handles->Destroy(
 | 
| +    GlobalHandles::Destroy(
 | 
|          reinterpret_cast<Object**>(event_listener_data_.location()));
 | 
|      event_listener_data_ = Handle<Object>();
 | 
|    }
 | 
| 
 |