Commit 09b22474 by Olli Etuaho Committed by Jamie Madill

Add addBinaryMath and addUnaryMath helpers to ParseContext

This refactoring reduces code duplication and moves functionality that is not immediately related to the language grammar out of glslang.y. BUG=angle:911 Change-Id: If5e225461890ed542dee01905829df1c9a6f5e27 Reviewed-on: https://chromium-review.googlesource.com/248570Reviewed-by: 's avatarZhenyao Mo <zmo@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 40853472
......@@ -2588,6 +2588,53 @@ TPublicType TParseContext::addStructure(const TSourceLoc& structLine, const TSou
return publicType;
}
TIntermTyped *TParseContext::addUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &loc)
{
TIntermTyped *node = intermediate.addUnaryMath(op, child, loc);
if (node == 0)
{
unaryOpError(loc, GetOperatorString(op), child->getCompleteString());
recover();
return child;
}
return node;
}
TIntermTyped *TParseContext::addUnaryMathLValue(TOperator op, TIntermTyped *child, const TSourceLoc &loc)
{
if (lValueErrorCheck(loc, GetOperatorString(op), child))
recover();
return addUnaryMath(op, child, loc);
}
TIntermTyped *TParseContext::addBinaryMath(TOperator op, TIntermTyped *left, TIntermTyped *right,
const TSourceLoc &loc)
{
TIntermTyped *node = intermediate.addBinaryMath(op, left, right, loc);
if (node == 0)
{
binaryOpError(loc, GetOperatorString(op), left->getCompleteString(), right->getCompleteString());
recover();
return left;
}
return node;
}
TIntermTyped *TParseContext::addBinaryMathBooleanResult(TOperator op, TIntermTyped *left, TIntermTyped *right,
const TSourceLoc &loc)
{
TIntermTyped *node = intermediate.addBinaryMath(op, left, right, loc);
if (node == 0)
{
binaryOpError(loc, GetOperatorString(op), left->getCompleteString(), right->getCompleteString());
recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
return intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), loc);
}
return node;
}
//
// Parse an array of strings using yyparse.
//
......
......@@ -164,6 +164,13 @@ struct TParseContext {
void exitStructDeclaration();
bool structNestingErrorCheck(const TSourceLoc& line, const TField& field);
TIntermTyped *addUnaryMath(TOperator op, TIntermTyped *child, const TSourceLoc &);
TIntermTyped *addUnaryMathLValue(TOperator op, TIntermTyped *child, const TSourceLoc &);
TIntermTyped *addBinaryMath(TOperator op, TIntermTyped *left, TIntermTyped *right,
const TSourceLoc &);
TIntermTyped *addBinaryMathBooleanResult(TOperator op, TIntermTyped *left, TIntermTyped *right,
const TSourceLoc &);
};
int PaParseStrings(size_t count, const char* const string[], const int length[],
......
......@@ -272,24 +272,10 @@ postfix_expression
$$ = context->addFieldSelectionExpression($1, @2, *$3.string, @3);
}
| postfix_expression INC_OP {
if (context->lValueErrorCheck(@2, "++", $1))
context->recover();
$$ = context->intermediate.addUnaryMath(EOpPostIncrement, $1, @2);
if ($$ == 0) {
context->unaryOpError(@2, "++", $1->getCompleteString());
context->recover();
$$ = $1;
}
$$ = context->addUnaryMathLValue(EOpPostIncrement, $1, @2);
}
| postfix_expression DEC_OP {
if (context->lValueErrorCheck(@2, "--", $1))
context->recover();
$$ = context->intermediate.addUnaryMath(EOpPostDecrement, $1, @2);
if ($$ == 0) {
context->unaryOpError(@2, "--", $1->getCompleteString());
context->recover();
$$ = $1;
}
$$ = context->addUnaryMathLValue(EOpPostDecrement, $1, @2);
}
;
......@@ -490,41 +476,14 @@ unary_expression
$$ = $1;
}
| INC_OP unary_expression {
if (context->lValueErrorCheck(@1, "++", $2))
context->recover();
$$ = context->intermediate.addUnaryMath(EOpPreIncrement, $2, @1);
if ($$ == 0) {
context->unaryOpError(@1, "++", $2->getCompleteString());
context->recover();
$$ = $2;
}
$$ = context->addUnaryMathLValue(EOpPreIncrement, $2, @1);
}
| DEC_OP unary_expression {
if (context->lValueErrorCheck(@1, "--", $2))
context->recover();
$$ = context->intermediate.addUnaryMath(EOpPreDecrement, $2, @1);
if ($$ == 0) {
context->unaryOpError(@1, "--", $2->getCompleteString());
context->recover();
$$ = $2;
}
$$ = context->addUnaryMathLValue(EOpPreDecrement, $2, @1);
}
| unary_operator unary_expression {
if ($1.op != EOpNull) {
$$ = context->intermediate.addUnaryMath($1.op, $2, @1);
if ($$ == 0) {
const char* errorOp = "";
switch($1.op) {
case EOpNegative: errorOp = "-"; break;
case EOpPositive: errorOp = "+"; break;
case EOpLogicalNot: errorOp = "!"; break;
case EOpBitwiseNot: errorOp = "~"; break;
default: break;
}
context->unaryOpError(@1, errorOp, $2->getCompleteString());
context->recover();
$$ = $2;
}
$$ = context->addUnaryMath($1.op, $2, @1);
} else
$$ = $2;
}
......@@ -545,49 +504,24 @@ unary_operator
multiplicative_expression
: unary_expression { $$ = $1; }
| multiplicative_expression STAR unary_expression {
$$ = context->intermediate.addBinaryMath(EOpMul, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "*", $1->getCompleteString(), $3->getCompleteString());
context->recover();
$$ = $1;
}
$$ = context->addBinaryMath(EOpMul, $1, $3, @2);
}
| multiplicative_expression SLASH unary_expression {
$$ = context->intermediate.addBinaryMath(EOpDiv, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "/", $1->getCompleteString(), $3->getCompleteString());
context->recover();
$$ = $1;
}
$$ = context->addBinaryMath(EOpDiv, $1, $3, @2);
}
| multiplicative_expression PERCENT unary_expression {
ES3_ONLY("%", @2, "integer modulus operator");
$$ = context->intermediate.addBinaryMath(EOpMod, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "%", $1->getCompleteString(), $3->getCompleteString());
context->recover();
$$ = $1;
}
$$ = context->addBinaryMath(EOpMod, $1, $3, @2);
}
;
additive_expression
: multiplicative_expression { $$ = $1; }
| additive_expression PLUS multiplicative_expression {
$$ = context->intermediate.addBinaryMath(EOpAdd, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "+", $1->getCompleteString(), $3->getCompleteString());
context->recover();
$$ = $1;
}
$$ = context->addBinaryMath(EOpAdd, $1, $3, @2);
}
| additive_expression DASH multiplicative_expression {
$$ = context->intermediate.addBinaryMath(EOpSub, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "-", $1->getCompleteString(), $3->getCompleteString());
context->recover();
$$ = $1;
}
$$ = context->addBinaryMath(EOpSub, $1, $3, @2);
}
;
......@@ -595,89 +529,37 @@ shift_expression
: additive_expression { $$ = $1; }
| shift_expression LEFT_OP additive_expression {
ES3_ONLY("<<", @2, "bit-wise operator");
$$ = context->intermediate.addBinaryMath(EOpBitShiftLeft, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "<<", $1->getCompleteString(), $3->getCompleteString());
context->recover();
$$ = $1;
}
$$ = context->addBinaryMath(EOpBitShiftLeft, $1, $3, @2);
}
| shift_expression RIGHT_OP additive_expression {
ES3_ONLY(">>", @2, "bit-wise operator");
$$ = context->intermediate.addBinaryMath(EOpBitShiftRight, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, ">>", $1->getCompleteString(), $3->getCompleteString());
context->recover();
$$ = $1;
}
$$ = context->addBinaryMath(EOpBitShiftRight, $1, $3, @2);
}
;
relational_expression
: shift_expression { $$ = $1; }
| relational_expression LEFT_ANGLE shift_expression {
$$ = context->intermediate.addBinaryMath(EOpLessThan, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "<", $1->getCompleteString(), $3->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
$$ = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), @2);
}
$$ = context->addBinaryMathBooleanResult(EOpLessThan, $1, $3, @2);
}
| relational_expression RIGHT_ANGLE shift_expression {
$$ = context->intermediate.addBinaryMath(EOpGreaterThan, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, ">", $1->getCompleteString(), $3->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
$$ = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), @2);
}
$$ = context->addBinaryMathBooleanResult(EOpGreaterThan, $1, $3, @2);
}
| relational_expression LE_OP shift_expression {
$$ = context->intermediate.addBinaryMath(EOpLessThanEqual, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "<=", $1->getCompleteString(), $3->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
$$ = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), @2);
}
$$ = context->addBinaryMathBooleanResult(EOpLessThanEqual, $1, $3, @2);
}
| relational_expression GE_OP shift_expression {
$$ = context->intermediate.addBinaryMath(EOpGreaterThanEqual, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, ">=", $1->getCompleteString(), $3->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
$$ = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), @2);
}
$$ = context->addBinaryMathBooleanResult(EOpGreaterThanEqual, $1, $3, @2);
}
;
equality_expression
: relational_expression { $$ = $1; }
| equality_expression EQ_OP relational_expression {
$$ = context->intermediate.addBinaryMath(EOpEqual, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "==", $1->getCompleteString(), $3->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
$$ = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), @2);
}
$$ = context->addBinaryMathBooleanResult(EOpEqual, $1, $3, @2);
}
| equality_expression NE_OP relational_expression {
$$ = context->intermediate.addBinaryMath(EOpNotEqual, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "!=", $1->getCompleteString(), $3->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
$$ = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), @2);
}
$$ = context->addBinaryMathBooleanResult(EOpNotEqual, $1, $3, @2);
}
;
......@@ -685,12 +567,7 @@ and_expression
: equality_expression { $$ = $1; }
| and_expression AMPERSAND equality_expression {
ES3_ONLY("&", @2, "bit-wise operator");
$$ = context->intermediate.addBinaryMath(EOpBitwiseAnd, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "&", $1->getCompleteString(), $3->getCompleteString());
context->recover();
$$ = $1;
}
$$ = context->addBinaryMath(EOpBitwiseAnd, $1, $3, @2);
}
;
......@@ -698,12 +575,7 @@ exclusive_or_expression
: and_expression { $$ = $1; }
| exclusive_or_expression CARET and_expression {
ES3_ONLY("^", @2, "bit-wise operator");
$$ = context->intermediate.addBinaryMath(EOpBitwiseXor, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "^", $1->getCompleteString(), $3->getCompleteString());
context->recover();
$$ = $1;
}
$$ = context->addBinaryMath(EOpBitwiseXor, $1, $3, @2);
}
;
......@@ -711,54 +583,28 @@ inclusive_or_expression
: exclusive_or_expression { $$ = $1; }
| inclusive_or_expression VERTICAL_BAR exclusive_or_expression {
ES3_ONLY("|", @2, "bit-wise operator");
$$ = context->intermediate.addBinaryMath(EOpBitwiseOr, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "|", $1->getCompleteString(), $3->getCompleteString());
context->recover();
$$ = $1;
}
$$ = context->addBinaryMath(EOpBitwiseOr, $1, $3, @2);
}
;
logical_and_expression
: inclusive_or_expression { $$ = $1; }
| logical_and_expression AND_OP inclusive_or_expression {
$$ = context->intermediate.addBinaryMath(EOpLogicalAnd, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "&&", $1->getCompleteString(), $3->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
$$ = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), @2);
}
$$ = context->addBinaryMathBooleanResult(EOpLogicalAnd, $1, $3, @2);
}
;
logical_xor_expression
: logical_and_expression { $$ = $1; }
| logical_xor_expression XOR_OP logical_and_expression {
$$ = context->intermediate.addBinaryMath(EOpLogicalXor, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "^^", $1->getCompleteString(), $3->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
$$ = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), @2);
}
$$ = context->addBinaryMathBooleanResult(EOpLogicalXor, $1, $3, @2);
}
;
logical_or_expression
: logical_xor_expression { $$ = $1; }
| logical_or_expression OR_OP logical_xor_expression {
$$ = context->intermediate.addBinaryMath(EOpLogicalOr, $1, $3, @2);
if ($$ == 0) {
context->binaryOpError(@2, "||", $1->getCompleteString(), $3->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
$$ = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), @2);
}
$$ = context->addBinaryMathBooleanResult(EOpLogicalOr, $1, $3, @2);
}
;
......
......@@ -688,32 +688,32 @@ static const yytype_uint8 yytranslate[] =
static const yytype_uint16 yyrline[] =
{
0, 205, 205, 206, 209, 233, 236, 241, 246, 251,
256, 262, 265, 268, 271, 274, 284, 297, 305, 422,
425, 433, 436, 442, 446, 453, 459, 468, 476, 479,
489, 492, 502, 512, 535, 536, 537, 538, 546, 547,
555, 563, 575, 576, 584, 595, 596, 605, 617, 618,
628, 638, 648, 661, 662, 672, 685, 686, 698, 699,
711, 712, 724, 725, 738, 739, 752, 753, 766, 767,
784, 785, 798, 799, 800, 801, 805, 806, 807, 811,
815, 819, 823, 830, 833, 844, 852, 860, 887, 893,
904, 908, 912, 916, 923, 979, 982, 989, 997, 1018,
1039, 1049, 1077, 1082, 1092, 1097, 1107, 1110, 1113, 1116,
1122, 1129, 1132, 1136, 1140, 1144, 1151, 1155, 1159, 1166,
1170, 1174, 1181, 1190, 1196, 1199, 1205, 1211, 1218, 1227,
1236, 1244, 1247, 1254, 1258, 1265, 1268, 1272, 1276, 1285,
1294, 1302, 1312, 1324, 1327, 1330, 1336, 1343, 1346, 1352,
1355, 1358, 1364, 1367, 1382, 1386, 1390, 1394, 1398, 1402,
1407, 1412, 1417, 1422, 1427, 1432, 1437, 1442, 1447, 1452,
1457, 1462, 1467, 1472, 1477, 1482, 1487, 1492, 1497, 1502,
1507, 1511, 1515, 1519, 1523, 1527, 1531, 1535, 1539, 1543,
1547, 1551, 1555, 1559, 1563, 1567, 1575, 1583, 1587, 1600,
1600, 1603, 1603, 1609, 1612, 1628, 1631, 1640, 1644, 1650,
1657, 1672, 1676, 1680, 1681, 1687, 1688, 1689, 1690, 1691,
1695, 1696, 1696, 1696, 1706, 1707, 1711, 1711, 1712, 1712,
1717, 1720, 1730, 1733, 1739, 1740, 1744, 1752, 1756, 1766,
1771, 1788, 1788, 1793, 1793, 1800, 1800, 1808, 1811, 1817,
1820, 1826, 1830, 1837, 1844, 1851, 1858, 1869, 1878, 1882,
1889, 1892, 1898, 1898
256, 262, 265, 268, 271, 274, 277, 283, 291, 408,
411, 419, 422, 428, 432, 439, 445, 454, 462, 465,
475, 478, 481, 484, 494, 495, 496, 497, 505, 506,
509, 512, 519, 520, 523, 529, 530, 534, 541, 542,
545, 548, 551, 557, 558, 561, 567, 568, 575, 576,
583, 584, 591, 592, 598, 599, 605, 606, 612, 613,
630, 631, 644, 645, 646, 647, 651, 652, 653, 657,
661, 665, 669, 676, 679, 690, 698, 706, 733, 739,
750, 754, 758, 762, 769, 825, 828, 835, 843, 864,
885, 895, 923, 928, 938, 943, 953, 956, 959, 962,
968, 975, 978, 982, 986, 990, 997, 1001, 1005, 1012,
1016, 1020, 1027, 1036, 1042, 1045, 1051, 1057, 1064, 1073,
1082, 1090, 1093, 1100, 1104, 1111, 1114, 1118, 1122, 1131,
1140, 1148, 1158, 1170, 1173, 1176, 1182, 1189, 1192, 1198,
1201, 1204, 1210, 1213, 1228, 1232, 1236, 1240, 1244, 1248,
1253, 1258, 1263, 1268, 1273, 1278, 1283, 1288, 1293, 1298,
1303, 1308, 1313, 1318, 1323, 1328, 1333, 1338, 1343, 1348,
1353, 1357, 1361, 1365, 1369, 1373, 1377, 1381, 1385, 1389,
1393, 1397, 1401, 1405, 1409, 1413, 1421, 1429, 1433, 1446,
1446, 1449, 1449, 1455, 1458, 1474, 1477, 1486, 1490, 1496,
1503, 1518, 1522, 1526, 1527, 1533, 1534, 1535, 1536, 1537,
1541, 1542, 1542, 1542, 1552, 1553, 1557, 1557, 1558, 1558,
1563, 1566, 1576, 1579, 1585, 1586, 1590, 1598, 1602, 1612,
1617, 1634, 1634, 1639, 1639, 1646, 1646, 1654, 1657, 1663,
1666, 1672, 1676, 1683, 1690, 1697, 1704, 1715, 1724, 1728,
1735, 1738, 1744, 1744
};
#endif
......@@ -2428,14 +2428,7 @@ yyreduce:
case 15:
{
if (context->lValueErrorCheck((yylsp[0]), "++", (yyvsp[-1].interm.intermTypedNode)))
context->recover();
(yyval.interm.intermTypedNode) = context->intermediate.addUnaryMath(EOpPostIncrement, (yyvsp[-1].interm.intermTypedNode), (yylsp[0]));
if ((yyval.interm.intermTypedNode) == 0) {
context->unaryOpError((yylsp[0]), "++", (yyvsp[-1].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addUnaryMathLValue(EOpPostIncrement, (yyvsp[-1].interm.intermTypedNode), (yylsp[0]));
}
break;
......@@ -2443,14 +2436,7 @@ yyreduce:
case 16:
{
if (context->lValueErrorCheck((yylsp[0]), "--", (yyvsp[-1].interm.intermTypedNode)))
context->recover();
(yyval.interm.intermTypedNode) = context->intermediate.addUnaryMath(EOpPostDecrement, (yyvsp[-1].interm.intermTypedNode), (yylsp[0]));
if ((yyval.interm.intermTypedNode) == 0) {
context->unaryOpError((yylsp[0]), "--", (yyvsp[-1].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[-1].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addUnaryMathLValue(EOpPostDecrement, (yyvsp[-1].interm.intermTypedNode), (yylsp[0]));
}
break;
......@@ -2697,14 +2683,7 @@ yyreduce:
case 31:
{
if (context->lValueErrorCheck((yylsp[-1]), "++", (yyvsp[0].interm.intermTypedNode)))
context->recover();
(yyval.interm.intermTypedNode) = context->intermediate.addUnaryMath(EOpPreIncrement, (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->unaryOpError((yylsp[-1]), "++", (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addUnaryMathLValue(EOpPreIncrement, (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2712,14 +2691,7 @@ yyreduce:
case 32:
{
if (context->lValueErrorCheck((yylsp[-1]), "--", (yyvsp[0].interm.intermTypedNode)))
context->recover();
(yyval.interm.intermTypedNode) = context->intermediate.addUnaryMath(EOpPreDecrement, (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->unaryOpError((yylsp[-1]), "--", (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addUnaryMathLValue(EOpPreDecrement, (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2728,20 +2700,7 @@ yyreduce:
{
if ((yyvsp[-1].interm).op != EOpNull) {
(yyval.interm.intermTypedNode) = context->intermediate.addUnaryMath((yyvsp[-1].interm).op, (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
const char* errorOp = "";
switch((yyvsp[-1].interm).op) {
case EOpNegative: errorOp = "-"; break;
case EOpPositive: errorOp = "+"; break;
case EOpLogicalNot: errorOp = "!"; break;
case EOpBitwiseNot: errorOp = "~"; break;
default: break;
}
context->unaryOpError((yylsp[-1]), errorOp, (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addUnaryMath((yyvsp[-1].interm).op, (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
} else
(yyval.interm.intermTypedNode) = (yyvsp[0].interm.intermTypedNode);
}
......@@ -2784,12 +2743,7 @@ yyreduce:
case 39:
{
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpMul, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "*", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addBinaryMath(EOpMul, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2797,12 +2751,7 @@ yyreduce:
case 40:
{
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpDiv, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "/", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addBinaryMath(EOpDiv, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2811,12 +2760,7 @@ yyreduce:
{
ES3_ONLY("%", (yylsp[-1]), "integer modulus operator");
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpMod, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "%", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addBinaryMath(EOpMod, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2830,12 +2774,7 @@ yyreduce:
case 43:
{
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpAdd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "+", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addBinaryMath(EOpAdd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2843,12 +2782,7 @@ yyreduce:
case 44:
{
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpSub, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "-", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addBinaryMath(EOpSub, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2863,12 +2797,7 @@ yyreduce:
{
ES3_ONLY("<<", (yylsp[-1]), "bit-wise operator");
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpBitShiftLeft, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "<<", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addBinaryMath(EOpBitShiftLeft, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2877,12 +2806,7 @@ yyreduce:
{
ES3_ONLY(">>", (yylsp[-1]), "bit-wise operator");
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpBitShiftRight, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), ">>", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addBinaryMath(EOpBitShiftRight, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2896,14 +2820,7 @@ yyreduce:
case 49:
{
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLessThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "<", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
(yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
}
(yyval.interm.intermTypedNode) = context->addBinaryMathBooleanResult(EOpLessThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2911,14 +2828,7 @@ yyreduce:
case 50:
{
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpGreaterThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), ">", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
(yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
}
(yyval.interm.intermTypedNode) = context->addBinaryMathBooleanResult(EOpGreaterThan, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2926,14 +2836,7 @@ yyreduce:
case 51:
{
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLessThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "<=", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
(yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
}
(yyval.interm.intermTypedNode) = context->addBinaryMathBooleanResult(EOpLessThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2941,14 +2844,7 @@ yyreduce:
case 52:
{
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpGreaterThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), ">=", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
(yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
}
(yyval.interm.intermTypedNode) = context->addBinaryMathBooleanResult(EOpGreaterThanEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2962,14 +2858,7 @@ yyreduce:
case 54:
{
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "==", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
(yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
}
(yyval.interm.intermTypedNode) = context->addBinaryMathBooleanResult(EOpEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2977,14 +2866,7 @@ yyreduce:
case 55:
{
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpNotEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "!=", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
(yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
}
(yyval.interm.intermTypedNode) = context->addBinaryMathBooleanResult(EOpNotEqual, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -2999,12 +2881,7 @@ yyreduce:
{
ES3_ONLY("&", (yylsp[-1]), "bit-wise operator");
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpBitwiseAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "&", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addBinaryMath(EOpBitwiseAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -3019,12 +2896,7 @@ yyreduce:
{
ES3_ONLY("^", (yylsp[-1]), "bit-wise operator");
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpBitwiseXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "^", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addBinaryMath(EOpBitwiseXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -3039,12 +2911,7 @@ yyreduce:
{
ES3_ONLY("|", (yylsp[-1]), "bit-wise operator");
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpBitwiseOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "|", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
(yyval.interm.intermTypedNode) = (yyvsp[-2].interm.intermTypedNode);
}
(yyval.interm.intermTypedNode) = context->addBinaryMath(EOpBitwiseOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -3058,14 +2925,7 @@ yyreduce:
case 63:
{
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLogicalAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "&&", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
(yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
}
(yyval.interm.intermTypedNode) = context->addBinaryMathBooleanResult(EOpLogicalAnd, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -3079,14 +2939,7 @@ yyreduce:
case 65:
{
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLogicalXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "^^", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
(yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
}
(yyval.interm.intermTypedNode) = context->addBinaryMathBooleanResult(EOpLogicalXor, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......@@ -3100,14 +2953,7 @@ yyreduce:
case 67:
{
(yyval.interm.intermTypedNode) = context->intermediate.addBinaryMath(EOpLogicalOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
if ((yyval.interm.intermTypedNode) == 0) {
context->binaryOpError((yylsp[-1]), "||", (yyvsp[-2].interm.intermTypedNode)->getCompleteString(), (yyvsp[0].interm.intermTypedNode)->getCompleteString());
context->recover();
ConstantUnion *unionArray = new ConstantUnion[1];
unionArray->setBConst(false);
(yyval.interm.intermTypedNode) = context->intermediate.addConstantUnion(unionArray, TType(EbtBool, EbpUndefined, EvqConst), (yylsp[-1]));
}
(yyval.interm.intermTypedNode) = context->addBinaryMathBooleanResult(EOpLogicalOr, (yyvsp[-2].interm.intermTypedNode), (yyvsp[0].interm.intermTypedNode), (yylsp[-1]));
}
break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment