Skip to content

Commit efab8ed

Browse files
Check icu version dynamically for windows
1 parent 14b2131 commit efab8ed

4 files changed

Lines changed: 58 additions & 43 deletions

File tree

lib/Runtime/Library/IntlEngineInterfaceExtensionObject.cpp

Lines changed: 46 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2437,40 +2437,43 @@ DEFINE_ISXLOCALEAVAILABLE(PR, uloc)
24372437
return JavascriptString::NewWithBuffer(formatted, formattedLen, scriptContext);
24382438
}
24392439

2440-
#if defined(ICU_VERSION) && ICU_VERSION >= 61
2441-
UErrorCode status = U_ZERO_ERROR;
2442-
ScopedUFieldPositionIterator fpi(ufieldpositer_open(&status));
2443-
2444-
EnsureBuffer([&](UChar *buf, int bufLen, UErrorCode *status)
2440+
if (PlatformAgnostic::ICUHelpers::LinkedIcuMajorVersion() >= 61)
24452441
{
2446-
return unum_formatDoubleForFields(*fmt, num, buf, bufLen, fpi, status);
2447-
}, scriptContext->GetRecycler(), &formatted, &formattedLen);
2442+
UErrorCode status = U_ZERO_ERROR;
2443+
ScopedUFieldPositionIterator fpi(ufieldpositer_open(&status));
24482444

2449-
NumberFormatPartsBuilder nfpb(num, formatted, formattedLen, scriptContext);
2445+
EnsureBuffer([&](UChar *buf, int bufLen, UErrorCode *status)
2446+
{
2447+
return unum_formatDoubleForFields(*fmt, num, buf, bufLen, fpi, status);
2448+
}, scriptContext->GetRecycler(), &formatted, &formattedLen);
24502449

2451-
int partStart = 0;
2452-
int partEnd = 0;
2453-
int i = 0;
2454-
for (int kind = ufieldpositer_next(fpi, &partStart, &partEnd); kind >= 0; kind = ufieldpositer_next(fpi, &partStart, &partEnd), ++i)
2455-
{
2456-
nfpb.InsertPart(static_cast<UNumberFormatFields>(kind), partStart, partEnd);
2457-
}
2450+
NumberFormatPartsBuilder nfpb(num, formatted, formattedLen, scriptContext);
24582451

2459-
return nfpb.ToPartsArray();
2460-
#else
2461-
JavascriptLibrary *library = scriptContext->GetLibrary();
2462-
JavascriptArray *ret = library->CreateArray(1);
2463-
DynamicObject* part = library->CreateObject();
2464-
EnsureBuffer([&](UChar *buf, int bufLen, UErrorCode *status)
2452+
int partStart = 0;
2453+
int partEnd = 0;
2454+
int i = 0;
2455+
for (int kind = ufieldpositer_next(fpi, &partStart, &partEnd); kind >= 0; kind = ufieldpositer_next(fpi, &partStart, &partEnd), ++i)
2456+
{
2457+
nfpb.InsertPart(static_cast<UNumberFormatFields>(kind), partStart, partEnd);
2458+
}
2459+
2460+
return nfpb.ToPartsArray();
2461+
}
2462+
else
24652463
{
2466-
return unum_formatDouble(*fmt, num, buf, bufLen, nullptr, status);
2467-
}, scriptContext->GetRecycler(), &formatted, &formattedLen);
2468-
JavascriptOperators::InitProperty(part, PropertyIds::type, library->GetIntlUnknownPartString());
2469-
JavascriptOperators::InitProperty(part, PropertyIds::value, JavascriptString::NewWithBuffer(formatted, formattedLen, scriptContext));
2464+
JavascriptLibrary *library = scriptContext->GetLibrary();
2465+
JavascriptArray *ret = library->CreateArray(1);
2466+
DynamicObject *part = library->CreateObject();
2467+
EnsureBuffer([&](UChar *buf, int bufLen, UErrorCode *status)
2468+
{
2469+
return unum_formatDouble(*fmt, num, buf, bufLen, nullptr, status);
2470+
}, scriptContext->GetRecycler(), &formatted, &formattedLen);
2471+
JavascriptOperators::InitProperty(part, PropertyIds::type, library->GetIntlUnknownPartString());
2472+
JavascriptOperators::InitProperty(part, PropertyIds::value, JavascriptString::NewWithBuffer(formatted, formattedLen, scriptContext));
24702473

