* Dump a value. */
| 1424 | * Dump a value. |
| 1425 | */ |
| 1426 | static void dumpVal(const MatchVal &val, std::string &str, bool hex = false) |
| 1427 | { |
| 1428 | switch (val.type) |
| 1429 | { |
| 1430 | case MATCH_TYPE_UNDEFINED: |
| 1431 | str += "undefined"; return; |
| 1432 | case MATCH_TYPE_NIL: |
| 1433 | str += "nil"; return; |
| 1434 | case MATCH_TYPE_INTEGER: |
| 1435 | if (!hex) |
| 1436 | str += std::to_string(val.i); |
| 1437 | else |
| 1438 | { |
| 1439 | std::stringstream ss; |
| 1440 | ss << std::hex << val.i; |
| 1441 | str += "0x"; |
| 1442 | str += ss.str(); |
| 1443 | } |
| 1444 | return; |
| 1445 | case MATCH_TYPE_OPERAND: |
| 1446 | switch (val.op) |
| 1447 | { |
| 1448 | case OPTYPE_IMM: |
| 1449 | str += "imm"; return; |
| 1450 | case OPTYPE_REG: |
| 1451 | str += "reg"; return; |
| 1452 | case OPTYPE_MEM: |
| 1453 | str += "mem"; return; |
| 1454 | default: |
| 1455 | str += "???"; return; |
| 1456 | } |
| 1457 | case MATCH_TYPE_ACCESS: |
| 1458 | switch (val.access) |
| 1459 | { |
| 1460 | case 0: |
| 1461 | str += '-'; return; |
| 1462 | case ACCESS_READ: |
| 1463 | str += 'r'; return; |
| 1464 | case ACCESS_WRITE: |
| 1465 | str += 'w'; return; |
| 1466 | case ACCESS_READ | ACCESS_WRITE: |
| 1467 | str += "rw"; return; |
| 1468 | default: |
| 1469 | str += "???"; return; |
| 1470 | } |
| 1471 | case MATCH_TYPE_REGISTER: |
| 1472 | str += getRegName(val.reg); return; |
| 1473 | case MATCH_TYPE_MEMORY: |
| 1474 | str += "mem"; |
| 1475 | str += std::to_string(8 * val.mem.size); |
| 1476 | str += '<'; |
| 1477 | if (val.mem.seg != REGISTER_NONE) |
| 1478 | { |
| 1479 | str += getRegName(val.mem.seg); |
| 1480 | str += ':'; |
| 1481 | } |
| 1482 | if (val.mem.disp != 0) |
| 1483 | str += std::to_string(val.mem.disp); |
no outgoing calls
no test coverage detected