Reviewers: marja,

Description:
Fix issue with numeric property names

We were not correctly treating 1.0 as 1, nor 1.20 as 1.2 in accessors.

BUG=v8:3507
LOG=Y

Please review this at https://codereview.chromium.org/493173003/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+87, -4 lines):
  M src/parser.h
  M src/parser.cc
  M src/preparser.h
  M src/preparser.cc
  M test/mjsunit/object-literal.js


Index: src/parser.cc
diff --git a/src/parser.cc b/src/parser.cc
index db4e0fed2416554afc676609979d00e0317acf46..197f81727d4960a577e2589e96dd1f39bf70d4d8 100644
--- a/src/parser.cc
+++ b/src/parser.cc
@@ -629,6 +629,15 @@ const AstRawString* ParserTraits::GetSymbol(Scanner* scanner) {
 }


+const AstRawString* ParserTraits::GetNumberAsSymbol(Scanner* scanner) {
+  double double_value = parser_->scanner()->DoubleValue();
+  char array[100];
+  const char* string =
+ DoubleToCString(double_value, Vector<char>(array, ARRAY_SIZE(array)));
+  return ast_value_factory()->GetOneByteString(string);
+}
+
+
 const AstRawString* ParserTraits::GetNextSymbol(Scanner* scanner) {
   return parser_->scanner()->NextSymbol(parser_->ast_value_factory_);
 }
Index: src/parser.h
diff --git a/src/parser.h b/src/parser.h
index 4aa6f719f3b9361d7cf6a1622f4cc7cc8dd0f908..dc2fb9c3ee1f6946f2b3d5d452d26e4f56f03244 100644
--- a/src/parser.h
+++ b/src/parser.h
@@ -534,6 +534,7 @@ class ParserTraits {
   // Producing data during the recursive descent.
   const AstRawString* GetSymbol(Scanner* scanner);
   const AstRawString* GetNextSymbol(Scanner* scanner);
+  const AstRawString* GetNumberAsSymbol(Scanner* scanner);

   Expression* ThisExpression(Scope* scope,
AstNodeFactory<AstConstructionVisitor>* factory,
Index: src/preparser.cc
diff --git a/src/preparser.cc b/src/preparser.cc
index 04907d3c1cab9f3d378b347e47992a0717300a70..f100f4af672e111eb89fa3820ac76c1b87c968c0 100644
--- a/src/preparser.cc
+++ b/src/preparser.cc
@@ -82,6 +82,11 @@ PreParserIdentifier PreParserTraits::GetSymbol(Scanner* scanner) {
 }


+PreParserIdentifier PreParserTraits::GetNumberAsSymbol(Scanner* scanner) {
+  return PreParserIdentifier::Default();
+}
+
+
 PreParserExpression PreParserTraits::ExpressionFromString(
     int pos, Scanner* scanner, PreParserFactory* factory) {
   if (scanner->UnescapedLiteralMatches("use strict", 10)) {
Index: src/preparser.h
diff --git a/src/preparser.h b/src/preparser.h
index 2c8e405ceea9242d23417ceb632693e9105611ac..793903bf5b06abd27e7662328abc2b5dd9851026 100644
--- a/src/preparser.h
+++ b/src/preparser.h
@@ -1248,6 +1248,7 @@ class PreParserTraits {

   // Producing data during the recursive descent.
   PreParserIdentifier GetSymbol(Scanner* scanner);
+  PreParserIdentifier GetNumberAsSymbol(Scanner* scanner);

   static PreParserIdentifier GetNextSymbol(Scanner* scanner) {
     return PreParserIdentifier::Default();
@@ -1893,10 +1894,7 @@ typename ParserBase<Traits>::ObjectLiteralPropertyT ParserBase<
             break;
           case Token::NUMBER:
             Consume(Token::NUMBER);
-            // TODO(arv): Fix issue with numeric keys. get 1.0() should be
-            // treated as if the key was '1'
-            // https://code.google.com/p/v8/issues/detail?id=3507
-            name = this->GetSymbol(scanner_);
+            name = this->GetNumberAsSymbol(scanner_);
             break;
           default:
             name = ParseIdentifierName(
Index: test/mjsunit/object-literal.js
diff --git a/test/mjsunit/object-literal.js b/test/mjsunit/object-literal.js
index 3d0b33bd99195584829d67db2af31ed123ce6d31..53188d15b8aebeb39ad30470f3f08da5565bc7ab 100644
--- a/test/mjsunit/object-literal.js
+++ b/test/mjsunit/object-literal.js
@@ -190,3 +190,73 @@ function testKeywordProperty(keyword) {
 for (var i = 0; i < keywords.length; i++) {
   testKeywordProperty(keywords[i]);
 }
+
+
+(function TestNumericNames() {
+  var o = {
+    1: 1,
+    2.: 2,
+    3.0: 3,
+    4e0: 4,
+    5E0: 5,
+    6e-0: 6,
+    7E-0: 7,
+    0x8: 8,
+    0X9: 9,
+  }
+ assertEquals(['1', '2', '3', '4', '5', '6', '7', '8', '9'], Object.keys(o));
+
+  o = {
+    1.2: 1.2,
+    1.30: 1.3
+  };
+  assertEquals(['1.2', '1.3'], Object.keys(o));
+})();
+
+
+function TestNumericNamesGetter(expectedKeys, object) {
+  assertEquals(expectedKeys, Object.keys(object));
+  expectedKeys.forEach(function(key) {
+    var descr = Object.getOwnPropertyDescriptor(object, key);
+    assertEquals(key, descr.get.name);
+  });
+}
+TestNumericNamesGetter(['1', '2', '3', '4', '5', '6', '7', '8', '9'], {
+  get 1() {},
+  get 2.() {},
+  get 3.0() {},
+  get 4e0() {},
+  get 5E0() {},
+  get 6e-0() {},
+  get 7E-0() {},
+  get 0x8() {},
+  get 0X9() {},
+});
+TestNumericNamesGetter(['1.2', '1.3'], {
+  get 1.2() {},
+  get 1.30() {}
+});
+
+
+function TestNumericNamesSetter(expectedKeys, object) {
+  assertEquals(expectedKeys, Object.keys(object));
+  expectedKeys.forEach(function(key) {
+    var descr = Object.getOwnPropertyDescriptor(object, key);
+    assertEquals(key, descr.set.name);
+  });
+}
+TestNumericNamesSetter(['1', '2', '3', '4', '5', '6', '7', '8', '9'], {
+  set 1(_) {},
+  set 2.(_) {},
+  set 3.0(_) {},
+  set 4e0(_) {},
+  set 5E0(_) {},
+  set 6e-0(_) {},
+  set 7E-0(_) {},
+  set 0x8(_) {},
+  set 0X9(_) {},
+});
+TestNumericNamesSetter(['1.2', '1.3'], {
+  set 1.2(_) {; },
+  set 1.30(_) {; }
+});


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to