mirror of
https://github.com/encounter/objdiff.git
synced 2025-08-06 12:15:44 +00:00
Compare commits
11 Commits
v3.0.0-bet
...
main
Author | SHA1 | Date | |
---|---|---|---|
a015971c20 | |||
e67d5998b3 | |||
91bc23edfc | |||
c9c3b32376 | |||
0dc123b064 | |||
1e62d4664c | |||
1205e8ceb4 | |||
c917cad5f0 | |||
dd653329f5 | |||
f5d3d5f10a | |||
c327ed3ea8 |
308
Cargo.lock
generated
308
Cargo.lock
generated
@ -20,9 +20,9 @@ checksum = "b2187590a23ab1e3df8681afdf0987c48504d80291f002fcdb651f0ef5e25169"
|
||||
|
||||
[[package]]
|
||||
name = "accesskit"
|
||||
version = "0.17.1"
|
||||
version = "0.19.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d3d3b8f9bae46a948369bc4a03e815d4ed6d616bd00de4051133a5019dc31c5a"
|
||||
checksum = "e25ae84c0260bdf5df07796d7cc4882460de26a2b406ec0e6c42461a723b271b"
|
||||
dependencies = [
|
||||
"enumn",
|
||||
"serde",
|
||||
@ -34,7 +34,7 @@ version = "0.24.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
|
||||
dependencies = [
|
||||
"gimli",
|
||||
"gimli 0.31.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -716,12 +716,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "codespan-reporting"
|
||||
version = "0.11.1"
|
||||
version = "0.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
|
||||
checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"termcolor",
|
||||
"unicode-width 0.1.14",
|
||||
"unicode-width 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -790,6 +791,15 @@ dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "convert_case"
|
||||
version = "0.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb402b8d4c85569410425650ce3eddc7d698ed96d39a73f941b08fb63082f1e7"
|
||||
dependencies = [
|
||||
"unicode-segmentation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation"
|
||||
version = "0.9.4"
|
||||
@ -920,6 +930,24 @@ dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossterm"
|
||||
version = "0.29.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b"
|
||||
dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
"crossterm_winapi",
|
||||
"derive_more",
|
||||
"document-features",
|
||||
"mio",
|
||||
"parking_lot",
|
||||
"rustix 1.0.8",
|
||||
"signal-hook",
|
||||
"signal-hook-mio",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossterm_winapi"
|
||||
version = "0.9.1"
|
||||
@ -929,6 +957,12 @@ dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crunchy"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
|
||||
|
||||
[[package]]
|
||||
name = "crypto-common"
|
||||
version = "0.1.6"
|
||||
@ -1004,6 +1038,27 @@ dependencies = [
|
||||
"powerfmt",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derive_more"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678"
|
||||
dependencies = [
|
||||
"derive_more-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derive_more-impl"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3"
|
||||
dependencies = [
|
||||
"convert_case",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "digest"
|
||||
version = "0.10.7"
|
||||
@ -1129,9 +1184,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ecolor"
|
||||
version = "0.31.1"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bc4feb366740ded31a004a0e4452fbf84e80ef432ecf8314c485210229672fd1"
|
||||
checksum = "4a631732d995184114016fab22fc7e3faf73d6841c2d7650395fe251fbcd9285"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"emath",
|
||||
@ -1140,9 +1195,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "eframe"
|
||||
version = "0.31.1"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d0dfe0859f3fb1bc6424c57d41e10e9093fe938f426b691e42272c2f336d915c"
|
||||
checksum = "0c790ccfbb3dd556588342463454b2b2b13909e5fdce5bc2a1432a8aa69c8b7a"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"bytemuck",
|
||||
@ -1181,9 +1236,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "egui"
|
||||
version = "0.31.1"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3"
|
||||
checksum = "8470210c95a42cc985d9ffebfd5067eea55bdb1c3f7611484907db9639675e28"
|
||||
dependencies = [
|
||||
"accesskit",
|
||||
"ahash",
|
||||
@ -1195,13 +1250,15 @@ dependencies = [
|
||||
"profiling",
|
||||
"ron",
|
||||
"serde",
|
||||
"smallvec",
|
||||
"unicode-segmentation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "egui-wgpu"
|
||||
version = "0.31.1"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d319dfef570f699b6e9114e235e862a2ddcf75f0d1a061de9e1328d92146d820"
|
||||
checksum = "14de9942d8b9e99e2d830403c208ab1a6e052e925a7456a4f6f66d567d90de1d"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"bytemuck",
|
||||
@ -1219,9 +1276,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "egui-winit"
|
||||
version = "0.31.1"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7d9dfbb78fe4eb9c3a39ad528b90ee5915c252e77bbab9d4ebc576541ab67e13"
|
||||
checksum = "c490804a035cec9c826082894a3e1ecf4198accd3817deb10f7919108ebafab0"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"arboard",
|
||||
@ -1239,9 +1296,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "egui_extras"
|
||||
version = "0.31.1"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "624659a2e972a46f4d5f646557906c55f1cd5a0836eddbe610fdf1afba1b4226"
|
||||
checksum = "0f791a5937f518249016b276b3639ad2aa3824048b6f2161ec2b431ab325880a"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"egui",
|
||||
@ -1253,9 +1310,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "egui_glow"
|
||||
version = "0.31.1"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "910906e3f042ea6d2378ec12a6fd07698e14ddae68aed2d819ffe944a73aab9e"
|
||||
checksum = "d44f3fd4fdc5f960c9e9ef7327c26647edc3141abf96102980647129d49358e6"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"bytemuck",
|
||||
@ -1277,9 +1334,9 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
|
||||
|
||||
[[package]]
|
||||
name = "emath"
|
||||
version = "0.31.1"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9e4cadcff7a5353ba72b7fea76bf2122b5ebdbc68e8155aa56dfdea90083fe1b"
|
||||
checksum = "45f057b141e7e46340c321400be74b793543b1b213036f0f989c35d35957c32e"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"serde",
|
||||
@ -1336,7 +1393,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9"
|
||||
dependencies = [
|
||||
"enum-map-derive",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1384,9 +1440,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "epaint"
|
||||
version = "0.31.1"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41fcc0f5a7c613afd2dee5e4b30c3e6acafb8ad6f0edb06068811f708a67c562"
|
||||
checksum = "94cca02195f0552c17cabdc02f39aa9ab6fbd815dac60ab1cd3d5b0aa6f9551c"
|
||||
dependencies = [
|
||||
"ab_glyph",
|
||||
"ahash",
|
||||
@ -1403,9 +1459,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "epaint_default_fonts"
|
||||
version = "0.31.1"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fc7e7a64c02cf7a5b51e745a9e45f60660a286f151c238b9d397b3e923f5082f"
|
||||
checksum = "e8495e11ed527dff39663b8c36b6c2b2799d7e4287fb90556e455d72eca0b4d3"
|
||||
|
||||
[[package]]
|
||||
name = "equivalent"
|
||||
@ -1531,8 +1587,9 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99"
|
||||
|
||||
[[package]]
|
||||
name = "flagset"
|
||||
version = "0.4.6"
|
||||
source = "git+https://github.com/enarx/flagset.git?rev=a1fe9369b3741e43fec45da1998e83b9d78966a2#a1fe9369b3741e43fec45da1998e83b9d78966a2"
|
||||
version = "0.4.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7ac824320a75a52197e8f2d787f6a38b6718bb6897a35142d749af3c0e8f4fe"
|
||||
|
||||
[[package]]
|
||||
name = "flate2"
|
||||
@ -1816,6 +1873,12 @@ version = "0.31.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
|
||||
|
||||
[[package]]
|
||||
name = "gimli"
|
||||
version = "0.32.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "93563d740bc9ef04104f9ed6f86f1e3275c2cdafb95664e26584b9ca807a8ffe"
|
||||
|
||||
[[package]]
|
||||
name = "gl_generator"
|
||||
version = "0.14.0"
|
||||
@ -2020,6 +2083,17 @@ dependencies = [
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "half"
|
||||
version = "2.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"crunchy",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.15.4"
|
||||
@ -2663,6 +2737,12 @@ dependencies = [
|
||||
"windows-targets 0.53.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libm"
|
||||
version = "0.2.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de"
|
||||
|
||||
[[package]]
|
||||
name = "libmimalloc-sys"
|
||||
version = "0.1.43"
|
||||
@ -2876,24 +2956,27 @@ checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084"
|
||||
|
||||
[[package]]
|
||||
name = "naga"
|
||||
version = "24.0.0"
|
||||
version = "25.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e380993072e52eef724eddfcde0ed013b0c023c3f0417336ed041aa9f076994e"
|
||||
checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
"bit-set",
|
||||
"bitflags 2.9.1",
|
||||
"cfg_aliases",
|
||||
"codespan-reporting",
|
||||
"half",
|
||||
"hashbrown",
|
||||
"hexf-parse",
|
||||
"indexmap",
|
||||
"log",
|
||||
"num-traits",
|
||||
"once_cell",
|
||||
"rustc-hash 1.1.0",
|
||||
"spirv",
|
||||
"strum",
|
||||
"termcolor",
|
||||
"thiserror 2.0.12",
|
||||
"unicode-xid",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3031,6 +3114,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"libm",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3353,11 +3437,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "objdiff-cli"
|
||||
version = "3.0.0-beta.11"
|
||||
version = "3.0.0-beta.13"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"argp",
|
||||
"crossterm",
|
||||
"crossterm 0.29.0",
|
||||
"enable-ansi-support",
|
||||
"memmap2",
|
||||
"mimalloc",
|
||||
@ -3376,7 +3460,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "objdiff-core"
|
||||
version = "3.0.0-beta.11"
|
||||
version = "3.0.0-beta.13"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"arm-attr",
|
||||
@ -3386,7 +3470,7 @@ dependencies = [
|
||||
"encoding_rs",
|
||||
"filetime",
|
||||
"flagset",
|
||||
"gimli",
|
||||
"gimli 0.32.0",
|
||||
"globset",
|
||||
"heck",
|
||||
"iced-x86",
|
||||
@ -3421,6 +3505,7 @@ dependencies = [
|
||||
"syn",
|
||||
"tempfile",
|
||||
"time",
|
||||
"typed-arena",
|
||||
"typed-path",
|
||||
"unarm",
|
||||
"winapi",
|
||||
@ -3430,7 +3515,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "objdiff-gui"
|
||||
version = "3.0.0-beta.11"
|
||||
version = "3.0.0-beta.13"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"cfg-if",
|
||||
@ -3466,7 +3551,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "objdiff-wasm"
|
||||
version = "3.0.0-beta.11"
|
||||
version = "3.0.0-beta.13"
|
||||
dependencies = [
|
||||
"log",
|
||||
"objdiff-core",
|
||||
@ -3675,22 +3760,22 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "pbjson"
|
||||
version = "0.7.0"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c7e6349fa080353f4a597daffd05cb81572a9c031a6d4fff7e504947496fcc68"
|
||||
checksum = "898bac3fa00d0ba57a4e8289837e965baa2dee8c3749f3b11d45a64b4223d9c3"
|
||||
dependencies = [
|
||||
"base64 0.21.7",
|
||||
"base64 0.22.1",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pbjson-build"
|
||||
version = "0.7.0"
|
||||
version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6eea3058763d6e656105d1403cb04e0a41b7bbac6362d413e7c33be0c32279c9"
|
||||
checksum = "af22d08a625a2213a78dbb0ffa253318c5c79ce3133d32d296655a7bdfb02095"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"itertools 0.13.0",
|
||||
"itertools 0.14.0",
|
||||
"prost",
|
||||
"prost-types",
|
||||
]
|
||||
@ -3915,9 +4000,9 @@ checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773"
|
||||
|
||||
[[package]]
|
||||
name = "prost"
|
||||
version = "0.13.5"
|
||||
version = "0.14.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5"
|
||||
checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"prost-derive",
|
||||
@ -3925,9 +4010,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "prost-build"
|
||||
version = "0.13.5"
|
||||
version = "0.14.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf"
|
||||
checksum = "ac6c3320f9abac597dcbc668774ef006702672474aad53c6d596b62e487b40b1"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"itertools 0.14.0",
|
||||
@ -3945,9 +4030,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "prost-derive"
|
||||
version = "0.13.5"
|
||||
version = "0.14.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d"
|
||||
checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"itertools 0.14.0",
|
||||
@ -3958,9 +4043,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "prost-types"
|
||||
version = "0.13.5"
|
||||
version = "0.14.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16"
|
||||
checksum = "b9b4db3d6da204ed77bb26ba83b6122a73aeb2e87e25fbf7ad2e84c4ccbf8f72"
|
||||
dependencies = [
|
||||
"prost",
|
||||
]
|
||||
@ -4131,7 +4216,7 @@ dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
"cassowary",
|
||||
"compact_str",
|
||||
"crossterm",
|
||||
"crossterm 0.28.1",
|
||||
"indoc",
|
||||
"instability",
|
||||
"itertools 0.13.0",
|
||||
@ -4405,14 +4490,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ron"
|
||||
version = "0.8.1"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
|
||||
checksum = "beceb6f7bf81c73e73aeef6dd1356d9a1b2b4909e1f0fc3e59b034f9572d7b7f"
|
||||
dependencies = [
|
||||
"base64 0.21.7",
|
||||
"base64 0.22.1",
|
||||
"bitflags 2.9.1",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -5535,6 +5621,12 @@ dependencies = [
|
||||
"rustc-hash 2.1.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typed-arena"
|
||||
version = "2.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a"
|
||||
|
||||
[[package]]
|
||||
name = "typed-path"
|
||||
version = "0.11.0"
|
||||
@ -5792,9 +5884,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-encoder"
|
||||
version = "0.230.0"
|
||||
version = "0.235.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d4349d0943718e6e434b51b9639e876293093dca4b96384fb136ab5bd5ce6660"
|
||||
checksum = "b3bc393c395cb621367ff02d854179882b9a351b4e0c93d1397e6090b53a5c2a"
|
||||
dependencies = [
|
||||
"leb128fmt",
|
||||
"wasmparser",
|
||||
@ -5802,9 +5894,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-metadata"
|
||||
version = "0.230.0"
|
||||
version = "0.235.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1a52e010df5494f4289ccc68ce0c2a8c17555225a5e55cc41b98f5ea28d0844b"
|
||||
checksum = "b055604ba04189d54b8c0ab2c2fc98848f208e103882d5c0b984f045d5ea4d20"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"indexmap",
|
||||
@ -5827,9 +5919,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.230.0"
|
||||
version = "0.235.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "808198a69b5a0535583370a51d459baa14261dfab04800c4864ee9e1a14346ed"
|
||||
checksum = "161296c618fa2d63f6ed5fffd1112937e803cb9ec71b32b01a76321555660917"
|
||||
dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
"hashbrown",
|
||||
@ -6005,18 +6097,20 @@ checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3"
|
||||
|
||||
[[package]]
|
||||
name = "wgpu"
|
||||
version = "24.0.5"
|
||||
version = "25.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b0b3436f0729f6cdf2e6e9201f3d39dc95813fad61d826c1ed07918b4539353"
|
||||
checksum = "ec8fb398f119472be4d80bc3647339f56eb63b2a331f6a3d16e25d8144197dd9"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
"bitflags 2.9.1",
|
||||
"cfg_aliases",
|
||||
"document-features",
|
||||
"hashbrown",
|
||||
"js-sys",
|
||||
"log",
|
||||
"naga",
|
||||
"parking_lot",
|
||||
"portable-atomic",
|
||||
"profiling",
|
||||
"raw-window-handle",
|
||||
"smallvec",
|
||||
@ -6031,34 +6125,67 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wgpu-core"
|
||||
version = "24.0.5"
|
||||
version = "25.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f0aa306497a238d169b9dc70659105b4a096859a34894544ca81719242e1499"
|
||||
checksum = "f7b882196f8368511d613c6aeec80655160db6646aebddf8328879a88d54e500"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
"bit-set",
|
||||
"bit-vec",
|
||||
"bitflags 2.9.1",
|
||||
"cfg_aliases",
|
||||
"document-features",
|
||||
"hashbrown",
|
||||
"indexmap",
|
||||
"log",
|
||||
"naga",
|
||||
"once_cell",
|
||||
"parking_lot",
|
||||
"portable-atomic",
|
||||
"profiling",
|
||||
"raw-window-handle",
|
||||
"rustc-hash 1.1.0",
|
||||
"smallvec",
|
||||
"thiserror 2.0.12",
|
||||
"wgpu-core-deps-apple",
|
||||
"wgpu-core-deps-emscripten",
|
||||
"wgpu-core-deps-windows-linux-android",
|
||||
"wgpu-hal",
|
||||
"wgpu-types",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wgpu-hal"
|
||||
version = "24.0.4"
|
||||
name = "wgpu-core-deps-apple"
|
||||
version = "25.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f112f464674ca69f3533248508ee30cb84c67cf06c25ff6800685f5e0294e259"
|
||||
checksum = "cfd488b3239b6b7b185c3b045c39ca6bf8af34467a4c5de4e0b1a564135d093d"
|
||||
dependencies = [
|
||||
"wgpu-hal",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wgpu-core-deps-emscripten"
|
||||
version = "25.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f09ad7aceb3818e52539acc679f049d3475775586f3f4e311c30165cf2c00445"
|
||||
dependencies = [
|
||||
"wgpu-hal",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wgpu-core-deps-windows-linux-android"
|
||||
version = "25.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cba5fb5f7f9c98baa7c889d444f63ace25574833df56f5b817985f641af58e46"
|
||||
dependencies = [
|
||||
"wgpu-hal",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wgpu-hal"
|
||||
version = "25.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f968767fe4d3d33747bbd1473ccd55bf0f6451f55d733b5597e67b5deab4ad17"
|
||||
dependencies = [
|
||||
"android_system_properties",
|
||||
"arrayvec",
|
||||
@ -6067,6 +6194,7 @@ dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
"block",
|
||||
"bytemuck",
|
||||
"cfg-if",
|
||||
"cfg_aliases",
|
||||
"core-graphics-types",
|
||||
"glow",
|
||||
@ -6074,6 +6202,7 @@ dependencies = [
|
||||
"gpu-alloc",
|
||||
"gpu-allocator",
|
||||
"gpu-descriptor",
|
||||
"hashbrown",
|
||||
"js-sys",
|
||||
"khronos-egl",
|
||||
"libc",
|
||||
@ -6083,14 +6212,13 @@ dependencies = [
|
||||
"naga",
|
||||
"ndk-sys 0.5.0+25.2.9519653",
|
||||
"objc",
|
||||
"once_cell",
|
||||
"ordered-float 4.6.0",
|
||||
"parking_lot",
|
||||
"portable-atomic",
|
||||
"profiling",
|
||||
"range-alloc",
|
||||
"raw-window-handle",
|
||||
"renderdoc-sys",
|
||||
"rustc-hash 1.1.0",
|
||||
"smallvec",
|
||||
"thiserror 2.0.12",
|
||||
"wasm-bindgen",
|
||||
@ -6102,13 +6230,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wgpu-types"
|
||||
version = "24.0.0"
|
||||
version = "25.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c"
|
||||
checksum = "2aa49460c2a8ee8edba3fca54325540d904dd85b2e086ada762767e17d06e8bc"
|
||||
dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
"bytemuck",
|
||||
"js-sys",
|
||||
"log",
|
||||
"thiserror 2.0.12",
|
||||
"web-sys",
|
||||
]
|
||||
|
||||
@ -6610,19 +6740,19 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.42.1"
|
||||
version = "0.43.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa5b79cd8cb4b27a9be3619090c03cbb87fe7b1c6de254b4c9b4477188828af8"
|
||||
checksum = "9a18712ff1ec5bd09da500fe1e91dec11256b310da0ff33f8b4ec92b927cf0c6"
|
||||
dependencies = [
|
||||
"wit-bindgen-rt 0.42.1",
|
||||
"wit-bindgen-rt 0.43.0",
|
||||
"wit-bindgen-rust-macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-core"
|
||||
version = "0.42.1"
|
||||
version = "0.43.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e35e550f614e16db196e051d22b0d4c94dd6f52c90cb1016240f71b9db332631"
|
||||
checksum = "2c53468e077362201de11999c85c07c36e12048a990a3e0d69da2bd61da355d0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
@ -6640,18 +6770,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rt"
|
||||
version = "0.42.1"
|
||||
version = "0.43.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "051105bab12bc78e161f8dfb3596e772dd6a01ebf9c4840988e00347e744966a"
|
||||
checksum = "9fd734226eac1fd7c450956964e3a9094c9cee65e9dafdf126feef8c0096db65"
|
||||
dependencies = [
|
||||
"bitflags 2.9.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust"
|
||||
version = "0.42.1"
|
||||
version = "0.43.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cb1e0a91fc85f4ef70e0b81cd86c2b49539d3cd14766fd82396184aadf8cb7d7"
|
||||
checksum = "531ebfcec48e56473805285febdb450e270fa75b2dacb92816861d0473b4c15f"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
@ -6665,9 +6795,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust-macro"
|
||||
version = "0.42.1"
|
||||
version = "0.43.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ce69f52c5737705881d5da5a1dd06f47f8098d094a8d65a3e44292942edb571f"
|
||||
checksum = "7852bf8a9d1ea80884d26b864ddebd7b0c7636697c6ca10f4c6c93945e023966"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"prettyplease",
|
||||
@ -6680,9 +6810,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wit-component"
|
||||
version = "0.230.0"
|
||||
version = "0.235.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b607b15ead6d0e87f5d1613b4f18c04d4e80ceeada5ffa608d8360e6909881df"
|
||||
checksum = "64a57a11109cc553396f89f3a38a158a97d0b1adaec113bd73e0f64d30fb601f"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bitflags 2.9.1",
|
||||
@ -6724,9 +6854,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wit-parser"
|
||||
version = "0.230.0"
|
||||
version = "0.235.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "679fde5556495f98079a8e6b9ef8c887f731addaffa3d48194075c1dd5cd611b"
|
||||
checksum = "0a1f95a87d03a33e259af286b857a95911eb46236a0f726cbaec1227b3dfc67a"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"id-arena",
|
||||
|
@ -14,9 +14,9 @@ strip = "debuginfo"
|
||||
codegen-units = 1
|
||||
|
||||
[workspace.package]
|
||||
version = "3.0.0-beta.11"
|
||||
version = "3.0.0-beta.13"
|
||||
authors = ["Luke Street <luke@street.dev>"]
|
||||
edition = "2024"
|
||||
license = "MIT OR Apache-2.0"
|
||||
repository = "https://github.com/encounter/objdiff"
|
||||
rust-version = "1.85"
|
||||
rust-version = "1.88"
|
||||
|
@ -15,11 +15,11 @@ publish = false
|
||||
[dependencies]
|
||||
anyhow = "1.0"
|
||||
argp = "0.4"
|
||||
crossterm = "0.28"
|
||||
crossterm = "0.29"
|
||||
enable-ansi-support = "0.2"
|
||||
memmap2 = "0.9"
|
||||
objdiff-core = { path = "../objdiff-core", features = ["all"] }
|
||||
prost = "0.13"
|
||||
prost = "0.14"
|
||||
ratatui = "0.29"
|
||||
rayon = "1.10"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
|
@ -248,13 +248,12 @@ fn report_object(
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if let Some(existing_functions) = &mut existing_functions {
|
||||
if (symbol.flags.contains(SymbolFlag::Global)
|
||||
if let Some(existing_functions) = &mut existing_functions
|
||||
&& (symbol.flags.contains(SymbolFlag::Global)
|
||||
|| symbol.flags.contains(SymbolFlag::Weak))
|
||||
&& !existing_functions.insert(symbol.name.clone())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
&& !existing_functions.insert(symbol.name.clone())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
let match_percent = symbol_diff.match_percent.unwrap_or_else(|| {
|
||||
// Support cases where we don't have a target object,
|
||||
|
@ -170,32 +170,31 @@ impl UiView for FunctionDiffUi {
|
||||
|
||||
let mut prev_text = None;
|
||||
let mut prev_margin_text = None;
|
||||
if self.three_way {
|
||||
if let Some((obj, symbol_idx, symbol_diff)) =
|
||||
if self.three_way
|
||||
&& let Some((obj, symbol_idx, symbol_diff)) =
|
||||
get_symbol(state.prev_obj.as_ref(), self.prev_sym)
|
||||
{
|
||||
let mut text = Text::default();
|
||||
let rect = content_chunks[4].inner(Margin::new(0, 1));
|
||||
self.print_sym(
|
||||
&mut text,
|
||||
obj,
|
||||
symbol_idx,
|
||||
symbol_diff,
|
||||
&state.diff_obj_config,
|
||||
rect,
|
||||
&self.right_highlight,
|
||||
result,
|
||||
true,
|
||||
);
|
||||
max_width = max_width.max(text.width());
|
||||
prev_text = Some(text);
|
||||
{
|
||||
let mut text = Text::default();
|
||||
let rect = content_chunks[4].inner(Margin::new(0, 1));
|
||||
self.print_sym(
|
||||
&mut text,
|
||||
obj,
|
||||
symbol_idx,
|
||||
symbol_diff,
|
||||
&state.diff_obj_config,
|
||||
rect,
|
||||
&self.right_highlight,
|
||||
result,
|
||||
true,
|
||||
);
|
||||
max_width = max_width.max(text.width());
|
||||
prev_text = Some(text);
|
||||
|
||||
// Render margin
|
||||
let mut text = Text::default();
|
||||
let rect = content_chunks[3].inner(Margin::new(1, 1));
|
||||
self.print_margin(&mut text, symbol_diff, rect);
|
||||
prev_margin_text = Some(text);
|
||||
}
|
||||
// Render margin
|
||||
let mut text = Text::default();
|
||||
let rect = content_chunks[3].inner(Margin::new(1, 1));
|
||||
self.print_margin(&mut text, symbol_diff, rect);
|
||||
prev_margin_text = Some(text);
|
||||
}
|
||||
|
||||
let max_scroll_x =
|
||||
@ -561,10 +560,12 @@ impl FunctionDiffUi {
|
||||
let len = label_text.len();
|
||||
let highlighted =
|
||||
highlight_kind != HighlightKind::None && *highlight == highlight_kind;
|
||||
if let Some((cx, cy)) = result.click_xy {
|
||||
if cx >= sx && cx < sx + len as u16 && cy == sy {
|
||||
new_highlight = Some(highlight_kind);
|
||||
}
|
||||
if let Some((cx, cy)) = result.click_xy
|
||||
&& cx >= sx
|
||||
&& cx < sx + len as u16
|
||||
&& cy == sy
|
||||
{
|
||||
new_highlight = Some(highlight_kind);
|
||||
}
|
||||
let mut style = Style::new().fg(match segment.color {
|
||||
DiffTextColor::Normal => Color::Gray,
|
||||
|
@ -62,7 +62,10 @@ config = [
|
||||
"dep:semver",
|
||||
"dep:typed-path",
|
||||
]
|
||||
dwarf = ["dep:gimli"]
|
||||
dwarf = [
|
||||
"dep:gimli",
|
||||
"dep:typed-arena",
|
||||
]
|
||||
serde = [
|
||||
"dep:pbjson",
|
||||
"dep:pbjson-build",
|
||||
@ -78,6 +81,7 @@ std = [
|
||||
"prost?/std",
|
||||
"serde?/std",
|
||||
"similar?/std",
|
||||
"typed-arena?/std",
|
||||
"typed-path?/std",
|
||||
"dep:filetime",
|
||||
"dep:memmap2",
|
||||
@ -123,14 +127,14 @@ features = ["all"]
|
||||
[dependencies]
|
||||
anyhow = { version = "1.0", default-features = false }
|
||||
filetime = { version = "0.2", optional = true }
|
||||
flagset = { version = "0.4", default-features = false, optional = true, git = "https://github.com/enarx/flagset.git", rev = "a1fe9369b3741e43fec45da1998e83b9d78966a2" }
|
||||
flagset = { version = "0.4", default-features = false, optional = true }
|
||||
itertools = { version = "0.14", default-features = false, features = ["use_alloc"] }
|
||||
log = { version = "0.4", default-features = false, optional = true }
|
||||
memmap2 = { version = "0.9", optional = true }
|
||||
num-traits = { version = "0.2", default-features = false, optional = true }
|
||||
object = { git = "https://github.com/gimli-rs/object", rev = "16ff70aa6fbd97d6bb7b92375929f4d72414c32b", default-features = false, features = ["read_core", "elf", "coff"] }
|
||||
pbjson = { version = "0.7", default-features = false, optional = true }
|
||||
prost = { version = "0.13", default-features = false, features = ["prost-derive"], optional = true }
|
||||
pbjson = { version = "0.8", default-features = false, optional = true }
|
||||
prost = { version = "0.14", default-features = false, features = ["derive"], optional = true }
|
||||
regex = { version = "1.11", default-features = false, features = [], optional = true }
|
||||
serde = { version = "1.0", default-features = false, features = ["derive"], optional = true }
|
||||
similar = { version = "2.7", default-features = false, features = ["hashbrown"], optional = true, git = "https://github.com/encounter/similar.git", branch = "no_std" }
|
||||
@ -142,16 +146,17 @@ semver = { version = "1.0", default-features = false, optional = true }
|
||||
serde_json = { version = "1.0", default-features = false, features = ["alloc"], optional = true }
|
||||
|
||||
# dwarf
|
||||
gimli = { version = "0.31", default-features = false, features = ["read"], optional = true }
|
||||
gimli = { version = "0.32", default-features = false, features = ["read"], optional = true }
|
||||
typed-arena = { version = "2.0", default-features = false, optional = true }
|
||||
|
||||
# ppc
|
||||
cwdemangle = { version = "1.0", optional = true }
|
||||
cwextab = { version = "1.0", optional = true }
|
||||
cwextab = { version = "1.1", optional = true }
|
||||
powerpc = { version = "0.4", optional = true }
|
||||
rlwinmdec = { version = "1.1", optional = true }
|
||||
|
||||
# mips
|
||||
rabbitizer = { version = "2.0.0-alpha.1", default-features = false, features = ["all_extensions"], optional = true }
|
||||
rabbitizer = { version = "2.0.0-alpha.4", default-features = false, features = ["all_extensions"], optional = true }
|
||||
|
||||
# x86
|
||||
cpp_demangle = { version = "0.4", default-features = false, features = ["alloc"], optional = true }
|
||||
@ -159,7 +164,7 @@ iced-x86 = { version = "1.21", default-features = false, features = ["decoder",
|
||||
msvc-demangler = { version = "0.11", optional = true }
|
||||
|
||||
# arm
|
||||
unarm = { version = "1.8", optional = true }
|
||||
unarm = { version = "1.9", optional = true }
|
||||
arm-attr = { version = "0.2", optional = true }
|
||||
|
||||
# arm64
|
||||
@ -167,10 +172,10 @@ yaxpeax-arch = { version = "0.3", default-features = false, optional = true }
|
||||
yaxpeax-arm = { version = "0.3", default-features = false, optional = true }
|
||||
|
||||
# build
|
||||
notify = { version = "8.0.0", optional = true }
|
||||
notify = { version = "8.1.0", optional = true }
|
||||
notify-debouncer-full = { version = "0.5.0", optional = true }
|
||||
shell-escape = { version = "0.1", optional = true }
|
||||
tempfile = { version = "3.19", optional = true }
|
||||
tempfile = { version = "3.20", optional = true }
|
||||
time = { version = "0.3", optional = true }
|
||||
encoding_rs = { version = "0.8.35", optional = true }
|
||||
|
||||
@ -189,10 +194,10 @@ self_update = { version = "0.42", optional = true }
|
||||
|
||||
[build-dependencies]
|
||||
heck = { version = "0.5", optional = true }
|
||||
pbjson-build = { version = "0.7", optional = true }
|
||||
pbjson-build = { version = "0.8", optional = true }
|
||||
prettyplease = { version = "0.2", optional = true }
|
||||
proc-macro2 = { version = "1.0", optional = true }
|
||||
prost-build = { version = "0.13", optional = true }
|
||||
prost-build = { version = "0.14", optional = true }
|
||||
quote = { version = "1.0", optional = true }
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
serde_json = { version = "1.0" }
|
||||
|
@ -509,25 +509,25 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
return "ubfx";
|
||||
}
|
||||
Opcode::SBFM => {
|
||||
if let Operand::Immediate(63) = ins.operands[3] {
|
||||
if let Operand::Register(SizeCode::X, _) = ins.operands[0] {
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[1], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return "asr";
|
||||
}
|
||||
if let Operand::Immediate(63) = ins.operands[3]
|
||||
&& let Operand::Register(SizeCode::X, _) = ins.operands[0]
|
||||
{
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[1], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return "asr";
|
||||
}
|
||||
if let Operand::Immediate(31) = ins.operands[3] {
|
||||
if let Operand::Register(SizeCode::W, _) = ins.operands[0] {
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[1], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return "asr";
|
||||
}
|
||||
if let Operand::Immediate(31) = ins.operands[3]
|
||||
&& let Operand::Register(SizeCode::W, _) = ins.operands[0]
|
||||
{
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[1], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return "asr";
|
||||
}
|
||||
if let Operand::Immediate(0) = ins.operands[2] {
|
||||
let newsrc = if let Operand::Register(_size, srcnum) = ins.operands[1] {
|
||||
@ -554,22 +554,21 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
if let (Operand::Immediate(imms), Operand::Immediate(immr)) =
|
||||
(ins.operands[2], ins.operands[3])
|
||||
&& immr < imms
|
||||
{
|
||||
if immr < imms {
|
||||
let size = if let Operand::Register(size, _) = ins.operands[0] {
|
||||
if size == SizeCode::W { 32 } else { 64 }
|
||||
} else {
|
||||
unreachable!("operand 0 is always a register");
|
||||
};
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[1], ctx);
|
||||
push_separator(args);
|
||||
push_unsigned(args, (size - imms) as u64);
|
||||
push_separator(args);
|
||||
push_unsigned(args, (immr + 1) as u64);
|
||||
return "sbfiz";
|
||||
}
|
||||
let size = if let Operand::Register(size, _) = ins.operands[0] {
|
||||
if size == SizeCode::W { 32 } else { 64 }
|
||||
} else {
|
||||
unreachable!("operand 0 is always a register");
|
||||
};
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[1], ctx);
|
||||
push_separator(args);
|
||||
push_unsigned(args, (size - imms) as u64);
|
||||
push_separator(args);
|
||||
push_unsigned(args, (immr + 1) as u64);
|
||||
return "sbfiz";
|
||||
}
|
||||
// `sbfm` is never actually displayed: in the remaining case, it is always aliased to `sbfx`
|
||||
let width = if let (Operand::Immediate(lsb), Operand::Immediate(width)) =
|
||||
@ -593,15 +592,14 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
Opcode::EXTR => {
|
||||
if let (Operand::Register(_, rn), Operand::Register(_, rm)) =
|
||||
(ins.operands[1], ins.operands[2])
|
||||
&& rn == rm
|
||||
{
|
||||
if rn == rm {
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[3], ctx);
|
||||
return "ror";
|
||||
}
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[3], ctx);
|
||||
return "ror";
|
||||
}
|
||||
"extr"
|
||||
}
|
||||
@ -804,27 +802,24 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
"csneg"
|
||||
}
|
||||
Opcode::CSINC => {
|
||||
if let (
|
||||
Operand::Register(_, n),
|
||||
Operand::Register(_, m),
|
||||
Operand::ConditionCode(cond),
|
||||
) = (ins.operands[1], ins.operands[2], ins.operands[3])
|
||||
if let (Operand::Register(_, n), Operand::Register(_, m), Operand::ConditionCode(cond)) =
|
||||
(ins.operands[1], ins.operands[2], ins.operands[3])
|
||||
&& n == m
|
||||
&& cond < 0b1110
|
||||
{
|
||||
if n == m && cond < 0b1110 {
|
||||
return if n == 31 {
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_condition_code(args, cond ^ 0x01);
|
||||
"cset"
|
||||
} else {
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[1], ctx);
|
||||
push_separator(args);
|
||||
push_condition_code(args, cond ^ 0x01);
|
||||
"cinc"
|
||||
};
|
||||
}
|
||||
return if n == 31 {
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_condition_code(args, cond ^ 0x01);
|
||||
"cset"
|
||||
} else {
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[1], ctx);
|
||||
push_separator(args);
|
||||
push_condition_code(args, cond ^ 0x01);
|
||||
"cinc"
|
||||
};
|
||||
}
|
||||
"csinc"
|
||||
}
|
||||
@ -1200,15 +1195,13 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
Operand::Register(reg_sz, _),
|
||||
Operand::SIMDRegisterElementsLane(_, _, elem_sz, _),
|
||||
) = (ins.operands[0], ins.operands[1])
|
||||
&& ((reg_sz == SizeCode::W && elem_sz == SIMDSizeCode::S)
|
||||
|| (reg_sz == SizeCode::X && elem_sz == SIMDSizeCode::D))
|
||||
{
|
||||
if (reg_sz == SizeCode::W && elem_sz == SIMDSizeCode::S)
|
||||
|| (reg_sz == SizeCode::X && elem_sz == SIMDSizeCode::D)
|
||||
{
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[1], ctx);
|
||||
return "mov";
|
||||
}
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[1], ctx);
|
||||
return "mov";
|
||||
}
|
||||
"umov"
|
||||
}
|
||||
@ -1308,14 +1301,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDADDB(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "staddb" } else { "staddlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "staddb" } else { "staddlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldaddb"
|
||||
@ -1328,14 +1322,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDCLRB(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stclrb" } else { "stclrlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stclrb" } else { "stclrlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldclrb"
|
||||
@ -1348,14 +1343,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDEORB(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "steorb" } else { "steorlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "steorb" } else { "steorlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldeorb"
|
||||
@ -1368,14 +1364,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDSETB(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stsetb" } else { "stsetlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stsetb" } else { "stsetlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldsetb"
|
||||
@ -1388,14 +1385,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDSMAXB(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stsmaxb" } else { "stsmaxlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stsmaxb" } else { "stsmaxlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldsmaxb"
|
||||
@ -1408,14 +1406,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDSMINB(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stsminb" } else { "stsminlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stsminb" } else { "stsminlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldsminb"
|
||||
@ -1428,14 +1427,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDUMAXB(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stumaxb" } else { "stumaxlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stumaxb" } else { "stumaxlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldumaxb"
|
||||
@ -1448,14 +1448,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDUMINB(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stuminb" } else { "stuminlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stuminb" } else { "stuminlb" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
// write!(fmt, "{}", self.opcode)?;
|
||||
if ar == 0 {
|
||||
@ -1469,14 +1470,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDADDH(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "staddh" } else { "staddlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "staddh" } else { "staddlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldaddh"
|
||||
@ -1489,14 +1491,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDCLRH(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stclrh" } else { "stclrlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stclrh" } else { "stclrlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldclrh"
|
||||
@ -1509,14 +1512,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDEORH(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "steorh" } else { "steorlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "steorh" } else { "steorlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldeorh"
|
||||
@ -1529,14 +1533,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDSETH(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stseth" } else { "stsetlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stseth" } else { "stsetlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldseth"
|
||||
@ -1549,14 +1554,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDSMAXH(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stsmaxh" } else { "stsmaxlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stsmaxh" } else { "stsmaxlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldsmaxh"
|
||||
@ -1569,14 +1575,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDSMINH(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stsminh" } else { "stsminlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stsminh" } else { "stsminlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldsminh"
|
||||
@ -1589,14 +1596,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDUMAXH(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stumaxh" } else { "stumaxlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stumaxh" } else { "stumaxlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldumaxh"
|
||||
@ -1609,14 +1617,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDUMINH(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stuminh" } else { "stuminlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stuminh" } else { "stuminlh" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"lduminh"
|
||||
@ -1629,14 +1638,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDADD(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stadd" } else { "staddl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stadd" } else { "staddl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldadd"
|
||||
@ -1649,14 +1659,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDCLR(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stclr" } else { "stclrl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stclr" } else { "stclrl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldclr"
|
||||
@ -1669,14 +1680,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDEOR(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "steor" } else { "steorl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "steor" } else { "steorl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldeor"
|
||||
@ -1689,14 +1701,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDSET(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stset" } else { "stsetl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stset" } else { "stsetl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldset"
|
||||
@ -1709,14 +1722,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDSMAX(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stsmax" } else { "stsmaxl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stsmax" } else { "stsmaxl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldsmax"
|
||||
@ -1729,14 +1743,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDSMIN(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stsmin" } else { "stsminl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stsmin" } else { "stsminl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldsmin"
|
||||
@ -1749,14 +1764,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDUMAX(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stumax" } else { "stumaxl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stumax" } else { "stumaxl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldumax"
|
||||
@ -1769,14 +1785,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
}
|
||||
}
|
||||
Opcode::LDUMIN(ar) => {
|
||||
if let Operand::Register(_, rt) = ins.operands[1] {
|
||||
if rt == 31 && ar & 0b10 == 0b00 {
|
||||
let inst = if ar & 0b01 == 0b00 { "stumin" } else { "stuminl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if let Operand::Register(_, rt) = ins.operands[1]
|
||||
&& rt == 31
|
||||
&& ar & 0b10 == 0b00
|
||||
{
|
||||
let inst = if ar & 0b01 == 0b00 { "stumin" } else { "stuminl" };
|
||||
push_operand(args, &ins.operands[0], ctx);
|
||||
push_separator(args);
|
||||
push_operand(args, &ins.operands[2], ctx);
|
||||
return inst;
|
||||
}
|
||||
if ar == 0 {
|
||||
"ldumin"
|
||||
@ -2067,16 +2084,15 @@ where Cb: FnMut(InstructionPart<'static>) {
|
||||
|
||||
/// Relocations that appear in Operand::PCOffset.
|
||||
fn is_pc_offset_reloc(reloc: Option<ResolvedRelocation>) -> Option<ResolvedRelocation> {
|
||||
if let Some(resolved) = reloc {
|
||||
if let RelocationFlags::Elf(
|
||||
if let Some(resolved) = reloc
|
||||
&& let RelocationFlags::Elf(
|
||||
elf::R_AARCH64_ADR_PREL_PG_HI21
|
||||
| elf::R_AARCH64_JUMP26
|
||||
| elf::R_AARCH64_CALL26
|
||||
| elf::R_AARCH64_ADR_GOT_PAGE,
|
||||
) = resolved.relocation.flags
|
||||
{
|
||||
return Some(resolved);
|
||||
}
|
||||
{
|
||||
return Some(resolved);
|
||||
}
|
||||
None
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ use crate::{
|
||||
diff::{DiffObjConfig, MipsAbi, MipsInstrCategory, display::InstructionPart},
|
||||
obj::{
|
||||
InstructionArg, InstructionArgValue, InstructionRef, Relocation, RelocationFlags,
|
||||
ResolvedInstructionRef, ResolvedRelocation, SymbolFlag, SymbolFlagSet,
|
||||
ResolvedInstructionRef, ResolvedRelocation, Section, Symbol, SymbolFlag, SymbolFlagSet,
|
||||
},
|
||||
};
|
||||
|
||||
@ -140,6 +140,14 @@ impl ArchMips {
|
||||
})
|
||||
}
|
||||
|
||||
fn default_instruction_flags(&self) -> rabbitizer::InstructionFlags {
|
||||
match self.isa_extension {
|
||||
Some(extension) => rabbitizer::InstructionFlags::new_extension(extension),
|
||||
None => rabbitizer::InstructionFlags::new(IsaVersion::MIPS_III),
|
||||
}
|
||||
.with_abi(self.abi)
|
||||
}
|
||||
|
||||
fn instruction_flags(&self, diff_config: &DiffObjConfig) -> rabbitizer::InstructionFlags {
|
||||
let isa_extension = match diff_config.mips_instr_category {
|
||||
MipsInstrCategory::Auto => self.isa_extension,
|
||||
@ -151,7 +159,7 @@ impl ArchMips {
|
||||
};
|
||||
match isa_extension {
|
||||
Some(extension) => rabbitizer::InstructionFlags::new_extension(extension),
|
||||
None => rabbitizer::InstructionFlags::new_isa(IsaVersion::MIPS_III, None),
|
||||
None => rabbitizer::InstructionFlags::new(IsaVersion::MIPS_III),
|
||||
}
|
||||
.with_abi(match diff_config.mips_abi {
|
||||
MipsAbi::Auto => self.abi,
|
||||
@ -234,17 +242,16 @@ impl Arch for ArchMips {
|
||||
object::RelocationFlags::Elf { r_type } => {
|
||||
if relocation.has_implicit_addend() {
|
||||
// Check for paired R_MIPS_HI16 and R_MIPS_LO16 relocations.
|
||||
if let elf::R_MIPS_HI16 | elf::R_MIPS_LO16 = r_type {
|
||||
if let Some(addend) = self
|
||||
if let elf::R_MIPS_HI16 | elf::R_MIPS_LO16 = r_type
|
||||
&& let Some(addend) = self
|
||||
.paired_relocations
|
||||
.get(section.index().0)
|
||||
.and_then(|m| m.get(&address).copied())
|
||||
{
|
||||
return Ok(Some(RelocationOverride {
|
||||
target: RelocationOverrideTarget::Keep,
|
||||
addend,
|
||||
}));
|
||||
}
|
||||
{
|
||||
return Ok(Some(RelocationOverride {
|
||||
target: RelocationOverrideTarget::Keep,
|
||||
addend,
|
||||
}));
|
||||
}
|
||||
|
||||
let data = section.data()?;
|
||||
@ -331,6 +338,36 @@ impl Arch for ArchMips {
|
||||
}
|
||||
flags
|
||||
}
|
||||
|
||||
fn infer_function_size(
|
||||
&self,
|
||||
symbol: &Symbol,
|
||||
section: &Section,
|
||||
next_address: u64,
|
||||
) -> Result<u64> {
|
||||
// Trim any trailing 4-byte zeroes from the end (nops)
|
||||
let mut new_address = next_address;
|
||||
while new_address >= symbol.address + 4
|
||||
&& let Some(data) = section.data_range(new_address - 4, 4)
|
||||
&& data == [0u8; 4]
|
||||
{
|
||||
new_address -= 4;
|
||||
}
|
||||
// Check if the last instruction has a delay slot, if so, include the delay slot nop
|
||||
if new_address + 4 <= next_address
|
||||
&& new_address >= symbol.address + 4
|
||||
&& let Some(data) = section.data_range(new_address - 4, 4)
|
||||
&& let instruction = rabbitizer::Instruction::new(
|
||||
self.endianness.read_u32_bytes(data.try_into().unwrap()),
|
||||
Vram::new((new_address - 4) as u32),
|
||||
self.default_instruction_flags(),
|
||||
)
|
||||
&& instruction.opcode().has_delay_slot()
|
||||
{
|
||||
new_address += 4;
|
||||
}
|
||||
Ok(new_address.saturating_sub(symbol.address))
|
||||
}
|
||||
}
|
||||
|
||||
fn push_args(
|
||||
|
@ -215,10 +215,10 @@ impl dyn Arch {
|
||||
|
||||
// Remove any branch destinations that are outside the function range
|
||||
for ins in result.iter_mut() {
|
||||
if let Some(branch_dest) = ins.branch_dest {
|
||||
if branch_dest < function_start || branch_dest >= function_end {
|
||||
ins.branch_dest = None;
|
||||
}
|
||||
if let Some(branch_dest) = ins.branch_dest
|
||||
&& (branch_dest < function_start || branch_dest >= function_end)
|
||||
{
|
||||
ins.branch_dest = None;
|
||||
}
|
||||
}
|
||||
|
||||
@ -406,6 +406,15 @@ pub trait Arch: Send + Sync + Debug {
|
||||
) -> Vec<ContextItem> {
|
||||
Vec::new()
|
||||
}
|
||||
|
||||
fn infer_function_size(
|
||||
&self,
|
||||
symbol: &Symbol,
|
||||
_section: &Section,
|
||||
next_address: u64,
|
||||
) -> Result<u64> {
|
||||
Ok(next_address.saturating_sub(symbol.address))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_arch(object: &object::File) -> Result<Box<dyn Arch>> {
|
||||
@ -462,6 +471,7 @@ impl Arch for ArchDummy {
|
||||
fn data_reloc_size(&self, _flags: RelocationFlags) -> usize { 0 }
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum RelocationOverrideTarget {
|
||||
Keep,
|
||||
Skip,
|
||||
@ -469,6 +479,7 @@ pub enum RelocationOverrideTarget {
|
||||
Section(object::SectionIndex),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub struct RelocationOverride {
|
||||
pub target: RelocationOverrideTarget,
|
||||
pub addend: i64,
|
||||
|
@ -514,14 +514,14 @@ pub fn ppc_data_flow_analysis(
|
||||
}
|
||||
|
||||
fn get_string_data(obj: &Object, symbol_index: usize, offset: Simm) -> Option<&str> {
|
||||
if let Some(sym) = obj.symbols.get(symbol_index) {
|
||||
if sym.name.starts_with("@stringBase") && offset.0 != 0 {
|
||||
if let Some(data) = obj.symbol_data(symbol_index) {
|
||||
let bytes = &data[offset.0 as usize..];
|
||||
if let Ok(Ok(str)) = CStr::from_bytes_until_nul(bytes).map(|x| x.to_str()) {
|
||||
return Some(str);
|
||||
}
|
||||
}
|
||||
if let Some(sym) = obj.symbols.get(symbol_index)
|
||||
&& sym.name.starts_with("@stringBase")
|
||||
&& offset.0 != 0
|
||||
&& let Some(data) = obj.symbol_data(symbol_index)
|
||||
{
|
||||
let bytes = &data[offset.0 as usize..];
|
||||
if let Ok(Ok(str)) = CStr::from_bytes_until_nul(bytes).map(|x| x.to_str()) {
|
||||
return Some(str);
|
||||
}
|
||||
}
|
||||
None
|
||||
@ -577,19 +577,17 @@ fn generate_flow_analysis_result(
|
||||
let registers = register_state_at.get(index as usize).unwrap_or(&default_register_state);
|
||||
if let (powerpc::Opcode::Addi, Argument::GPR(rel), Argument::Simm(offset)) =
|
||||
(ins.op, args[1], args[2])
|
||||
&& let RegisterContent::Symbol(sym_index) = registers[rel]
|
||||
&& let Some(str) = get_string_data(obj, sym_index, offset)
|
||||
{
|
||||
if let RegisterContent::Symbol(sym_index) = registers[rel] {
|
||||
if let Some(str) = get_string_data(obj, sym_index, offset) {
|
||||
// Show the string constant in the analysis result
|
||||
let formatted = format!("\"{str}\"");
|
||||
analysis_result.set_argument_value_at_address(
|
||||
ins_address,
|
||||
2,
|
||||
FlowAnalysisValue::Text(clamp_text_length(formatted, 20)),
|
||||
);
|
||||
// Don't continue, we want to show the stringbase value as well
|
||||
}
|
||||
}
|
||||
// Show the string constant in the analysis result
|
||||
let formatted = format!("\"{str}\"");
|
||||
analysis_result.set_argument_value_at_address(
|
||||
ins_address,
|
||||
2,
|
||||
FlowAnalysisValue::Text(clamp_text_length(formatted, 20)),
|
||||
);
|
||||
// Don't continue, we want to show the stringbase value as well
|
||||
}
|
||||
|
||||
let is_store = is_store_instruction(ins.op);
|
||||
|
@ -20,7 +20,7 @@ use crate::{
|
||||
},
|
||||
obj::{
|
||||
FlowAnalysisResult, InstructionRef, Object, Relocation, RelocationFlags,
|
||||
ResolvedInstructionRef, ResolvedRelocation, Symbol, SymbolFlag, SymbolFlagSet,
|
||||
ResolvedInstructionRef, ResolvedRelocation, Section, Symbol, SymbolFlag, SymbolFlagSet,
|
||||
},
|
||||
};
|
||||
|
||||
@ -66,7 +66,9 @@ impl ArchPpc {
|
||||
if file.is_64() {
|
||||
powerpc::Extension::Ppc64 | powerpc::Extension::AltiVec
|
||||
} else {
|
||||
powerpc::Extension::AltiVec.into()
|
||||
// Gekko/Broadway objects often use the EF_PPC_EMB flag,
|
||||
// but ProDG in particular does not emit it.
|
||||
powerpc::Extensions::gekko_broadway()
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -229,13 +231,19 @@ impl Arch for ArchPpc {
|
||||
typ: pe::IMAGE_REL_PPC_PAIR
|
||||
})
|
||||
})
|
||||
.map_or(Ok(None), |(_, reloc)| match reloc.target() {
|
||||
object::RelocationTarget::Symbol(index) => Ok(Some(RelocationOverride {
|
||||
.map_or(
|
||||
Ok(Some(RelocationOverride {
|
||||
target: RelocationOverrideTarget::Keep,
|
||||
addend: index.0 as u16 as i16 as i64,
|
||||
addend: 0,
|
||||
})),
|
||||
target => Err(anyhow!("Unsupported IMAGE_REL_PPC_PAIR target {target:?}")),
|
||||
}),
|
||||
|(_, reloc)| match reloc.target() {
|
||||
object::RelocationTarget::Symbol(index) => Ok(Some(RelocationOverride {
|
||||
target: RelocationOverrideTarget::Keep,
|
||||
addend: index.0 as u16 as i16 as i64,
|
||||
})),
|
||||
target => Err(anyhow!("Unsupported IMAGE_REL_PPC_PAIR target {target:?}")),
|
||||
},
|
||||
),
|
||||
// Skip PAIR relocations as they are handled by the previous case
|
||||
object::RelocationFlags::Coff { typ: pe::IMAGE_REL_PPC_PAIR } => {
|
||||
Ok(Some(RelocationOverride { target: RelocationOverrideTarget::Skip, addend: 0 }))
|
||||
@ -449,6 +457,22 @@ impl Arch for ArchPpc {
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
fn infer_function_size(
|
||||
&self,
|
||||
symbol: &Symbol,
|
||||
section: &Section,
|
||||
mut next_address: u64,
|
||||
) -> Result<u64> {
|
||||
// Trim any trailing 4-byte zeroes from the end (padding)
|
||||
while next_address >= symbol.address + 4
|
||||
&& let Some(data) = section.data_range(next_address - 4, 4)
|
||||
&& data == [0u8; 4]
|
||||
{
|
||||
next_address -= 4;
|
||||
}
|
||||
Ok(next_address.saturating_sub(symbol.address))
|
||||
}
|
||||
}
|
||||
|
||||
impl ArchPpc {
|
||||
@ -844,44 +868,43 @@ fn generate_fake_pool_relocations_for_function(
|
||||
break;
|
||||
}
|
||||
}
|
||||
if let Some(branch_dest) = branch_dest {
|
||||
if branch_dest >= func_address as u32
|
||||
&& (branch_dest - func_address as u32) < code.len() as u32
|
||||
{
|
||||
let dest_offset_into_func = branch_dest - func_address as u32;
|
||||
let dest_code_slice = &code[dest_offset_into_func as usize..];
|
||||
match ins.op {
|
||||
Opcode::Bc => {
|
||||
// Conditional branch.
|
||||
// Add the branch destination to the queue to do later.
|
||||
if let Some(branch_dest) = branch_dest
|
||||
&& branch_dest >= func_address as u32
|
||||
&& (branch_dest - func_address as u32) < code.len() as u32
|
||||
{
|
||||
let dest_offset_into_func = branch_dest - func_address as u32;
|
||||
let dest_code_slice = &code[dest_offset_into_func as usize..];
|
||||
match ins.op {
|
||||
Opcode::Bc => {
|
||||
// Conditional branch.
|
||||
// Add the branch destination to the queue to do later.
|
||||
ins_iters_with_gpr_state.push((
|
||||
InsIter::new(dest_code_slice, branch_dest, extensions),
|
||||
gpr_pool_relocs.clone(),
|
||||
));
|
||||
// Then continue on with the current iterator.
|
||||
}
|
||||
Opcode::B => {
|
||||
if simplified.mnemonic != "bl" {
|
||||
// Unconditional branch.
|
||||
// Add the branch destination to the queue.
|
||||
ins_iters_with_gpr_state.push((
|
||||
InsIter::new(dest_code_slice, branch_dest, extensions),
|
||||
gpr_pool_relocs.clone(),
|
||||
));
|
||||
// Then continue on with the current iterator.
|
||||
// Break out of the current iterator so we can do the newly added one.
|
||||
break;
|
||||
}
|
||||
Opcode::B => {
|
||||
if simplified.mnemonic != "bl" {
|
||||
// Unconditional branch.
|
||||
// Add the branch destination to the queue.
|
||||
ins_iters_with_gpr_state.push((
|
||||
InsIter::new(dest_code_slice, branch_dest, extensions),
|
||||
gpr_pool_relocs.clone(),
|
||||
));
|
||||
// Break out of the current iterator so we can do the newly added one.
|
||||
break;
|
||||
}
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
if let Opcode::Bcctr = ins.op {
|
||||
if simplified.mnemonic == "bctr" {
|
||||
// Unconditional branch to count register.
|
||||
// Likely a jump table.
|
||||
gpr_state_at_bctr.insert(cur_addr, gpr_pool_relocs.clone());
|
||||
}
|
||||
if let Opcode::Bcctr = ins.op
|
||||
&& simplified.mnemonic == "bctr"
|
||||
{
|
||||
// Unconditional branch to count register.
|
||||
// Likely a jump table.
|
||||
gpr_state_at_bctr.insert(cur_addr, gpr_pool_relocs.clone());
|
||||
}
|
||||
|
||||
// Then handle keeping track of which GPR contains which pool relocation.
|
||||
|
@ -11,7 +11,7 @@ use object::{Endian as _, Object as _, ObjectSection as _, elf, pe};
|
||||
use crate::{
|
||||
arch::{Arch, RelocationOverride, RelocationOverrideTarget},
|
||||
diff::{DiffObjConfig, X86Formatter, display::InstructionPart},
|
||||
obj::{InstructionRef, Relocation, RelocationFlags, ResolvedInstructionRef},
|
||||
obj::{InstructionRef, Relocation, RelocationFlags, ResolvedInstructionRef, Section, Symbol},
|
||||
};
|
||||
|
||||
#[derive(Debug)]
|
||||
@ -303,6 +303,52 @@ impl Arch for ArchX86 {
|
||||
fn data_reloc_size(&self, flags: RelocationFlags) -> usize {
|
||||
self.reloc_size(flags).unwrap_or(1)
|
||||
}
|
||||
|
||||
fn infer_function_size(
|
||||
&self,
|
||||
symbol: &Symbol,
|
||||
section: &Section,
|
||||
next_address: u64,
|
||||
) -> Result<u64> {
|
||||
let Ok(size) = (next_address - symbol.address).try_into() else {
|
||||
return Ok(next_address.saturating_sub(symbol.address));
|
||||
};
|
||||
let Some(code) = section.data_range(symbol.address, size) else {
|
||||
return Ok(0);
|
||||
};
|
||||
// Decode instructions to find the last non-NOP instruction
|
||||
let mut decoder = self.decoder(code, symbol.address);
|
||||
let mut instruction = Instruction::default();
|
||||
let mut new_address = 0;
|
||||
let mut reloc_iter = section.relocations.iter().peekable();
|
||||
'outer: while decoder.can_decode() {
|
||||
let address = decoder.ip();
|
||||
while let Some(reloc) = reloc_iter.peek() {
|
||||
match reloc.address.cmp(&address) {
|
||||
Ordering::Less => {
|
||||
reloc_iter.next();
|
||||
}
|
||||
Ordering::Equal => {
|
||||
// If the instruction starts at a relocation, it's inline data
|
||||
let reloc_size = self.reloc_size(reloc.flags).with_context(|| {
|
||||
format!("Unsupported inline x86 relocation {:?}", reloc.flags)
|
||||
})?;
|
||||
if decoder.set_position(decoder.position() + reloc_size).is_ok() {
|
||||
new_address = address + reloc_size as u64;
|
||||
decoder.set_ip(new_address);
|
||||
continue 'outer;
|
||||
}
|
||||
}
|
||||
Ordering::Greater => break,
|
||||
}
|
||||
}
|
||||
decoder.decode_out(&mut instruction);
|
||||
if instruction.mnemonic() != iced_x86::Mnemonic::Nop {
|
||||
new_address = instruction.next_ip();
|
||||
}
|
||||
}
|
||||
Ok(new_address.saturating_sub(symbol.address))
|
||||
}
|
||||
}
|
||||
|
||||
struct InstructionFormatterOutput<'a> {
|
||||
|
@ -385,13 +385,13 @@ pub fn symbol_context(obj: &Object, symbol_index: usize) -> Vec<ContextItem> {
|
||||
if let Some(name) = &symbol.demangled_name {
|
||||
out.push(ContextItem::Copy { value: name.clone(), label: None });
|
||||
}
|
||||
if symbol.section.is_some() {
|
||||
if let Some(address) = symbol.virtual_address {
|
||||
out.push(ContextItem::Copy {
|
||||
value: format!("{address:x}"),
|
||||
label: Some("virtual address".to_string()),
|
||||
});
|
||||
}
|
||||
if symbol.section.is_some()
|
||||
&& let Some(address) = symbol.virtual_address
|
||||
{
|
||||
out.push(ContextItem::Copy {
|
||||
value: format!("{address:x}"),
|
||||
label: Some("virtual address".to_string()),
|
||||
});
|
||||
}
|
||||
out.append(&mut obj.arch.symbol_context(obj, symbol_index));
|
||||
out
|
||||
|
@ -467,15 +467,15 @@ fn apply_symbol_mappings(
|
||||
) -> Result<()> {
|
||||
// If we're selecting a symbol to use as a comparison, mark it as used
|
||||
// This ensures that we don't match it to another symbol at any point
|
||||
if let Some(left_name) = &mapping_config.selecting_left {
|
||||
if let Some(left_symbol) = left.symbol_by_name(left_name) {
|
||||
left_used.insert(left_symbol);
|
||||
}
|
||||
if let Some(left_name) = &mapping_config.selecting_left
|
||||
&& let Some(left_symbol) = left.symbol_by_name(left_name)
|
||||
{
|
||||
left_used.insert(left_symbol);
|
||||
}
|
||||
if let Some(right_name) = &mapping_config.selecting_right {
|
||||
if let Some(right_symbol) = right.symbol_by_name(right_name) {
|
||||
right_used.insert(right_symbol);
|
||||
}
|
||||
if let Some(right_name) = &mapping_config.selecting_right
|
||||
&& let Some(right_symbol) = right.symbol_by_name(right_name)
|
||||
{
|
||||
right_used.insert(right_symbol);
|
||||
}
|
||||
|
||||
// Apply manual symbol mappings
|
||||
@ -639,17 +639,16 @@ fn find_symbol(
|
||||
// If they are at the same address in the same section
|
||||
if in_symbol.name.starts_with('@')
|
||||
&& matches!(section_kind, SectionKind::Data | SectionKind::Bss)
|
||||
{
|
||||
if let Some((symbol_idx, _)) = unmatched_symbols(obj, used).find(|(_, symbol)| {
|
||||
&& let Some((symbol_idx, _)) = unmatched_symbols(obj, used).find(|(_, symbol)| {
|
||||
let Some(section_index) = symbol.section else {
|
||||
return false;
|
||||
};
|
||||
symbol.name.starts_with('@')
|
||||
&& symbol.address == in_symbol.address
|
||||
&& obj.sections[section_index].name == section_name
|
||||
}) {
|
||||
return Some(symbol_idx);
|
||||
}
|
||||
})
|
||||
{
|
||||
return Some(symbol_idx);
|
||||
}
|
||||
// Match Metrowerks symbol$1234 against symbol$2345
|
||||
if let Some((prefix, suffix)) = in_symbol.name.split_once('$') {
|
||||
|
109
objdiff-core/src/obj/dwarf2.rs
Normal file
109
objdiff-core/src/obj/dwarf2.rs
Normal file
@ -0,0 +1,109 @@
|
||||
use alloc::{borrow::Cow, vec::Vec};
|
||||
|
||||
use anyhow::{Context, Result};
|
||||
use object::{Object as _, ObjectSection as _};
|
||||
use typed_arena::Arena;
|
||||
|
||||
use crate::obj::{Section, SectionKind};
|
||||
|
||||
/// Parse line information from DWARF 2+ sections.
|
||||
pub(crate) fn parse_line_info_dwarf2(
|
||||
obj_file: &object::File,
|
||||
sections: &mut [Section],
|
||||
) -> Result<()> {
|
||||
let arena_data = Arena::new();
|
||||
let arena_relocations = Arena::new();
|
||||
let endian = match obj_file.endianness() {
|
||||
object::Endianness::Little => gimli::RunTimeEndian::Little,
|
||||
object::Endianness::Big => gimli::RunTimeEndian::Big,
|
||||
};
|
||||
let dwarf = gimli::Dwarf::load(|id: gimli::SectionId| -> Result<_> {
|
||||
load_file_section(id, obj_file, endian, &arena_data, &arena_relocations)
|
||||
})
|
||||
.context("loading DWARF sections")?;
|
||||
|
||||
let mut iter = dwarf.units();
|
||||
if let Some(header) = iter.next().map_err(|e| gimli_error(e, "iterating over DWARF units"))? {
|
||||
let unit = dwarf.unit(header).map_err(|e| gimli_error(e, "loading DWARF unit"))?;
|
||||
if let Some(program) = unit.line_program.clone() {
|
||||
let mut text_sections = sections.iter_mut().filter(|s| s.kind == SectionKind::Code);
|
||||
let mut lines = text_sections.next().map(|section| &mut section.line_info);
|
||||
|
||||
let mut rows = program.rows();
|
||||
while let Some((_header, row)) =
|
||||
rows.next_row().map_err(|e| gimli_error(e, "loading program row"))?
|
||||
{
|
||||
if let (Some(line), Some(lines)) = (row.line(), &mut lines) {
|
||||
lines.insert(row.address(), line.get() as u32);
|
||||
}
|
||||
if row.end_sequence() {
|
||||
// The next row is the start of a new sequence, which means we must
|
||||
// advance to the next .text section.
|
||||
lines = text_sections.next().map(|section| &mut section.line_info);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if iter.next().map_err(|e| gimli_error(e, "checking for next unit"))?.is_some() {
|
||||
log::warn!("Multiple units found in DWARF data, only processing the first");
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[derive(Debug, Default)]
|
||||
struct RelocationMap(object::read::RelocationMap);
|
||||
|
||||
impl RelocationMap {
|
||||
fn add(&mut self, file: &object::File, section: &object::Section) {
|
||||
for (offset, relocation) in section.relocations() {
|
||||
if let Err(e) = self.0.add(file, offset, relocation) {
|
||||
log::error!(
|
||||
"Relocation error for section {} at offset 0x{:08x}: {}",
|
||||
section.name().unwrap(),
|
||||
offset,
|
||||
e
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl gimli::read::Relocate for &'_ RelocationMap {
|
||||
fn relocate_address(&self, offset: usize, value: u64) -> gimli::Result<u64> {
|
||||
Ok(self.0.relocate(offset as u64, value))
|
||||
}
|
||||
|
||||
fn relocate_offset(&self, offset: usize, value: usize) -> gimli::Result<usize> {
|
||||
<usize as gimli::ReaderOffset>::from_u64(self.0.relocate(offset as u64, value as u64))
|
||||
}
|
||||
}
|
||||
|
||||
type Relocate<'a, R> = gimli::RelocateReader<R, &'a RelocationMap>;
|
||||
|
||||
fn load_file_section<'input, 'arena, Endian: gimli::Endianity>(
|
||||
id: gimli::SectionId,
|
||||
file: &object::File<'input>,
|
||||
endian: Endian,
|
||||
arena_data: &'arena Arena<Cow<'input, [u8]>>,
|
||||
arena_relocations: &'arena Arena<RelocationMap>,
|
||||
) -> Result<Relocate<'arena, gimli::EndianSlice<'arena, Endian>>> {
|
||||
let mut relocations = RelocationMap::default();
|
||||
let data = match file.section_by_name(id.name()) {
|
||||
Some(ref section) => {
|
||||
relocations.add(file, section);
|
||||
section.uncompressed_data()?
|
||||
}
|
||||
// Use a non-zero capacity so that `ReaderOffsetId`s are unique.
|
||||
None => Cow::Owned(Vec::with_capacity(1)),
|
||||
};
|
||||
let data_ref = arena_data.alloc(data);
|
||||
let section = gimli::EndianSlice::new(data_ref, endian);
|
||||
let relocations = arena_relocations.alloc(relocations);
|
||||
Ok(Relocate::new(section, relocations))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn gimli_error(e: gimli::Error, context: &str) -> anyhow::Error {
|
||||
anyhow::anyhow!("gimli error {context}: {e:?}")
|
||||
}
|
@ -1,3 +1,5 @@
|
||||
#[cfg(feature = "dwarf")]
|
||||
mod dwarf2;
|
||||
pub mod read;
|
||||
pub mod split_meta;
|
||||
|
||||
|
@ -122,7 +122,7 @@ fn map_symbols(
|
||||
}
|
||||
|
||||
// Infer symbol sizes for 0-size symbols
|
||||
infer_symbol_sizes(&mut symbols, sections);
|
||||
infer_symbol_sizes(arch, &mut symbols, sections)?;
|
||||
|
||||
Ok((symbols, symbol_indices))
|
||||
}
|
||||
@ -136,7 +136,7 @@ fn is_local_label(symbol: &Symbol) -> bool {
|
||||
&& LABEL_PREFIXES.iter().any(|p| symbol.name.starts_with(p))
|
||||
}
|
||||
|
||||
fn infer_symbol_sizes(symbols: &mut [Symbol], sections: &[Section]) {
|
||||
fn infer_symbol_sizes(arch: &dyn Arch, symbols: &mut [Symbol], sections: &[Section]) -> Result<()> {
|
||||
// Create a sorted list of symbol indices by section
|
||||
let mut symbols_with_section = Vec::<usize>::with_capacity(symbols.len());
|
||||
for (i, symbol) in symbols.iter().enumerate() {
|
||||
@ -205,11 +205,14 @@ fn infer_symbol_sizes(symbols: &mut [Symbol], sections: &[Section]) {
|
||||
}
|
||||
iter_idx += 1;
|
||||
};
|
||||
let next_address = next_symbol.map(|s| s.address).unwrap_or_else(|| {
|
||||
let section = §ions[section_idx];
|
||||
section.address + section.size
|
||||
});
|
||||
let new_size = next_address.saturating_sub(symbol.address);
|
||||
let section = §ions[section_idx];
|
||||
let next_address =
|
||||
next_symbol.map(|s| s.address).unwrap_or_else(|| section.address + section.size);
|
||||
let new_size = if section.kind == SectionKind::Code {
|
||||
arch.infer_function_size(symbol, section, next_address)?
|
||||
} else {
|
||||
next_address.saturating_sub(symbol.address)
|
||||
};
|
||||
if new_size > 0 {
|
||||
let symbol = &mut symbols[symbol_idx];
|
||||
symbol.size = new_size;
|
||||
@ -218,7 +221,7 @@ fn infer_symbol_sizes(symbols: &mut [Symbol], sections: &[Section]) {
|
||||
}
|
||||
// Set symbol kind if unknown and size is non-zero
|
||||
if symbol.kind == SymbolKind::Unknown {
|
||||
symbol.kind = match sections[section_idx].kind {
|
||||
symbol.kind = match section.kind {
|
||||
SectionKind::Code => SymbolKind::Function,
|
||||
SectionKind::Data | SectionKind::Bss => SymbolKind::Object,
|
||||
_ => SymbolKind::Unknown,
|
||||
@ -226,6 +229,7 @@ fn infer_symbol_sizes(symbols: &mut [Symbol], sections: &[Section]) {
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn map_sections(
|
||||
@ -361,7 +365,8 @@ fn map_section_relocations(
|
||||
None => {
|
||||
ensure!(
|
||||
!reloc.has_implicit_addend(),
|
||||
"Unsupported implicit relocation {:?}",
|
||||
"Unsupported {:?} implicit relocation {:?}",
|
||||
obj_file.architecture(),
|
||||
reloc.flags()
|
||||
);
|
||||
}
|
||||
@ -545,12 +550,11 @@ fn perform_data_flow_analysis(obj: &mut Object, config: &DiffObjConfig) -> Resul
|
||||
}
|
||||
|
||||
// Optional full data flow analysis
|
||||
if config.analyze_data_flow {
|
||||
if let Some(flow_result) =
|
||||
if config.analyze_data_flow
|
||||
&& let Some(flow_result) =
|
||||
obj.arch.data_flow_analysis(obj, symbol, code, §ion.relocations)
|
||||
{
|
||||
generated_flow_results.push((symbol.clone(), flow_result));
|
||||
}
|
||||
{
|
||||
generated_flow_results.push((symbol.clone(), flow_result));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -573,6 +577,28 @@ fn parse_line_info(
|
||||
obj_data: &[u8],
|
||||
) -> Result<()> {
|
||||
// DWARF 1.1
|
||||
if let Err(e) = parse_line_info_dwarf1(obj_file, sections) {
|
||||
log::warn!("Failed to parse DWARF 1.1 line info: {e}");
|
||||
}
|
||||
|
||||
// DWARF 2+
|
||||
#[cfg(feature = "dwarf")]
|
||||
if let Err(e) = super::dwarf2::parse_line_info_dwarf2(obj_file, sections) {
|
||||
log::warn!("Failed to parse DWARF 2+ line info: {e}");
|
||||
}
|
||||
|
||||
// COFF
|
||||
if let object::File::Coff(coff) = obj_file
|
||||
&& let Err(e) = parse_line_info_coff(coff, sections, section_indices, obj_data)
|
||||
{
|
||||
log::warn!("Failed to parse COFF line info: {e}");
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Parse .line section from DWARF 1.1 format.
|
||||
fn parse_line_info_dwarf1(obj_file: &object::File, sections: &mut [Section]) -> Result<()> {
|
||||
if let Some(section) = obj_file.section_by_name(".line") {
|
||||
let data = section.uncompressed_data()?;
|
||||
let mut reader: &[u8] = data.as_ref();
|
||||
@ -600,55 +626,6 @@ fn parse_line_info(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// DWARF 2+
|
||||
#[cfg(feature = "dwarf")]
|
||||
{
|
||||
fn gimli_error(e: gimli::Error) -> anyhow::Error { anyhow::anyhow!("DWARF error: {e:?}") }
|
||||
let dwarf_cow = gimli::DwarfSections::load(|id| {
|
||||
Ok::<_, gimli::Error>(
|
||||
obj_file
|
||||
.section_by_name(id.name())
|
||||
.and_then(|section| section.uncompressed_data().ok())
|
||||
.unwrap_or(alloc::borrow::Cow::Borrowed(&[][..])),
|
||||
)
|
||||
})
|
||||
.map_err(gimli_error)?;
|
||||
let endian = match obj_file.endianness() {
|
||||
object::Endianness::Little => gimli::RunTimeEndian::Little,
|
||||
object::Endianness::Big => gimli::RunTimeEndian::Big,
|
||||
};
|
||||
let dwarf = dwarf_cow.borrow(|section| gimli::EndianSlice::new(section, endian));
|
||||
let mut iter = dwarf.units();
|
||||
if let Some(header) = iter.next().map_err(gimli_error)? {
|
||||
let unit = dwarf.unit(header).map_err(gimli_error)?;
|
||||
if let Some(program) = unit.line_program.clone() {
|
||||
let mut text_sections = sections.iter_mut().filter(|s| s.kind == SectionKind::Code);
|
||||
let mut lines = text_sections.next().map(|section| &mut section.line_info);
|
||||
|
||||
let mut rows = program.rows();
|
||||
while let Some((_header, row)) = rows.next_row().map_err(gimli_error)? {
|
||||
if let (Some(line), Some(lines)) = (row.line(), &mut lines) {
|
||||
lines.insert(row.address(), line.get() as u32);
|
||||
}
|
||||
if row.end_sequence() {
|
||||
// The next row is the start of a new sequence, which means we must
|
||||
// advance to the next .text section.
|
||||
lines = text_sections.next().map(|section| &mut section.line_info);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if iter.next().map_err(gimli_error)?.is_some() {
|
||||
log::warn!("Multiple units found in DWARF data, only processing the first");
|
||||
}
|
||||
}
|
||||
|
||||
// COFF
|
||||
if let object::File::Coff(coff) = obj_file {
|
||||
parse_line_info_coff(coff, sections, section_indices, obj_data)?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -48,7 +48,7 @@ pub fn align_data_to_4<W: std::io::Write + ?Sized>(
|
||||
len: usize,
|
||||
) -> std::io::Result<()> {
|
||||
const ALIGN_BYTES: &[u8] = &[0; 4];
|
||||
if len % 4 != 0 {
|
||||
if !len.is_multiple_of(4) {
|
||||
writer.write_all(&ALIGN_BYTES[..4 - len % 4])?;
|
||||
}
|
||||
Ok(())
|
||||
|
@ -507,116 +507,4 @@ expression: diff.instruction_rows
|
||||
),
|
||||
arg_diff: [],
|
||||
},
|
||||
InstructionDiffRow {
|
||||
ins_ref: Some(
|
||||
InstructionRef {
|
||||
address: 88,
|
||||
size: 1,
|
||||
opcode: 465,
|
||||
branch_dest: None,
|
||||
},
|
||||
),
|
||||
kind: None,
|
||||
branch_from: None,
|
||||
branch_to: None,
|
||||
arg_diff: [],
|
||||
},
|
||||
InstructionDiffRow {
|
||||
ins_ref: Some(
|
||||
InstructionRef {
|
||||
address: 89,
|
||||
size: 1,
|
||||
opcode: 465,
|
||||
branch_dest: None,
|
||||
},
|
||||
),
|
||||
kind: None,
|
||||
branch_from: None,
|
||||
branch_to: None,
|
||||
arg_diff: [],
|
||||
},
|
||||
InstructionDiffRow {
|
||||
ins_ref: Some(
|
||||
InstructionRef {
|
||||
address: 90,
|
||||
size: 1,
|
||||
opcode: 465,
|
||||
branch_dest: None,
|
||||
},
|
||||
),
|
||||
kind: None,
|
||||
branch_from: None,
|
||||
branch_to: None,
|
||||
arg_diff: [],
|
||||
},
|
||||
InstructionDiffRow {
|
||||
ins_ref: Some(
|
||||
InstructionRef {
|
||||
address: 91,
|
||||
size: 1,
|
||||
opcode: 465,
|
||||
branch_dest: None,
|
||||
},
|
||||
),
|
||||
kind: None,
|
||||
branch_from: None,
|
||||
branch_to: None,
|
||||
arg_diff: [],
|
||||
},
|
||||
InstructionDiffRow {
|
||||
ins_ref: Some(
|
||||
InstructionRef {
|
||||
address: 92,
|
||||
size: 1,
|
||||
opcode: 465,
|
||||
branch_dest: None,
|
||||
},
|
||||
),
|
||||
kind: None,
|
||||
branch_from: None,
|
||||
branch_to: None,
|
||||
arg_diff: [],
|
||||
},
|
||||
InstructionDiffRow {
|
||||
ins_ref: Some(
|
||||
InstructionRef {
|
||||
address: 93,
|
||||
size: 1,
|
||||
opcode: 465,
|
||||
branch_dest: None,
|
||||
},
|
||||
),
|
||||
kind: None,
|
||||
branch_from: None,
|
||||
branch_to: None,
|
||||
arg_diff: [],
|
||||
},
|
||||
InstructionDiffRow {
|
||||
ins_ref: Some(
|
||||
InstructionRef {
|
||||
address: 94,
|
||||
size: 1,
|
||||
opcode: 465,
|
||||
branch_dest: None,
|
||||
},
|
||||
),
|
||||
kind: None,
|
||||
branch_from: None,
|
||||
branch_to: None,
|
||||
arg_diff: [],
|
||||
},
|
||||
InstructionDiffRow {
|
||||
ins_ref: Some(
|
||||
InstructionRef {
|
||||
address: 95,
|
||||
size: 1,
|
||||
opcode: 465,
|
||||
branch_dest: None,
|
||||
},
|
||||
),
|
||||
kind: None,
|
||||
branch_from: None,
|
||||
branch_to: None,
|
||||
arg_diff: [],
|
||||
},
|
||||
]
|
||||
|
@ -29,11 +29,3 @@ expression: output
|
||||
[(Address(76), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(41), Normal, 0), (Basic(" ~>"), Rotating(6), 0), (Eol, Normal, 0)]
|
||||
[(Address(80), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(47), Normal, 0), (Basic(" ~>"), Rotating(7), 0), (Eol, Normal, 0)]
|
||||
[(Address(84), Normal, 5), (Spacing(4), Normal, 0), (Opcode(".dword", 65534), Normal, 10), (BranchDest(53), Normal, 0), (Basic(" ~>"), Rotating(8), 0), (Eol, Normal, 0)]
|
||||
[(Address(88), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 465), Normal, 10), (Eol, Normal, 0)]
|
||||
[(Address(89), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 465), Normal, 10), (Eol, Normal, 0)]
|
||||
[(Address(90), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 465), Normal, 10), (Eol, Normal, 0)]
|
||||
[(Address(91), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 465), Normal, 10), (Eol, Normal, 0)]
|
||||
[(Address(92), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 465), Normal, 10), (Eol, Normal, 0)]
|
||||
[(Address(93), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 465), Normal, 10), (Eol, Normal, 0)]
|
||||
[(Address(94), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 465), Normal, 10), (Eol, Normal, 0)]
|
||||
[(Address(95), Normal, 5), (Spacing(4), Normal, 0), (Opcode("nop", 465), Normal, 10), (Eol, Normal, 0)]
|
||||
|
@ -63,7 +63,7 @@ Object {
|
||||
"int __cdecl test(int)",
|
||||
),
|
||||
address: 0,
|
||||
size: 96,
|
||||
size: 88,
|
||||
kind: Function,
|
||||
section: Some(
|
||||
1,
|
||||
|
@ -29,8 +29,8 @@ cfg-if = "1.0"
|
||||
const_format = "0.2"
|
||||
cwdemangle = "1.0"
|
||||
dirs = "6.0"
|
||||
egui = "0.31"
|
||||
egui_extras = "0.31"
|
||||
egui = "0.32"
|
||||
egui_extras = "0.32"
|
||||
filetime = "0.2"
|
||||
float-ord = "0.3"
|
||||
font-kit = "0.14"
|
||||
@ -43,18 +43,19 @@ pollster = "0.4"
|
||||
regex = "1.11"
|
||||
rfd = { version = "0.15" } #, default-features = false, features = ['xdg-portal']
|
||||
rlwinmdec = "1.1"
|
||||
ron = "0.8"
|
||||
ron = "0.10"
|
||||
serde = { version = "1.0", features = ["derive"] }
|
||||
time = { version = "0.3", features = ["formatting", "local-offset"] }
|
||||
typed-path = "0.11"
|
||||
winit = { version = "0.30", features = ["wayland-csd-adwaita"] }
|
||||
winit = { version = "0.30", features = ["default"] }
|
||||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||||
|
||||
# Keep version in sync with egui
|
||||
[dependencies.eframe]
|
||||
version = "0.31"
|
||||
version = "0.32"
|
||||
features = [
|
||||
"default_fonts",
|
||||
"glow",
|
||||
"persistence",
|
||||
"wayland",
|
||||
"x11",
|
||||
@ -63,10 +64,12 @@ default-features = false
|
||||
|
||||
# Keep version in sync with eframe
|
||||
[dependencies.wgpu]
|
||||
version = "24.0"
|
||||
version = "25.0"
|
||||
features = [
|
||||
"dx12",
|
||||
"metal",
|
||||
"gles",
|
||||
"vulkan",
|
||||
"webgpu",
|
||||
]
|
||||
optional = true
|
||||
|
@ -461,11 +461,11 @@ impl App {
|
||||
use eframe::egui_wgpu::wgpu::Backend;
|
||||
let info = wgpu_render_state.adapter.get_info();
|
||||
app.view_state.graphics_state.active_backend = match info.backend {
|
||||
Backend::Empty => "Unknown",
|
||||
Backend::Noop => "None",
|
||||
Backend::Vulkan => "Vulkan",
|
||||
Backend::Metal => "Metal",
|
||||
Backend::Dx12 => "DirectX 12",
|
||||
Backend::Gl => "OpenGL",
|
||||
Backend::Gl => "OpenGL ES",
|
||||
Backend::BrowserWebGpu => "WebGPU",
|
||||
}
|
||||
.to_string();
|
||||
@ -474,7 +474,7 @@ impl App {
|
||||
#[cfg(feature = "glow")]
|
||||
if let Some(gl) = &cc.gl {
|
||||
use eframe::glow::HasContext;
|
||||
app.view_state.graphics_state.active_backend = "OpenGL (Fallback)".to_string();
|
||||
app.view_state.graphics_state.active_backend = "OpenGL".to_string();
|
||||
app.view_state.graphics_state.active_device =
|
||||
unsafe { gl.get_parameter_string(0x1F01) }; // GL_RENDERER
|
||||
}
|
||||
@ -526,14 +526,12 @@ impl App {
|
||||
mod_check = true;
|
||||
}
|
||||
|
||||
if mod_check {
|
||||
if let Some(info) = &state.project_config_info {
|
||||
if let Some(last_ts) = info.timestamp {
|
||||
if file_modified(&info.path, last_ts) {
|
||||
state.config_change = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if mod_check
|
||||
&& let Some(info) = &state.project_config_info
|
||||
&& let Some(last_ts) = info.timestamp
|
||||
&& file_modified(&info.path, last_ts)
|
||||
{
|
||||
state.config_change = true;
|
||||
}
|
||||
|
||||
if state.config_change {
|
||||
@ -581,22 +579,20 @@ impl App {
|
||||
state.queue_build = true;
|
||||
}
|
||||
|
||||
if let Some(result) = &diff_state.build {
|
||||
if mod_check {
|
||||
if let Some((obj, _)) = &result.first_obj {
|
||||
if let (Some(path), Some(timestamp)) = (&obj.path, obj.timestamp) {
|
||||
if file_modified(path, timestamp) {
|
||||
state.queue_reload = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if let Some((obj, _)) = &result.second_obj {
|
||||
if let (Some(path), Some(timestamp)) = (&obj.path, obj.timestamp) {
|
||||
if file_modified(path, timestamp) {
|
||||
state.queue_reload = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if let Some(result) = &diff_state.build
|
||||
&& mod_check
|
||||
{
|
||||
if let Some((obj, _)) = &result.first_obj
|
||||
&& let (Some(path), Some(timestamp)) = (&obj.path, obj.timestamp)
|
||||
&& file_modified(path, timestamp)
|
||||
{
|
||||
state.queue_reload = true;
|
||||
}
|
||||
if let Some((obj, _)) = &result.second_obj
|
||||
&& let (Some(path), Some(timestamp)) = (&obj.path, obj.timestamp)
|
||||
&& file_modified(path, timestamp)
|
||||
{
|
||||
state.queue_reload = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -618,13 +614,12 @@ impl App {
|
||||
state.queue_reload = false;
|
||||
}
|
||||
|
||||
if graphics_state.should_relaunch {
|
||||
if let Some(app_path) = &self.app_path {
|
||||
if let Ok(mut guard) = self.relaunch_path.lock() {
|
||||
*guard = Some(app_path.clone());
|
||||
self.should_relaunch = true;
|
||||
}
|
||||
}
|
||||
if graphics_state.should_relaunch
|
||||
&& let Some(app_path) = &self.app_path
|
||||
&& let Ok(mut guard) = self.relaunch_path.lock()
|
||||
{
|
||||
*guard = Some(app_path.clone());
|
||||
self.should_relaunch = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -665,6 +660,9 @@ impl eframe::App for App {
|
||||
let side_panel_available = diff_state.current_view == View::SymbolDiff;
|
||||
|
||||
egui::TopBottomPanel::top("top_panel").show(ctx, |ui| {
|
||||
// Temporarily use pre-egui 0.32 menu. ComboBox within menu
|
||||
// is currently broken. Issue TBD
|
||||
#[allow(deprecated)]
|
||||
egui::menu::bar(ui, |ui| {
|
||||
if ui
|
||||
.add_enabled(
|
||||
@ -677,15 +675,16 @@ impl eframe::App for App {
|
||||
*show_side_panel = !*show_side_panel;
|
||||
}
|
||||
ui.separator();
|
||||
ui.menu_button("File", |ui| {
|
||||
let bar_state = egui::menu::BarState::load(ui.ctx(), ui.id());
|
||||
egui::menu::menu_button(ui, "File", |ui| {
|
||||
#[cfg(debug_assertions)]
|
||||
if ui.button("Debug…").clicked() {
|
||||
*show_debug = !*show_debug;
|
||||
ui.close_menu();
|
||||
ui.close();
|
||||
}
|
||||
if ui.button("Project…").clicked() {
|
||||
*show_project_config = !*show_project_config;
|
||||
ui.close_menu();
|
||||
ui.close();
|
||||
}
|
||||
let recent_projects = if let Ok(guard) = state.read() {
|
||||
guard.config.recent_projects.clone()
|
||||
@ -694,49 +693,56 @@ impl eframe::App for App {
|
||||
};
|
||||
if recent_projects.is_empty() {
|
||||
ui.add_enabled(false, egui::Button::new("Recent projects…"));
|
||||
} else {
|
||||
ui.menu_button("Recent Projects…", |ui| {
|
||||
if ui.button("Clear").clicked() {
|
||||
state.write().unwrap().config.recent_projects.clear();
|
||||
};
|
||||
ui.separator();
|
||||
for path in recent_projects {
|
||||
if ui.button(&path).clicked() {
|
||||
state
|
||||
.write()
|
||||
.unwrap()
|
||||
.set_project_dir(Utf8PlatformPathBuf::from(path));
|
||||
ui.close_menu();
|
||||
} else if let Some(menu_root) = bar_state.as_ref() {
|
||||
egui::menu::submenu_button(
|
||||
ui,
|
||||
menu_root.menu_state.clone(),
|
||||
"Recent Projects…",
|
||||
|ui| {
|
||||
if ui.button("Clear").clicked() {
|
||||
state.write().unwrap().config.recent_projects.clear();
|
||||
};
|
||||
ui.separator();
|
||||
for path in recent_projects {
|
||||
if ui.button(&path).clicked() {
|
||||
state
|
||||
.write()
|
||||
.unwrap()
|
||||
.set_project_dir(Utf8PlatformPathBuf::from(path));
|
||||
ui.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
);
|
||||
} else {
|
||||
ui.add_enabled(false, egui::Button::new("Recent projects…"));
|
||||
}
|
||||
if ui.button("Appearance…").clicked() {
|
||||
*show_appearance_config = !*show_appearance_config;
|
||||
ui.close_menu();
|
||||
ui.close();
|
||||
}
|
||||
if ui.button("Graphics…").clicked() {
|
||||
*show_graphics = !*show_graphics;
|
||||
ui.close_menu();
|
||||
ui.close();
|
||||
}
|
||||
if ui.button("Quit").clicked() {
|
||||
ctx.send_viewport_cmd(egui::ViewportCommand::Close);
|
||||
}
|
||||
});
|
||||
ui.menu_button("Tools", |ui| {
|
||||
egui::menu::menu_button(ui, "Tools", |ui| {
|
||||
if ui.button("Demangle…").clicked() {
|
||||
*show_demangle = !*show_demangle;
|
||||
ui.close_menu();
|
||||
ui.close();
|
||||
}
|
||||
if ui.button("Rlwinm Decoder…").clicked() {
|
||||
*show_rlwinm_decode = !*show_rlwinm_decode;
|
||||
ui.close_menu();
|
||||
ui.close();
|
||||
}
|
||||
});
|
||||
ui.menu_button("Diff Options", |ui| {
|
||||
egui::menu::menu_button(ui, "Diff Options", |ui| {
|
||||
if ui.button("Arch Settings…").clicked() {
|
||||
*show_arch_config = !*show_arch_config;
|
||||
ui.close_menu();
|
||||
ui.close();
|
||||
}
|
||||
let mut state = state.write().unwrap();
|
||||
let response = ui
|
||||
|
@ -95,7 +95,8 @@ fn main() -> ExitCode {
|
||||
GraphicsBackend::Dx12 => wgpu::Backends::DX12,
|
||||
GraphicsBackend::Metal => wgpu::Backends::METAL,
|
||||
GraphicsBackend::Vulkan => wgpu::Backends::VULKAN,
|
||||
GraphicsBackend::OpenGL => wgpu::Backends::GL,
|
||||
GraphicsBackend::OpenGLES => wgpu::Backends::GL,
|
||||
GraphicsBackend::OpenGL => wgpu::Backends::empty(),
|
||||
};
|
||||
WgpuSetup::CreateNew(setup)
|
||||
}
|
||||
@ -172,23 +173,23 @@ fn main() -> ExitCode {
|
||||
}
|
||||
|
||||
// Attempt to relaunch application from the updated path
|
||||
if let Ok(mut guard) = exec_path.lock() {
|
||||
if let Some(path) = guard.take() {
|
||||
cfg_if! {
|
||||
if #[cfg(unix)] {
|
||||
let e = exec::Command::new(path)
|
||||
.args(&std::env::args().collect::<Vec<String>>())
|
||||
.exec();
|
||||
if let Ok(mut guard) = exec_path.lock()
|
||||
&& let Some(path) = guard.take()
|
||||
{
|
||||
cfg_if! {
|
||||
if #[cfg(unix)] {
|
||||
let e = exec::Command::new(path)
|
||||
.args(&std::env::args().collect::<Vec<String>>())
|
||||
.exec();
|
||||
log::error!("Failed to relaunch: {e:?}");
|
||||
return ExitCode::FAILURE;
|
||||
} else {
|
||||
let result = std::process::Command::new(path)
|
||||
.args(std::env::args())
|
||||
.spawn();
|
||||
if let Err(e) = result {
|
||||
log::error!("Failed to relaunch: {e:?}");
|
||||
return ExitCode::FAILURE;
|
||||
} else {
|
||||
let result = std::process::Command::new(path)
|
||||
.args(std::env::args())
|
||||
.spawn();
|
||||
if let Err(e) = result {
|
||||
log::error!("Failed to relaunch: {e:?}");
|
||||
return ExitCode::FAILURE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,8 +5,8 @@ use std::{mem::take, path::MAIN_SEPARATOR};
|
||||
#[cfg(all(windows, feature = "wsl"))]
|
||||
use anyhow::{Context, Result};
|
||||
use egui::{
|
||||
CollapsingHeader, FontFamily, FontId, RichText, SelectableLabel, TextFormat, Widget,
|
||||
output::OpenUrl, text::LayoutJob,
|
||||
CollapsingHeader, FontFamily, FontId, RichText, TextFormat, Widget, output::OpenUrl,
|
||||
text::LayoutJob,
|
||||
};
|
||||
use globset::Glob;
|
||||
use objdiff_core::{
|
||||
@ -185,16 +185,15 @@ pub fn config_ui(
|
||||
if result.update_available {
|
||||
ui.colored_label(appearance.insert_color, "Update available");
|
||||
ui.horizontal(|ui| {
|
||||
if let Some(bin_name) = &result.found_binary {
|
||||
if ui
|
||||
if let Some(bin_name) = &result.found_binary
|
||||
&& ui
|
||||
.add_enabled(!config_state.update_running, egui::Button::new("Automatic"))
|
||||
.on_hover_text_at_pointer(
|
||||
"Automatically download and replace the current build",
|
||||
)
|
||||
.clicked()
|
||||
{
|
||||
config_state.queue_update = Some(bin_name.clone());
|
||||
}
|
||||
{
|
||||
config_state.queue_update = Some(bin_name.clone());
|
||||
}
|
||||
if ui
|
||||
.button("Manual")
|
||||
@ -278,7 +277,7 @@ pub fn config_ui(
|
||||
{
|
||||
filters_text = filters_text.color(appearance.replace_color);
|
||||
}
|
||||
egui::menu::menu_button(ui, filters_text, |ui| {
|
||||
egui::containers::menu::MenuButton::new(filters_text).ui(ui, |ui| {
|
||||
ui.checkbox(&mut config_state.filter_diffable, "Diffable")
|
||||
.on_hover_text_at_pointer("Only show objects with a source file");
|
||||
ui.checkbox(&mut config_state.filter_incomplete, "Incomplete")
|
||||
@ -329,12 +328,12 @@ pub fn config_ui(
|
||||
});
|
||||
});
|
||||
}
|
||||
if new_selected_index != selected_index {
|
||||
if let Some(idx) = new_selected_index {
|
||||
// Will set obj_changed, which will trigger a rebuild
|
||||
let config = objects[idx].clone();
|
||||
state_guard.set_selected_obj(config);
|
||||
}
|
||||
if new_selected_index != selected_index
|
||||
&& let Some(idx) = new_selected_index
|
||||
{
|
||||
// Will set obj_changed, which will trigger a rebuild
|
||||
let config = objects[idx].clone();
|
||||
state_guard.set_selected_obj(config);
|
||||
}
|
||||
}
|
||||
|
||||
@ -355,7 +354,7 @@ fn display_unit(
|
||||
} else {
|
||||
appearance.text_color
|
||||
};
|
||||
let response = SelectableLabel::new(
|
||||
let response = egui::Button::selectable(
|
||||
selected,
|
||||
RichText::new(name)
|
||||
.font(FontId {
|
||||
@ -374,18 +373,17 @@ fn display_unit(
|
||||
}
|
||||
|
||||
fn object_context_ui(ui: &mut egui::Ui, object: &ObjectConfig) {
|
||||
if let Some(source_path) = &object.source_path {
|
||||
if ui
|
||||
if let Some(source_path) = &object.source_path
|
||||
&& ui
|
||||
.button("Open source file")
|
||||
.on_hover_text("Open the source file in the default editor")
|
||||
.clicked()
|
||||
{
|
||||
log::info!("Opening file {source_path}");
|
||||
if let Err(e) = open::that_detached(source_path.as_str()) {
|
||||
log::error!("Failed to open source file: {e}");
|
||||
}
|
||||
ui.close_menu();
|
||||
{
|
||||
log::info!("Opening file {source_path}");
|
||||
if let Err(e) = open::that_detached(source_path.as_str()) {
|
||||
log::error!("Failed to open source file: {e}");
|
||||
}
|
||||
ui.close();
|
||||
}
|
||||
}
|
||||
|
||||
@ -835,12 +833,11 @@ fn split_obj_config_ui(
|
||||
.add_enabled(state.project_config_info.is_none(), egui::Button::new("+").small())
|
||||
.on_disabled_hover_text(CONFIG_DISABLED_TEXT)
|
||||
.clicked()
|
||||
&& let Ok(glob) = Glob::new(&config_state.watch_pattern_text)
|
||||
{
|
||||
if let Ok(glob) = Glob::new(&config_state.watch_pattern_text) {
|
||||
state.config.watch_patterns.push(glob);
|
||||
state.watcher_change = true;
|
||||
config_state.watch_pattern_text.clear();
|
||||
}
|
||||
state.config.watch_patterns.push(glob);
|
||||
state.watcher_change = true;
|
||||
config_state.watch_pattern_text.clear();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -164,7 +164,7 @@ pub(crate) fn data_row_ui(
|
||||
write_text(byte_text.as_str(), byte_color, &mut job, appearance.code_font.clone());
|
||||
cur_addr += 1;
|
||||
cur_addr_actual += 1;
|
||||
if cur_addr % 8 == 0 {
|
||||
if cur_addr.is_multiple_of(8) {
|
||||
write_text(" ", base_color, &mut job, appearance.code_font.clone());
|
||||
}
|
||||
}
|
||||
|
@ -128,10 +128,10 @@ pub fn diff_view_ui(
|
||||
let mut navigation = current_navigation.clone();
|
||||
if let Some((_symbol, symbol_diff, _symbol_idx)) = left_ctx.symbol {
|
||||
// If a matching symbol appears, select it
|
||||
if !right_ctx.has_symbol() {
|
||||
if let Some(target_symbol_ref) = symbol_diff.target_symbol {
|
||||
navigation.right_symbol = Some(target_symbol_ref);
|
||||
}
|
||||
if !right_ctx.has_symbol()
|
||||
&& let Some(target_symbol_ref) = symbol_diff.target_symbol
|
||||
{
|
||||
navigation.right_symbol = Some(target_symbol_ref);
|
||||
}
|
||||
} else if navigation.left_symbol.is_some()
|
||||
&& left_ctx.obj.is_some()
|
||||
@ -142,10 +142,10 @@ pub fn diff_view_ui(
|
||||
}
|
||||
if let Some((_symbol, symbol_diff, _symbol_idx)) = right_ctx.symbol {
|
||||
// If a matching symbol appears, select it
|
||||
if !left_ctx.has_symbol() {
|
||||
if let Some(target_symbol_ref) = symbol_diff.target_symbol {
|
||||
navigation.left_symbol = Some(target_symbol_ref);
|
||||
}
|
||||
if !left_ctx.has_symbol()
|
||||
&& let Some(target_symbol_ref) = symbol_diff.target_symbol
|
||||
{
|
||||
navigation.left_symbol = Some(target_symbol_ref);
|
||||
}
|
||||
} else if navigation.right_symbol.is_some()
|
||||
&& right_ctx.obj.is_some()
|
||||
@ -247,16 +247,15 @@ pub fn diff_view_ui(
|
||||
|
||||
// Third row
|
||||
if left_ctx.has_symbol() && right_ctx.has_symbol() {
|
||||
if state.current_view == View::FunctionDiff
|
||||
if (state.current_view == View::FunctionDiff
|
||||
&& ui
|
||||
.button("Change target")
|
||||
.on_hover_text_at_pointer("Choose a different symbol to use as the target")
|
||||
.clicked()
|
||||
|| hotkeys::consume_change_target_shortcut(ui.ctx())
|
||||
|| hotkeys::consume_change_target_shortcut(ui.ctx()))
|
||||
&& let Some(symbol_ref) = state.symbol_state.right_symbol.as_ref()
|
||||
{
|
||||
if let Some(symbol_ref) = state.symbol_state.right_symbol.as_ref() {
|
||||
ret = Some(DiffViewAction::SelectingLeft(symbol_ref.clone()));
|
||||
}
|
||||
ret = Some(DiffViewAction::SelectingLeft(symbol_ref.clone()));
|
||||
}
|
||||
} else if left_ctx.status.success && !left_ctx.has_symbol() {
|
||||
ui.horizontal(|ui| {
|
||||
@ -409,17 +408,16 @@ pub fn diff_view_ui(
|
||||
if needs_separator {
|
||||
ui.separator();
|
||||
}
|
||||
if ui
|
||||
if (ui
|
||||
.button("Change base")
|
||||
.on_hover_text_at_pointer(
|
||||
"Choose a different symbol to use as the base",
|
||||
)
|
||||
.clicked()
|
||||
|| hotkeys::consume_change_base_shortcut(ui.ctx())
|
||||
|| hotkeys::consume_change_base_shortcut(ui.ctx()))
|
||||
&& let Some(symbol_ref) = state.symbol_state.left_symbol.as_ref()
|
||||
{
|
||||
if let Some(symbol_ref) = state.symbol_state.left_symbol.as_ref() {
|
||||
ret = Some(DiffViewAction::SelectingRight(symbol_ref.clone()));
|
||||
}
|
||||
ret = Some(DiffViewAction::SelectingRight(symbol_ref.clone()));
|
||||
}
|
||||
}
|
||||
} else if right_ctx.status.success && !right_ctx.has_symbol() {
|
||||
@ -583,8 +581,8 @@ pub fn diff_view_ui(
|
||||
) {
|
||||
ret = Some(action);
|
||||
}
|
||||
} else if column == 1 {
|
||||
if let Some(action) = diff_col_ui(
|
||||
} else if column == 1
|
||||
&& let Some(action) = diff_col_ui(
|
||||
ui,
|
||||
state,
|
||||
appearance,
|
||||
@ -594,9 +592,9 @@ pub fn diff_view_ui(
|
||||
available_width,
|
||||
open_sections.1,
|
||||
diff_config,
|
||||
) {
|
||||
ret = Some(action);
|
||||
}
|
||||
)
|
||||
{
|
||||
ret = Some(action);
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -873,7 +871,7 @@ pub fn context_menu_items_ui(
|
||||
}
|
||||
if ui.button(job).clicked() {
|
||||
ui.ctx().copy_text(value);
|
||||
ui.close_menu();
|
||||
ui.close();
|
||||
}
|
||||
}
|
||||
ContextItem::Navigate { label, symbol_index, kind } => {
|
||||
@ -883,7 +881,7 @@ pub fn context_menu_items_ui(
|
||||
symbol_index,
|
||||
column,
|
||||
)));
|
||||
ui.close_menu();
|
||||
ui.close();
|
||||
}
|
||||
}
|
||||
ContextItem::Separator => {
|
||||
|
@ -26,7 +26,8 @@ pub enum GraphicsBackend {
|
||||
Vulkan,
|
||||
Metal,
|
||||
Dx12,
|
||||
OpenGL,
|
||||
OpenGL, // glow
|
||||
OpenGLES, // wgpu
|
||||
}
|
||||
|
||||
static ALL_BACKENDS: &[GraphicsBackend] = &[
|
||||
@ -35,6 +36,7 @@ static ALL_BACKENDS: &[GraphicsBackend] = &[
|
||||
GraphicsBackend::Metal,
|
||||
GraphicsBackend::Dx12,
|
||||
GraphicsBackend::OpenGL,
|
||||
GraphicsBackend::OpenGLES,
|
||||
];
|
||||
|
||||
#[derive(Clone, Debug, Default, serde::Deserialize, serde::Serialize)]
|
||||
@ -54,7 +56,7 @@ pub fn load_graphics_config(path: &Path) -> Result<Option<GraphicsConfig>> {
|
||||
|
||||
pub fn save_graphics_config(path: &Path, config: &GraphicsConfig) -> Result<()> {
|
||||
let file = BufWriter::new(File::create(path)?);
|
||||
ron::ser::to_writer(file, config)?;
|
||||
ron::Options::default().to_io_writer(file, config)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -67,7 +69,8 @@ impl GraphicsBackend {
|
||||
}
|
||||
GraphicsBackend::Metal => cfg!(all(feature = "wgpu", target_os = "macos")),
|
||||
GraphicsBackend::Dx12 => cfg!(all(feature = "wgpu", target_os = "windows")),
|
||||
GraphicsBackend::OpenGL => true,
|
||||
GraphicsBackend::OpenGL => cfg!(feature = "glow"),
|
||||
GraphicsBackend::OpenGLES => cfg!(all(feature = "wgpu", target_os = "windows")),
|
||||
}
|
||||
}
|
||||
|
||||
@ -78,6 +81,7 @@ impl GraphicsBackend {
|
||||
GraphicsBackend::Metal => "Metal",
|
||||
GraphicsBackend::Dx12 => "DirectX 12",
|
||||
GraphicsBackend::OpenGL => "OpenGL",
|
||||
GraphicsBackend::OpenGLES => "OpenGL ES",
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,8 +1,8 @@
|
||||
use std::mem::take;
|
||||
|
||||
use egui::{
|
||||
CollapsingHeader, Color32, Id, OpenUrl, ScrollArea, SelectableLabel, Ui, Widget,
|
||||
style::ScrollAnimation, text::LayoutJob,
|
||||
CollapsingHeader, Color32, Id, OpenUrl, ScrollArea, Ui, Widget, style::ScrollAnimation,
|
||||
text::LayoutJob,
|
||||
};
|
||||
use objdiff_core::{
|
||||
diff::{
|
||||
@ -211,19 +211,19 @@ impl DiffViewState {
|
||||
|
||||
let mut resolved_left = self.resolve_symbol(nav.left_symbol, 0);
|
||||
let mut resolved_right = self.resolve_symbol(nav.right_symbol, 1);
|
||||
if let Some(resolved_right) = &resolved_right {
|
||||
if resolved_left.is_none() {
|
||||
resolved_left = resolved_right
|
||||
.target_symbol
|
||||
.and_then(|idx| self.resolve_symbol(Some(idx), 0));
|
||||
}
|
||||
if let Some(resolved_right) = &resolved_right
|
||||
&& resolved_left.is_none()
|
||||
{
|
||||
resolved_left = resolved_right
|
||||
.target_symbol
|
||||
.and_then(|idx| self.resolve_symbol(Some(idx), 0));
|
||||
}
|
||||
if let Some(resolved_left) = &resolved_left {
|
||||
if resolved_right.is_none() {
|
||||
resolved_right = resolved_left
|
||||
.target_symbol
|
||||
.and_then(|idx| self.resolve_symbol(Some(idx), 1));
|
||||
}
|
||||
if let Some(resolved_left) = &resolved_left
|
||||
&& resolved_right.is_none()
|
||||
{
|
||||
resolved_right = resolved_left
|
||||
.target_symbol
|
||||
.and_then(|idx| self.resolve_symbol(Some(idx), 1));
|
||||
}
|
||||
let resolved_nav = resolve_navigation(nav.kind, resolved_left, resolved_right);
|
||||
if (resolved_nav.left_symbol.is_some() && resolved_nav.right_symbol.is_some())
|
||||
@ -500,16 +500,16 @@ pub fn symbol_context_menu_ui(
|
||||
ret = Some(action);
|
||||
}
|
||||
|
||||
if let Some(section) = section {
|
||||
if ui.button("Map symbol").clicked() {
|
||||
let symbol_ref = SymbolRefByName::new(symbol, Some(section));
|
||||
if column == 0 {
|
||||
ret = Some(DiffViewAction::SelectingRight(symbol_ref));
|
||||
} else {
|
||||
ret = Some(DiffViewAction::SelectingLeft(symbol_ref));
|
||||
}
|
||||
ui.close_menu();
|
||||
if let Some(section) = section
|
||||
&& ui.button("Map symbol").clicked()
|
||||
{
|
||||
let symbol_ref = SymbolRefByName::new(symbol, Some(section));
|
||||
if column == 0 {
|
||||
ret = Some(DiffViewAction::SelectingRight(symbol_ref));
|
||||
} else {
|
||||
ret = Some(DiffViewAction::SelectingLeft(symbol_ref));
|
||||
}
|
||||
ui.close();
|
||||
}
|
||||
});
|
||||
ret
|
||||
@ -586,7 +586,7 @@ fn symbol_ui(
|
||||
write_text(") ", appearance.text_color, &mut job, appearance.code_font.clone());
|
||||
}
|
||||
write_text(name, appearance.highlight_color, &mut job, appearance.code_font.clone());
|
||||
let response = SelectableLabel::new(selected, job)
|
||||
let response = egui::Button::selectable(selected, job)
|
||||
.ui(ui)
|
||||
.on_hover_ui_at_pointer(|ui| symbol_hover_ui(ui, ctx, symbol_idx, appearance));
|
||||
response.context_menu(|ui| {
|
||||
@ -664,10 +664,10 @@ pub fn symbol_list_ui(
|
||||
let mut ret = None;
|
||||
ScrollArea::both().auto_shrink([false, false]).show(ui, |ui| {
|
||||
let mut show_mapped_symbols = state.show_mapped_symbols;
|
||||
if let SymbolFilter::Mapping(_, _) = filter {
|
||||
if ui.checkbox(&mut show_mapped_symbols, "Show mapped symbols").changed() {
|
||||
ret = Some(DiffViewAction::SetShowMappedSymbols(show_mapped_symbols));
|
||||
}
|
||||
if let SymbolFilter::Mapping(_, _) = filter
|
||||
&& ui.checkbox(&mut show_mapped_symbols, "Show mapped symbols").changed()
|
||||
{
|
||||
ret = Some(DiffViewAction::SetShowMappedSymbols(show_mapped_symbols));
|
||||
}
|
||||
let section_display = display_sections(
|
||||
ctx.obj,
|
||||
|
@ -34,7 +34,7 @@ features = ["arm", "arm64", "mips", "ppc", "superh", "x86", "dwarf"]
|
||||
talc = { version = "4.4", default-features = false, features = ["lock_api"] }
|
||||
|
||||
[target.'cfg(target_os = "wasi")'.dependencies]
|
||||
wit-bindgen = { version = "0.42", default-features = false, features = ["macros"] }
|
||||
wit-bindgen = { version = "0.43", default-features = false, features = ["macros"] }
|
||||
|
||||
[build-dependencies]
|
||||
wit-deps = "0.5"
|
||||
|
631
objdiff-wasm/package-lock.json
generated
631
objdiff-wasm/package-lock.json
generated
@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "objdiff-wasm",
|
||||
"version": "3.0.0-beta.11",
|
||||
"version": "3.0.0-beta.13",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "objdiff-wasm",
|
||||
"version": "3.0.0-beta.11",
|
||||
"version": "3.0.0-beta.13",
|
||||
"license": "MIT OR Apache-2.0",
|
||||
"devDependencies": {
|
||||
"@biomejs/biome": "^1.9.3",
|
||||
@ -461,115 +461,6 @@
|
||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||
}
|
||||
},
|
||||
"node_modules/@microsoft/api-extractor": {
|
||||
"version": "7.50.0",
|
||||
"resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.50.0.tgz",
|
||||
"integrity": "sha512-Ds/PHTiVzuENQsmXrJKkSdfgNkr/SDG/2rDef0AWl3BchAnXdO7gXaYsAkNx4gWiC4OngNA3fQfd3+BcQxP1DQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@microsoft/api-extractor-model": "7.30.3",
|
||||
"@microsoft/tsdoc": "~0.15.1",
|
||||
"@microsoft/tsdoc-config": "~0.17.1",
|
||||
"@rushstack/node-core-library": "5.11.0",
|
||||
"@rushstack/rig-package": "0.5.3",
|
||||
"@rushstack/terminal": "0.15.0",
|
||||
"@rushstack/ts-command-line": "4.23.5",
|
||||
"lodash": "~4.17.15",
|
||||
"minimatch": "~3.0.3",
|
||||
"resolve": "~1.22.1",
|
||||
"semver": "~7.5.4",
|
||||
"source-map": "~0.6.1",
|
||||
"typescript": "5.7.2"
|
||||
},
|
||||
"bin": {
|
||||
"api-extractor": "bin/api-extractor"
|
||||
}
|
||||
},
|
||||
"node_modules/@microsoft/api-extractor-model": {
|
||||
"version": "7.30.3",
|
||||
"resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.3.tgz",
|
||||
"integrity": "sha512-yEAvq0F78MmStXdqz9TTT4PZ05Xu5R8nqgwI5xmUmQjWBQ9E6R2n8HB/iZMRciG4rf9iwI2mtuQwIzDXBvHn1w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@microsoft/tsdoc": "~0.15.1",
|
||||
"@microsoft/tsdoc-config": "~0.17.1",
|
||||
"@rushstack/node-core-library": "5.11.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@microsoft/api-extractor/node_modules/brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@microsoft/api-extractor/node_modules/minimatch": {
|
||||
"version": "3.0.8",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
|
||||
"integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
},
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@microsoft/api-extractor/node_modules/typescript": {
|
||||
"version": "5.7.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz",
|
||||
"integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
"tsserver": "bin/tsserver"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.17"
|
||||
}
|
||||
},
|
||||
"node_modules/@microsoft/tsdoc": {
|
||||
"version": "0.15.1",
|
||||
"resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz",
|
||||
"integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/@microsoft/tsdoc-config": {
|
||||
"version": "0.17.1",
|
||||
"resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz",
|
||||
"integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@microsoft/tsdoc": "0.15.1",
|
||||
"ajv": "~8.12.0",
|
||||
"jju": "~1.4.0",
|
||||
"resolve": "~1.22.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@module-federation/error-codes": {
|
||||
"version": "0.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.8.4.tgz",
|
||||
@ -1186,101 +1077,6 @@
|
||||
"node": ">=16.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rushstack/node-core-library": {
|
||||
"version": "5.11.0",
|
||||
"resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.11.0.tgz",
|
||||
"integrity": "sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"ajv": "~8.13.0",
|
||||
"ajv-draft-04": "~1.0.0",
|
||||
"ajv-formats": "~3.0.1",
|
||||
"fs-extra": "~11.3.0",
|
||||
"import-lazy": "~4.0.0",
|
||||
"jju": "~1.4.0",
|
||||
"resolve": "~1.22.1",
|
||||
"semver": "~7.5.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/node": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/node": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@rushstack/node-core-library/node_modules/ajv": {
|
||||
"version": "8.13.0",
|
||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz",
|
||||
"integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"fast-deep-equal": "^3.1.3",
|
||||
"json-schema-traverse": "^1.0.0",
|
||||
"require-from-string": "^2.0.2",
|
||||
"uri-js": "^4.4.1"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/epoberezkin"
|
||||
}
|
||||
},
|
||||
"node_modules/@rushstack/rig-package": {
|
||||
"version": "0.5.3",
|
||||
"resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.3.tgz",
|
||||
"integrity": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"resolve": "~1.22.1",
|
||||
"strip-json-comments": "~3.1.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@rushstack/terminal": {
|
||||
"version": "0.15.0",
|
||||
"resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.15.0.tgz",
|
||||
"integrity": "sha512-vXQPRQ+vJJn4GVqxkwRe+UGgzNxdV8xuJZY2zem46Y0p3tlahucH9/hPmLGj2i9dQnUBFiRnoM9/KW7PYw8F4Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@rushstack/node-core-library": "5.11.0",
|
||||
"supports-color": "~8.1.1"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/node": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/node": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@rushstack/ts-command-line": {
|
||||
"version": "4.23.5",
|
||||
"resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.5.tgz",
|
||||
"integrity": "sha512-jg70HfoK44KfSP3MTiL5rxsZH7X1ktX3cZs9Sl8eDu1/LxJSbPsh0MOFRC710lIuYYSgxWjI5AjbCBAl7u3RxA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@rushstack/terminal": "0.15.0",
|
||||
"@types/argparse": "1.0.38",
|
||||
"argparse": "~1.0.9",
|
||||
"string-argv": "~0.3.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/helpers": {
|
||||
"version": "0.5.15",
|
||||
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
|
||||
@ -1302,15 +1098,6 @@
|
||||
"tslib": "^2.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/argparse": {
|
||||
"version": "1.0.38",
|
||||
"resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz",
|
||||
"integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/acorn": {
|
||||
"version": "8.14.0",
|
||||
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
|
||||
@ -1324,62 +1111,6 @@
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/ajv": {
|
||||
"version": "8.12.0",
|
||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
|
||||
"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"fast-deep-equal": "^3.1.1",
|
||||
"json-schema-traverse": "^1.0.0",
|
||||
"require-from-string": "^2.0.2",
|
||||
"uri-js": "^4.2.2"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/epoberezkin"
|
||||
}
|
||||
},
|
||||
"node_modules/ajv-draft-04": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz",
|
||||
"integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"peerDependencies": {
|
||||
"ajv": "^8.5.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"ajv": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/ajv-formats": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
|
||||
"integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"ajv": "^8.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"ajv": "^8.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"ajv": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/ansi-regex": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
|
||||
@ -1393,27 +1124,6 @@
|
||||
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/argparse": {
|
||||
"version": "1.0.10",
|
||||
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
|
||||
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"sprintf-js": "~1.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/base64-js": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
|
||||
@ -1620,15 +1330,6 @@
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"node_modules/concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/core-js": {
|
||||
"version": "3.40.0",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.40.0.tgz",
|
||||
@ -1775,15 +1476,6 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/fast-deep-equal": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/fd-slicer": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
|
||||
@ -1811,35 +1503,6 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/fs-extra": {
|
||||
"version": "11.3.0",
|
||||
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
|
||||
"integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"graceful-fs": "^4.2.0",
|
||||
"jsonfile": "^6.0.1",
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.14"
|
||||
}
|
||||
},
|
||||
"node_modules/function-bind": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/get-east-asian-width": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
|
||||
@ -1874,33 +1537,6 @@
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/has-flag": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/hasown": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
||||
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"function-bind": "^1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/ieee754": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
|
||||
@ -1922,18 +1558,6 @@
|
||||
],
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/import-lazy": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
|
||||
"integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
@ -1941,24 +1565,6 @@
|
||||
"dev": true,
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/is-core-module": {
|
||||
"version": "2.16.1",
|
||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
|
||||
"integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"hasown": "^2.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/is-interactive": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
|
||||
@ -2019,48 +1625,6 @@
|
||||
"node": ">=14.17.6"
|
||||
}
|
||||
},
|
||||
"node_modules/jju": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz",
|
||||
"integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/json-schema-traverse": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
|
||||
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/jsonfile": {
|
||||
"version": "6.1.0",
|
||||
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
|
||||
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"universalify": "^2.0.0"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"graceful-fs": "^4.1.6"
|
||||
}
|
||||
},
|
||||
"node_modules/lodash": {
|
||||
"version": "4.17.21",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/log-symbols": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz",
|
||||
@ -2091,21 +1655,6 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/lru-cache": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
|
||||
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"yallist": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/magic-string": {
|
||||
"version": "0.30.17",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
|
||||
@ -2228,15 +1777,6 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/path-parse": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
||||
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/pend": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
|
||||
@ -2291,18 +1831,6 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/punycode": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
|
||||
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/readable-stream": {
|
||||
"version": "2.3.8",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
|
||||
@ -2326,41 +1854,6 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/require-from-string": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
|
||||
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/resolve": {
|
||||
"version": "1.22.10",
|
||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
|
||||
"integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"is-core-module": "^2.16.0",
|
||||
"path-parse": "^1.0.7",
|
||||
"supports-preserve-symlinks-flag": "^1.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"resolve": "bin/resolve"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/restore-cursor": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
|
||||
@ -2448,24 +1941,6 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/semver": {
|
||||
"version": "7.5.4",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
|
||||
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"lru-cache": "^6.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"semver": "bin/semver.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/signal-exit": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
|
||||
@ -2500,15 +1975,6 @@
|
||||
"source-map": "^0.6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sprintf-js": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
|
||||
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
|
||||
"dev": true,
|
||||
"license": "BSD-3-Clause",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/stdin-discarder": {
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz",
|
||||
@ -2539,18 +2005,6 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/string-argv": {
|
||||
"version": "0.3.2",
|
||||
"resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz",
|
||||
"integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=0.6.19"
|
||||
}
|
||||
},
|
||||
"node_modules/string-width": {
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
|
||||
@ -2595,54 +2049,6 @@
|
||||
"is-natural-number": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/strip-json-comments": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
|
||||
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/supports-color": {
|
||||
"version": "8.1.1",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
|
||||
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"has-flag": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/supports-color?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/supports-preserve-symlinks-flag": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
|
||||
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/tar-stream": {
|
||||
"version": "1.6.2",
|
||||
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz",
|
||||
@ -2779,30 +2185,6 @@
|
||||
"through": "^2.3.8"
|
||||
}
|
||||
},
|
||||
"node_modules/universalify": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
|
||||
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">= 10.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/uri-js": {
|
||||
"version": "4.4.1",
|
||||
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
|
||||
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
|
||||
"dev": true,
|
||||
"license": "BSD-2-Clause",
|
||||
"optional": true,
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"punycode": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
@ -2827,15 +2209,6 @@
|
||||
"node": ">=0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
|
||||
"dev": true,
|
||||
"license": "ISC",
|
||||
"optional": true,
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/yauzl": {
|
||||
"version": "2.10.0",
|
||||
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "objdiff-wasm",
|
||||
"version": "3.0.0-beta.11",
|
||||
"version": "3.0.0-beta.13",
|
||||
"description": "A local diffing tool for decompilation projects.",
|
||||
"author": {
|
||||
"name": "Luke Street",
|
||||
|
Loading…
x
Reference in New Issue
Block a user