Commit 4e8ebeb0 authored by jshin's avatar jshin Committed by Commit bot

Throw when case mapping result > max string length

Throw 'Range Error: invalid string length' when the result of
case mapping is longer than the max string length (kMaxLength in
objects.h = 1 << 28 - 16).

This is for case mapping with ICU.

A new test (case-mapping-slow.js) is added with PASS,SLOW. It's
configured to skip unless arch=x64 and mode=release and not on
simulator.

This is a reattempt to land
 https://codereview.chromium.org/2236593002 that was reverted.

BUG=v8:5271
TEST=intl/general/case-mapping-slow.js with --icu_case_mapping

Review-Url: https://codereview.chromium.org/2236963003
Cr-Commit-Position: refs/heads/master@{#38626}
parent e6d1a80e
...@@ -859,8 +859,10 @@ MUST_USE_RESULT Object* LocaleConvertCase(Handle<String> s, Isolate* isolate, ...@@ -859,8 +859,10 @@ MUST_USE_RESULT Object* LocaleConvertCase(Handle<String> s, Isolate* isolate,
// This is not a real loop. It'll be executed only once (no overflow) or // This is not a real loop. It'll be executed only once (no overflow) or
// twice (overflow). // twice (overflow).
for (int i = 0; i < 2; ++i) { for (int i = 0; i < 2; ++i) {
result = // Case conversion can increase the string length (e.g. sharp-S => SS) so
isolate->factory()->NewRawTwoByteString(dest_length).ToHandleChecked(); // that we have to handle RangeError exceptions here.
ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
isolate, result, isolate->factory()->NewRawTwoByteString(dest_length));
DisallowHeapAllocation no_gc; DisallowHeapAllocation no_gc;
String::FlatContent flat = s->GetFlatContent(); String::FlatContent flat = s->GetFlatContent();
const UChar* src = GetUCharBufferFromFlat(flat, &sap, src_length); const UChar* src = GetUCharBufferFromFlat(flat, &sap, src_length);
......
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