Browse Source

Fixed panic when parsing invalid object property keys. Fixes #376.

Dmitry Panov 3 years ago
parent
commit
8a7c4f41dd
2 changed files with 24 additions and 29 deletions
  1. 21 29
      parser/expression.go
  2. 3 0
      parser/parser_test.go

+ 21 - 29
parser/expression.go

@@ -333,6 +333,9 @@ func (self *_parser) parseObjectProperty() ast.Property {
 	}
 	}
 	keyStartIdx := self.idx
 	keyStartIdx := self.idx
 	literal, parsedLiteral, value, tkn := self.parseObjectPropertyKey()
 	literal, parsedLiteral, value, tkn := self.parseObjectPropertyKey()
+	if value == nil {
+		return nil
+	}
 	if tkn == token.IDENTIFIER || tkn == token.STRING || tkn == token.KEYWORD || tkn == token.ILLEGAL {
 	if tkn == token.IDENTIFIER || tkn == token.STRING || tkn == token.KEYWORD || tkn == token.ILLEGAL {
 		switch {
 		switch {
 		case self.token == token.LEFT_PARENTHESIS:
 		case self.token == token.LEFT_PARENTHESIS:
@@ -367,54 +370,43 @@ func (self *_parser) parseObjectProperty() ast.Property {
 					Initializer: initializer,
 					Initializer: initializer,
 				}
 				}
 			}
 			}
-		case literal == "get" && self.token != token.COLON:
+		case (literal == "get" || literal == "set") && self.token != token.COLON:
 			_, _, keyValue, _ := self.parseObjectPropertyKey()
 			_, _, keyValue, _ := self.parseObjectPropertyKey()
+			if keyValue == nil {
+				return nil
+			}
+			var kind ast.PropertyKind
 			idx1 := self.idx
 			idx1 := self.idx
 			parameterList := self.parseFunctionParameterList()
 			parameterList := self.parseFunctionParameterList()
-			if len(parameterList.List) > 0 || parameterList.Rest != nil {
-				self.error(idx1, "Getter must not have any formal parameters.")
-			}
-			node := &ast.FunctionLiteral{
-				Function:      keyStartIdx,
-				ParameterList: parameterList,
-			}
-			node.Body, node.DeclarationList = self.parseFunctionBlock()
-			node.Source = self.slice(keyStartIdx, node.Body.Idx1())
-			return &ast.PropertyKeyed{
-				Key:   keyValue,
-				Kind:  ast.PropertyKindGet,
-				Value: node,
+			if literal == "get" {
+				kind = ast.PropertyKindGet
+				if len(parameterList.List) > 0 || parameterList.Rest != nil {
+					self.error(idx1, "Getter must not have any formal parameters.")
+				}
+			} else {
+				kind = ast.PropertyKindSet
 			}
 			}
-		case literal == "set" && self.token != token.COLON:
-			_, _, keyValue, _ := self.parseObjectPropertyKey()
-			parameterList := self.parseFunctionParameterList()
-
 			node := &ast.FunctionLiteral{
 			node := &ast.FunctionLiteral{
 				Function:      keyStartIdx,
 				Function:      keyStartIdx,
 				ParameterList: parameterList,
 				ParameterList: parameterList,
 			}
 			}
-
 			node.Body, node.DeclarationList = self.parseFunctionBlock()
 			node.Body, node.DeclarationList = self.parseFunctionBlock()
 			node.Source = self.slice(keyStartIdx, node.Body.Idx1())
 			node.Source = self.slice(keyStartIdx, node.Body.Idx1())
-
 			return &ast.PropertyKeyed{
 			return &ast.PropertyKeyed{
 				Key:   keyValue,
 				Key:   keyValue,
-				Kind:  ast.PropertyKindSet,
+				Kind:  kind,
 				Value: node,
 				Value: node,
 			}
 			}
 		}
 		}
 	}
 	}
 
 
 	self.expect(token.COLON)
 	self.expect(token.COLON)
-	if value != nil {
-		return &ast.PropertyKeyed{
-			Key:      value,
-			Kind:     ast.PropertyKindValue,
-			Value:    self.parseAssignmentExpression(),
-			Computed: tkn == token.ILLEGAL,
-		}
+	return &ast.PropertyKeyed{
+		Key:      value,
+		Kind:     ast.PropertyKindValue,
+		Value:    self.parseAssignmentExpression(),
+		Computed: tkn == token.ILLEGAL,
 	}
 	}
-	return nil
 }
 }
 
 
 func (self *_parser) parseObjectLiteral() *ast.ObjectLiteral {
 func (self *_parser) parseObjectLiteral() *ast.ObjectLiteral {

+ 3 - 0
parser/parser_test.go

@@ -497,6 +497,9 @@ func TestParserErr(t *testing.T) {
 		test("`", "(anonymous): Line 1:2 Unexpected end of input")
 		test("`", "(anonymous): Line 1:2 Unexpected end of input")
 		test(" `", "(anonymous): Line 1:3 Unexpected end of input")
 		test(" `", "(anonymous): Line 1:3 Unexpected end of input")
 		test("` ", "(anonymous): Line 1:3 Unexpected end of input")
 		test("` ", "(anonymous): Line 1:3 Unexpected end of input")
+		test(`var{..(`, "(anonymous): Line 1:7 Unexpected token ILLEGAL")
+		test(`var{get..(`, "(anonymous): Line 1:10 Unexpected token ILLEGAL")
+		test(`var{set..(`, "(anonymous): Line 1:10 Unexpected token ILLEGAL")
 	})
 	})
 }
 }