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

Side by Side Diff: src/regexp.js

Issue 286203010: Harden builtins BuildResultFromMatchInfo and URIDecodeOctets (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: address comments Created 6 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « src/hydrogen.cc ('k') | src/uri.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 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 // This file relies on the fact that the following declaration has been made 5 // This file relies on the fact that the following declaration has been made
6 // in runtime.js: 6 // in runtime.js:
7 // var $Object = global.Object; 7 // var $Object = global.Object;
8 // var $Array = global.Array; 8 // var $Array = global.Array;
9 9
10 var $RegExp = global.RegExp; 10 var $RegExp = global.RegExp;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 } 101 }
102 102
103 103
104 function DoRegExpExec(regexp, string, index) { 104 function DoRegExpExec(regexp, string, index) {
105 var result = %_RegExpExec(regexp, string, index, lastMatchInfo); 105 var result = %_RegExpExec(regexp, string, index, lastMatchInfo);
106 if (result !== null) lastMatchInfoOverride = null; 106 if (result !== null) lastMatchInfoOverride = null;
107 return result; 107 return result;
108 } 108 }
109 109
110 110
111 function BuildResultFromMatchInfo(lastMatchInfo, s) { 111 // This is kind of performance sensitive, so we want to avoid unnecessary
112 var numResults = NUMBER_OF_CAPTURES(lastMatchInfo) >> 1; 112 // type checks on inputs. But we also don't want to inline it several times
113 var start = lastMatchInfo[CAPTURE0]; 113 // manually, so we use a macro :-)
114 var end = lastMatchInfo[CAPTURE1]; 114 macro RETURN_NEW_RESULT_FROM_MATCH_INFO(MATCHINFO, STRING)
115 var result = %_RegExpConstructResult(numResults, start, s); 115 var numResults = NUMBER_OF_CAPTURES(MATCHINFO) >> 1;
116 result[0] = %_SubString(s, start, end); 116 var start = MATCHINFO[CAPTURE0];
117 var end = MATCHINFO[CAPTURE1];
118 var result = %_RegExpConstructResult(numResults, start, STRING);
119 result[0] = %_SubString(STRING, start, end);
117 var j = REGEXP_FIRST_CAPTURE + 2; 120 var j = REGEXP_FIRST_CAPTURE + 2;
118 for (var i = 1; i < numResults; i++) { 121 for (var i = 1; i < numResults; i++) {
119 start = lastMatchInfo[j++]; 122 start = MATCHINFO[j++];
120 if (start != -1) { 123 if (start != -1) {
121 end = lastMatchInfo[j]; 124 end = MATCHINFO[j];
122 result[i] = %_SubString(s, start, end); 125 result[i] = %_SubString(STRING, start, end);
123 } 126 }
124 j++; 127 j++;
125 } 128 }
126 return result; 129 return result;
127 } 130 endmacro
128 131
129 132
130 function RegExpExecNoTests(regexp, string, start) { 133 function RegExpExecNoTests(regexp, string, start) {
131 // Must be called with RegExp, string and positive integer as arguments. 134 // Must be called with RegExp, string and positive integer as arguments.
132 var matchInfo = %_RegExpExec(regexp, string, start, lastMatchInfo); 135 var matchInfo = %_RegExpExec(regexp, string, start, lastMatchInfo);
133 if (matchInfo !== null) { 136 if (matchInfo !== null) {
134 lastMatchInfoOverride = null; 137 lastMatchInfoOverride = null;
135 return BuildResultFromMatchInfo(matchInfo, string); 138 RETURN_NEW_RESULT_FROM_MATCH_INFO(matchInfo, string);
136 } 139 }
137 regexp.lastIndex = 0; 140 regexp.lastIndex = 0;
138 return null; 141 return null;
139 } 142 }
140 143
141 144
142 function RegExpExec(string) { 145 function RegExpExec(string) {
143 if (!IS_REGEXP(this)) { 146 if (!IS_REGEXP(this)) {
144 throw MakeTypeError('incompatible_method_receiver', 147 throw MakeTypeError('incompatible_method_receiver',
145 ['RegExp.prototype.exec', this]); 148 ['RegExp.prototype.exec', this]);
(...skipping 22 matching lines...) Expand all
168 if (IS_NULL(matchIndices)) { 171 if (IS_NULL(matchIndices)) {
169 this.lastIndex = 0; 172 this.lastIndex = 0;
170 return null; 173 return null;
171 } 174 }
172 175
173 // Successful match. 176 // Successful match.
174 lastMatchInfoOverride = null; 177 lastMatchInfoOverride = null;
175 if (global) { 178 if (global) {
176 this.lastIndex = lastMatchInfo[CAPTURE1]; 179 this.lastIndex = lastMatchInfo[CAPTURE1];
177 } 180 }
178 return BuildResultFromMatchInfo(matchIndices, string); 181 RETURN_NEW_RESULT_FROM_MATCH_INFO(matchIndices, string);
179 } 182 }
180 183
181 184
182 // One-element cache for the simplified test regexp. 185 // One-element cache for the simplified test regexp.
183 var regexp_key; 186 var regexp_key;
184 var regexp_val; 187 var regexp_val;
185 188
186 // Section 15.10.6.3 doesn't actually make sense, but the intention seems to be 189 // Section 15.10.6.3 doesn't actually make sense, but the intention seems to be
187 // that test is defined in terms of String.prototype.exec. However, it probably 190 // that test is defined in terms of String.prototype.exec. However, it probably
188 // means the original value of String.prototype.exec, which is what everybody 191 // means the original value of String.prototype.exec, which is what everybody
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 453
451 for (var i = 1; i < 10; ++i) { 454 for (var i = 1; i < 10; ++i) {
452 %DefineOrRedefineAccessorProperty($RegExp, '$' + i, 455 %DefineOrRedefineAccessorProperty($RegExp, '$' + i,
453 RegExpMakeCaptureGetter(i), NoOpSetter, 456 RegExpMakeCaptureGetter(i), NoOpSetter,
454 DONT_DELETE); 457 DONT_DELETE);
455 } 458 }
456 %ToFastProperties($RegExp); 459 %ToFastProperties($RegExp);
457 } 460 }
458 461
459 SetUpRegExp(); 462 SetUpRegExp();
OLDNEW
« no previous file with comments | « src/hydrogen.cc ('k') | src/uri.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698