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

Side by Side Diff: src/js/regexp.js

Issue 2302773002: [regexp] Port RegExpConstructor (Closed)
Patch Set: Tweaks 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/heap-symbols.h ('k') | src/v8.gyp » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 (function(global, utils) { 5 (function(global, utils) {
6 6
7 %CheckIsBootstrapping(); 7 %CheckIsBootstrapping();
8 8
9 // ------------------------------------------------------------------- 9 // -------------------------------------------------------------------
10 // Imports 10 // Imports
11 11
12 var ExpandReplacement; 12 var ExpandReplacement;
13 var GlobalArray = global.Array; 13 var GlobalArray = global.Array;
14 var GlobalObject = global.Object; 14 var GlobalObject = global.Object;
15 var GlobalRegExp = global.RegExp; 15 var GlobalRegExp = global.RegExp;
16 var GlobalRegExpPrototype;
17 var InternalArray = utils.InternalArray; 16 var InternalArray = utils.InternalArray;
18 var InternalPackedArray = utils.InternalPackedArray; 17 var InternalPackedArray = utils.InternalPackedArray;
19 var MaxSimple; 18 var MaxSimple;
20 var MinSimple; 19 var MinSimple;
21 var matchSymbol = utils.ImportNow("match_symbol"); 20 var matchSymbol = utils.ImportNow("match_symbol");
22 var replaceSymbol = utils.ImportNow("replace_symbol"); 21 var replaceSymbol = utils.ImportNow("replace_symbol");
23 var searchSymbol = utils.ImportNow("search_symbol"); 22 var searchSymbol = utils.ImportNow("search_symbol");
24 var speciesSymbol = utils.ImportNow("species_symbol"); 23 var speciesSymbol = utils.ImportNow("species_symbol");
25 var splitSymbol = utils.ImportNow("split_symbol"); 24 var splitSymbol = utils.ImportNow("split_symbol");
26 var SpeciesConstructor; 25 var SpeciesConstructor;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 72
74 function PatternFlags(pattern) { 73 function PatternFlags(pattern) {
75 return (REGEXP_GLOBAL(pattern) ? 'g' : '') + 74 return (REGEXP_GLOBAL(pattern) ? 'g' : '') +
76 (REGEXP_IGNORE_CASE(pattern) ? 'i' : '') + 75 (REGEXP_IGNORE_CASE(pattern) ? 'i' : '') +
77 (REGEXP_MULTILINE(pattern) ? 'm' : '') + 76 (REGEXP_MULTILINE(pattern) ? 'm' : '') +
78 (REGEXP_UNICODE(pattern) ? 'u' : '') + 77 (REGEXP_UNICODE(pattern) ? 'u' : '') +
79 (REGEXP_STICKY(pattern) ? 'y' : ''); 78 (REGEXP_STICKY(pattern) ? 'y' : '');
80 } 79 }
81 80
82 81
83 // ES#sec-regexp-pattern-flags
84 // RegExp ( pattern, flags )
85 function RegExpConstructor(pattern, flags) {
86 var newtarget = new.target;
87 var pattern_is_regexp = IsRegExp(pattern);
88
89 if (IS_UNDEFINED(newtarget)) {
90 newtarget = GlobalRegExp;
91
92 // ES6 section 21.2.3.1 step 3.b
93 if (pattern_is_regexp && IS_UNDEFINED(flags) &&
94 pattern.constructor === newtarget) {
95 return pattern;
96 }
97 }
98
99 if (IS_REGEXP(pattern)) {
100 if (IS_UNDEFINED(flags)) flags = PatternFlags(pattern);
101 pattern = REGEXP_SOURCE(pattern);
102
103 } else if (pattern_is_regexp) {
104 var input_pattern = pattern;
105 pattern = pattern.source;
106 if (IS_UNDEFINED(flags)) flags = input_pattern.flags;
107 }
108
109 var object = %_NewObject(GlobalRegExp, newtarget);
110 return RegExpInitialize(object, pattern, flags);
111 }
112
113
114 // ES#sec-regexp.prototype.compile RegExp.prototype.compile (pattern, flags) 82 // ES#sec-regexp.prototype.compile RegExp.prototype.compile (pattern, flags)
115 function RegExpCompileJS(pattern, flags) { 83 function RegExpCompileJS(pattern, flags) {
116 if (!IS_REGEXP(this)) { 84 if (!IS_REGEXP(this)) {
117 throw %make_type_error(kIncompatibleMethodReceiver, 85 throw %make_type_error(kIncompatibleMethodReceiver,
118 "RegExp.prototype.compile", this); 86 "RegExp.prototype.compile", this);
119 } 87 }
120 88
121 if (IS_REGEXP(pattern)) { 89 if (IS_REGEXP(pattern)) {
122 if (!IS_UNDEFINED(flags)) throw %make_type_error(kRegExpFlags); 90 if (!IS_UNDEFINED(flags)) throw %make_type_error(kRegExpFlags);
123 91
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 } 332 }
365 return regexp_val; 333 return regexp_val;
366 } 334 }
367 335
368 336
369 function RegExpToString() { 337 function RegExpToString() {
370 if (!IS_RECEIVER(this)) { 338 if (!IS_RECEIVER(this)) {
371 throw %make_type_error( 339 throw %make_type_error(
372 kIncompatibleMethodReceiver, 'RegExp.prototype.toString', this); 340 kIncompatibleMethodReceiver, 'RegExp.prototype.toString', this);
373 } 341 }
374 if (this === GlobalRegExpPrototype) { 342 if (this === GlobalRegExp.prototype) {
375 %IncrementUseCounter(kRegExpPrototypeToString); 343 %IncrementUseCounter(kRegExpPrototypeToString);
376 } 344 }
377 return '/' + TO_STRING(this.source) + '/' + TO_STRING(this.flags); 345 return '/' + TO_STRING(this.source) + '/' + TO_STRING(this.flags);
378 } 346 }
379 347
380 348
381 function AtSurrogatePair(subject, index) { 349 function AtSurrogatePair(subject, index) {
382 if (index + 1 >= subject.length) return false; 350 if (index + 1 >= subject.length) return false;
383 var first = %_StringCharCodeAt(subject, index); 351 var first = %_StringCharCodeAt(subject, index);
384 if (first < 0xD800 || first > 0xDBFF) return false; 352 if (first < 0xD800 || first > 0xDBFF) return false;
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after
1029 if (this.unicode) result += 'u'; 997 if (this.unicode) result += 'u';
1030 if (this.sticky) result += 'y'; 998 if (this.sticky) result += 'y';
1031 return result; 999 return result;
1032 } 1000 }
1033 1001
1034 1002
1035 // ES6 21.2.5.4. 1003 // ES6 21.2.5.4.
1036 function RegExpGetGlobal() { 1004 function RegExpGetGlobal() {
1037 if (!IS_REGEXP(this)) { 1005 if (!IS_REGEXP(this)) {
1038 // TODO(littledan): Remove this RegExp compat workaround 1006 // TODO(littledan): Remove this RegExp compat workaround
1039 if (this === GlobalRegExpPrototype) { 1007 if (this === GlobalRegExp.prototype) {
1040 %IncrementUseCounter(kRegExpPrototypeOldFlagGetter); 1008 %IncrementUseCounter(kRegExpPrototypeOldFlagGetter);
1041 return UNDEFINED; 1009 return UNDEFINED;
1042 } 1010 }
1043 throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.global"); 1011 throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.global");
1044 } 1012 }
1045 return TO_BOOLEAN(REGEXP_GLOBAL(this)); 1013 return TO_BOOLEAN(REGEXP_GLOBAL(this));
1046 } 1014 }
1047 %SetForceInlineFlag(RegExpGetGlobal); 1015 %SetForceInlineFlag(RegExpGetGlobal);
1048 1016
1049 1017
1050 // ES6 21.2.5.5. 1018 // ES6 21.2.5.5.
1051 function RegExpGetIgnoreCase() { 1019 function RegExpGetIgnoreCase() {
1052 if (!IS_REGEXP(this)) { 1020 if (!IS_REGEXP(this)) {
1053 // TODO(littledan): Remove this RegExp compat workaround 1021 // TODO(littledan): Remove this RegExp compat workaround
1054 if (this === GlobalRegExpPrototype) { 1022 if (this === GlobalRegExp.prototype) {
1055 %IncrementUseCounter(kRegExpPrototypeOldFlagGetter); 1023 %IncrementUseCounter(kRegExpPrototypeOldFlagGetter);
1056 return UNDEFINED; 1024 return UNDEFINED;
1057 } 1025 }
1058 throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.ignoreCase"); 1026 throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.ignoreCase");
1059 } 1027 }
1060 return TO_BOOLEAN(REGEXP_IGNORE_CASE(this)); 1028 return TO_BOOLEAN(REGEXP_IGNORE_CASE(this));
1061 } 1029 }
1062 1030
1063 1031
1064 // ES6 21.2.5.7. 1032 // ES6 21.2.5.7.
1065 function RegExpGetMultiline() { 1033 function RegExpGetMultiline() {
1066 if (!IS_REGEXP(this)) { 1034 if (!IS_REGEXP(this)) {
1067 // TODO(littledan): Remove this RegExp compat workaround 1035 // TODO(littledan): Remove this RegExp compat workaround
1068 if (this === GlobalRegExpPrototype) { 1036 if (this === GlobalRegExp.prototype) {
1069 %IncrementUseCounter(kRegExpPrototypeOldFlagGetter); 1037 %IncrementUseCounter(kRegExpPrototypeOldFlagGetter);
1070 return UNDEFINED; 1038 return UNDEFINED;
1071 } 1039 }
1072 throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.multiline"); 1040 throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.multiline");
1073 } 1041 }
1074 return TO_BOOLEAN(REGEXP_MULTILINE(this)); 1042 return TO_BOOLEAN(REGEXP_MULTILINE(this));
1075 } 1043 }
1076 1044
1077 1045
1078 // ES6 21.2.5.10. 1046 // ES6 21.2.5.10.
1079 function RegExpGetSource() { 1047 function RegExpGetSource() {
1080 if (!IS_REGEXP(this)) { 1048 if (!IS_REGEXP(this)) {
1081 // TODO(littledan): Remove this RegExp compat workaround 1049 // TODO(littledan): Remove this RegExp compat workaround
1082 if (this === GlobalRegExpPrototype) { 1050 if (this === GlobalRegExp.prototype) {
1083 %IncrementUseCounter(kRegExpPrototypeSourceGetter); 1051 %IncrementUseCounter(kRegExpPrototypeSourceGetter);
1084 return "(?:)"; 1052 return "(?:)";
1085 } 1053 }
1086 throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.source"); 1054 throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.source");
1087 } 1055 }
1088 return REGEXP_SOURCE(this); 1056 return REGEXP_SOURCE(this);
1089 } 1057 }
1090 1058
1091 1059
1092 // ES6 21.2.5.12. 1060 // ES6 21.2.5.12.
1093 function RegExpGetSticky() { 1061 function RegExpGetSticky() {
1094 if (!IS_REGEXP(this)) { 1062 if (!IS_REGEXP(this)) {
1095 // Compat fix: RegExp.prototype.sticky == undefined; UseCounter tracks it 1063 // Compat fix: RegExp.prototype.sticky == undefined; UseCounter tracks it
1096 // TODO(littledan): Remove this workaround or standardize it 1064 // TODO(littledan): Remove this workaround or standardize it
1097 if (this === GlobalRegExpPrototype) { 1065 if (this === GlobalRegExp.prototype) {
1098 %IncrementUseCounter(kRegExpPrototypeStickyGetter); 1066 %IncrementUseCounter(kRegExpPrototypeStickyGetter);
1099 return UNDEFINED; 1067 return UNDEFINED;
1100 } 1068 }
1101 throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.sticky"); 1069 throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.sticky");
1102 } 1070 }
1103 return TO_BOOLEAN(REGEXP_STICKY(this)); 1071 return TO_BOOLEAN(REGEXP_STICKY(this));
1104 } 1072 }
1105 %SetForceInlineFlag(RegExpGetSticky); 1073 %SetForceInlineFlag(RegExpGetSticky);
1106 1074
1107 1075
1108 // ES6 21.2.5.15. 1076 // ES6 21.2.5.15.
1109 function RegExpGetUnicode() { 1077 function RegExpGetUnicode() {
1110 if (!IS_REGEXP(this)) { 1078 if (!IS_REGEXP(this)) {
1111 // TODO(littledan): Remove this RegExp compat workaround 1079 // TODO(littledan): Remove this RegExp compat workaround
1112 if (this === GlobalRegExpPrototype) { 1080 if (this === GlobalRegExp.prototype) {
1113 %IncrementUseCounter(kRegExpPrototypeUnicodeGetter); 1081 %IncrementUseCounter(kRegExpPrototypeUnicodeGetter);
1114 return UNDEFINED; 1082 return UNDEFINED;
1115 } 1083 }
1116 throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.unicode"); 1084 throw %make_type_error(kRegExpNonRegExp, "RegExp.prototype.unicode");
1117 } 1085 }
1118 return TO_BOOLEAN(REGEXP_UNICODE(this)); 1086 return TO_BOOLEAN(REGEXP_UNICODE(this));
1119 } 1087 }
1120 %SetForceInlineFlag(RegExpGetUnicode); 1088 %SetForceInlineFlag(RegExpGetUnicode);
1121 1089
1122 1090
1123 function RegExpSpecies() { 1091 function RegExpSpecies() {
1124 return this; 1092 return this;
1125 } 1093 }
1126 1094
1127 1095
1128 // ------------------------------------------------------------------- 1096 // -------------------------------------------------------------------
1129 1097
1130 %FunctionSetInstanceClassName(GlobalRegExp, 'RegExp');
1131 GlobalRegExpPrototype = new GlobalObject();
1132 %FunctionSetPrototype(GlobalRegExp, GlobalRegExpPrototype);
1133 %AddNamedProperty(
1134 GlobalRegExp.prototype, 'constructor', GlobalRegExp, DONT_ENUM);
1135 %SetCode(GlobalRegExp, RegExpConstructor);
1136
1137 utils.InstallGetter(GlobalRegExp, speciesSymbol, RegExpSpecies); 1098 utils.InstallGetter(GlobalRegExp, speciesSymbol, RegExpSpecies);
1138 1099
1139 utils.InstallFunctions(GlobalRegExp.prototype, DONT_ENUM, [ 1100 utils.InstallFunctions(GlobalRegExp.prototype, DONT_ENUM, [
1140 "exec", RegExpSubclassExecJS, 1101 "exec", RegExpSubclassExecJS,
1141 "test", RegExpSubclassTest, 1102 "test", RegExpSubclassTest,
1142 "toString", RegExpToString, 1103 "toString", RegExpToString,
1143 "compile", RegExpCompileJS, 1104 "compile", RegExpCompileJS,
1144 matchSymbol, RegExpSubclassMatch, 1105 matchSymbol, RegExpSubclassMatch,
1145 replaceSymbol, RegExpSubclassReplace, 1106 replaceSymbol, RegExpSubclassReplace,
1146 searchSymbol, RegExpSubclassSearch, 1107 searchSymbol, RegExpSubclassSearch,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1231 to.InternalRegExpMatch = InternalRegExpMatch; 1192 to.InternalRegExpMatch = InternalRegExpMatch;
1232 to.InternalRegExpReplace = InternalRegExpReplace; 1193 to.InternalRegExpReplace = InternalRegExpReplace;
1233 to.IsRegExp = IsRegExp; 1194 to.IsRegExp = IsRegExp;
1234 to.RegExpExec = DoRegExpExec; 1195 to.RegExpExec = DoRegExpExec;
1235 to.RegExpInitialize = RegExpInitialize; 1196 to.RegExpInitialize = RegExpInitialize;
1236 to.RegExpLastMatchInfo = RegExpLastMatchInfo; 1197 to.RegExpLastMatchInfo = RegExpLastMatchInfo;
1237 to.RegExpTest = RegExpTest; 1198 to.RegExpTest = RegExpTest;
1238 }); 1199 });
1239 1200
1240 }) 1201 })
OLDNEW
« no previous file with comments | « src/heap-symbols.h ('k') | src/v8.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698