| Index: src/i18n.cc
 | 
| diff --git a/src/i18n.cc b/src/i18n.cc
 | 
| index 80a739c285e16c6973116edd15cffe54fcabfe66..f340cc0bcf1e9524584b221186c9604a7fe6ea6d 100644
 | 
| --- a/src/i18n.cc
 | 
| +++ b/src/i18n.cc
 | 
| @@ -864,15 +864,24 @@ icu::SimpleDateFormat* DateFormat::UnpackDateFormat(
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void DateFormat::DeleteDateFormat(v8::Isolate* isolate,
 | 
| -                                  Persistent<v8::Value>* object,
 | 
| -                                  void* param) {
 | 
| -  // First delete the hidden C++ object.
 | 
| -  delete reinterpret_cast<icu::SimpleDateFormat*>(Handle<JSObject>::cast(
 | 
| -      v8::Utils::OpenPersistent(object))->GetInternalField(0));
 | 
| -
 | 
| -  // Then dispose of the persistent handle to JS object.
 | 
| -  object->Reset();
 | 
| +template<class T>
 | 
| +void DeleteNativeObjectAt(const v8::WeakCallbackData<v8::Value, void>& data,
 | 
| +                          int index) {
 | 
| +  v8::Local<v8::Object> obj = v8::Handle<v8::Object>::Cast(data.GetValue());
 | 
| +  delete reinterpret_cast<T*>(obj->GetAlignedPointerFromInternalField(index));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +static void DestroyGlobalHandle(
 | 
| +    const v8::WeakCallbackData<v8::Value, void>& data) {
 | 
| +  GlobalHandles::Destroy(reinterpret_cast<Object**>(data.GetParameter()));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +void DateFormat::DeleteDateFormat(
 | 
| +    const v8::WeakCallbackData<v8::Value, void>& data) {
 | 
| +  DeleteNativeObjectAt<icu::SimpleDateFormat>(data, 0);
 | 
| +  DestroyGlobalHandle(data);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -928,15 +937,10 @@ icu::DecimalFormat* NumberFormat::UnpackNumberFormat(
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void NumberFormat::DeleteNumberFormat(v8::Isolate* isolate,
 | 
| -                                      Persistent<v8::Value>* object,
 | 
| -                                      void* param) {
 | 
| -  // First delete the hidden C++ object.
 | 
| -  delete reinterpret_cast<icu::DecimalFormat*>(Handle<JSObject>::cast(
 | 
| -      v8::Utils::OpenPersistent(object))->GetInternalField(0));
 | 
| -
 | 
| -  // Then dispose of the persistent handle to JS object.
 | 
| -  object->Reset();
 | 
| +void NumberFormat::DeleteNumberFormat(
 | 
| +    const v8::WeakCallbackData<v8::Value, void>& data) {
 | 
| +  DeleteNativeObjectAt<icu::DecimalFormat>(data, 0);
 | 
| +  DestroyGlobalHandle(data);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -989,15 +993,10 @@ icu::Collator* Collator::UnpackCollator(Isolate* isolate,
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void Collator::DeleteCollator(v8::Isolate* isolate,
 | 
| -                              Persistent<v8::Value>* object,
 | 
| -                              void* param) {
 | 
| -  // First delete the hidden C++ object.
 | 
| -  delete reinterpret_cast<icu::Collator*>(Handle<JSObject>::cast(
 | 
| -      v8::Utils::OpenPersistent(object))->GetInternalField(0));
 | 
| -
 | 
| -  // Then dispose of the persistent handle to JS object.
 | 
| -  object->Reset();
 | 
| +void Collator::DeleteCollator(
 | 
| +    const v8::WeakCallbackData<v8::Value, void>& data) {
 | 
| +  DeleteNativeObjectAt<icu::Collator>(data, 0);
 | 
| +  DestroyGlobalHandle(data);
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -1053,18 +1052,11 @@ icu::BreakIterator* BreakIterator::UnpackBreakIterator(Isolate* isolate,
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void BreakIterator::DeleteBreakIterator(v8::Isolate* isolate,
 | 
| -                                        Persistent<v8::Value>* object,
 | 
| -                                        void* param) {
 | 
| -  // First delete the hidden C++ object.
 | 
| -  delete reinterpret_cast<icu::BreakIterator*>(Handle<JSObject>::cast(
 | 
| -      v8::Utils::OpenPersistent(object))->GetInternalField(0));
 | 
| -
 | 
| -  delete reinterpret_cast<icu::UnicodeString*>(Handle<JSObject>::cast(
 | 
| -      v8::Utils::OpenPersistent(object))->GetInternalField(1));
 | 
| -
 | 
| -  // Then dispose of the persistent handle to JS object.
 | 
| -  object->Reset();
 | 
| +void BreakIterator::DeleteBreakIterator(
 | 
| +    const v8::WeakCallbackData<v8::Value, void>& data) {
 | 
| +  DeleteNativeObjectAt<icu::BreakIterator>(data, 0);
 | 
| +  DeleteNativeObjectAt<icu::UnicodeString>(data, 1);
 | 
| +  DestroyGlobalHandle(data);
 | 
|  }
 | 
|  
 | 
|  } }  // namespace v8::internal
 | 
| 
 |