================ idCompiler::ParseForStatement Form of for statement with a counter: a = 0; start: << patch4 if ( !( a < 10 ) ) { goto end; << patch1 } else { goto process; << patch3 } increment: << patch2 a = a + 1; goto start; << goto patch4 process: statements; goto increment; << goto patch2 end: Form of for statement without a counter: a = 0; start: << patch2
| 1823 | ================ |
| 1824 | */ |
| 1825 | void idCompiler::ParseForStatement( void ) { |
| 1826 | idVarDef *e; |
| 1827 | int start; |
| 1828 | int patch1; |
| 1829 | int patch2; |
| 1830 | int patch3; |
| 1831 | int patch4; |
| 1832 | |
| 1833 | loopDepth++; |
| 1834 | |
| 1835 | start = gameLocal.program.NumStatements(); |
| 1836 | |
| 1837 | ExpectToken( "(" ); |
| 1838 | |
| 1839 | // init |
| 1840 | if ( !CheckToken( ";" ) ) { |
| 1841 | do { |
| 1842 | GetExpression( TOP_PRIORITY ); |
| 1843 | } while( CheckToken( "," ) ); |
| 1844 | |
| 1845 | ExpectToken( ";" ); |
| 1846 | } |
| 1847 | |
| 1848 | // condition |
| 1849 | patch2 = gameLocal.program.NumStatements(); |
| 1850 | |
| 1851 | e = GetExpression( TOP_PRIORITY ); |
| 1852 | ExpectToken( ";" ); |
| 1853 | |
| 1854 | //FIXME: add check for constant expression |
| 1855 | patch1 = gameLocal.program.NumStatements(); |
| 1856 | EmitOpcode( OP_IFNOT, e, 0 ); |
| 1857 | |
| 1858 | // counter |
| 1859 | if ( !CheckToken( ")" ) ) { |
| 1860 | patch3 = gameLocal.program.NumStatements(); |
| 1861 | EmitOpcode( OP_IF, e, 0 ); |
| 1862 | |
| 1863 | patch4 = patch2; |
| 1864 | patch2 = gameLocal.program.NumStatements(); |
| 1865 | do { |
| 1866 | GetExpression( TOP_PRIORITY ); |
| 1867 | } while( CheckToken( "," ) ); |
| 1868 | |
| 1869 | ExpectToken( ")" ); |
| 1870 | |
| 1871 | // goto patch4 |
| 1872 | EmitOpcode( OP_GOTO, JumpTo( patch4 ), 0 ); |
| 1873 | |
| 1874 | // fixup patch3 |
| 1875 | gameLocal.program.GetStatement( patch3 ).b = JumpFrom( patch3 ); |
| 1876 | } |
| 1877 | |
| 1878 | ParseStatement(); |
| 1879 | |
| 1880 | // goto patch2 |
| 1881 | EmitOpcode( OP_GOTO, JumpTo( patch2 ), 0 ); |
| 1882 |
nothing calls this directly
no test coverage detected