diff --git a/.gitignore b/.gitignore index 74b3bf3..035d0d5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ /build /include/org/ /target + +bin \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index cb840ab..3da739e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,37 +1,21 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" -version = "0.14.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a" dependencies = [ - "gimli 0.23.0", + "gimli", ] [[package]] name = "adler" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" - -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "ascii" -version = "0.9.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "autocfg" @@ -41,11 +25,12 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" -version = "0.3.55" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5140344c85b01f9bbb4d4b7288a8aa4b3287ccef913a14bcc78a1063623598" +checksum = "b7815ea54e4d821e791162e078acbebfd6d8c8939cd559c9335dceb1c8ca7282" dependencies = [ "addr2line", + "cc", "cfg-if 1.0.0", "libc", "miniz_oxide", @@ -55,11 +40,10 @@ dependencies = [ [[package]] name = "bincode" -version = "1.3.1" +version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" dependencies = [ - "byteorder", "serde", ] @@ -70,31 +54,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] -name = "blake3" -version = "0.3.7" +name = "byteorder" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9ff35b701f3914bdb8fad3368d822c766ef2858b2583198e41639b936f09d3f" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if 0.1.10", - "constant_time_eq", - "crypto-mac", - "digest", -] +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] -name = "byteorder" -version = "1.3.4" +name = "bytes" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" +checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" [[package]] name = "cc" -version = "1.0.66" +version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" +checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" [[package]] name = "cesu8" @@ -116,62 +91,45 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "combine" -version = "3.8.1" +version = "4.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +checksum = "cc4369b5e4c0cddf64ad8981c0111e7df4f7078f4d6ba98fb31f2e17c4c57b7e" dependencies = [ - "ascii", - "byteorder", - "either", + "bytes", "memchr", - "unreachable", ] -[[package]] -name = "const_fn" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826" - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "cranelift-bforest" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9221545c0507dc08a62b2d8b5ffe8e17ac580b0a74d1813b496b8d70b070fbd0" +checksum = "c8ca3560686e7c9c7ed7e0fe77469f2410ba5d7781b1acaa9adc8d8deea28e3e" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9936ea608b6cd176f107037f6adbb4deac933466fc7231154f96598b2d3ab1" +checksum = "baf9bf1ffffb6ce3d2e5ebc83549bd2436426c99b31cc550d521364cbe35d276" dependencies = [ - "byteorder", "cranelift-bforest", "cranelift-codegen-meta", "cranelift-codegen-shared", "cranelift-entity", - "gimli 0.22.0", + "gimli", "log", "regalloc", "smallvec", "target-lexicon", - "thiserror", ] [[package]] name = "cranelift-codegen-meta" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef2b2768568306540f4c8db3acce9105534d34c4a1e440529c1e702d7f8c8d7" +checksum = "4cc21936a5a6d07e23849ffe83e5c1f6f50305c074f4b2970ca50c13bf55b821" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -179,24 +137,21 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6759012d6d19c4caec95793f052613e9d4113e925e7f14154defbac0f1d4c938" +checksum = "ca5b6ffaa87560bebe69a5446449da18090b126037920b0c1c6d5945f72faf6b" [[package]] name = "cranelift-entity" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86badbce14e15f52a45b666b38abe47b204969dd7f8fb7488cb55dd46b361fa6" -dependencies = [ - "serde", -] +checksum = "7d6b4a8bef04f82e4296782646f733c641d09497df2fabf791323fefaa44c64c" [[package]] name = "cranelift-frontend" -version = "0.68.0" +version = "0.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608bb7656c554d0a4cf8f50c7a10b857e80306f6ff829ad6d468a7e2323c8d8" +checksum = "c31b783b351f966fce33e3c03498cb116d16d97a8f9978164a60920bd0d3a99c" dependencies = [ "cranelift-codegen", "log", @@ -215,9 +170,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -236,12 +191,11 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.1" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d" +checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" dependencies = [ "cfg-if 1.0.0", - "const_fn", "crossbeam-utils", "lazy_static", "memoffset", @@ -250,30 +204,29 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.1" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" dependencies = [ - "autocfg", "cfg-if 1.0.0", "lazy_static", ] [[package]] -name = "crypto-mac" -version = "0.8.0" +name = "ctor" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d" dependencies = [ - "generic-array", - "subtle", + "quote", + "syn", ] [[package]] name = "darling" -version = "0.10.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c" dependencies = [ "darling_core", "darling_macro", @@ -281,9 +234,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.10.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36" dependencies = [ "fnv", "ident_case", @@ -295,24 +248,15 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.10.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" dependencies = [ "darling_core", "quote", "syn", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "either" version = "1.6.1" @@ -321,19 +265,18 @@ checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[package]] name = "enumset" -version = "1.0.1" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "959a80a2062fedd66ed41d99736212de987b3a8c83a4c2cef243968075256bd1" +checksum = "fbd795df6708a599abf1ee10eacc72efd052b7a5f70fdf0715e4d5151a6db9c3" dependencies = [ "enumset_derive", - "num-traits", ] [[package]] name = "enumset_derive" -version = "0.5.0" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74bef436ac71820c5cf768d7af9ba33121246b09a00e09a55d94ef8095a875ac" +checksum = "e19c52f9ec503c8a68dc04daf71a04b07e690c32ab1a8b68e33897f255269d47" dependencies = [ "darling", "proc-macro2", @@ -342,13 +285,12 @@ dependencies = [ ] [[package]] -name = "error-chain" -version = "0.12.4" +name = "erased-serde" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +checksum = "3de9ad4541d99dc22b59134e7ff8dc3d6c988c89ecd7324bf10a8362b07a2afa" dependencies = [ - "backtrace", - "version_check", + "serde", ] [[package]] @@ -364,20 +306,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "generic-array" -version = "0.14.4" +name = "generational-arena" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "8e1d3b771574f62d0548cee0ad9057857e9fc25d7a3335f140c84f6acd0bf601" dependencies = [ - "typenum", - "version_check", + "cfg-if 0.1.10", + "serde", ] [[package]] name = "getrandom" -version = "0.1.16" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ "cfg-if 1.0.0", "libc", @@ -385,21 +327,26 @@ dependencies = [ ] [[package]] -name = "gimli" -version = "0.22.0" +name = "ghost" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +checksum = "1a5bcf1bbeab73aa4cf2fde60a846858dc036163c7c33bec309f8d17de785479" dependencies = [ - "fallible-iterator", - "indexmap", - "stable_deref_trait", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "gimli" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" +dependencies = [ + "fallible-iterator", + "indexmap", + "stable_deref_trait", +] [[package]] name = "hashbrown" @@ -409,19 +356,13 @@ checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" [[package]] name = "hermit-abi" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8" +checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" dependencies = [ "libc", ] -[[package]] -name = "hex" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" - [[package]] name = "ident_case" version = "1.0.1" @@ -430,26 +371,48 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indexmap" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" +checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" dependencies = [ "autocfg", "hashbrown", "serde", ] +[[package]] +name = "inventory" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0f7efb804ec95e33db9ad49e4252f049e37e8b0a4652e3cd61f7999f2eff7f" +dependencies = [ + "ctor", + "ghost", + "inventory-impl", +] + +[[package]] +name = "inventory-impl" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75c094e94816723ab936484666968f5b58060492e880f3c8d00489a1e244fa51" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "jni" -version = "0.16.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22bbdc25b49340bc4fc3d9c96dd84d878c4beeca35e3651efa53db51a68d7d4d" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" dependencies = [ "cesu8", "combine", - "error-chain", "jni-sys", "log", + "thiserror", "walkdir", ] @@ -473,15 +436,15 @@ checksum = "3576a87f2ba00f6f106fdfcd16db1d698d648a26ad8e0573cad8537c3c362d2a" [[package]] name = "libc" -version = "0.2.81" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" +checksum = "789da6d93f1b866ffe175afc5322a4d76c038605a1c3319bb57b06967ca98a36" [[package]] name = "libloading" -version = "0.6.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9367bdfa836b7e3cf895867f7a570283444da90562980ec2263d6e1569b16bc" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" dependencies = [ "cfg-if 1.0.0", "winapi", @@ -489,11 +452,32 @@ dependencies = [ [[package]] name = "log" -version = "0.4.11" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", +] + +[[package]] +name = "loupe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d79b0cc3aa7552a59274f642a0a6e7419b7f5438aba06a0a82825918ba69f0e6" +dependencies = [ + "indexmap", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a545b22ceeec36de91c46206afd384c17946bd62b95b76e927a2adb77fbdcc0" +dependencies = [ + "quote", + "syn", ] [[package]] @@ -507,33 +491,33 @@ dependencies = [ [[package]] name = "memchr" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" [[package]] name = "memmap2" -version = "0.2.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e73be3b7d04a0123e933fea1d50d126cc7196bbc0362c0ce426694f777194eee" +checksum = "723e3ebdcdc5c023db1df315364573789f8857c11b631a2fdfad7c00f5c046b4" dependencies = [ "libc", ] [[package]] name = "memoffset" -version = "0.6.1" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "157b4208e3059a8f9e78d559edc658e13df41410cb3ae03979c83130067fdd87" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" dependencies = [ "autocfg", ] [[package]] name = "miniz_oxide" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" dependencies = [ "adler", "autocfg", @@ -545,15 +529,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0debeb9fcf88823ea64d64e4a815ab1643f33127d995978e099942ce38f25238" -[[package]] -name = "num-traits" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" -dependencies = [ - "autocfg", -] - [[package]] name = "num_cpus" version = "1.13.0" @@ -566,19 +541,20 @@ dependencies = [ [[package]] name = "object" -version = "0.22.0" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" +checksum = "f8bc1d42047cf336f0f939c99e97183cf31551bf0f2865a2ec9c8d91fd4ffb5e" dependencies = [ "crc32fast", "indexmap", + "memchr", ] [[package]] name = "pin-project-lite" -version = "0.2.0" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b063f57ec186e6140e2b8b6921e5f1bd89c7356dda5b33acc5401203ca6131c" +checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" [[package]] name = "ppv-lite86" @@ -612,29 +588,48 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ "unicode-xid", ] +[[package]] +name = "ptr_meta" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7424255320182a46c403331afed6f95e0259a7c578f9da54a27e262ef3b60118" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53005b9863728f508d3f23ae37e03d60986a01b65f7ae8397dcebaa1d5e54e10" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "quote" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ "proc-macro2", ] [[package]] name = "rand" -version = "0.7.3" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "getrandom", "libc", "rand_chacha", "rand_core", @@ -643,9 +638,9 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ "ppv-lite86", "rand_core", @@ -653,38 +648,27 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.5.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" dependencies = [ "getrandom", ] [[package]] name = "rand_hc" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" dependencies = [ "rand_core", ] -[[package]] -name = "raw-cpuid" -version = "7.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb71f708fe39b2c5e98076204c3cc094ee5a4c12c4cdb119a2b72dc34164f41" -dependencies = [ - "bitflags", - "cc", - "rustc_version", -] - [[package]] name = "rayon" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b0d8e0819fadc20c74ea8373106ead0600e3a67ef1fe8da56e39b9ae7275674" +checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" dependencies = [ "autocfg", "crossbeam-deque", @@ -694,9 +678,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ab346ac5921dc62ffa9f89b7a773907511cdfa5490c572ae9be1be33e8afa4a" +checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" dependencies = [ "crossbeam-channel", "crossbeam-deque", @@ -707,9 +691,12 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.57" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" +dependencies = [ + "bitflags", +] [[package]] name = "regalloc" @@ -743,11 +730,34 @@ dependencies = [ "winapi", ] +[[package]] +name = "rkyv" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f10244dc3cf3eddbf33245a69d154620746c60f629bec071e236d135b654556d" +dependencies = [ + "memoffset", + "ptr_meta", + "rkyv_derive", + "seahash", +] + +[[package]] +name = "rkyv_derive" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3fccbf52ee0b76a29417794226e225798dd6bd32e40debd9e284cecc20dd76" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "rustc-demangle" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" +checksum = "410f7acf3cb3a44527c5d9546bad4bf4e6c460915d5f9f2fc524498bfe8f70ce" [[package]] name = "rustc-hash" @@ -756,13 +766,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] -name = "rustc_version" -version = "0.2.3" +name = "rustversion" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] +checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" [[package]] name = "same-file" @@ -780,25 +787,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] -name = "semver" -version = "0.9.0" +name = "seahash" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "serde" -version = "1.0.118" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" dependencies = [ "serde_derive", ] @@ -814,9 +812,9 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.118" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c84d3526699cd55261af4b941e4e725444df67aa4f9e6a3564f18030d12672df" +checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", @@ -825,9 +823,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a55ca5f3b68e41c979bf8c46a6f1da892ca4db8f94023ce0bd32407573b1ac0" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "stable_deref_trait" @@ -837,21 +835,15 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "strsim" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" - -[[package]] -name = "subtle" -version = "2.4.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.56" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9802ddde94170d186eeee5005b798d9c159fa970403f1be19976d0cfb939b72" +checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82" dependencies = [ "proc-macro2", "quote", @@ -860,17 +852,17 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9" +checksum = "64ae3b39281e4b14b8123bdbaddd472b7dfe215e444181f2f9d2443c2444f834" [[package]] name = "tempfile" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "libc", "rand", "redox_syscall", @@ -880,31 +872,42 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.23" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" +checksum = "fa6f76457f59514c7eeb4e59d891395fab0b2fd1d40723ae737d64153392e9c6" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.23" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" +checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d" dependencies = [ "proc-macro2", "quote", "syn", ] +[[package]] +name = "time" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "tracing" -version = "0.1.22" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f47026cdc4080c07e49b37087de021820269d996f581aac150ef9e5583eefe3" +checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" dependencies = [ "cfg-if 1.0.0", + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -912,9 +915,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.11" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada" +checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2", "quote", @@ -923,51 +926,54 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" dependencies = [ "lazy_static", ] [[package]] -name = "typenum" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" - -[[package]] -name = "unicode-xid" -version = "0.2.1" +name = "typetag" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "422619e1a7299befb977a1f6d8932c499f6151dbcafae715193570860cae8f07" +dependencies = [ + "erased-serde", + "inventory", + "lazy_static", + "serde", + "typetag-impl", +] [[package]] -name = "unreachable" -version = "1.0.0" +name = "typetag-impl" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +checksum = "504f9626fe6cc1c376227864781996668e15c1ff251d222f63ef17f310bf1fec" dependencies = [ - "void", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "version_check" -version = "0.9.2" +name = "unicode-xid" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] -name = "void" -version = "1.0.2" +name = "version_check" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" [[package]] name = "walkdir" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" dependencies = [ "same-file", "winapi", @@ -976,17 +982,19 @@ dependencies = [ [[package]] name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasmer" -version = "1.0.0" -source = "git+https://github.com/wasmerio/wasmer?rev=1.0.0#aa03cab26cbe49d7701cabe5e063a1d76f4fbb0f" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f52e455a01d0fac439cd7a96ba9b519bdc84e923a5b96034054697ebb17cd75" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", + "loupe", "more-asserts", "target-lexicon", "thiserror", @@ -994,32 +1002,23 @@ dependencies = [ "wasmer-compiler-cranelift", "wasmer-derive", "wasmer-engine", - "wasmer-engine-jit", - "wasmer-engine-native", + "wasmer-engine-dylib", + "wasmer-engine-universal", "wasmer-types", "wasmer-vm", "wat", "winapi", ] -[[package]] -name = "wasmer-cache" -version = "1.0.0" -source = "git+https://github.com/wasmerio/wasmer?rev=1.0.0#aa03cab26cbe49d7701cabe5e063a1d76f4fbb0f" -dependencies = [ - "blake3", - "hex", - "thiserror", - "wasmer", -] - [[package]] name = "wasmer-compiler" -version = "1.0.0" -source = "git+https://github.com/wasmerio/wasmer?rev=1.0.0#aa03cab26cbe49d7701cabe5e063a1d76f4fbb0f" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc86dda6f715f03104800be575a38382b35c3962953af9e9d8722dcf0bd2458f" dependencies = [ "enumset", - "raw-cpuid", + "loupe", + "rkyv", "serde", "serde_bytes", "smallvec", @@ -1032,15 +1031,17 @@ dependencies = [ [[package]] name = "wasmer-compiler-cranelift" -version = "1.0.0" -source = "git+https://github.com/wasmerio/wasmer?rev=1.0.0#aa03cab26cbe49d7701cabe5e063a1d76f4fbb0f" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a570746cbec434179e2d53357973a34dfdb208043104e8fac3b7b0023015cf6" dependencies = [ "cranelift-codegen", + "cranelift-entity", "cranelift-frontend", - "gimli 0.22.0", + "gimli", + "loupe", "more-asserts", "rayon", - "serde", "smallvec", "tracing", "wasmer-compiler", @@ -1050,8 +1051,9 @@ dependencies = [ [[package]] name = "wasmer-derive" -version = "1.0.0" -source = "git+https://github.com/wasmerio/wasmer?rev=1.0.0#aa03cab26cbe49d7701cabe5e063a1d76f4fbb0f" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee7b351bcc1e782997c72dc0b5b328f3ddcad4813b8ce3cac3f25ae5a4ab56b" dependencies = [ "proc-macro-error", "proc-macro2", @@ -1061,12 +1063,13 @@ dependencies = [ [[package]] name = "wasmer-engine" -version = "1.0.0" -source = "git+https://github.com/wasmerio/wasmer?rev=1.0.0#aa03cab26cbe49d7701cabe5e063a1d76f4fbb0f" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8454ead320a4017ba36ddd9ab4fbf7776fceea6ab0b79b5e53664a1682569fc3" dependencies = [ "backtrace", - "bincode", "lazy_static", + "loupe", "memmap2", "more-asserts", "rustc-demangle", @@ -1080,40 +1083,43 @@ dependencies = [ ] [[package]] -name = "wasmer-engine-jit" -version = "1.0.0" -source = "git+https://github.com/wasmerio/wasmer?rev=1.0.0#aa03cab26cbe49d7701cabe5e063a1d76f4fbb0f" +name = "wasmer-engine-dylib" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aa390d123ebe23d5315c39f6063fcc18319661d03c8000f23d0fe1c011e8135" dependencies = [ - "bincode", - "cfg-if 0.1.10", - "region", + "cfg-if 1.0.0", + "leb128", + "libloading", + "loupe", + "rkyv", "serde", - "serde_bytes", + "tempfile", + "tracing", "wasmer-compiler", "wasmer-engine", + "wasmer-object", "wasmer-types", "wasmer-vm", - "winapi", + "which", ] [[package]] -name = "wasmer-engine-native" -version = "1.0.0" -source = "git+https://github.com/wasmerio/wasmer?rev=1.0.0#aa03cab26cbe49d7701cabe5e063a1d76f4fbb0f" +name = "wasmer-engine-universal" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dffe8015f08915eb4939ebc8e521cde8246f272f5197ea60d46214ac5aef285" dependencies = [ - "bincode", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "leb128", - "libloading", - "serde", - "tempfile", - "tracing", + "loupe", + "region", + "rkyv", "wasmer-compiler", "wasmer-engine", - "wasmer-object", "wasmer-types", "wasmer-vm", - "which", + "winapi", ] [[package]] @@ -1122,14 +1128,16 @@ version = "0.3.0" dependencies = [ "jni", "wasmer", - "wasmer-runtime", - "wasmer-runtime-core", + "wasmer-compiler-cranelift", + "wasmer-engine-universal", + "wasmer-wasi", ] [[package]] name = "wasmer-object" -version = "1.0.0" -source = "git+https://github.com/wasmerio/wasmer?rev=1.0.0#aa03cab26cbe49d7701cabe5e063a1d76f4fbb0f" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c541c985799fc1444702501c15d41becfb066c92d9673defc1c7417fd8739e15" dependencies = [ "object", "thiserror", @@ -1137,92 +1145,104 @@ dependencies = [ "wasmer-types", ] -[[package]] -name = "wasmer-runtime" -version = "0.18.0" -source = "git+https://github.com/wasmerio/wasmer?rev=1.0.0#aa03cab26cbe49d7701cabe5e063a1d76f4fbb0f" -dependencies = [ - "wasmer-runtime-core", -] - -[[package]] -name = "wasmer-runtime-core" -version = "0.18.0" -source = "git+https://github.com/wasmerio/wasmer?rev=1.0.0#aa03cab26cbe49d7701cabe5e063a1d76f4fbb0f" -dependencies = [ - "blake3", - "lazy_static", - "wasmer", - "wasmer-cache", - "wasmer-compiler", - "wasmer-compiler-cranelift", - "wasmer-engine", - "wasmer-engine-jit", - "wasmer-types", - "wasmer-vm", -] - [[package]] name = "wasmer-types" -version = "1.0.0" -source = "git+https://github.com/wasmerio/wasmer?rev=1.0.0#aa03cab26cbe49d7701cabe5e063a1d76f4fbb0f" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91f75d3c31f8b1f8d818ff49624fc974220243cbc07a2252f408192e97c6b51" dependencies = [ - "cranelift-entity", + "indexmap", + "loupe", + "rkyv", "serde", "thiserror", ] [[package]] name = "wasmer-vm" -version = "1.0.0" -source = "git+https://github.com/wasmerio/wasmer?rev=1.0.0#aa03cab26cbe49d7701cabe5e063a1d76f4fbb0f" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469a12346a4831e7dac639b9646d8c9b24c7d2cf0cf458b77f489edb35060c1f" dependencies = [ "backtrace", "cc", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "indexmap", "libc", + "loupe", "memoffset", "more-asserts", "region", + "rkyv", "serde", "thiserror", "wasmer-types", "winapi", ] +[[package]] +name = "wasmer-wasi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a992dcafd11c584f3b8d84b7b4c6af350b63db03cf4452fc38647e8eab45994" +dependencies = [ + "bincode", + "generational-arena", + "getrandom", + "libc", + "serde", + "thiserror", + "tracing", + "typetag", + "wasmer", + "wasmer-wasi-types", + "winapi", +] + +[[package]] +name = "wasmer-wasi-types" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a275df0190f65f9e62f25b6bc8505a55cc643e433c822fb03a5e3e11fe1c29" +dependencies = [ + "byteorder", + "serde", + "time", + "wasmer-types", +] + [[package]] name = "wasmparser" -version = "0.65.0" +version = "0.78.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc2fe6350834b4e528ba0901e7aa405d78b89dc1fa3145359eb4de0e323fcf" +checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65" [[package]] name = "wast" -version = "30.0.0" +version = "35.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b79907b22f740634810e882d8d1d9d0f9563095a8ab94e786e370242bff5cd2" +checksum = "2ef140f1b49946586078353a453a1d28ba90adfc54dde75710bc1931de204d68" dependencies = [ "leb128", ] [[package]] name = "wat" -version = "1.0.31" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8279a02835bf12e61ed2b3c3cbc6ecf9918762fd97e036917c11a09ec20ca44" +checksum = "8ec280a739b69173e0ffd12c1658507996836ba4e992ed9bc1e5385a0bd72a02" dependencies = [ "wast", ] [[package]] name = "which" -version = "4.0.2" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87c14ef7e1b8b8ecfc75d5eca37949410046e66f15d185c01d70824f1f8111ef" +checksum = "b55551e42cbdf2ce2bedd2203d0cc08dba002c27510f86dab6d0ce304cba3dfe" dependencies = [ + "either", "libc", - "thiserror", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 4816ed6..0cc7c1c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,8 @@ edition = "2018" crate-type = ["cdylib"] [dependencies] -wasmer = { git = "https://github.com/wasmerio/wasmer", rev = "1.0.0" } -wasmer-runtime = { git = "https://github.com/wasmerio/wasmer", rev = "1.0.0" } -wasmer-runtime-core = { git = "https://github.com/wasmerio/wasmer", rev = "1.0.0" } -jni = "0.16" +wasmer = "2.0.0" +wasmer-compiler-cranelift = "2.0.0" +wasmer-engine-universal = "2.0.0" +wasmer-wasi = "2.0.0" +jni = "0.19" diff --git a/build.gradle b/build.gradle index cc0894b..b5f8c77 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ sourceSets { } test { java { - srcDirs = ["tests"] + srcDirs = ["tests/java"] } resources { srcDirs = ["tests/resources"] diff --git a/include/org_wasmer_Imports.h b/include/org_wasmer_Imports.h new file mode 100644 index 0000000..4fe2120 --- /dev/null +++ b/include/org_wasmer_Imports.h @@ -0,0 +1,45 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class org_wasmer_Imports */ + +#ifndef _Included_org_wasmer_Imports +#define _Included_org_wasmer_Imports +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: org_wasmer_Imports + * Method: nativeImportsInstantiate + * Signature: (Ljava/util/List;J)J + */ +JNIEXPORT jlong JNICALL Java_org_wasmer_Imports_nativeImportsInstantiate + (JNIEnv *, jclass, jobject, jlong); + +/* + * Class: org_wasmer_Imports + * Method: nativeImportsChain + * Signature: (JJ)J + */ +JNIEXPORT jlong JNICALL Java_org_wasmer_Imports_nativeImportsChain + (JNIEnv *, jclass, jlong, jlong); + +/* + * Class: org_wasmer_Imports + * Method: nativeImportsWasi + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_org_wasmer_Imports_nativeImportsWasi + (JNIEnv *, jclass, jlong); + +/* + * Class: org_wasmer_Imports + * Method: nativeDrop + * Signature: (J)V + */ +JNIEXPORT void JNICALL Java_org_wasmer_Imports_nativeDrop + (JNIEnv *, jclass, jlong); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/org_wasmer_Module.h b/include/org_wasmer_Module.h index 9b4c8de..33c7de0 100644 --- a/include/org_wasmer_Module.h +++ b/include/org_wasmer_Module.h @@ -26,10 +26,10 @@ JNIEXPORT void JNICALL Java_org_wasmer_Module_nativeDrop /* * Class: org_wasmer_Module * Method: nativeInstantiate - * Signature: (JLorg/wasmer/Instance;)J + * Signature: (JLorg/wasmer/Instance;J)J */ JNIEXPORT jlong JNICALL Java_org_wasmer_Module_nativeInstantiate - (JNIEnv *, jobject, jlong, jobject); + (JNIEnv *, jobject, jlong, jobject, jlong); /* * Class: org_wasmer_Module diff --git a/src/exception.rs b/src/exception.rs index f77d500..5874eba 100644 --- a/src/exception.rs +++ b/src/exception.rs @@ -1,9 +1,28 @@ -pub use jni::errors::Error; -use jni::{errors::ErrorKind, JNIEnv}; +use jni::JNIEnv; use std::thread; +use jni::errors::Error as JNIError; + +#[derive(Debug)] +pub enum Error { + JNIError(JNIError), + Message(String), +} + +impl From for Error { + fn from(err: JNIError) -> Self { Self::JNIError(err) } +} + +impl std::fmt::Display for Error { + fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { + match self { + Error::JNIError(err) => err.fmt(fmt), + Error::Message(msg) => msg.fmt(fmt), + } + } +} pub fn runtime_error(message: String) -> Error { - Error::from_kind(ErrorKind::Msg(message)) + Error::Message(message) } #[derive(Debug)] diff --git a/src/imports.rs b/src/imports.rs new file mode 100644 index 0000000..377e94c --- /dev/null +++ b/src/imports.rs @@ -0,0 +1,148 @@ +use crate::{ + exception::{joption_or_throw}, + types::{jptr, Pointer}, + module::Module, +}; +use jni::{ + sys::{jlong}, + objects::{JClass, JObject, ReleaseMode, AutoArray, TypeArray}, + JNIEnv, +}; +use std::{collections::HashMap, panic}; +use wasmer::{ImportObject, NamedResolver, ChainableNamedResolver, Exports, Function, FunctionType, Type, Value}; +use wasmer_wasi::WasiState; + +pub struct Imports { + pub(crate) import_object: Box, +} + +fn array2vec<'a, T: TypeArray>(array: &'a AutoArray) -> Vec<&'a T> { + let len = array.size().unwrap(); + let mut ret = Vec::with_capacity(len as usize); + for i in 0..len { + ret.push(unsafe { &*(array.as_ptr().offset(i as isize) as *const T) }); + } + ret +} + + +#[no_mangle] +pub extern "system" fn Java_org_wasmer_Imports_nativeImportsInstantiate( + env: JNIEnv, + _class: JClass, + spec: JObject, + module: jptr, +) -> jptr { + let output = panic::catch_unwind(|| { + let mut namespaces = HashMap::::new(); + let mut import_object = ImportObject::new(); + let module: &Module = Into::>::into(module).borrow(); + let store = module.module.store(); + let spec = env.get_list(spec).unwrap(); + for import in spec.iter().unwrap() { + let namespace = env.get_field(import, "namespace", "Ljava/lang/String;").unwrap().l().unwrap(); + let namespace = env.get_string(namespace.into()).unwrap().to_str().unwrap().to_string(); + let name = env.get_field(import, "name", "Ljava/lang/String;").unwrap().l().unwrap(); + let name = env.get_string(name.into()).unwrap().to_str().unwrap().to_string(); + let function = env.get_field(import, "function", "Ljava/util/function/Function;").unwrap().l().unwrap(); + let params = env.get_field(import, "argTypesInt", "[I").unwrap().l().unwrap(); + let returns = env.get_field(import, "retTypesInt", "[I").unwrap().l().unwrap(); + let params = env.get_int_array_elements(*params, ReleaseMode::NoCopyBack).unwrap(); + let returns = env.get_int_array_elements(*returns, ReleaseMode::NoCopyBack).unwrap(); + let i2t = |i: &i32| match i { 1 => Type::I32, 2 => Type::I64, 3 => Type::F32, 4 => Type::F64, _ => unreachable!("Unknown {}", i)}; + let params = array2vec(¶ms).into_iter().map(i2t).collect::>(); + let returns = array2vec(&returns).into_iter().map(i2t).collect::>(); + let sig = FunctionType::new(params.clone(), returns.clone()); + let function = env.new_global_ref(function).unwrap(); + let jvm = env.get_java_vm().unwrap(); + namespaces.entry(namespace).or_insert_with(|| Exports::new()).insert(name, Function::new(store, sig, move |argv| { + // There is many ways of transferring the args from wasm to java, JList being the cleanes, + // but probably also slowest by far (two JNI calls per argument). Benchmark? + let env = jvm.get_env().unwrap(); + env.ensure_local_capacity(argv.len() as i32 + 2).ok(); + let jargv = env.new_long_array(argv.len() as i32).unwrap(); + let argv = argv.into_iter().enumerate().map(|(i, arg)| match arg { + Value::I32(arg) => { assert!(params[i] == Type::I32); *arg as i64 }, + Value::I64(arg) => { assert!(params[i] == Type::I64); *arg as i64 }, + Value::F32(arg) => { assert!(params[i] == Type::F32); arg.to_bits() as i64 }, + Value::F64(arg) => { assert!(params[i] == Type::F64); arg.to_bits() as i64 }, + _ => panic!("Argument of unsupported type {:?}", arg) + }).collect::>(); + env.set_long_array_region(jargv, 0, &argv).unwrap(); + let jret = env.call_method(function.as_obj(), "apply", "(Ljava/lang/Object;)Ljava/lang/Object;", &[jargv.into()]).unwrap().l().unwrap(); + let ret = match returns.len() { + 0 => vec![], + len => { + let mut ret = vec![0; len]; + env.get_long_array_region(*jret, 0, &mut ret).unwrap(); + ret.into_iter().enumerate().map(|(i, ret)| match returns[i] { + Type::I32 => Value::I32(ret as i32), + Type::I64 => Value::I64(ret as i64), + Type::F32 => Value::F32(f32::from_bits(ret as u32)), + Type::F64 => Value::F64(f64::from_bits(ret as u64)), + t => panic!("Return of unsupported type {:?}", t) + }).collect() + } + }; + // TODO: Error handling + Ok(ret) + })); + } + for (namespace, exports) in namespaces.into_iter() { + import_object.register(namespace, exports); + } + let import_object = Box::new(import_object); + + Ok(Pointer::new(Imports { import_object }).into()) + }); + + joption_or_throw(&env, output).unwrap_or(0) +} + +#[no_mangle] +pub extern "system" fn Java_org_wasmer_Imports_nativeImportsWasi( + env: JNIEnv, + _class: JClass, + module: jptr, +) -> jptr { + let output = panic::catch_unwind(|| { + // TODO: When getting serious about this, one might have to expose the wasi builder... :/ + let module: &Module = Into::>::into(module).borrow(); + let mut wasi = WasiState::new("").finalize().unwrap(); + let import_object = wasi.import_object(&module.module).unwrap(); + let import_object = Box::new(import_object); + + Ok(Pointer::new(Imports { import_object }).into()) + }); + + joption_or_throw(&env, output).unwrap_or(0) +} + +#[no_mangle] +pub extern "system" fn Java_org_wasmer_Imports_nativeImportsChain( + env: JNIEnv, + _class: JClass, + back: jptr, + front: jptr, +) -> jptr { + let output = panic::catch_unwind(|| { + + let back: &Imports = Into::>::into(back).borrow(); + let front: &Imports = Into::>::into(front).borrow(); + let import_object = Box::new((&back.import_object).chain_front(&front.import_object)); + + Ok(Pointer::new(Imports { import_object }).into()) + }); + + joption_or_throw(&env, output).unwrap_or(0) + +} + +#[no_mangle] +pub extern "system" fn Java_org_wasmer_Imports_nativeDrop( + _env: JNIEnv, + _class: JClass, + imports_pointer: jptr, +) { + let _: Pointer = imports_pointer.into(); +} diff --git a/src/instance.rs b/src/instance.rs index c0972b6..43cb5f7 100644 --- a/src/instance.rs +++ b/src/instance.rs @@ -11,8 +11,10 @@ use jni::{ JNIEnv, }; use std::{collections::HashMap, convert::TryFrom, panic, rc::Rc}; -use wasmer_runtime::{imports, instantiate, DynFunc, Export, Value as WasmValue}; -use wasmer_runtime as core; +use wasmer::{imports, Extern, Value as WasmValue, Function}; +use wasmer as core; +use wasmer_compiler_cranelift::Cranelift; +use wasmer_engine_universal::Universal as UniversalEngine; pub struct Instance { pub java_instance_object: GlobalRef, @@ -24,7 +26,10 @@ impl Instance { fn new(java_instance_object: GlobalRef, module_bytes: Vec) -> Result { let module_bytes = module_bytes.as_slice(); let imports = imports! {}; - let instance = match instantiate(module_bytes, &imports) { + let store = core::Store::new(&UniversalEngine::new(Cranelift::default()).engine()); + let module = core::Module::new(&store, module_bytes) + .map_err(|e| runtime_error(format!("Failed to compile the module: {}", e)))?; + let instance = match core::Instance::new(&module, &imports) { Ok(instance) => Rc::new(instance), Err(e) => { return Err(runtime_error(format!( @@ -35,9 +40,10 @@ impl Instance { }; let memories: HashMap = instance - .exports() + .exports + .iter() .filter_map(|(export_name, export)| match export { - Export::Memory(memory) => Some((export_name.to_string(), Memory::new(Rc::new(memory.clone())))), + Extern::Memory(memory) => Some((export_name.to_string(), Memory::new(Rc::new(memory.clone())))), _ => None, }) .collect(); @@ -54,7 +60,7 @@ impl Instance { export_name: String, arguments: Vec, ) -> Result, Error> { - let function: DynFunc = self.instance.exports.get(&export_name).map_err(|_| { + let function: &Function = self.instance.exports.get(&export_name).map_err(|_| { runtime_error(format!( "Exported function `{}` does not exist", export_name @@ -110,7 +116,7 @@ pub extern "system" fn Java_org_wasmer_Instance_nativeCallExportedFunction<'a>( let arguments_length = env.get_array_length(arguments_pointer)?; let arguments = (0..arguments_length) - .map(|i| env.get_object_array_element(arguments_pointer, i)) + .map(|i| env.get_object_array_element(arguments_pointer, i).map_err(Into::into)) .collect::, Error>>()?; let results = instance.call_exported_function( @@ -184,8 +190,8 @@ pub extern "system" fn Java_org_wasmer_Instance_nativeInitializeExportedFunction )? .l()?; - for (export_name, export) in instance.instance.exports() { - if let Export::Function { .. } = export { + for (export_name, export) in instance.instance.exports.iter() { + if let Extern::Function { .. } = export { let name = env.new_string(export_name)?; env.call_method( diff --git a/src/java/org/wasmer/Imports.java b/src/java/org/wasmer/Imports.java new file mode 100644 index 0000000..11457db --- /dev/null +++ b/src/java/org/wasmer/Imports.java @@ -0,0 +1,97 @@ +package org.wasmer; + +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class Imports { + + static { + if (!Native.LOADED_EMBEDDED_LIBRARY) { + System.loadLibrary("wasmer_jni"); + } + } + private static native long nativeImportsInstantiate(List imports, long modulePointer) throws RuntimeException; + private static native long nativeImportsChain(long back, long froont) throws RuntimeException; + private static native long nativeImportsWasi(long modulePointer) throws RuntimeException; + private static native void nativeDrop(long nativePointer); + + final long importsPointer; + + public static class Spec { + public final String namespace; + public final String name; + final Function function; + public final List argTypes; + public final List retTypes; + final int[] argTypesInt; + final int[] retTypesInt; + + public Spec(String namespace, String name, Function, List> function, List argTypes, List retTypes) { + this.namespace = namespace; + this.name = name; + this.function = (long[] argv) -> { + List lret = function.apply(IntStream.range(0, argTypes.size()).mapToObj((int i) -> { + switch (argTypes.get(i)) { + case I32: + return (int) argv[i]; + case I64: + return argv[i]; + case F32: + return Float.intBitsToFloat((int) argv[i]); + case F64: + return Double.longBitsToDouble(argv[i]); + default: + throw new RuntimeException("Unreachable (argument type)"); + } + }).collect(Collectors.toList())); + long[] ret = argv.length >= retTypes.size() ? argv : new long[retTypes.size()]; + for (int i = 0; i < retTypes.size(); i++) + switch (retTypes.get(i)) { + case I32: + ret[i] = lret.get(i).longValue(); + break; + case I64: + ret[i] = lret.get(i).longValue(); + break; + case F32: + ret[i] = Float.floatToRawIntBits(lret.get(i).floatValue()); + break; + case F64: + ret[i] = Double.doubleToRawLongBits(lret.get(i).doubleValue()); + break; + default: + throw new RuntimeException("Unreachable (return type)"); + } + return ret; + }; + this.argTypesInt = argTypes.stream().mapToInt(t -> t.i).toArray(); + this.retTypesInt = retTypes.stream().mapToInt(t -> t.i).toArray(); + this.argTypes = Collections.unmodifiableList(argTypes); + this.retTypes = Collections.unmodifiableList(retTypes); + } + } + + private Imports(long importsPointer) { + this.importsPointer = importsPointer; + } + + public static Imports from(List imports, Module module) throws RuntimeException { + return new Imports(nativeImportsInstantiate(imports, module.modulePointer)); + } + + public static Imports chain(Imports back, Imports front) { + return new Imports(nativeImportsChain(back.importsPointer, front.importsPointer)); + } + + public static Imports wasi(Module module) { + return new Imports(nativeImportsWasi(module.modulePointer)); + } + + protected void finalize() { + nativeDrop(importsPointer); + // TODO allow memory-safe user invocation + } +} diff --git a/src/java/org/wasmer/Instance.java b/src/java/org/wasmer/Instance.java index 5e8f598..84974df 100644 --- a/src/java/org/wasmer/Instance.java +++ b/src/java/org/wasmer/Instance.java @@ -57,7 +57,11 @@ protected Instance() { * Delete an instance object pointer. */ public void close() { - this.nativeDrop(this.instancePointer); + // To avoid duplicate native dropping + if(this.instancePointer != 0l) { + this.nativeDrop(this.instancePointer); + this.instancePointer = 0l; + } } /** diff --git a/src/java/org/wasmer/Module.java b/src/java/org/wasmer/Module.java index c4fa118..dffc007 100644 --- a/src/java/org/wasmer/Module.java +++ b/src/java/org/wasmer/Module.java @@ -1,5 +1,7 @@ package org.wasmer; +import java.util.Collections; + /** * `Module` is a Java class that represents a WebAssembly module. * @@ -22,12 +24,12 @@ public class Module { } private native long nativeModuleInstantiate(Module self, byte[] moduleBytes) throws RuntimeException; private native void nativeDrop(long modulePointer); - private native long nativeInstantiate(long modulePointer, Instance instance); + private native long nativeInstantiate(long modulePointer, Instance instance, long importsPointer); private static native boolean nativeValidate(byte[] moduleBytes); private native byte[] nativeSerialize(long modulePointer); private static native long nativeDeserialize(Module module, byte[] serializedBytes); - private long modulePointer; + protected long modulePointer; /** @@ -57,7 +59,11 @@ private Module() {} * Delete a module object pointer. */ public void close() { - this.nativeDrop(this.modulePointer); + // To avoid duplicate native dropping + if (this.modulePointer != 0l) { + this.nativeDrop(this.modulePointer); + this.modulePointer = 0l; + } } /** @@ -68,14 +74,18 @@ public void finalize() { this.close(); } + public Instance instantiate() { + return instantiate(Imports.from(Collections.emptyList(), this)); + } /** * Create an instance object based on a module object. * * @return Instance object. */ - public Instance instantiate() { + public Instance instantiate(Imports imports) { Instance instance = new Instance(); - long instancePointer = this.nativeInstantiate(this.modulePointer, instance); + + long instancePointer = this.nativeInstantiate(this.modulePointer, instance, imports.importsPointer); instance.instancePointer = instancePointer; instance.nativeInitializeExportedFunctions(instancePointer); diff --git a/src/java/org/wasmer/Type.java b/src/java/org/wasmer/Type.java new file mode 100644 index 0000000..2eb9c0c --- /dev/null +++ b/src/java/org/wasmer/Type.java @@ -0,0 +1,14 @@ +package org.wasmer; + +public enum Type { + I32((byte)1), + I64((byte)2), + F32((byte)3), + F64((byte)4); + + byte i; + + Type(byte i) { + this.i = i; + } +} diff --git a/src/lib.rs b/src/lib.rs index 1c377ba..a7a362a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,3 +4,4 @@ mod memory; mod module; mod types; mod value; +mod imports; diff --git a/src/memory.rs b/src/memory.rs index 20b9bb1..4ffc07e 100644 --- a/src/memory.rs +++ b/src/memory.rs @@ -8,8 +8,8 @@ use jni::{ JNIEnv, }; use std::{cell::Cell, panic, rc::Rc, slice}; -use wasmer_runtime::memory::MemoryView; -use wasmer_runtime::units::Pages; +use wasmer::MemoryView; +use wasmer::Pages; use wasmer::Memory as WasmMemory; #[derive(Clone)] diff --git a/src/module.rs b/src/module.rs index 6ff553e..4b7e540 100644 --- a/src/module.rs +++ b/src/module.rs @@ -3,6 +3,7 @@ use crate::{ instance::Instance, memory::Memory, types::{jptr, Pointer}, + imports::Imports, }; use jni::{ objects::{GlobalRef, JClass, JObject}, @@ -10,19 +11,21 @@ use jni::{ JNIEnv, }; use std::{collections::HashMap, panic, rc::Rc}; -use wasmer_runtime::{self as runtime, validate, Export}; -use wasmer_runtime::{cache::Artifact, imports, load_cache_with}; +use wasmer::{self as runtime, Extern, Engine as _}; +use wasmer_compiler_cranelift::Cranelift; +use wasmer_engine_universal::Universal as UniversalEngine; pub struct Module { #[allow(unused)] java_module_object: GlobalRef, - module: runtime::Module, + pub(crate) module: runtime::Module, } impl Module { fn new(java_module_object: GlobalRef, module_bytes: Vec) -> Result { + let store = runtime::Store::new(&UniversalEngine::new(Cranelift::default()).engine()); let module_bytes = module_bytes.as_slice(); - let module = runtime::compile(module_bytes) + let module = runtime::Module::new(&store, module_bytes) .map_err(|e| runtime_error(format!("Failed to compile the module: {}", e)))?; Ok(Self { @@ -32,16 +35,13 @@ impl Module { } fn serialize(&self) -> Result, Error> { - match self.module.cache() { - Ok(artifact) => match artifact.serialize() { - Ok(serialized_artifact) => Ok(serialized_artifact), - Err(_) => { - return Err(runtime_error(format!( - "Failed to serialize the module artifact." - ))) - } - }, - Err(_) => return Err(runtime_error(format!("Failed to get the module artifact."))), + match self.module.serialize() { + Ok(serialized_artifact) => Ok(serialized_artifact), + Err(_) => { + return Err(runtime_error(format!( + "Failed to serialize the module artifact." + ))) + } } } @@ -49,17 +49,9 @@ impl Module { java_module_object: GlobalRef, serialized_module: Vec, ) -> Result { - let module = match unsafe { Artifact::deserialize(serialized_module.as_slice()) } { - Ok(artifact) => { - match load_cache_with(artifact) { - Ok(module) => module, - Err(_) => { - return Err(runtime_error(format!( - "Failed to compile the serialized module." - ))) - } - } - } + let store = runtime::Store::new(&UniversalEngine::new(Cranelift::default()).engine()); + let module = match unsafe { runtime::Module::deserialize(&store, serialized_module.as_slice()) } { + Ok(module) => module, Err(_) => return Err(runtime_error(format!("Failed to deserialize the module."))), }; @@ -104,20 +96,22 @@ pub extern "system" fn Java_org_wasmer_Module_nativeInstantiate( _class: JClass, module_pointer: jptr, instance_object: JObject, + imports: jptr, ) -> jptr { let output = panic::catch_unwind(|| { let java_instance_object = env.new_global_ref(instance_object)?; let module: &Module = Into::>::into(module_pointer).borrow(); - let import_object = imports! {}; - let instance = module.module.instantiate(&import_object).map_err(|e| { + let imports: &Imports = Into::>::into(imports).borrow(); + let instance = runtime::Instance::new(&module.module, &imports.import_object).map_err(|e| { runtime_error(format!("Failed to instantiate a WebAssembly module: {}", e)) })?; let memories: HashMap = instance - .exports() + .exports + .iter() .filter_map(|(export_name, export)| match export { - Export::Memory(memory) => Some((export_name.to_string(), Memory::new(Rc::new(memory.clone())))), + Extern::Memory(memory) => Some((export_name.to_string(), Memory::new(Rc::new(memory.clone())))), _ => None, }) .collect(); @@ -141,9 +135,9 @@ pub extern "system" fn Java_org_wasmer_Module_nativeValidate( ) -> jboolean { let output = panic::catch_unwind(|| { let module_bytes = env.convert_byte_array(module_bytes)?; - match validate(module_bytes.as_slice()) { - true => Ok(1), - false => Ok(0), + match UniversalEngine::new(Cranelift::default()).engine().validate(module_bytes.as_slice()) { + Ok(()) => Ok(1), + Err(_) => Ok(0), } }); diff --git a/src/value.rs b/src/value.rs index 67adbcd..1c1fddb 100644 --- a/src/value.rs +++ b/src/value.rs @@ -1,7 +1,7 @@ use crate::exception::{runtime_error, Error}; -use jni::{errors::ErrorKind, objects::JObject, JNIEnv}; +use jni::{errors::Error as JNIError, objects::JObject, JNIEnv}; use std::convert::TryFrom; -use wasmer_runtime::Value as WasmValue; +use wasmer::Value as WasmValue; /// Value wrapping the real WebAssembly value. pub struct Value(WasmValue); @@ -22,7 +22,7 @@ impl TryFrom<(&JNIEnv<'_>, JObject<'_>)> for Value { fn try_from((env, jobject): (&JNIEnv, JObject)) -> Result { if jobject.is_null() { - return Err(ErrorKind::NullPtr("`try_from` receives a null object").into()); + return Err(JNIError::NullPtr("`try_from` receives a null object").into()); } Ok(Value( diff --git a/tests/java/org/wasmer/ImportsTest.java b/tests/java/org/wasmer/ImportsTest.java new file mode 100644 index 0000000..12a6d36 --- /dev/null +++ b/tests/java/org/wasmer/ImportsTest.java @@ -0,0 +1,131 @@ +package org.wasmer; + +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.net.URL; +import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.concurrent.atomic.AtomicReference; + +import static org.junit.jupiter.api.Assertions.*; + +class ImportsTest { + private byte[] getBytes(String name) throws IOException,Exception { + URL url = getClass().getClassLoader().getResource(name); + Path modulePath = Paths.get(url.toURI()); + return Files.readAllBytes(modulePath); + } + private String getString(Integer ptr, ByteBuffer mbf) { + StringBuilder sb = new StringBuilder(); + for(int i = ptr, max = mbf.limit(); i < max; i++) { + mbf.position(i); + byte b = mbf.get(); + if (b == 0) { + break; + } + sb.appendCodePoint(b); + } + String result = sb.toString(); + return result; + } + + @Test + void simple() throws IOException,Exception { + Module module = new Module(getBytes("import_simple.wasm")); + AtomicReference arg1r = new AtomicReference<>(); + AtomicReference arg2r = new AtomicReference<>(); + AtomicReference ret1r = new AtomicReference<>(); + Imports imports = Imports.from(Collections.singletonList( + new Imports.Spec("env", "mul_from_java", argv -> { + arg1r.set(argv.get(0)); + arg2r.set(argv.get(1)); + int arg1 = argv.get(0).intValue(); + int arg2 = argv.get(1).intValue(); + int ret1 = arg1 * arg2; + argv.set(0, ret1); + ret1r.set(argv.get(0)); + return argv; + }, Arrays.asList(Type.I32, Type.I32), Collections.singletonList(Type.I32)) + ), module); + Instance instance = module.instantiate(imports); + + Object[] ret = instance.exports.getFunction("double_each_arg_then_mul").apply(2, 3); + assertEquals(4, arg1r.get()); + assertEquals(6, arg2r.get()); + assertEquals(24, ret1r.get()); + assertEquals(1, ret.length); + assertEquals(24, ret[0]); + + instance.close(); + } + + @Test + void accessMemory() throws IOException,Exception { + HashMap msg = new HashMap<>(); + String msgKey1 = "key1"; + String msg1 = "World"; + String msgKey2 = "key2"; + String msg2 = "WebAssembly"; + msg.put(msgKey1, msg1); + msg.put(msgKey2, msg2); + + Module module = new Module(getBytes("import_accessmemory.wasm")); + AtomicReference arInstance = new AtomicReference<>(); + Imports imports = Imports.from(Arrays.asList( + new Imports.Spec("env", "get_greet_msg_len_from_java", argv -> { + Memory memory = arInstance.get().exports.getMemory("memory"); + int msgKeyPtr = argv.get(0).intValue(); + ByteBuffer mbf = memory.buffer(); + String msgKey = getString(msgKeyPtr, mbf); + argv.set(0, msgKey.length()); + return argv; + }, Collections.singletonList(Type.I32), Collections.singletonList(Type.I32)), + new Imports.Spec("env", "greet_from_java", argv -> { + Memory memory = arInstance.get().exports.getMemory("memory"); + int msgKeyPtr = argv.get(0).intValue(); + ByteBuffer mbf = memory.buffer(); + String msgKey = getString(msgKeyPtr, mbf); + String msgValue = msg.get(msgKey); + byte[] msgValueBytes = msgValue.getBytes(StandardCharsets.UTF_8); + int msgValuePtr = argv.get(1).intValue(); + mbf.position(msgValuePtr); + mbf.put(msgValueBytes); + return argv; + }, Arrays.asList(Type.I32, Type.I32), Collections.singletonList(Type.I32)) + ), module); + + Instance instance = module.instantiate(imports); + arInstance.set(instance); + + Memory memory = instance.exports.getMemory("memory"); + byte[] msgKey1Bytes = msgKey1.getBytes(StandardCharsets.UTF_8); + byte[] msgKey2Bytes = msgKey2.getBytes(StandardCharsets.UTF_8); + Integer msgKey1Ptr = (Integer) instance.exports.getFunction("allocate").apply(msgKey1Bytes.length)[0]; + Integer msgKey2Ptr = (Integer) instance.exports.getFunction("allocate").apply(msgKey2Bytes.length)[0]; + ByteBuffer mbf = memory.buffer(); + mbf.position(msgKey1Ptr); + mbf.put(msgKey1Bytes); + mbf.position(msgKey2Ptr); + mbf.put(msgKey2Bytes); + Integer ret1Ptr = (Integer) instance.exports.getFunction("greet").apply(msgKey1Ptr)[0]; + String ret1 = getString(ret1Ptr, mbf); + Integer ret2Ptr = (Integer) instance.exports.getFunction("greet").apply(msgKey2Ptr)[0]; + String ret2 = getString(ret2Ptr, mbf); + instance.exports.getFunction("deallocate").apply(msgKey1Ptr, msgKey1Bytes.length); + instance.exports.getFunction("drop_string").apply(ret1Ptr); + instance.exports.getFunction("deallocate").apply(msgKey2Ptr, msgKey2Bytes.length); + instance.exports.getFunction("drop_string").apply(ret2Ptr); + assertEquals("Hello, World!", ret1); + assertEquals("Hello, WebAssembly!", ret2); + + instance.close(); + module.close(); + } +} diff --git a/tests/resources/import_accessmemory.rs b/tests/resources/import_accessmemory.rs new file mode 100644 index 0000000..b84b9cb --- /dev/null +++ b/tests/resources/import_accessmemory.rs @@ -0,0 +1,50 @@ +use std::ffi::{CStr, CString}; +use std::mem; +use std::os::raw::{c_char, c_void}; + +extern { + fn get_greet_msg_len_from_java(msg_key_ptr: *mut c_char) -> i32; + fn greet_from_java(msg_key_ptr: *mut c_char, msg_ptr: *mut c_char) -> *mut c_char; +} + +#[no_mangle] +pub extern fn greet(msg_key_ptr: *mut c_char) -> *mut c_char { + let msg_len; + unsafe { + msg_len = get_greet_msg_len_from_java(msg_key_ptr) as usize; + } + let msg_ptr = allocate(msg_len) as *mut c_char; + unsafe { + greet_from_java(msg_key_ptr, msg_ptr); + } + let msg; + unsafe { + msg = CStr::from_ptr(msg_ptr).to_str().unwrap(); + } + let string = CString::new(format!("Hello, {}!", msg)).unwrap(); + deallocate(msg_ptr as *mut c_void, msg_len); + string.into_raw() +} + +#[no_mangle] +pub extern fn drop_string(ptr: *mut c_char) { + unsafe { + let _ = CString::from_raw(ptr); + } +} + +#[no_mangle] +pub extern fn allocate(size: usize) -> *mut c_void { + let mut buffer = Vec::with_capacity(size); + let ptr = buffer.as_mut_ptr(); + mem::forget(buffer); + + ptr as *mut c_void +} + +#[no_mangle] +pub extern fn deallocate(ptr: *mut c_void, capacity: usize) { + unsafe { + let _ = Vec::from_raw_parts(ptr, 0, capacity); + } +} \ No newline at end of file diff --git a/tests/resources/import_accessmemory.wasm b/tests/resources/import_accessmemory.wasm new file mode 100755 index 0000000..7f366db Binary files /dev/null and b/tests/resources/import_accessmemory.wasm differ diff --git a/tests/resources/import_simple.rs b/tests/resources/import_simple.rs new file mode 100644 index 0000000..4aa76a3 --- /dev/null +++ b/tests/resources/import_simple.rs @@ -0,0 +1,12 @@ +extern { + fn mul_from_java(x:i32, y: i32) -> i32; +} + +#[no_mangle] +pub extern fn double_each_arg_then_mul(x: i32, y: i32) -> i32 { + let x = x * 2; + let y = y * 2; + unsafe { + mul_from_java(x, y) + } +} diff --git a/tests/resources/import_simple.wasm b/tests/resources/import_simple.wasm new file mode 100755 index 0000000..8780b97 Binary files /dev/null and b/tests/resources/import_simple.wasm differ