Reviewers: Mads Ager,

Description:
Fix off-by-one in hex-parsing.

Please review this at http://codereview.chromium.org/5129002/

Affected files:
  M src/scanner-base.h
  M test/mjsunit/compiler/literals.js


Index: src/scanner-base.h
diff --git a/src/scanner-base.h b/src/scanner-base.h
index 4952f1cd650cea9f9447c01a75c95ad7e2f9aa5c..61b1fddda9331837f122028eda31972b80b6177c 100644
--- a/src/scanner-base.h
+++ b/src/scanner-base.h
@@ -48,7 +48,7 @@ inline int HexValue(uc32 c) {
   c -= '0';
   if (static_cast<unsigned>(c) <= 9) return c;
   c = (c | 0x20) - ('a' - '0');  // detect 0x11..0x16 and 0x31..0x36.
-  if (static_cast<unsigned>(c) <= 6) return c + 10;
+  if (static_cast<unsigned>(c) <= 5) return c + 10;
   return -1;
 }

Index: test/mjsunit/compiler/literals.js
diff --git a/test/mjsunit/compiler/literals.js b/test/mjsunit/compiler/literals.js index 6775401d442580b158d327948d89b9a83cbd52b5..d846cf5b781dfd2db8cda4e694edf68cdbbfbd5c 100644
--- a/test/mjsunit/compiler/literals.js
+++ b/test/mjsunit/compiler/literals.js
@@ -34,6 +34,43 @@ assertEquals("abc", eval("'abc'"));

 assertEquals(8, eval("6;'abc';8"));

+// Characters just outside the ranges of hex-escapes.
+// "/" comes just before "0".
+assertEquals("x1/", "\x1/");
+assertEquals("u111/", "\u111/");
+assertEquals("\\x1/", RegExp("\\x1/").source);
+assertEquals("\\u111/", RegExp("\\u111/").source);
+
+// ":" comes just after "9".
+assertEquals("x1:", "\x1:");
+assertEquals("u111:", "\u111:");
+assertEquals("\\x1:", /\x1:/.source);
+assertEquals("\\u111:", /\u111:/.source);
+
+// "`" comes just before "a".
+assertEquals("x1`", "\x1`");
+assertEquals("u111`", "\u111`");
+assertEquals("\\x1`", /\x1`/.source);
+assertEquals("\\u111`", /\u111`/.source);
+
+// "g" comes just before "f".
+assertEquals("x1g", "\x1g");
+assertEquals("u111g", "\u111g");
+assertEquals("\\x1g", /\x1g/.source);
+assertEquals("\\u111g", /\u111g/.source);
+
+// "@" comes just before "A".
+assertEquals("x1@", "\x1@");
+assertEquals("u111@", "\u111@");
+assertEquals("\\x1@", /\x1@/.source);
+assertEquals("\\u111@", /\u111@/.source);
+
+// "G" comes just after "F".
+assertEquals("x1G", "\x1G");
+assertEquals("u111G", "\u111G");
+assertEquals("\\x1G", /\x1G/.source);
+assertEquals("\\u111G", /\u111G/.source);
+
 // Test some materialized array literals.
 assertEquals([1,2,3,4], eval('[1,2,3,4]'));
 assertEquals([[1,2],3,4], eval('[[1,2],3,4]'));
@@ -50,3 +87,4 @@ assertEquals([2,4,6,8], eval(s));
 assertEquals(17, eval('[1,2,3,4]; 17'));
 assertEquals(19, eval('var a=1, b=2; [a,b,3,4]; 19'));
 assertEquals(23, eval('var a=1, b=2; c=23; [a,b,3,4]; c'));
+


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to