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

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

Issue 2415103002: [regexp] Turn last match info into a simple FixedArray (Closed)
Patch Set: Don't check instance type before map check 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/regexp/regexp-utils.h ('k') | src/runtime/runtime.h » ('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/regexp/regexp-utils.h" 5 #include "src/regexp/regexp-utils.h"
6 6
7 #include "src/factory.h" 7 #include "src/factory.h"
8 #include "src/isolate.h" 8 #include "src/isolate.h"
9 #include "src/objects-inl.h" 9 #include "src/objects-inl.h"
10 #include "src/regexp/jsregexp.h" 10 #include "src/regexp/jsregexp.h"
11 11
12 namespace v8 { 12 namespace v8 {
13 namespace internal { 13 namespace internal {
14 14
15 // Constants for accessing RegExpLastMatchInfo. 15 Handle<String> RegExpUtils::GenericCaptureGetter(
16 // TODO(jgruber): Currently, RegExpLastMatchInfo is still a JSObject maintained 16 Isolate* isolate, Handle<RegExpMatchInfo> match_info, int capture,
17 // and accessed from JS. This is a crutch until all RegExp logic is ported, then 17 bool* ok) {
18 // we can take care of RegExpLastMatchInfo.
19
20 Handle<Object> RegExpUtils::GetLastMatchField(Isolate* isolate,
21 Handle<JSObject> match_info,
22 int index) {
23 return JSReceiver::GetElement(isolate, match_info, index).ToHandleChecked();
24 }
25
26 void RegExpUtils::SetLastMatchField(Isolate* isolate,
27 Handle<JSObject> match_info, int index,
28 Handle<Object> value) {
29 JSReceiver::SetElement(isolate, match_info, index, value, SLOPPY)
30 .ToHandleChecked();
31 }
32
33 int RegExpUtils::GetLastMatchNumberOfCaptures(Isolate* isolate,
34 Handle<JSObject> match_info) {
35 Handle<Object> obj =
36 GetLastMatchField(isolate, match_info, RegExpImpl::kLastCaptureCount);
37 return Handle<Smi>::cast(obj)->value();
38 }
39
40 Handle<String> RegExpUtils::GetLastMatchSubject(Isolate* isolate,
41 Handle<JSObject> match_info) {
42 return Handle<String>::cast(
43 GetLastMatchField(isolate, match_info, RegExpImpl::kLastSubject));
44 }
45
46 Handle<Object> RegExpUtils::GetLastMatchInput(Isolate* isolate,
47 Handle<JSObject> match_info) {
48 return GetLastMatchField(isolate, match_info, RegExpImpl::kLastInput);
49 }
50
51 int RegExpUtils::GetLastMatchCapture(Isolate* isolate,
52 Handle<JSObject> match_info, int i) {
53 Handle<Object> obj =
54 GetLastMatchField(isolate, match_info, RegExpImpl::kFirstCapture + i);
55 return Handle<Smi>::cast(obj)->value();
56 }
57
58 Handle<String> RegExpUtils::GenericCaptureGetter(Isolate* isolate,
59 Handle<JSObject> match_info,
60 int capture, bool* ok) {
61 const int index = capture * 2; 18 const int index = capture * 2;
62 if (index >= GetLastMatchNumberOfCaptures(isolate, match_info)) { 19 if (index >= match_info->NumberOfCaptureRegisters()) {
63 if (ok != nullptr) *ok = false; 20 if (ok != nullptr) *ok = false;
64 return isolate->factory()->empty_string(); 21 return isolate->factory()->empty_string();
65 } 22 }
66 23
67 const int match_start = GetLastMatchCapture(isolate, match_info, index); 24 const int match_start = match_info->Capture(index);
68 const int match_end = GetLastMatchCapture(isolate, match_info, index + 1); 25 const int match_end = match_info->Capture(index + 1);
69 if (match_start == -1 || match_end == -1) { 26 if (match_start == -1 || match_end == -1) {
70 if (ok != nullptr) *ok = false; 27 if (ok != nullptr) *ok = false;
71 return isolate->factory()->empty_string(); 28 return isolate->factory()->empty_string();
72 } 29 }
73 30
74 if (ok != nullptr) *ok = true; 31 if (ok != nullptr) *ok = true;
75 Handle<String> last_subject = GetLastMatchSubject(isolate, match_info); 32 Handle<String> last_subject(match_info->LastSubject());
76 return isolate->factory()->NewSubString(last_subject, match_start, match_end); 33 return isolate->factory()->NewSubString(last_subject, match_start, match_end);
77 } 34 }
78 35
79 namespace { 36 namespace {
80 37
81 V8_INLINE bool HasInitialRegExpMap(Isolate* isolate, Handle<JSReceiver> recv) { 38 V8_INLINE bool HasInitialRegExpMap(Isolate* isolate, Handle<JSReceiver> recv) {
82 return recv->map() == isolate->regexp_function()->initial_map(); 39 return recv->map() == isolate->regexp_function()->initial_map();
83 } 40 }
84 41
85 } // namespace 42 } // namespace
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 178
222 const int last_index = Handle<Smi>::cast(last_index_obj)->value(); 179 const int last_index = Handle<Smi>::cast(last_index_obj)->value();
223 const int new_last_index = 180 const int new_last_index =
224 last_index + AdvanceStringIndex(isolate, string, last_index, unicode); 181 last_index + AdvanceStringIndex(isolate, string, last_index, unicode);
225 182
226 return SetLastIndex(isolate, regexp, new_last_index); 183 return SetLastIndex(isolate, regexp, new_last_index);
227 } 184 }
228 185
229 } // namespace internal 186 } // namespace internal
230 } // namespace v8 187 } // namespace v8
OLDNEW
« no previous file with comments | « src/regexp/regexp-utils.h ('k') | src/runtime/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698