| Index: src/runtime/runtime-strings.cc
|
| diff --git a/src/runtime/runtime-strings.cc b/src/runtime/runtime-strings.cc
|
| index a126e8cd6379a92f766636036da5e9dcfc2903d6..d51d8bafa13d9c035f3efcfe75db65d0167694d8 100644
|
| --- a/src/runtime/runtime-strings.cc
|
| +++ b/src/runtime/runtime-strings.cc
|
| @@ -13,6 +13,44 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| +RUNTIME_FUNCTION(Runtime_GetSubstitution) {
|
| + HandleScope scope(isolate);
|
| + DCHECK_EQ(4, args.length());
|
| + CONVERT_ARG_HANDLE_CHECKED(String, matched, 0);
|
| + CONVERT_ARG_HANDLE_CHECKED(String, subject, 1);
|
| + CONVERT_SMI_ARG_CHECKED(position, 2);
|
| + CONVERT_ARG_HANDLE_CHECKED(String, replacement, 3);
|
| +
|
| + // A simple match without captures.
|
| + class SimpleMatch : public String::Match {
|
| + public:
|
| + SimpleMatch(Handle<String> match, Handle<String> prefix,
|
| + Handle<String> suffix)
|
| + : match_(match), prefix_(prefix), suffix_(suffix) {}
|
| +
|
| + Handle<String> GetMatch() override { return match_; }
|
| + MaybeHandle<String> GetCapture(int i, bool* capture_exists) override {
|
| + *capture_exists = false;
|
| + return match_; // Return arbitrary string handle.
|
| + }
|
| + Handle<String> GetPrefix() override { return prefix_; }
|
| + Handle<String> GetSuffix() override { return suffix_; }
|
| + int CaptureCount() override { return 0; }
|
| +
|
| + private:
|
| + Handle<String> match_, prefix_, suffix_;
|
| + };
|
| +
|
| + Handle<String> prefix =
|
| + isolate->factory()->NewSubString(subject, 0, position);
|
| + Handle<String> suffix = isolate->factory()->NewSubString(
|
| + subject, position + matched->length(), subject->length());
|
| + SimpleMatch match(matched, prefix, suffix);
|
| +
|
| + RETURN_RESULT_OR_FAILURE(
|
| + isolate, String::GetSubstitution(isolate, &match, replacement));
|
| +}
|
| +
|
| // This may return an empty MaybeHandle if an exception is thrown or
|
| // we abort due to reaching the recursion limit.
|
| MaybeHandle<String> StringReplaceOneCharWithString(
|
|
|