From 05ee181c3434989d3719d18e442beff03becaf4a Mon Sep 17 00:00:00 2001 From: Robert Krimen Date: Fri, 19 Oct 2012 16:24:14 -0700 Subject: [PATCH] Fix parsing of null, etc. on Object intialization true, false, etc. --- .test262/shim.js | 8 ++++++++ lexer.go | 6 ++++-- otto_test.go | 26 ++++++++++++++++++++++++++ parse_expression.go | 12 ++++++++++-- parser.go | 7 +++++++ 5 files changed, 55 insertions(+), 4 deletions(-) diff --git a/.test262/shim.js b/.test262/shim.js index 275e03e..f7df5f7 100644 --- a/.test262/shim.js +++ b/.test262/shim.js @@ -2,4 +2,12 @@ function $ERROR(message) { console.log(message) } +function runTestCase(fn) { + if (fn()) { + console.log("pass") + } else { + console.log("=== fail") + } +} + // --- diff --git a/lexer.go b/lexer.go index ead9e0e..f656089 100644 --- a/lexer.go +++ b/lexer.go @@ -433,18 +433,19 @@ func (self *_lexer) scanIdentifierKeyword() (token _token) { chr := convertHexadecimalRune(string(read[2:])) if chr == utf8.RuneError { word = append(word, 'u') - self.skip(2) + self.skip(2) // Skip \u } else { if chr == '\\' || !identifierCheck(chr) { return } word = append(word, chr) - self.skip(6) + self.skip(6) // Skip \u???? } } else { return } } else { + // Basically a skip of 1 word = append(word, self.next()) } default: @@ -467,6 +468,7 @@ func (self *_lexer) scanIdentifierKeyword() (token _token) { // Now we're looking at the body of the identiifer identifierCheck = isIdentifierPart } + return } diff --git a/otto_test.go b/otto_test.go index 509bbe3..15b84d0 100644 --- a/otto_test.go +++ b/otto_test.go @@ -2022,3 +2022,29 @@ func TestUnicode(t *testing.T) { } } +func TestDotMember(t *testing.T) { + Terst(t) + + test := runTest() + + test(` + abc = { + ghi: 11, + } + abc.def = "Xyzzy" + abc.null = "Nothing happens." + `) + test(`abc.def`, "Xyzzy") + test(`abc.null`, "Nothing happens.") + test(`abc.ghi`, "11") + + test(` + abc = { + null: 11, + } + `) + test(`abc.def`, "undefined") + test(`abc.null`, "11") + test(`abc.ghi`, "undefined") +} + diff --git a/parse_expression.go b/parse_expression.go index 8663baf..2c88bbd 100644 --- a/parse_expression.go +++ b/parse_expression.go @@ -49,7 +49,11 @@ func (self *_parser) ParseObjectPropertyKey() string { } else if self.Match("string") { return toString(self.ConsumeString().Value) } - panic(self.Unexpected(self.Peek())) + token := self.Next() + if !isIdentifierName(token) { + panic(self.Unexpected(token)) + } + return token.Text } func (self *_parser) ParseObjectProperty() *_objectPropertyNode { @@ -147,7 +151,11 @@ func (self *_parser) ParseCallExpression(left _node) _node { func (self *_parser) ParseDotMember(left _node) _node { self.Expect(".") - member := self.ConsumeIdentifier().Value + token := self.Next() + member := token.Text + if !isIdentifierName(token) { + panic(token.newSyntaxError("Unexpected token %s", token.Kind)) + } node := newDotMemberNode(left, member) self.markNode(node) return node diff --git a/parser.go b/parser.go index cf01b71..221bd1c 100644 --- a/parser.go +++ b/parser.go @@ -297,3 +297,10 @@ func (self *_parser) markNode(node _node) { node.setPosition(self.lexer.lineCount) } +func isIdentifierName(token _token) bool { + switch token.Kind { + case "identifier", "boolean": + return true + } + return keywordTable[token.Kind] +}