Flutter Engine
The Flutter Engine
Macros | Functions
SkUnicode_icu_runtime.cpp File Reference
#include "include/core/SkString.h"
#include "include/core/SkTypes.h"
#include "modules/skunicode/src/SkUnicode_icupriv.h"
#include <dlfcn.h>

Go to the source code of this file.

Macros

#define SK_RUNTIME_ICU_PATHS   "libicuuc.so"
 
#define SKICU_FUNC(fname)   *(void**)(&lib.f_##fname) = resolve_sym(dlhnd, #fname, true);
 

Functions

std::unique_ptr< SkICULibSkLoadICULib ()
 

Macro Definition Documentation

◆ SK_RUNTIME_ICU_PATHS

#define SK_RUNTIME_ICU_PATHS   "libicuuc.so"

Definition at line 14 of file SkUnicode_icu_runtime.cpp.

◆ SKICU_FUNC

#define SKICU_FUNC (   fname)    *(void**)(&lib.f_##fname) = resolve_sym(dlhnd, #fname, true);

Function Documentation

◆ SkLoadICULib()

std::unique_ptr< SkICULib > SkLoadICULib ( )

Definition at line 16 of file SkUnicode_icu_runtime.cpp.

16 {
17 static constexpr char const* gLibPaths[] = { SK_RUNTIME_ICU_PATHS };
18
19 void* dlhnd = nullptr;
20 for (const auto path : gLibPaths) {
21 dlhnd = dlopen(path, RTLD_LAZY);
22 if (dlhnd) {
23 break;
24 }
25 }
26
27 if (!dlhnd) {
28 SkDEBUGF("ICU loader: failed to open libicuuc.\n");
29 return nullptr;
30 }
31
32 int icu_ver = -1;
33
34 bool resolved_required_syms = true;
35
36 auto resolve_sym = [&](void* hnd, const char name[], bool required = false) -> void* {
37 static constexpr int kMinVer = 44,
38 kMaxVer = 100;
39
40 // First call performs a search to determine the actual lib version.
41 // Subsequent calls are pinned to the version found.
42 const auto search_to = icu_ver > 0 ? icu_ver : kMaxVer;
43 icu_ver = icu_ver > 0 ? icu_ver : kMinVer;
44
45 for (;;) {
46 const auto sym = SkStringPrintf("%s_%d", name, icu_ver);
47 if (auto* addr = dlsym(dlhnd, sym.c_str())) {
48 return addr;
49 }
50
51 if (icu_ver == search_to) {
52 break;
53 }
54
55 icu_ver++;
56 }
57
58 if (required) {
59 resolved_required_syms = false;
60 }
61 return nullptr;
62 };
63
64 SkICULib lib {};
65
66 // When using dlsym
67 // *(void**)(&procPtr) = dlsym(self, "proc");
68 // is non-standard, but safe for POSIX. Cannot write
69 // *reinterpret_cast<void**>(&procPtr) = dlsym(self, "proc");
70 // because clang has not implemented DR573. See http://clang.llvm.org/cxx_dr_status.html .
71 #define SKICU_FUNC(fname) *(void**)(&lib.f_##fname) = resolve_sym(dlhnd, #fname, true);
73
74 *(void**)(&lib.f_ubrk_clone_) = resolve_sym(dlhnd, "ubrk_clone");
75 *(void**)(&lib.f_ubrk_safeClone_) = resolve_sym(dlhnd, "ubrk_safeClone");
76 *(void**)(&lib.f_ubrk_getLocaleByType) = resolve_sym(dlhnd, "ubrk_getLocaleByType");
77
78 if (!resolved_required_syms || (!lib.f_ubrk_clone_ && !lib.f_ubrk_safeClone_)) {
79 SkDEBUGF("ICU loader: failed to resolve required symbols.");
80 dlclose(dlhnd);
81 return nullptr;
82 }
83
84 return std::make_unique<SkICULib>(lib);
85}
#define SkDEBUGF(...)
Definition: SkDebug.h:24
SK_API SkString SkStringPrintf(const char *format,...) SK_PRINTF_LIKE(1
Creates a new string and writes into it using a printf()-style format.
#define SK_RUNTIME_ICU_PATHS
#define SKICU_EMIT_FUNCS
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
Definition: switches.h:57
DEF_SWITCHES_START aot vmservice shared library name
Definition: switches.h:32