Index: src/runtime.cc |
diff --git a/src/runtime.cc b/src/runtime.cc |
index fe5d15f6be3ed5140c607d2f450d70426dd98c2e..4fb7129bf3d354e766851d563c586142888f6b6a 100644 |
--- a/src/runtime.cc |
+++ b/src/runtime.cc |
@@ -4236,35 +4236,34 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceGlobalRegExpWithString) { |
} |
-Handle<String> StringReplaceOneCharWithString(Isolate* isolate, |
- Handle<String> subject, |
- Handle<String> search, |
- Handle<String> replace, |
- bool* found, |
- int recursion_limit) { |
- if (recursion_limit == 0) return Handle<String>::null(); |
+// This may return an empty MaybeHandle if an exception is thrown or |
+// we abort due to reaching the recursion limit. |
+MaybeHandle<String> StringReplaceOneCharWithString(Isolate* isolate, |
+ Handle<String> subject, |
+ Handle<String> search, |
+ Handle<String> replace, |
+ bool* found, |
+ int recursion_limit) { |
+ if (recursion_limit == 0) return MaybeHandle<String>(); |
+ recursion_limit--; |
if (subject->IsConsString()) { |
ConsString* cons = ConsString::cast(*subject); |
Handle<String> first = Handle<String>(cons->first()); |
Handle<String> second = Handle<String>(cons->second()); |
- Handle<String> new_first = |
- StringReplaceOneCharWithString(isolate, |
- first, |
- search, |
- replace, |
- found, |
- recursion_limit - 1); |
- if (new_first.is_null()) return new_first; |
+ Handle<String> new_first; |
+ if (!StringReplaceOneCharWithString( |
+ isolate, first, search, replace, found, recursion_limit) |
+ .ToHandle(&new_first)) { |
+ return MaybeHandle<String>(); |
+ } |
if (*found) return isolate->factory()->NewConsString(new_first, second); |
- Handle<String> new_second = |
- StringReplaceOneCharWithString(isolate, |
- second, |
- search, |
- replace, |
- found, |
- recursion_limit - 1); |
- if (new_second.is_null()) return new_second; |
+ Handle<String> new_second; |
+ if (!StringReplaceOneCharWithString( |
+ isolate, second, search, replace, found, recursion_limit) |
+ .ToHandle(&new_second)) { |
+ return MaybeHandle<String>(); |
+ } |
if (*found) return isolate->factory()->NewConsString(first, new_second); |
return subject; |
@@ -4273,8 +4272,11 @@ Handle<String> StringReplaceOneCharWithString(Isolate* isolate, |
if (index == -1) return subject; |
*found = true; |
Handle<String> first = isolate->factory()->NewSubString(subject, 0, index); |
- Handle<String> cons1 = isolate->factory()->NewConsString(first, replace); |
- RETURN_IF_EMPTY_HANDLE_VALUE(isolate, cons1, Handle<String>()); |
+ Handle<String> cons1; |
+ ASSIGN_RETURN_ON_EXCEPTION( |
+ isolate, cons1, |
+ isolate->factory()->NewConsString(first, replace), |
+ String); |
Handle<String> second = |
isolate->factory()->NewSubString(subject, index + 1, subject->length()); |
return isolate->factory()->NewConsString(cons1, second); |
@@ -4293,20 +4295,20 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceOneCharWithString) { |
// retry with a flattened subject string. |
const int kRecursionLimit = 0x1000; |
bool found = false; |
- Handle<String> result = StringReplaceOneCharWithString(isolate, |
- subject, |
- search, |
- replace, |
- &found, |
- kRecursionLimit); |
- if (!result.is_null()) return *result; |
+ Handle<String> result; |
+ if (StringReplaceOneCharWithString( |
+ isolate, subject, search, replace, &found, kRecursionLimit) |
+ .ToHandle(&result)) { |
+ return *result; |
+ } |
if (isolate->has_pending_exception()) return Failure::Exception(); |
- return *StringReplaceOneCharWithString(isolate, |
- FlattenGetString(subject), |
- search, |
- replace, |
- &found, |
- kRecursionLimit); |
+ |
+ subject = FlattenGetString(subject); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, result, |
+ StringReplaceOneCharWithString( |
+ isolate, subject, search, replace, &found, kRecursionLimit)); |
+ return *result; |
} |
@@ -6295,9 +6297,13 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_URIUnescape) { |
CONVERT_ARG_HANDLE_CHECKED(String, source, 0); |
Handle<String> string = FlattenGetString(source); |
ASSERT(string->IsFlat()); |
- return string->IsOneByteRepresentationUnderneath() |
- ? *URIUnescape::Unescape<uint8_t>(isolate, source) |
- : *URIUnescape::Unescape<uc16>(isolate, source); |
+ Handle<String> result; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, result, |
+ string->IsOneByteRepresentationUnderneath() |
+ ? URIUnescape::Unescape<uint8_t>(isolate, source) |
+ : URIUnescape::Unescape<uc16>(isolate, source)); |
+ return *result; |
} |
@@ -7067,8 +7073,9 @@ RUNTIME_FUNCTION(MaybeObject*, RuntimeHidden_StringAdd) { |
CONVERT_ARG_HANDLE_CHECKED(String, str1, 0); |
CONVERT_ARG_HANDLE_CHECKED(String, str2, 1); |
isolate->counters()->string_add_runtime()->Increment(); |
- Handle<String> result = isolate->factory()->NewConsString(str1, str2); |
- RETURN_IF_EMPTY_HANDLE(isolate, result); |
+ Handle<String> result; |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
+ isolate, result, isolate->factory()->NewConsString(str1, str2)); |
return *result; |
} |