Chromium Code Reviews| Index: src/icu_util.cc |
| diff --git a/src/icu_util.cc b/src/icu_util.cc |
| index 6441dbdd9f5fd98392a720d174fb7b4cebed7510..5ca9dbd5032e7ff8e05ce5544c723b17d9305753 100644 |
| --- a/src/icu_util.cc |
| +++ b/src/icu_util.cc |
| @@ -33,6 +33,7 @@ |
| #if defined(V8_I18N_SUPPORT) |
| #include <stdio.h> |
| +#include <stdlib.h> |
| #include "unicode/putil.h" |
| #include "unicode/udata.h" |
| @@ -49,6 +50,17 @@ namespace v8 { |
| namespace internal { |
| +#if ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE |
| +namespace { |
| +char* g_icu_data_ptr = NULL; |
| + |
| +void free_icu_data_ptr() { |
| + delete[] g_icu_data_ptr; |
| +} |
| + |
| +} // namespace |
| +#endif |
| + |
| bool InitializeICU(const char* icu_data_file) { |
| #if !defined(V8_I18N_SUPPORT) |
| return true; |
| @@ -70,6 +82,8 @@ bool InitializeICU(const char* icu_data_file) { |
| #elif ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_FILE |
| if (!icu_data_file) return false; |
| + if (g_icu_data_ptr) return true; |
| + |
| FILE* inf = fopen(icu_data_file, "rb"); |
| if (!inf) return false; |
| @@ -77,15 +91,19 @@ bool InitializeICU(const char* icu_data_file) { |
| size_t size = ftell(inf); |
| rewind(inf); |
| - char* addr = new char[size]; |
| - if (fread(addr, 1, size, inf) != size) { |
| - delete[] addr; |
| + g_icu_data_ptr = new char[size]; |
| + if (fread(g_icu_data_ptr, 1, size, inf) != size) { |
| + delete[] g_icu_data_ptr; |
| + g_icu_data_ptr = NULL; |
| fclose(inf); |
| return false; |
| } |
| fclose(inf); |
| + |
| + atexit(free_icu_data_ptr); |
|
Sven Panne
2014/03/26 07:44:47
Hmmm, using atexit is always a kind of a hack, and
|
| + |
| UErrorCode err = U_ZERO_ERROR; |
| - udata_setCommonData(reinterpret_cast<void*>(addr), &err); |
| + udata_setCommonData(reinterpret_cast<void*>(g_icu_data_ptr), &err); |
| return err == U_ZERO_ERROR; |
| #endif |
| #endif |