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.