Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(599)

Side by Side Diff: src/builtins/builtins-regexp.cc

Issue 2399423003: [builtins] Move StringIncludes to a builtin. (Closed)
Patch Set: Add another test. Re-use IsRegExp logic Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/builtins/builtins.h ('k') | src/builtins/builtins-string.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 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/builtins/builtins-utils.h" 5 #include "src/builtins/builtins-utils.h"
6 #include "src/builtins/builtins.h" 6 #include "src/builtins/builtins.h"
7 7
8 #include "src/code-factory.h" 8 #include "src/code-factory.h"
9 #include "src/regexp/jsregexp.h" 9 #include "src/regexp/jsregexp.h"
10 10
11 namespace v8 { 11 namespace v8 {
12 namespace internal { 12 namespace internal {
13 13
14 // ----------------------------------------------------------------------------- 14 // -----------------------------------------------------------------------------
15 // ES6 section 21.2 RegExp Objects 15 // ES6 section 21.2 RegExp Objects
16 16
17 namespace { 17 namespace {
18 18
19 // ES#sec-isregexp IsRegExp ( argument )
20 Maybe<bool> IsRegExp(Isolate* isolate, Handle<Object> object) {
21 if (!object->IsJSReceiver()) return Just(false);
22
23 Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object);
24
25 if (isolate->regexp_function()->initial_map() == receiver->map()) {
26 // Fast-path for unmodified JSRegExp instances.
27 return Just(true);
28 }
29
30 Handle<Object> match;
31 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
32 isolate, match,
33 JSObject::GetProperty(receiver, isolate->factory()->match_symbol()),
34 Nothing<bool>());
35
36 if (!match->IsUndefined(isolate)) return Just(match->BooleanValue());
37 return Just(object->IsJSRegExp());
38 }
39
40 Handle<String> PatternFlags(Isolate* isolate, Handle<JSRegExp> regexp) { 19 Handle<String> PatternFlags(Isolate* isolate, Handle<JSRegExp> regexp) {
41 static const int kMaxFlagsLength = 5 + 1; // 5 flags and '\0'; 20 static const int kMaxFlagsLength = 5 + 1; // 5 flags and '\0';
42 char flags_string[kMaxFlagsLength]; 21 char flags_string[kMaxFlagsLength];
43 int i = 0; 22 int i = 0;
44 23
45 const JSRegExp::Flags flags = regexp->GetFlags(); 24 const JSRegExp::Flags flags = regexp->GetFlags();
46 25
47 if ((flags & JSRegExp::kGlobal) != 0) flags_string[i++] = 'g'; 26 if ((flags & JSRegExp::kGlobal) != 0) flags_string[i++] = 'g';
48 if ((flags & JSRegExp::kIgnoreCase) != 0) flags_string[i++] = 'i'; 27 if ((flags & JSRegExp::kIgnoreCase) != 0) flags_string[i++] = 'i';
49 if ((flags & JSRegExp::kMultiline) != 0) flags_string[i++] = 'm'; 28 if ((flags & JSRegExp::kMultiline) != 0) flags_string[i++] = 'm';
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 HandleScope scope(isolate); 71 HandleScope scope(isolate);
93 72
94 Handle<HeapObject> new_target = args.new_target(); 73 Handle<HeapObject> new_target = args.new_target();
95 Handle<Object> pattern = args.atOrUndefined(isolate, 1); 74 Handle<Object> pattern = args.atOrUndefined(isolate, 1);
96 Handle<Object> flags = args.atOrUndefined(isolate, 2); 75 Handle<Object> flags = args.atOrUndefined(isolate, 2);
97 76
98 Handle<JSFunction> target = isolate->regexp_function(); 77 Handle<JSFunction> target = isolate->regexp_function();
99 78
100 bool pattern_is_regexp; 79 bool pattern_is_regexp;
101 { 80 {
102 Maybe<bool> maybe_pattern_is_regexp = IsRegExp(isolate, pattern); 81 Maybe<bool> maybe_pattern_is_regexp = Object::IsRegExp(isolate, pattern);
103 if (maybe_pattern_is_regexp.IsNothing()) { 82 if (maybe_pattern_is_regexp.IsNothing()) {
104 DCHECK(isolate->has_pending_exception()); 83 DCHECK(isolate->has_pending_exception());
105 return isolate->heap()->exception(); 84 return isolate->heap()->exception();
106 } 85 }
107 pattern_is_regexp = maybe_pattern_is_regexp.FromJust(); 86 pattern_is_regexp = maybe_pattern_is_regexp.FromJust();
108 } 87 }
109 88
110 if (new_target->IsUndefined(isolate)) { 89 if (new_target->IsUndefined(isolate)) {
111 new_target = target; 90 new_target = target;
112 91
(...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 BUILTIN(RegExpRightContextGetter) { 882 BUILTIN(RegExpRightContextGetter) {
904 HandleScope scope(isolate); 883 HandleScope scope(isolate);
905 const int start_index = GetLastMatchCapture(isolate, 1); 884 const int start_index = GetLastMatchCapture(isolate, 1);
906 Handle<String> last_subject = GetLastMatchSubject(isolate); 885 Handle<String> last_subject = GetLastMatchSubject(isolate);
907 const int len = last_subject->length(); 886 const int len = last_subject->length();
908 return *isolate->factory()->NewSubString(last_subject, start_index, len); 887 return *isolate->factory()->NewSubString(last_subject, start_index, len);
909 } 888 }
910 889
911 } // namespace internal 890 } // namespace internal
912 } // namespace v8 891 } // namespace v8
OLDNEW
« no previous file with comments | « src/builtins/builtins.h ('k') | src/builtins/builtins-string.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698