diff options
Diffstat (limited to 'deps/v8/src/icu_util.cc')
-rw-r--r-- | deps/v8/src/icu_util.cc | 58 |
1 files changed, 54 insertions, 4 deletions
diff --git a/deps/v8/src/icu_util.cc b/deps/v8/src/icu_util.cc index b9bd65edc6..1fff8170ff 100644 --- a/deps/v8/src/icu_util.cc +++ b/deps/v8/src/icu_util.cc @@ -27,12 +27,21 @@ #include "icu_util.h" -#if defined(_WIN32) && defined(V8_I18N_SUPPORT) +#if defined(_WIN32) #include <windows.h> +#endif + +#if defined(V8_I18N_SUPPORT) +#include <stdio.h> +#include <stdlib.h> #include "unicode/putil.h" #include "unicode/udata.h" +#define ICU_UTIL_DATA_FILE 0 +#define ICU_UTIL_DATA_SHARED 1 +#define ICU_UTIL_DATA_STATIC 2 + #define ICU_UTIL_DATA_SYMBOL "icudt" U_ICU_VERSION_SHORT "_dat" #define ICU_UTIL_DATA_SHARED_MODULE_NAME "icudt.dll" #endif @@ -41,8 +50,22 @@ namespace v8 { namespace internal { -bool InitializeICU() { -#if defined(_WIN32) && defined(V8_I18N_SUPPORT) +#if defined(V8_I18N_SUPPORT) && (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; +#else +#if ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_SHARED // We expect to find the ICU data module alongside the current module. HMODULE module = LoadLibraryA(ICU_UTIL_DATA_SHARED_MODULE_NAME); if (!module) return false; @@ -53,9 +76,36 @@ bool InitializeICU() { UErrorCode err = U_ZERO_ERROR; udata_setCommonData(reinterpret_cast<void*>(addr), &err); return err == U_ZERO_ERROR; -#else +#elif ICU_UTIL_DATA_IMPL == ICU_UTIL_DATA_STATIC // Mac/Linux bundle the ICU data in. return true; +#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; + + fseek(inf, 0, SEEK_END); + size_t size = ftell(inf); + rewind(inf); + + 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); + + UErrorCode err = U_ZERO_ERROR; + udata_setCommonData(reinterpret_cast<void*>(g_icu_data_ptr), &err); + return err == U_ZERO_ERROR; +#endif #endif } |