| 1450 | } |
| 1451 | |
| 1452 | Result WastParser::ParseModuleFieldList(Module* module) { |
| 1453 | WABT_TRACE(ParseModuleFieldList); |
| 1454 | |
| 1455 | // Reset module-specific state. |
| 1456 | resolve_ref_types_.clear(); |
| 1457 | resolve_type_vectors_.clear(); |
| 1458 | resolve_funcs_.clear(); |
| 1459 | |
| 1460 | while (IsModuleField(PeekPair()) || PeekIsCustom()) { |
| 1461 | if (PeekIsCustom()) { |
| 1462 | CHECK_RESULT(ParseCustomSectionAnnotation(module)); |
| 1463 | continue; |
| 1464 | } |
| 1465 | if (Failed(ParseModuleField(module))) { |
| 1466 | CHECK_RESULT(Synchronize(IsModuleField)); |
| 1467 | } |
| 1468 | } |
| 1469 | |
| 1470 | // Module parsing is completed, type names can be resolved now. |
| 1471 | Result result = Result::Ok; |
| 1472 | |
| 1473 | for (auto it : resolve_ref_types_) { |
| 1474 | result |= ResolveTargetRefType(*module, it.target_type, it.var, errors_); |
| 1475 | } |
| 1476 | |
| 1477 | for (auto it : resolve_type_vectors_) { |
| 1478 | result |= |
| 1479 | ResolveTargetTypeVector(*module, it.target_vector, &it.vars, errors_); |
| 1480 | } |
| 1481 | |
| 1482 | for (auto it : resolve_funcs_) { |
| 1483 | result |= ResolveTargetTypeVector(*module, &it.types, &it.vars, errors_); |
| 1484 | it.target_func->local_types.Set(it.types); |
| 1485 | } |
| 1486 | |
| 1487 | CHECK_RESULT(result); |
| 1488 | CHECK_RESULT(ResolveFuncTypes(module, errors_)); |
| 1489 | CHECK_RESULT(ResolveNamesModule(module, errors_)); |
| 1490 | return Result::Ok; |
| 1491 | } |
| 1492 | |
| 1493 | Result WastParser::ParseModuleField(Module* module) { |
| 1494 | WABT_TRACE(ParseModuleField); |
nothing calls this directly
no test coverage detected