| 1294 | } |
| 1295 | |
| 1296 | void fxCoderOptimize(txCoder* self) |
| 1297 | { |
| 1298 | txByteCode** address; |
| 1299 | txByteCode* code; |
| 1300 | |
| 1301 | // branch to (target | unwind)* end => end |
| 1302 | address = &self->firstCode; |
| 1303 | while ((code = *address)) { |
| 1304 | if (code->id == XS_CODE_BRANCH_1) { |
| 1305 | txByteCode* nextCode = ((txBranchCode*)code)->target->nextCode; |
| 1306 | while ((nextCode->id == XS_NO_CODE) || (nextCode->id == XS_CODE_UNWIND_1)) |
| 1307 | nextCode = nextCode->nextCode; |
| 1308 | if ((XS_CODE_END <= nextCode->id) && (nextCode->id <= XS_CODE_END_DERIVED)) { |
| 1309 | txByteCode* end = fxNewParserChunkClear(self->parser, sizeof(txByteCode)); |
| 1310 | end->nextCode = code->nextCode; |
| 1311 | end->id = nextCode->id; |
| 1312 | end->stackLevel = code->stackLevel; |
| 1313 | *address = end; |
| 1314 | } |
| 1315 | else |
| 1316 | address = &code->nextCode; |
| 1317 | } |
| 1318 | else |
| 1319 | address = &code->nextCode; |
| 1320 | } |
| 1321 | // unwind (target | unwind)* end => (target | unwind)* end |
| 1322 | address = &self->firstCode; |
| 1323 | while ((code = *address)) { |
| 1324 | if (code->id == XS_CODE_UNWIND_1) { |
| 1325 | txByteCode* nextCode = code->nextCode; |
| 1326 | while ((nextCode->id == XS_NO_CODE) || (nextCode->id == XS_CODE_UNWIND_1)) |
| 1327 | nextCode = nextCode->nextCode; |
| 1328 | if ((XS_CODE_END <= nextCode->id) && (nextCode->id <= XS_CODE_END_DERIVED)) |
| 1329 | *address = code->nextCode; |
| 1330 | else |
| 1331 | address = &code->nextCode; |
| 1332 | } |
| 1333 | else |
| 1334 | address = &code->nextCode; |
| 1335 | } |
| 1336 | // end target* end => target* end |
| 1337 | address = &self->firstCode; |
| 1338 | while ((code = *address)) { |
| 1339 | if ((XS_CODE_END <= code->id) && (code->id <= XS_CODE_END_DERIVED)) { |
| 1340 | txByteCode* nextCode = code->nextCode; |
| 1341 | if (!nextCode) |
| 1342 | break; |
| 1343 | while (nextCode->id == XS_NO_CODE) |
| 1344 | nextCode = nextCode->nextCode; |
| 1345 | if (nextCode->id == code->id) |
| 1346 | *address = code->nextCode; |
| 1347 | else |
| 1348 | address = &code->nextCode; |
| 1349 | } |
| 1350 | else |
| 1351 | address = &code->nextCode; |
| 1352 | } |
| 1353 | // branch to next => |
no test coverage detected