Commit 53aa5b63 authored by jochen@chromium.org's avatar jochen@chromium.org

Clean up ICU data tables on shutdown.

This is only used by d8 if compiled with external data tables, or an
embedder that uses external data tables and v8's version of ICU.

BUG=none
R=svenpanne@chromium.org
LOG=n

Review URL: https://codereview.chromium.org/210973007

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20283 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent a7d1b658
......@@ -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);
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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment