| 1829 | } |
| 1830 | |
| 1831 | void fxScopeCodeUsed(txScope* self, txCoder* coder, txUsingContext* context) |
| 1832 | { |
| 1833 | txTargetCode* normalTarget = fxCoderCreateTarget(coder); |
| 1834 | txTargetCode* uncatchTarget = fxCoderCreateTarget(coder); |
| 1835 | txTargetCode* finallyTarget = fxCoderCreateTarget(coder); |
| 1836 | txTargetCode* elseTarget = fxCoderCreateTarget(coder); |
| 1837 | txInteger selection; |
| 1838 | |
| 1839 | fxCoderAddBranch(coder, 0, XS_CODE_BRANCH_1, normalTarget); |
| 1840 | fxCoderAdd(coder, 0, context->catchTarget); |
| 1841 | fxCoderAddByte(coder, 1, XS_CODE_EXCEPTION); |
| 1842 | fxCoderAddIndex(coder, 0, XS_CODE_PULL_LOCAL_1, context->exception); |
| 1843 | fxCoderAddInteger(coder, 1, XS_CODE_INTEGER_1, 0); |
| 1844 | fxCoderAddIndex(coder, -1, XS_CODE_PULL_LOCAL_1, context->selector); |
| 1845 | fxCoderAddBranch(coder, 0, XS_CODE_BRANCH_1, finallyTarget); |
| 1846 | selection = 1; |
| 1847 | coder->firstBreakTarget = fxCoderFinalizeTargets(coder, coder->firstBreakTarget, context->selector, &selection, uncatchTarget); |
| 1848 | coder->firstContinueTarget = fxCoderFinalizeTargets(coder, coder->firstContinueTarget, context->selector, &selection, uncatchTarget); |
| 1849 | coder->returnTarget = fxCoderFinalizeTargets(coder, coder->returnTarget, context->selector, &selection, uncatchTarget); |
| 1850 | fxCoderAdd(coder, 0, normalTarget); |
| 1851 | fxCoderAddInteger(coder, 1, XS_CODE_INTEGER_1, selection); |
| 1852 | fxCoderAddIndex(coder, -1, XS_CODE_PULL_LOCAL_1, context->selector); |
| 1853 | fxCoderAdd(coder, 0, uncatchTarget); |
| 1854 | fxCoderAddByte(coder, 0, XS_CODE_UNCATCH); |
| 1855 | fxCoderAdd(coder, 0, finallyTarget); |
| 1856 | |
| 1857 | fxScopeCodeUsedReverse(self, coder, self->firstDeclareNode, context->exception, context->selector); |
| 1858 | |
| 1859 | fxCoderAddIndex(coder, 1, XS_CODE_GET_LOCAL_1, context->selector); |
| 1860 | fxCoderAddBranch(coder, -1, XS_CODE_BRANCH_IF_1, elseTarget); |
| 1861 | fxCoderAddIndex(coder, 1, XS_CODE_GET_LOCAL_1, context->exception); |
| 1862 | fxCoderAddByte(coder, -1, XS_CODE_THROW); |
| 1863 | fxCoderAdd(coder, 0, elseTarget); |
| 1864 | selection = 1; |
| 1865 | fxCoderJumpTargets(coder, coder->firstBreakTarget, context->selector, &selection); |
| 1866 | fxCoderJumpTargets(coder, coder->firstContinueTarget, context->selector, &selection); |
| 1867 | fxCoderJumpTargets(coder, coder->returnTarget, context->selector, &selection); |
| 1868 | fxCoderUnuseTemporaryVariables(coder, 2); |
| 1869 | } |
| 1870 | |
| 1871 | void fxScopeCodeUsedReverse(txScope* self, txCoder* coder, txDeclareNode* node, txInteger exception, txInteger selector) |
| 1872 | { |
no test coverage detected