| 1495 | } |
| 1496 | |
| 1497 | void GLSLCompiler::translateWhileStatement(glsl::astWhileStatement *statement) { |
| 1498 | m_exportLine(statement); |
| 1499 | |
| 1500 | size_t rewind_adr = m_gen.Function.GetCurrentAddress(); |
| 1501 | |
| 1502 | m_breaks.push(std::vector<size_t>()); |
| 1503 | m_continueAddr.push(rewind_adr); |
| 1504 | |
| 1505 | switch (statement->condition->type) { |
| 1506 | case glsl::astStatement::kDeclaration: |
| 1507 | translateDeclarationStatement((glsl::astDeclarationStatement*)statement->condition); |
| 1508 | break; |
| 1509 | case glsl::astStatement::kExpression: |
| 1510 | translateExpressionStatement((glsl::astExpressionStatement*)statement->condition); |
| 1511 | break; |
| 1512 | } |
| 1513 | size_t while_if_ref = m_gen.Function.If(); |
| 1514 | |
| 1515 | translateStatement(statement->body); |
| 1516 | size_t rewind_ref = m_gen.Function.Goto(); |
| 1517 | |
| 1518 | // goto points to the if statement, if statement points to the command after goto |
| 1519 | m_gen.Function.SetAddress(rewind_ref, rewind_adr); |
| 1520 | m_gen.Function.SetAddress(while_if_ref, m_gen.Function.GetCurrentAddress()); |
| 1521 | |
| 1522 | for (size_t i = 0; i < m_breaks.top().size(); i++) |
| 1523 | m_gen.Function.SetAddress(m_breaks.top()[i], m_gen.Function.GetCurrentAddress()); |
| 1524 | |
| 1525 | m_continueAddr.pop(); |
| 1526 | m_breaks.pop(); |
| 1527 | } |
| 1528 | |
| 1529 | void GLSLCompiler::translateDoStatement(glsl::astDoStatement *statement) { |
| 1530 | m_exportLine(statement); |