RegExpParser: Fix Reset()ting to the end.
authormarja <marja@chromium.org>
Tue, 16 Dec 2014 12:14:09 +0000 (04:14 -0800)
committerCommit bot <commit-bot@chromium.org>
Tue, 16 Dec 2014 12:14:19 +0000 (12:14 +0000)
commit978f41a1da57132f97fbfd9b6592cc99689e18ed
tree7df3a0770c6767c4116e03ba593a6e8c15c43d83
parent0f619463f25b5c21d1f47e4f839d8aab34b9284e
RegExpParser: Fix Reset()ting to the end.

The bug would occur when we try to Reset() to a position already at the end.

This happens e.g., when the regexp ends with \u. What used to happen in that
case: 1) Advance past \ and u (to the end) (which wouldn't increase next_pos_
enough) 2) Try to parse 4 hex digits 3) When that failed, Reset() to the
position which should've been at the end but wasn't.

To be able to properly Reset() to a position at the end, we need to allow
next_pos_ to move beyond the end (since position() is next_pos_ - 1).

Minimal repro case:

var r = /foo\u/
r.test("foou") // should be true, was false.

(Note that \u not followed by 4 hex didits should be interpreted as an identity
escape. It already worked unless \u was at the end of the regexp.)

BUG=v8:3756
LOG=NO

Review URL: https://codereview.chromium.org/802313003

Cr-Commit-Position: refs/heads/master@{#25838}
src/parser.cc
test/mjsunit/regress/regress-3756.js [new file with mode: 0644]