From 6bd6376588ba4934a88397bd8f87d3a3fe7a095d Mon Sep 17 00:00:00 2001 From: "lrn@chromium.org" Date: Thu, 22 Jan 2009 10:37:09 +0000 Subject: [PATCH] RegExp parser forgot to advance after reading \c in character class. I.e., \cM was interpreted as \ccM. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1122 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/parser.cc | 1 + test/mjsunit/regexp.js | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/parser.cc b/src/parser.cc index c8dbb36..9e7b4b3 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -4052,6 +4052,7 @@ uc32 RegExpParser::ParseClassCharacterEscape() { Advance(); return '\v'; case 'c': + Advance(); return ParseControlLetterEscape(); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': diff --git a/test/mjsunit/regexp.js b/test/mjsunit/regexp.js index 4422211..716b54b 100644 --- a/test/mjsunit/regexp.js +++ b/test/mjsunit/regexp.js @@ -94,6 +94,22 @@ assertFalse(/\ca/.test( "\\ca" )); //assertTrue(/\c[a/]/.test( "\x1ba/]" )); +// Test \c in character class +re = /^[\cM]$/; +assertTrue(re.test("\r")); +assertFalse(re.test("M")); +assertFalse(re.test("c")); +assertFalse(re.test("\\")); +assertFalse(re.test("\x03")); // I.e., read as \cc + +re = /^[\c]]$/; +assertTrue(re.test("c]")); +assertFalse(re.test("\\]")); +assertFalse(re.test("\x1d")); // ']' & 0x1f +assertFalse(re.test("\\]")); +assertFalse(re.test("\x03]")); // I.e., read as \cc + + // Test that we handle \s and \S correctly inside some bizarre // character classes. re = /[\s-:]/; -- 2.7.4