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

Side by Side Diff: src/regexp/jsregexp.cc

Issue 1601653006: [regexp] back refs must not start/end in the middle of a surrogate pair (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@unicodeclass
Patch Set: rebase Created 4 years, 11 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
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 #include "src/regexp/jsregexp.h" 5 #include "src/regexp/jsregexp.h"
6 6
7 #include "src/ast/ast.h" 7 #include "src/ast/ast.h"
8 #include "src/base/platform/platform.h" 8 #include "src/base/platform/platform.h"
9 #include "src/compilation-cache.h" 9 #include "src/compilation-cache.h"
10 #include "src/compiler.h" 10 #include "src/compiler.h"
(...skipping 3569 matching lines...) Expand 10 before | Expand all | Expand 10 after
3580 return alt_gens_[i]; 3580 return alt_gens_[i];
3581 } 3581 }
3582 3582
3583 private: 3583 private:
3584 static const int kAFew = 10; 3584 static const int kAFew = 10;
3585 ZoneList<AlternativeGeneration*> alt_gens_; 3585 ZoneList<AlternativeGeneration*> alt_gens_;
3586 AlternativeGeneration a_few_alt_gens_[kAFew]; 3586 AlternativeGeneration a_few_alt_gens_[kAFew];
3587 }; 3587 };
3588 3588
3589 3589
3590 static const uc32 kLeadSurrogateStart = 0xd800;
3591 static const uc32 kLeadSurrogateEnd = 0xdbff;
3592 static const uc32 kTrailSurrogateStart = 0xdc00;
3593 static const uc32 kTrailSurrogateEnd = 0xdfff;
3594 static const uc32 kNonBmpStart = 0x10000;
3595 static const uc32 kNonBmpEnd = 0x10ffff;
3596 static const uc32 kRangeEndMarker = 0x110000; 3590 static const uc32 kRangeEndMarker = 0x110000;
3597 3591
3598 // The '2' variant is has inclusive from and exclusive to. 3592 // The '2' variant is has inclusive from and exclusive to.
3599 // This covers \s as defined in ECMA-262 5.1, 15.10.2.12, 3593 // This covers \s as defined in ECMA-262 5.1, 15.10.2.12,
3600 // which include WhiteSpace (7.2) or LineTerminator (7.3) values. 3594 // which include WhiteSpace (7.2) or LineTerminator (7.3) values.
3601 static const int kSpaceRanges[] = { 3595 static const int kSpaceRanges[] = {
3602 '\t', '\r' + 1, ' ', ' ' + 1, 0x00A0, 0x00A1, 0x1680, 0x1681, 3596 '\t', '\r' + 1, ' ', ' ' + 1, 0x00A0, 0x00A1, 0x1680, 0x1681,
3603 0x180E, 0x180F, 0x2000, 0x200B, 0x2028, 0x202A, 0x202F, 0x2030, 3597 0x180E, 0x180F, 0x2000, 0x200B, 0x2028, 0x202A, 0x202F, 0x2030,
3604 0x205F, 0x2060, 0x3000, 0x3001, 0xFEFF, 0xFF00, kRangeEndMarker}; 3598 0x205F, 0x2060, 0x3000, 0x3001, 0xFEFF, 0xFF00, kRangeEndMarker};
3605 static const int kSpaceRangeCount = arraysize(kSpaceRanges); 3599 static const int kSpaceRangeCount = arraysize(kSpaceRanges);
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after
4386 trace->Flush(compiler, this); 4380 trace->Flush(compiler, this);
4387 return; 4381 return;
4388 } 4382 }
4389 4383
4390 LimitResult limit_result = LimitVersions(compiler, trace); 4384 LimitResult limit_result = LimitVersions(compiler, trace);
4391 if (limit_result == DONE) return; 4385 if (limit_result == DONE) return;
4392 DCHECK(limit_result == CONTINUE); 4386 DCHECK(limit_result == CONTINUE);
4393 4387
4394 RecursionCheck rc(compiler); 4388 RecursionCheck rc(compiler);
4395 4389
4390 bool surrogate_check = compiler->unicode() && !compiler->one_byte();
4391 if (surrogate_check) {
4392 assembler->CheckNotInSurrogatePair(trace->cp_offset(), trace->backtrack());
4393 }
erikcorry 2016/01/26 16:25:06 You don't need this check (and thus you don't need
Yang 2016/01/27 09:06:06 Done. Thanks.
4394
4396 DCHECK_EQ(start_reg_ + 1, end_reg_); 4395 DCHECK_EQ(start_reg_ + 1, end_reg_);
4397 if (compiler->ignore_case()) { 4396 if (compiler->ignore_case()) {
4398 assembler->CheckNotBackReferenceIgnoreCase(start_reg_, read_backward(), 4397 assembler->CheckNotBackReferenceIgnoreCase(start_reg_, read_backward(),
4399 trace->backtrack()); 4398 trace->backtrack());
4400 } else { 4399 } else {
4401 assembler->CheckNotBackReference(start_reg_, read_backward(), 4400 assembler->CheckNotBackReference(start_reg_, read_backward(),
4402 trace->backtrack()); 4401 trace->backtrack());
4403 } 4402 }
4404 // We are going to advance backward, so we may end up at the start. 4403 // We are going to advance backward, so we may end up at the start.
4405 if (read_backward()) trace->set_at_start(Trace::UNKNOWN); 4404 if (read_backward()) trace->set_at_start(Trace::UNKNOWN);
4405
4406 if (surrogate_check) {
4407 assembler->CheckNotInSurrogatePair(trace->cp_offset(), trace->backtrack());
4408 }
4406 on_success()->Emit(compiler, trace); 4409 on_success()->Emit(compiler, trace);
4407 } 4410 }
4408 4411
4409 4412
4410 // ------------------------------------------------------------------- 4413 // -------------------------------------------------------------------
4411 // Dot/dotty output 4414 // Dot/dotty output
4412 4415
4413 4416
4414 #ifdef DEBUG 4417 #ifdef DEBUG
4415 4418
(...skipping 2413 matching lines...) Expand 10 before | Expand all | Expand 10 after
6829 6832
6830 6833
6831 void RegExpResultsCache::Clear(FixedArray* cache) { 6834 void RegExpResultsCache::Clear(FixedArray* cache) {
6832 for (int i = 0; i < kRegExpResultsCacheSize; i++) { 6835 for (int i = 0; i < kRegExpResultsCacheSize; i++) {
6833 cache->set(i, Smi::FromInt(0)); 6836 cache->set(i, Smi::FromInt(0));
6834 } 6837 }
6835 } 6838 }
6836 6839
6837 } // namespace internal 6840 } // namespace internal
6838 } // namespace v8 6841 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/regexp/regexp-macro-assembler.h » ('j') | src/regexp/regexp-macro-assembler.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698