#44: fix crash on an empty list item

This commit is contained in:
z7zmey
2018-06-26 11:57:17 +03:00
parent 26117164d8
commit 10c63a30ae
7 changed files with 137 additions and 82 deletions

View File

@@ -97,6 +97,9 @@ func (l *Parser) GetPositions() parser.Positions {
// helpers
func lastNode(nn []node.Node) node.Node {
if len(nn) == 0 {
return nil
}
return nn[len(nn)-1]
}

View File

@@ -346,7 +346,7 @@ const yyEofCode = 1
const yyErrCode = 2
const yyInitialStackSize = 16
//line php7/php7.y:5344
//line php7/php7.y:5346
//line yacctab:1
var yyExca = [...]int{
@@ -7548,13 +7548,15 @@ yydefault:
yyVAL.list = append(yyDollar[1].list, yyDollar[3].node)
// save comments
yylex.(*Parser).comments.AddFromToken(lastNode(yyDollar[1].list), yyDollar[2].token, comment.CommaToken)
if lastNode(yyDollar[1].list) != nil {
yylex.(*Parser).comments.AddFromToken(lastNode(yyDollar[1].list), yyDollar[2].token, comment.CommaToken)
}
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}
case 458:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:4898
//line php7/php7.y:4900
{
yyVAL.list = []node.Node{yyDollar[1].node}
@@ -7562,7 +7564,7 @@ yydefault:
}
case 459:
yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:4907
//line php7/php7.y:4909
{
yyVAL.node = expr.NewArrayItem(yyDollar[1].node, yyDollar[3].node)
@@ -7576,7 +7578,7 @@ yydefault:
}
case 460:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:4919
//line php7/php7.y:4921
{
yyVAL.node = expr.NewArrayItem(nil, yyDollar[1].node)
@@ -7587,7 +7589,7 @@ yydefault:
}
case 461:
yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:4928
//line php7/php7.y:4930
{
reference := expr.NewReference(yyDollar[4].node)
yyVAL.node = expr.NewArrayItem(yyDollar[1].node, reference)
@@ -7603,7 +7605,7 @@ yydefault:
}
case 462:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:4942
//line php7/php7.y:4944
{
reference := expr.NewReference(yyDollar[2].node)
yyVAL.node = expr.NewArrayItem(nil, reference)
@@ -7618,7 +7620,7 @@ yydefault:
}
case 463:
yyDollar = yyS[yypt-6 : yypt+1]
//line php7/php7.y:4955
//line php7/php7.y:4957
{
// TODO: Cannot use list() as standalone expression
list := expr.NewList(yyDollar[5].list)
@@ -7638,7 +7640,7 @@ yydefault:
}
case 464:
yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:4973
//line php7/php7.y:4975
{
// TODO: Cannot use list() as standalone expression
list := expr.NewList(yyDollar[3].list)
@@ -7657,7 +7659,7 @@ yydefault:
}
case 465:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:4993
//line php7/php7.y:4995
{
yyVAL.list = append(yyDollar[1].list, yyDollar[2].node)
@@ -7665,7 +7667,7 @@ yydefault:
}
case 466:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:4999
//line php7/php7.y:5001
{
encapsed := scalar.NewEncapsedStringPart(yyDollar[2].token.Value)
yyVAL.list = append(yyDollar[1].list, encapsed)
@@ -7680,7 +7682,7 @@ yydefault:
}
case 467:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5012
//line php7/php7.y:5014
{
yyVAL.list = []node.Node{yyDollar[1].node}
@@ -7688,7 +7690,7 @@ yydefault:
}
case 468:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5018
//line php7/php7.y:5020
{
encapsed := scalar.NewEncapsedStringPart(yyDollar[1].token.Value)
yyVAL.list = []node.Node{encapsed, yyDollar[2].node}
@@ -7703,7 +7705,7 @@ yydefault:
}
case 469:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5034
//line php7/php7.y:5036
{
name := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
yyVAL.node = expr.NewVariable(name)
@@ -7719,7 +7721,7 @@ yydefault:
}
case 470:
yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:5048
//line php7/php7.y:5050
{
identifier := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
variable := expr.NewVariable(identifier)
@@ -7739,7 +7741,7 @@ yydefault:
}
case 471:
yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5066
//line php7/php7.y:5068
{
identifier := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
variable := expr.NewVariable(identifier)
@@ -7761,7 +7763,7 @@ yydefault:
}
case 472:
yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5086
//line php7/php7.y:5088
{
yyVAL.node = expr.NewVariable(yyDollar[2].node)
@@ -7776,7 +7778,7 @@ yydefault:
}
case 473:
yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5099
//line php7/php7.y:5101
{
name := node.NewIdentifier(yyDollar[2].token.Value)
yyVAL.node = expr.NewVariable(name)
@@ -7794,7 +7796,7 @@ yydefault:
}
case 474:
yyDollar = yyS[yypt-6 : yypt+1]
//line php7/php7.y:5115
//line php7/php7.y:5117
{
identifier := node.NewIdentifier(yyDollar[2].token.Value)
variable := expr.NewVariable(identifier)
@@ -7816,7 +7818,7 @@ yydefault:
}
case 475:
yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5135
//line php7/php7.y:5137
{
yyVAL.node = yyDollar[2].node
@@ -7824,7 +7826,7 @@ yydefault:
}
case 476:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5144
//line php7/php7.y:5146
{
yyVAL.node = scalar.NewString(yyDollar[1].token.Value)
@@ -7838,7 +7840,7 @@ yydefault:
}
case 477:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5156
//line php7/php7.y:5158
{
// TODO: add option to handle 64 bit integer
if _, err := strconv.Atoi(yyDollar[1].token.Value); err == nil {
@@ -7857,7 +7859,7 @@ yydefault:
}
case 478:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5173
//line php7/php7.y:5175
{
var lnumber *scalar.Lnumber
// TODO: add option to handle 64 bit integer
@@ -7890,7 +7892,7 @@ yydefault:
}
case 479:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5204
//line php7/php7.y:5206
{
identifier := node.NewIdentifier(strings.TrimLeftFunc(yyDollar[1].token.Value, isDollar))
yyVAL.node = expr.NewVariable(identifier)
@@ -7906,7 +7908,7 @@ yydefault:
}
case 480:
yyDollar = yyS[yypt-5 : yypt+1]
//line php7/php7.y:5221
//line php7/php7.y:5223
{
yyVAL.node = expr.NewIsset(yyDollar[3].list)
@@ -7925,7 +7927,7 @@ yydefault:
}
case 481:
yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:5238
//line php7/php7.y:5240
{
yyVAL.node = expr.NewEmpty(yyDollar[3].node)
@@ -7941,7 +7943,7 @@ yydefault:
}
case 482:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5252
//line php7/php7.y:5254
{
yyVAL.node = expr.NewInclude(yyDollar[2].node)
@@ -7955,7 +7957,7 @@ yydefault:
}
case 483:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5264
//line php7/php7.y:5266
{
yyVAL.node = expr.NewIncludeOnce(yyDollar[2].node)
@@ -7969,7 +7971,7 @@ yydefault:
}
case 484:
yyDollar = yyS[yypt-4 : yypt+1]
//line php7/php7.y:5276
//line php7/php7.y:5278
{
yyVAL.node = expr.NewEval(yyDollar[3].node)
@@ -7985,7 +7987,7 @@ yydefault:
}
case 485:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5290
//line php7/php7.y:5292
{
yyVAL.node = expr.NewRequire(yyDollar[2].node)
@@ -7999,7 +8001,7 @@ yydefault:
}
case 486:
yyDollar = yyS[yypt-2 : yypt+1]
//line php7/php7.y:5302
//line php7/php7.y:5304
{
yyVAL.node = expr.NewRequireOnce(yyDollar[2].node)
@@ -8013,7 +8015,7 @@ yydefault:
}
case 487:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5317
//line php7/php7.y:5319
{
yyVAL.list = []node.Node{yyDollar[1].node}
@@ -8021,7 +8023,7 @@ yydefault:
}
case 488:
yyDollar = yyS[yypt-3 : yypt+1]
//line php7/php7.y:5323
//line php7/php7.y:5325
{
yyVAL.list = append(yyDollar[1].list, yyDollar[3].node)
@@ -8032,7 +8034,7 @@ yydefault:
}
case 489:
yyDollar = yyS[yypt-1 : yypt+1]
//line php7/php7.y:5335
//line php7/php7.y:5337
{
yyVAL.node = yyDollar[1].node

View File

@@ -4890,7 +4890,9 @@ non_empty_array_pair_list:
$$ = append($1, $3)
// save comments
yylex.(*Parser).comments.AddFromToken(lastNode($1), $2, comment.CommaToken)
if lastNode($1) != nil {
yylex.(*Parser).comments.AddFromToken(lastNode($1), $2, comment.CommaToken)
}
yylex.(*Parser).returnTokenToPool(yyDollar, &yyVAL)
}