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

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

Issue 2813623003: [csa] Add IsNumber and IsNumberNormalized predicates (Closed)
Patch Set: Address comments Created 3 years, 8 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 | « no previous file | src/code-stub-assembler.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 2017 the V8 project authors. All rights reserved. 1 // Copyright 2017 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-regexp-gen.h" 5 #include "src/builtins/builtins-regexp-gen.h"
6 6
7 #include "src/builtins/builtins-constructor-gen.h" 7 #include "src/builtins/builtins-constructor-gen.h"
8 #include "src/builtins/builtins-utils-gen.h" 8 #include "src/builtins/builtins-utils-gen.h"
9 #include "src/builtins/builtins.h" 9 #include "src/builtins/builtins.h"
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 #ifdef V8_INTERPRETED_REGEXP 243 #ifdef V8_INTERPRETED_REGEXP
244 return CallRuntime(Runtime::kRegExpExec, context, regexp, string, last_index, 244 return CallRuntime(Runtime::kRegExpExec, context, regexp, string, last_index,
245 match_info); 245 match_info);
246 #else // V8_INTERPRETED_REGEXP 246 #else // V8_INTERPRETED_REGEXP
247 CSA_ASSERT(this, TaggedIsNotSmi(regexp)); 247 CSA_ASSERT(this, TaggedIsNotSmi(regexp));
248 CSA_ASSERT(this, IsJSRegExp(regexp)); 248 CSA_ASSERT(this, IsJSRegExp(regexp));
249 249
250 CSA_ASSERT(this, TaggedIsNotSmi(string)); 250 CSA_ASSERT(this, TaggedIsNotSmi(string));
251 CSA_ASSERT(this, IsString(string)); 251 CSA_ASSERT(this, IsString(string));
252 252
253 CSA_ASSERT(this, IsHeapNumberMap(LoadReceiverMap(last_index))); 253 CSA_ASSERT(this, IsNumber(last_index));
254 CSA_ASSERT(this, IsFixedArrayMap(LoadReceiverMap(match_info))); 254 CSA_ASSERT(this, IsFixedArrayMap(LoadReceiverMap(match_info)));
255 255
256 Node* const int_zero = IntPtrConstant(0); 256 Node* const int_zero = IntPtrConstant(0);
257 257
258 ToDirectStringAssembler to_direct(state(), string); 258 ToDirectStringAssembler to_direct(state(), string);
259 259
260 VARIABLE(var_result, MachineRepresentation::kTagged); 260 VARIABLE(var_result, MachineRepresentation::kTagged);
261 Label out(this), runtime(this, Label::kDeferred); 261 Label out(this), runtime(this, Label::kDeferred);
262 262
263 // External constants. 263 // External constants.
(...skipping 1261 matching lines...) Expand 10 before | Expand all | Expand 10 after
1525 SelectBooleanConstant(WordNotEqual(match_indices, NullConstant())); 1525 SelectBooleanConstant(WordNotEqual(match_indices, NullConstant()));
1526 Return(result); 1526 Return(result);
1527 } 1527 }
1528 } 1528 }
1529 1529
1530 Node* RegExpBuiltinsAssembler::AdvanceStringIndex(Node* const string, 1530 Node* RegExpBuiltinsAssembler::AdvanceStringIndex(Node* const string,
1531 Node* const index, 1531 Node* const index,
1532 Node* const is_unicode, 1532 Node* const is_unicode,
1533 bool is_fastpath) { 1533 bool is_fastpath) {
1534 CSA_ASSERT(this, IsString(string)); 1534 CSA_ASSERT(this, IsString(string));
1535 CSA_ASSERT(this, IsHeapNumberMap(LoadReceiverMap(index))); 1535 CSA_ASSERT(this, IsNumberNormalized(index));
1536 if (is_fastpath) CSA_ASSERT(this, TaggedIsPositiveSmi(index)); 1536 if (is_fastpath) CSA_ASSERT(this, TaggedIsPositiveSmi(index));
1537 1537
1538 // Default to last_index + 1. 1538 // Default to last_index + 1.
1539 // Smi range.
1540
1541 // Default to last_index + 1.
1542 Node* const index_plus_one = NumberInc(index); 1539 Node* const index_plus_one = NumberInc(index);
1543 VARIABLE(var_result, MachineRepresentation::kTagged, index_plus_one); 1540 VARIABLE(var_result, MachineRepresentation::kTagged, index_plus_one);
1544 1541
1545 // Advancing the index has some subtle issues involving the distinction 1542 // Advancing the index has some subtle issues involving the distinction
1546 // between Smis and HeapNumbers. There's three cases: 1543 // between Smis and HeapNumbers. There's three cases:
1547 // * {index} is a Smi, {index_plus_one} is a Smi. The standard case. 1544 // * {index} is a Smi, {index_plus_one} is a Smi. The standard case.
1548 // * {index} is a Smi, {index_plus_one} overflows into a HeapNumber. 1545 // * {index} is a Smi, {index_plus_one} overflows into a HeapNumber.
1549 // In this case we can return the result early, because 1546 // In this case we can return the result early, because
1550 // {index_plus_one} > {string}.length. 1547 // {index_plus_one} > {string}.length.
1551 // * {index} is a HeapNumber, {index_plus_one} is a HeapNumber. This can only 1548 // * {index} is a HeapNumber, {index_plus_one} is a HeapNumber. This can only
(...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after
2349 BIND(&limit_done); 2346 BIND(&limit_done);
2350 { 2347 {
2351 Node* const limit = var_limit.value(); 2348 Node* const limit = var_limit.value();
2352 RegExpPrototypeSplitBody(context, regexp, string, limit); 2349 RegExpPrototypeSplitBody(context, regexp, string, limit);
2353 } 2350 }
2354 2351
2355 Bind(&runtime); 2352 Bind(&runtime);
2356 { 2353 {
2357 // The runtime call passes in limit to ensure the second ToUint32(limit) 2354 // The runtime call passes in limit to ensure the second ToUint32(limit)
2358 // call is not observable. 2355 // call is not observable.
2359 CSA_ASSERT(this, IsHeapNumberMap(LoadReceiverMap(limit))); 2356 CSA_ASSERT(this, IsNumber(limit));
2360 Return(CallRuntime(Runtime::kRegExpSplit, context, regexp, string, limit)); 2357 Return(CallRuntime(Runtime::kRegExpSplit, context, regexp, string, limit));
2361 } 2358 }
2362 } 2359 }
2363 2360
2364 // ES#sec-regexp.prototype-@@split 2361 // ES#sec-regexp.prototype-@@split
2365 // RegExp.prototype [ @@split ] ( string, limit ) 2362 // RegExp.prototype [ @@split ] ( string, limit )
2366 TF_BUILTIN(RegExpPrototypeSplit, RegExpBuiltinsAssembler) { 2363 TF_BUILTIN(RegExpPrototypeSplit, RegExpBuiltinsAssembler) {
2367 Node* const maybe_receiver = Parameter(Descriptor::kReceiver); 2364 Node* const maybe_receiver = Parameter(Descriptor::kReceiver);
2368 Node* const maybe_string = Parameter(Descriptor::kString); 2365 Node* const maybe_string = Parameter(Descriptor::kString);
2369 Node* const maybe_limit = Parameter(Descriptor::kLimit); 2366 Node* const maybe_limit = Parameter(Descriptor::kLimit);
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after
2851 BIND(&if_matched); 2848 BIND(&if_matched);
2852 { 2849 {
2853 Node* result = 2850 Node* result =
2854 ConstructNewResultFromMatchInfo(context, regexp, match_indices, string); 2851 ConstructNewResultFromMatchInfo(context, regexp, match_indices, string);
2855 Return(result); 2852 Return(result);
2856 } 2853 }
2857 } 2854 }
2858 2855
2859 } // namespace internal 2856 } // namespace internal
2860 } // namespace v8 2857 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/code-stub-assembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698