2471-
ret->SetItem(0, part, PropertyOperationFlags::PropertyOperation_None);
2472-
return ret;
2473-
#endif // #if ICU_VERSION >= 61 ... #else
2474+
ret->SetItem(0, part, PropertyOperationFlags::PropertyOperation_None);
2475+
return ret;
2476+
}
24742477
#else
24752478
INTL_CHECK_ARGS(
24762479
args.Info.Count == 3 &&
@@ -3012,21 +3015,24 @@ DEFINE_ISXLOCALEAVAILABLE(PR, uloc)
30123015
// For ICU < 61, we can fake it by creating an array of ["other"], which
30133016
// uplrules_getKeywords is guaranteed to return at minimum.
30143017
// This array is only used in resolved options, so the majority of the functionality can remain (namely, select() still works)
3015-
#if defined(ICU_VERSION) && ICU_VERSION >= 61
3016-
DynamicObject *state = UnsafeVarTo<DynamicObject>(args[1]);
3017-
FinalizableUPluralRules *pr = GetOrCreateCachedUPluralRules(state, scriptContext);
3018+
if (PlatformAgnostic::ICUHelpers::LinkedIcuMajorVersion() >= 61)
3019+
{
3020+
DynamicObject *state = UnsafeVarTo<DynamicObject>(args[1]);
3021+
FinalizableUPluralRules *pr = GetOrCreateCachedUPluralRules(state, scriptContext);
30183022

3019-
UErrorCode status = U_ZERO_ERROR;
3020-
ScopedUEnumeration keywords(uplrules_getKeywords(*pr, &status));
3021-
ICU_ASSERT(status, true);
3023+
UErrorCode status = U_ZERO_ERROR;
3024+
ScopedUEnumeration keywords(uplrules_getKeywords(*pr, &status));
3025+
ICU_ASSERT(status, true);
30223026

3023-
ForEachUEnumeration16(keywords, [&](int index, const char16 *kw, charcount_t kwLength)
3027+
ForEachUEnumeration16(keywords, [&](int index, const char16 *kw, charcount_t kwLength)
3028+
{
3029+
ret->SetItem(index, JavascriptString::NewCopyBuffer(kw, kwLength, scriptContext), PropertyOperation_None);
3030+
});
3031+
}
3032+
else
30243033
{
3025-
ret->SetItem(index, JavascriptString::NewCopyBuffer(kw, kwLength, scriptContext), PropertyOperation_None);
3026-
});
3027-
#else
3028-
ret->SetItem(0, scriptContext->GetLibrary()->GetIntlPluralRulesOtherString(), PropertyOperation_None);
3029-
#endif
3034+
ret->SetItem(0, scriptContext->GetLibrary()->GetIntlPluralRulesOtherString(), PropertyOperation_None);
3035+
}
30303036

30313037
return ret;
30323038
#else

lib/Runtime/PlatformAgnostic/ChakraICU.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,17 @@ namespace PlatformAgnostic
102102
u_getVersion(version);
103103
return version[0];
104104
}
105+
106+
inline int LinkedIcuMajorVersion()
107+
{
108+
#if ICU_VERSION
109+
return ICU_VERSION;
110+
#elif U_ICU_VERSION_MAJOR_NUM
111+
return U_ICU_VERSION_MAJOR_NUM;
112+
#else
113+
return GetICUMajorVersion();
114+
#endif
115+
}
105116
}
106117
}
107118
#endif // ifdef HAS_ICU

test/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ endif ()
88

99
if (NO_ICU)
1010
set(TEST_ICU --not-tag exclude_noicu)
11-
elseif (NOT EMBED_ICU)
12-
set(TEST_ICU --not-tag exclude_icu62AndAboveTestFailures)
1311
endif()
1412

1513
if (BuildJIT)

test/Intl/rlexe.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<test>
2424
<default>
2525
<files>NumberFormat.js</files>
26-
<tags>Intl,exclude_drt,exclude_icu62AndAboveTestFailures</tags>
26+
<tags>Intl,exclude_drt</tags>
2727
</default>
2828
</test>
2929
<test>

0 commit comments

Comments
 (0)