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

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

Issue 2295273003: [regexp] Port RegExpCompile and RegExpToString (Closed)
Patch Set: Split up patch Created 4 years, 3 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/js/regexp.js » ('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.h" 5 #include "src/builtins/builtins.h"
6 #include "src/builtins/builtins-utils.h" 6 #include "src/builtins/builtins-utils.h"
7 7
8 #include "src/string-builder.h" 8 #include "src/string-builder.h"
9 9
10 namespace v8 { 10 namespace v8 {
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 141
142 Handle<JSObject> object; 142 Handle<JSObject> object;
143 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 143 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
144 isolate, object, JSObject::New(target, new_target_receiver)); 144 isolate, object, JSObject::New(target, new_target_receiver));
145 Handle<JSRegExp> regexp = Handle<JSRegExp>::cast(object); 145 Handle<JSRegExp> regexp = Handle<JSRegExp>::cast(object);
146 146
147 RETURN_RESULT_OR_FAILURE(isolate, 147 RETURN_RESULT_OR_FAILURE(isolate,
148 RegExpInitialize(isolate, regexp, pattern, flags)); 148 RegExpInitialize(isolate, regexp, pattern, flags));
149 } 149 }
150 150
151 BUILTIN(RegExpPrototypeCompile) {
152 HandleScope scope(isolate);
153 CHECK_RECEIVER(JSRegExp, regexp, "RegExp.prototype.compile");
154
155 Handle<Object> pattern = args.atOrUndefined(isolate, 1);
156 Handle<Object> flags = args.atOrUndefined(isolate, 2);
157
158 if (pattern->IsJSRegExp()) {
159 Handle<JSRegExp> pattern_regexp = Handle<JSRegExp>::cast(pattern);
160
161 if (!flags->IsUndefined(isolate)) {
162 THROW_NEW_ERROR_RETURN_FAILURE(
163 isolate, NewTypeError(MessageTemplate::kRegExpFlags));
164 }
165
166 flags = PatternFlags(isolate, pattern_regexp);
167 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
168 isolate, pattern,
169 Object::GetProperty(pattern, isolate->factory()->source_string()));
170 }
171
172 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
173 isolate, regexp, RegExpInitialize(isolate, regexp, pattern, flags));
174
175 // Return undefined for compatibility with JSC.
176 // See http://crbug.com/585775 for web compat details.
177
178 return isolate->heap()->undefined_value();
179 }
180
151 #define APPEND_CHAR_FOR_FLAG(flag, c) \ 181 #define APPEND_CHAR_FOR_FLAG(flag, c) \
152 do { \ 182 do { \
153 Handle<Object> property; \ 183 Handle<Object> property; \
154 Handle<Name> name = isolate->factory()->flag##_string(); \ 184 Handle<Name> name = isolate->factory()->flag##_string(); \
155 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, property, \ 185 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, property, \
156 JSReceiver::GetProperty(recv, name)); \ 186 JSReceiver::GetProperty(recv, name)); \
157 if (property->BooleanValue()) { \ 187 if (property->BooleanValue()) { \
158 builder.AppendCharacter(c); \ 188 builder.AppendCharacter(c); \
159 } \ 189 } \
160 } while (false); 190 } while (false);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 THROW_NEW_ERROR_RETURN_FAILURE( 222 THROW_NEW_ERROR_RETURN_FAILURE(
193 isolate, NewTypeError(MessageTemplate::kRegExpNonRegExp, 223 isolate, NewTypeError(MessageTemplate::kRegExpNonRegExp,
194 isolate->factory()->NewStringFromAsciiChecked( 224 isolate->factory()->NewStringFromAsciiChecked(
195 "RegExp.prototype.source"))); 225 "RegExp.prototype.source")));
196 } 226 }
197 227
198 Handle<JSRegExp> regexp = Handle<JSRegExp>::cast(recv); 228 Handle<JSRegExp> regexp = Handle<JSRegExp>::cast(recv);
199 return regexp->source(); 229 return regexp->source();
200 } 230 }
201 231
232 BUILTIN(RegExpPrototypeToString) {
233 HandleScope scope(isolate);
234 CHECK_RECEIVER(JSReceiver, recv, "RegExp.prototype.toString");
235
236 if (*recv == isolate->regexp_function()->prototype()) {
237 isolate->CountUsage(v8::Isolate::kRegExpPrototypeToString);
238 }
239
240 IncrementalStringBuilder builder(isolate);
241
242 builder.AppendCharacter('/');
243 {
244 Handle<Object> source;
245 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
246 isolate, source,
247 JSReceiver::GetProperty(recv, isolate->factory()->source_string()));
248 Handle<String> source_str;
249 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, source_str,
250 Object::ToString(isolate, source));
251 builder.AppendString(source_str);
252 }
253
254 builder.AppendCharacter('/');
255 {
256 Handle<Object> flags;
257 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
258 isolate, flags,
259 JSReceiver::GetProperty(recv, isolate->factory()->flags_string()));
260 Handle<String> flags_str;
261 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, flags_str,
262 Object::ToString(isolate, flags));
263 builder.AppendString(flags_str);
264 }
265
266 RETURN_RESULT_OR_FAILURE(isolate, builder.Finish());
267 }
268
202 // ES6 21.2.4.2. 269 // ES6 21.2.4.2.
203 BUILTIN(RegExpPrototypeSpeciesGetter) { 270 BUILTIN(RegExpPrototypeSpeciesGetter) {
204 HandleScope scope(isolate); 271 HandleScope scope(isolate);
205 return *args.receiver(); 272 return *args.receiver();
206 } 273 }
207 274
208 #define REGEXP_FLAG_GETTER(name, counter, getter) \ 275 #define REGEXP_FLAG_GETTER(name, counter, getter) \
209 BUILTIN(RegExpPrototype##name##Getter) { \ 276 BUILTIN(RegExpPrototype##name##Getter) { \
210 HandleScope scope(isolate); \ 277 HandleScope scope(isolate); \
211 Handle<Object> recv = args.receiver(); \ 278 Handle<Object> recv = args.receiver(); \
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 BUILTIN(RegExpPrototypeRightContextGetter) { 454 BUILTIN(RegExpPrototypeRightContextGetter) {
388 HandleScope scope(isolate); 455 HandleScope scope(isolate);
389 const int start_index = GetLastMatchCapture(isolate, 1); 456 const int start_index = GetLastMatchCapture(isolate, 1);
390 Handle<String> last_subject = GetLastMatchSubject(isolate); 457 Handle<String> last_subject = GetLastMatchSubject(isolate);
391 const int len = last_subject->length(); 458 const int len = last_subject->length();
392 return *isolate->factory()->NewSubString(last_subject, start_index, len); 459 return *isolate->factory()->NewSubString(last_subject, start_index, len);
393 } 460 }
394 461
395 } // namespace internal 462 } // namespace internal
396 } // namespace v8 463 } // namespace v8
OLDNEW
« no previous file with comments | « src/builtins/builtins.h ('k') | src/js/regexp.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698