| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
| 6 | 6 |
| 7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
| 8 #include "src/conversions-inl.h" | 8 #include "src/conversions-inl.h" |
| 9 #include "src/isolate-inl.h" | 9 #include "src/isolate-inl.h" |
| 10 #include "src/messages.h" | 10 #include "src/messages.h" |
| (...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 537 if (global_cache.HasException()) return isolate->heap()->exception(); | 537 if (global_cache.HasException()) return isolate->heap()->exception(); |
| 538 | 538 |
| 539 if (prev < subject_length) { | 539 if (prev < subject_length) { |
| 540 builder.EnsureCapacity(2); | 540 builder.EnsureCapacity(2); |
| 541 builder.AddSubjectSlice(prev, subject_length); | 541 builder.AddSubjectSlice(prev, subject_length); |
| 542 } | 542 } |
| 543 | 543 |
| 544 RegExpImpl::SetLastMatchInfo(last_match_info, subject, capture_count, | 544 RegExpImpl::SetLastMatchInfo(last_match_info, subject, capture_count, |
| 545 global_cache.LastSuccessfulMatch()); | 545 global_cache.LastSuccessfulMatch()); |
| 546 | 546 |
| 547 Handle<String> result; | 547 RETURN_RESULT_OR_FAILURE(isolate, builder.ToString()); |
| 548 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, builder.ToString()); | |
| 549 return *result; | |
| 550 } | 548 } |
| 551 | 549 |
| 552 | 550 |
| 553 template <typename ResultSeqString> | 551 template <typename ResultSeqString> |
| 554 MUST_USE_RESULT static Object* StringReplaceGlobalRegExpWithEmptyString( | 552 MUST_USE_RESULT static Object* StringReplaceGlobalRegExpWithEmptyString( |
| 555 Isolate* isolate, Handle<String> subject, Handle<JSRegExp> regexp, | 553 Isolate* isolate, Handle<String> subject, Handle<JSRegExp> regexp, |
| 556 Handle<JSArray> last_match_info) { | 554 Handle<JSArray> last_match_info) { |
| 557 DCHECK(subject->IsFlat()); | 555 DCHECK(subject->IsFlat()); |
| 558 | 556 |
| 559 // Shortcut for simple non-regexp global replacements | 557 // Shortcut for simple non-regexp global replacements |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 DCHECK(args.length() == 4); | 770 DCHECK(args.length() == 4); |
| 773 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0); | 771 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0); |
| 774 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1); | 772 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1); |
| 775 CONVERT_INT32_ARG_CHECKED(index, 2); | 773 CONVERT_INT32_ARG_CHECKED(index, 2); |
| 776 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3); | 774 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3); |
| 777 // Due to the way the JS calls are constructed this must be less than the | 775 // Due to the way the JS calls are constructed this must be less than the |
| 778 // length of a string, i.e. it is always a Smi. We check anyway for security. | 776 // length of a string, i.e. it is always a Smi. We check anyway for security. |
| 779 RUNTIME_ASSERT(index >= 0); | 777 RUNTIME_ASSERT(index >= 0); |
| 780 RUNTIME_ASSERT(index <= subject->length()); | 778 RUNTIME_ASSERT(index <= subject->length()); |
| 781 isolate->counters()->regexp_entry_runtime()->Increment(); | 779 isolate->counters()->regexp_entry_runtime()->Increment(); |
| 782 Handle<Object> result; | 780 RETURN_RESULT_OR_FAILURE( |
| 783 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 781 isolate, RegExpImpl::Exec(regexp, subject, index, last_match_info)); |
| 784 isolate, result, | |
| 785 RegExpImpl::Exec(regexp, subject, index, last_match_info)); | |
| 786 return *result; | |
| 787 } | 782 } |
| 788 | 783 |
| 789 | 784 |
| 790 RUNTIME_FUNCTION(Runtime_RegExpFlags) { | 785 RUNTIME_FUNCTION(Runtime_RegExpFlags) { |
| 791 SealHandleScope shs(isolate); | 786 SealHandleScope shs(isolate); |
| 792 DCHECK(args.length() == 1); | 787 DCHECK(args.length() == 1); |
| 793 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0); | 788 CONVERT_ARG_CHECKED(JSRegExp, regexp, 0); |
| 794 return regexp->flags(); | 789 return regexp->flags(); |
| 795 } | 790 } |
| 796 | 791 |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1021 | 1016 |
| 1022 | 1017 |
| 1023 RUNTIME_FUNCTION(Runtime_IsRegExp) { | 1018 RUNTIME_FUNCTION(Runtime_IsRegExp) { |
| 1024 SealHandleScope shs(isolate); | 1019 SealHandleScope shs(isolate); |
| 1025 DCHECK(args.length() == 1); | 1020 DCHECK(args.length() == 1); |
| 1026 CONVERT_ARG_CHECKED(Object, obj, 0); | 1021 CONVERT_ARG_CHECKED(Object, obj, 0); |
| 1027 return isolate->heap()->ToBoolean(obj->IsJSRegExp()); | 1022 return isolate->heap()->ToBoolean(obj->IsJSRegExp()); |
| 1028 } | 1023 } |
| 1029 } // namespace internal | 1024 } // namespace internal |
| 1030 } // namespace v8 | 1025 } // namespace v8 |
| OLD | NEW |