* Parse a trampoline message. */
| 705 | * Parse a trampoline message. |
| 706 | */ |
| 707 | static void parseTrampoline(Binary *B, const Message &msg) |
| 708 | { |
| 709 | const char *name = nullptr; |
| 710 | Trampoline *T = nullptr; |
| 711 | bool dup = false; |
| 712 | for (unsigned i = 0; i < msg.num_params; i++) |
| 713 | { |
| 714 | switch (msg.params[i].name) |
| 715 | { |
| 716 | case PARAM_NAME: |
| 717 | dup = dup || (name != nullptr); |
| 718 | name = msg.params[i].value.string; |
| 719 | break; |
| 720 | case PARAM_TEMPLATE: |
| 721 | dup = dup || (T != nullptr); |
| 722 | T = msg.params[i].value.trampoline; |
| 723 | break; |
| 724 | default: |
| 725 | break; |
| 726 | } |
| 727 | } |
| 728 | if (name == nullptr) |
| 729 | error("failed to parse \"trampoline\" message (id=%u); missing " |
| 730 | "\"name\" parameter", msg.id); |
| 731 | if (name[0] != '$') |
| 732 | error("failed to parse \"trampoline\" message (id=%u); \"name\" " |
| 733 | "parameter must begin with a `$', found \"%s\"", msg.id, name); |
| 734 | if (T == nullptr) |
| 735 | error("failed to parse \"trampoline\" message (id=%u); missing " |
| 736 | "\"template\" parameter", msg.id); |
| 737 | if (dup) |
| 738 | error("failed to parse \"trampoline\" message (id=%u); duplicate " |
| 739 | "parameters detected", msg.id); |
| 740 | |
| 741 | auto i = B->Ts.insert(std::make_pair(name, T)); |
| 742 | if (!i.second) |
| 743 | error("failed to parse \"trampoline\" message (id=%u); a trampoline " |
| 744 | "with name \"%s\" already exists", msg.id, name); |
| 745 | } |
| 746 | |
| 747 | /* |
| 748 | * Parse an option message. |