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

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

Issue 2392463005: [regexp] Port RegExpCompile and RegExpToString (Closed)
Patch Set: Rebase 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/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-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 #include "src/string-builder.h"
10 11
11 namespace v8 { 12 namespace v8 {
12 namespace internal { 13 namespace internal {
13 14
14 // ----------------------------------------------------------------------------- 15 // -----------------------------------------------------------------------------
15 // ES6 section 21.2 RegExp Objects 16 // ES6 section 21.2 RegExp Objects
16 17
17 namespace { 18 namespace {
18 19
19 // ES#sec-isregexp IsRegExp ( argument ) 20 // ES#sec-isregexp IsRegExp ( argument )
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 152
152 Handle<JSObject> object; 153 Handle<JSObject> object;
153 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 154 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
154 isolate, object, JSObject::New(target, new_target_receiver)); 155 isolate, object, JSObject::New(target, new_target_receiver));
155 Handle<JSRegExp> regexp = Handle<JSRegExp>::cast(object); 156 Handle<JSRegExp> regexp = Handle<JSRegExp>::cast(object);
156 157
157 RETURN_RESULT_OR_FAILURE(isolate, 158 RETURN_RESULT_OR_FAILURE(isolate,
158 RegExpInitialize(isolate, regexp, pattern, flags)); 159 RegExpInitialize(isolate, regexp, pattern, flags));
159 } 160 }
160 161
162 BUILTIN(RegExpPrototypeCompile) {
163 HandleScope scope(isolate);
164 CHECK_RECEIVER(JSRegExp, regexp, "RegExp.prototype.compile");
165
166 Handle<Object> pattern = args.atOrUndefined(isolate, 1);
167 Handle<Object> flags = args.atOrUndefined(isolate, 2);
168
169 if (pattern->IsJSRegExp()) {
170 Handle<JSRegExp> pattern_regexp = Handle<JSRegExp>::cast(pattern);
171
172 if (!flags->IsUndefined(isolate)) {
173 THROW_NEW_ERROR_RETURN_FAILURE(
174 isolate, NewTypeError(MessageTemplate::kRegExpFlags));
175 }
176
177 flags = PatternFlags(isolate, pattern_regexp);
178 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
179 isolate, pattern,
180 Object::GetProperty(pattern, isolate->factory()->source_string()));
181 }
182
183 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
184 isolate, regexp, RegExpInitialize(isolate, regexp, pattern, flags));
185
186 // Return undefined for compatibility with JSC.
187 // See http://crbug.com/585775 for web compat details.
188
189 return isolate->heap()->undefined_value();
190 }
191
161 namespace { 192 namespace {
162 193
163 compiler::Node* LoadLastIndex(CodeStubAssembler* a, compiler::Node* context, 194 compiler::Node* LoadLastIndex(CodeStubAssembler* a, compiler::Node* context,
164 compiler::Node* has_initialmap, 195 compiler::Node* has_initialmap,
165 compiler::Node* regexp) { 196 compiler::Node* regexp) {
166 typedef CodeStubAssembler::Variable Variable; 197 typedef CodeStubAssembler::Variable Variable;
167 typedef CodeStubAssembler::Label Label; 198 typedef CodeStubAssembler::Label Label;
168 typedef compiler::Node Node; 199 typedef compiler::Node Node;
169 200
170 Variable var_value(a, MachineRepresentation::kTagged); 201 Variable var_value(a, MachineRepresentation::kTagged);
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after
649 THROW_NEW_ERROR_RETURN_FAILURE( 680 THROW_NEW_ERROR_RETURN_FAILURE(
650 isolate, NewTypeError(MessageTemplate::kRegExpNonRegExp, 681 isolate, NewTypeError(MessageTemplate::kRegExpNonRegExp,
651 isolate->factory()->NewStringFromAsciiChecked( 682 isolate->factory()->NewStringFromAsciiChecked(
652 "RegExp.prototype.source"))); 683 "RegExp.prototype.source")));
653 } 684 }
654 685
655 Handle<JSRegExp> regexp = Handle<JSRegExp>::cast(recv); 686 Handle<JSRegExp> regexp = Handle<JSRegExp>::cast(recv);
656 return regexp->source(); 687 return regexp->source();
657 } 688 }
658 689
690 BUILTIN(RegExpPrototypeToString) {
691 HandleScope scope(isolate);
692 CHECK_RECEIVER(JSReceiver, recv, "RegExp.prototype.toString");
693
694 if (*recv == isolate->regexp_function()->prototype()) {
695 isolate->CountUsage(v8::Isolate::kRegExpPrototypeToString);
696 }
697
698 IncrementalStringBuilder builder(isolate);
699
700 builder.AppendCharacter('/');
701 {
702 Handle<Object> source;
703 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
704 isolate, source,
705 JSReceiver::GetProperty(recv, isolate->factory()->source_string()));
706 Handle<String> source_str;
707 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, source_str,
708 Object::ToString(isolate, source));
709 builder.AppendString(source_str);
710 }
711
712 builder.AppendCharacter('/');
713 {
714 Handle<Object> flags;
715 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
716 isolate, flags,
717 JSReceiver::GetProperty(recv, isolate->factory()->flags_string()));
718 Handle<String> flags_str;
719 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, flags_str,
720 Object::ToString(isolate, flags));
721 builder.AppendString(flags_str);
722 }
723
724 RETURN_RESULT_OR_FAILURE(isolate, builder.Finish());
725 }
726
659 // ES6 21.2.4.2. 727 // ES6 21.2.4.2.
660 BUILTIN(RegExpPrototypeSpeciesGetter) { 728 BUILTIN(RegExpPrototypeSpeciesGetter) {
661 HandleScope scope(isolate); 729 HandleScope scope(isolate);
662 return *args.receiver(); 730 return *args.receiver();
663 } 731 }
664 732
665 namespace { 733 namespace {
666 734
667 void Generate_FlagGetter(CodeStubAssembler* a, JSRegExp::Flag flag, 735 void Generate_FlagGetter(CodeStubAssembler* a, JSRegExp::Flag flag,
668 v8::Isolate::UseCounterFeature counter, 736 v8::Isolate::UseCounterFeature counter,
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 BUILTIN(RegExpRightContextGetter) { 971 BUILTIN(RegExpRightContextGetter) {
904 HandleScope scope(isolate); 972 HandleScope scope(isolate);
905 const int start_index = GetLastMatchCapture(isolate, 1); 973 const int start_index = GetLastMatchCapture(isolate, 1);
906 Handle<String> last_subject = GetLastMatchSubject(isolate); 974 Handle<String> last_subject = GetLastMatchSubject(isolate);
907 const int len = last_subject->length(); 975 const int len = last_subject->length();
908 return *isolate->factory()->NewSubString(last_subject, start_index, len); 976 return *isolate->factory()->NewSubString(last_subject, start_index, len);
909 } 977 }
910 978
911 } // namespace internal 979 } // namespace internal
912 } // namespace v8 980 } // 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