| 1452 | } |
| 1453 | |
| 1454 | void GLSLCompiler::translateSwitchStatement(glsl::astSwitchStatement *statement) { |
| 1455 | m_exportLine(statement); |
| 1456 | |
| 1457 | m_breaks.push(std::vector<size_t>()); |
| 1458 | |
| 1459 | glsl::vector<glsl::astStatement*>& stats = statement->statements; |
| 1460 | for (size_t i = 0; i < stats.size(); i++) { |
| 1461 | translateExpression(statement->expression); |
| 1462 | |
| 1463 | if (stats[i]->type == glsl::astStatement::kCaseLabel) { |
| 1464 | for (size_t j = i; j < stats.size(); j++) { |
| 1465 | if (j != i && stats[j]->type == glsl::astStatement::kCaseLabel) { |
| 1466 | i = j-1; |
| 1467 | break; |
| 1468 | } |
| 1469 | translateStatement(stats[j]); |
| 1470 | } |
| 1471 | } else continue; |
| 1472 | |
| 1473 | if (!m_caseIfDefault) |
| 1474 | m_gen.Function.SetAddress(m_caseIfAddr, m_gen.Function.GetCurrentAddress()); |
| 1475 | else |
| 1476 | m_gen.Function.PopStack(); |
| 1477 | } |
| 1478 | |
| 1479 | for (size_t i = 0; i < m_breaks.top().size(); i++) |
| 1480 | m_gen.Function.SetAddress(m_breaks.top()[i], m_gen.Function.GetCurrentAddress()); |
| 1481 | |
| 1482 | m_breaks.pop(); |
| 1483 | } |
| 1484 | |
| 1485 | void GLSLCompiler::translateCaseLabelStatement(glsl::astCaseLabelStatement *statement) { |
| 1486 | m_exportLine(statement); |