From add49a1f8b8a4f508f965ca536452002a33f8558 Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Sun, 27 Feb 2022 22:09:54 +0100 Subject: [PATCH] fix #2: Crash when drawing zero sized line --- platform/Cargo.lock | 127 +++++++++++++++++++++++++++++++++++--- platform/Cargo.toml | 2 +- platform/bin/loader.wasm | Bin 1249 -> 1255 bytes platform/bin/platform.uw8 | Bin 2710 -> 2716 bytes platform/src/main.rs | 6 +- platform/src/platform.cwa | 11 +++- 6 files changed, 132 insertions(+), 14 deletions(-) diff --git a/platform/Cargo.lock b/platform/Cargo.lock index 1074a3b..0ef87ce 100644 --- a/platform/Cargo.lock +++ b/platform/Cargo.lock @@ -79,9 +79,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chumsky" -version = "0.5.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2d3efff85e8572b1c3fa0127706af58c4fff8458f8d9436d54b1e97573c7a3f" +checksum = "8d02796e4586c6c41aeb68eae9bfb4558a522c35f1430c14b40136c3706e09e4" dependencies = [ "ahash 0.3.8", ] @@ -146,14 +146,14 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" [[package]] name = "curlywas" version = "0.1.0" -source = "git+https://github.com/exoticorn/curlywas.git?rev=196719b#196719b35ef377cb7e001554b27ac5de013dcf2b" +source = "git+https://github.com/exoticorn/curlywas.git?rev=89638565#896385654ab2c089200920b6dea4abec641c88d6" dependencies = [ "anyhow", "ariadne", "chumsky", "pico-args", - "wasm-encoder", - "wasmparser", + "wasm-encoder 0.10.0", + "wasmparser 0.83.0", ] [[package]] @@ -197,6 +197,21 @@ dependencies = [ "ahash 0.7.6", ] +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "id-arena" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" + [[package]] name = "lazy_static" version = "1.4.0" @@ -227,6 +242,15 @@ dependencies = [ "rgb", ] +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -286,6 +310,24 @@ version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +dependencies = [ + "proc-macro2", +] + [[package]] name = "rgb" version = "0.8.31" @@ -304,6 +346,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "syn" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "time" version = "0.1.43" @@ -323,6 +376,18 @@ dependencies = [ "crunchy", ] +[[package]] +name = "unicode-segmentation" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + [[package]] name = "upkr" version = "0.1.0" @@ -342,8 +407,9 @@ dependencies = [ "pbr", "pico-args", "upkr", - "wasm-encoder", - "wasmparser", + "walrus", + "wasm-encoder 0.8.0", + "wasmparser 0.81.0", ] [[package]] @@ -352,6 +418,32 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +[[package]] +name = "walrus" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb08e48cde54c05f363d984bb54ce374f49e242def9468d2e1b6c2372d291f8" +dependencies = [ + "anyhow", + "id-arena", + "leb128", + "log", + "walrus-macro", + "wasmparser 0.77.0", +] + +[[package]] +name = "walrus-macro" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e5bd22c71e77d60140b0bd5be56155a37e5bd14e24f5f87298040d0cc40d7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" @@ -367,12 +459,33 @@ dependencies = [ "leb128", ] +[[package]] +name = "wasm-encoder" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9d9bf45fc46f71c407837c9b30b1e874197f2dc357588430b21e5017d290ab" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasmparser" +version = "0.77.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35c86d22e720a07d954ebbed772d01180501afe7d03d464f413bb5f8914a8d6" + [[package]] name = "wasmparser" version = "0.81.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98930446519f63d00a836efdc22f67766ceae8dbcc1571379f2bcabc6b2b9abc" +[[package]] +name = "wasmparser" +version = "0.83.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" + [[package]] name = "winapi" version = "0.3.9" diff --git a/platform/Cargo.toml b/platform/Cargo.toml index 12ec78c..a840f8d 100644 --- a/platform/Cargo.toml +++ b/platform/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -curlywas = { git="https://github.com/exoticorn/curlywas.git", rev="196719b" } +curlywas = { git="https://github.com/exoticorn/curlywas.git", rev="89638565" } uw8-tool = { path="../uw8-tool" } anyhow = "1" lodepng = "3.4" \ No newline at end of file diff --git a/platform/bin/loader.wasm b/platform/bin/loader.wasm index bf56884279bfd23db869adb4ba66bfd733d13910..12115ebf9069e6900664b41e8f9fa45976743ef6 100644 GIT binary patch delta 485 zcmVFaG&jvx0ry(j(;hkZzs zL343e?FZB!935tYc7eL&I~B~7AyA?e={fr9A8AfE;)^8JUsIEA;A4*2Ve?s_mv~Mccgz#2U|-V2*JJ23Pr*~ z@$A4H?TW?&bPKHuhM?yV!%-SYnILC-yjG-lI}&d-0Nk8Tuh!7ig(W^dKZxfQafCoQ=SyRN~mqtfV!`!CjLnf`?2^eOzV z!zo^WOXs!c3BunxkJK3Y#J9J{HzZyv`$%)yvFdp?)N=f4T(RJXfb&N(i#x>h3Uo8R z0eY`7n~ikr1!iuOnGNrl!<|VgXX|FM0xb}g7%0XX!2ey1rXXIEkY>XGNotVC#n4QO zeky+0L&>y$z>>oNEvG(`H2r@f5JYH$H_4FiAD0|5X*01L|lr;q;+Xq5O5T=xxUp@-tav|&&l8JJk`T++lm zO8)!z*#nGq=6FD{%_Gx5Ti9#+S!rIVBwr8NCv0wcBCAbi?1HabA)+CS9ERmkwh&LL z(q$}11T%}e5ezLhZ;Y@Vs%c!7M}#u&WTAZh2VqIbQ&74UVVAjVnx_QqP2R8#07MfZWR=gD>I$R8yd<`5h2q zE$s{i$>Ayz#GtY+%lmQm`3hf{3zBZLoJ5tFA`Vgr92$iVS5rj}X9Ssfdd(RQVI|#Y zhnUS&1H>M9{AzzTwjy)5pLG4i1Xa09tWnxBcXCgcUr^n_!(%o=B*nAJG*h0bW`8HW zfzMtag^b^=f8Pr7P}*QktoG6(F@EV?QBbS0&h(YYRobFpse5)eSGm;45U*uU6g6Qnn0N{R;YCT1rq4*hy2(L{V#hR;{N5r}E`ihavOm%|IE<(ggp z?Rt-7K+ck$#9~*hfwT8Q^M}H*fbWz-Mqz@Hi+Q~WnhekSVXaa!pR|P{s4q~ORjIXL V+=AKVBBmYo0uG#s%bq8kY5GDb=p6t6 diff --git a/platform/bin/platform.uw8 b/platform/bin/platform.uw8 index 5ae23fafecb1a6850b110809307e675ed012b734..b2aca007866b61b6006208f28cee4a28d0406468 100644 GIT binary patch delta 2660 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 M|1w;?TBAwuFnuIEVE_OC diff --git a/platform/src/main.rs b/platform/src/main.rs index c0809bb..747fa84 100644 --- a/platform/src/main.rs +++ b/platform/src/main.rs @@ -12,15 +12,15 @@ fn main() -> Result<()> { println!("Compiling loader module"); let loader = curlywas::compile_file("src/loader.cwa", curlywas::Options::default())?; - File::create("bin/loader.wasm")?.write_all(&loader)?; + File::create("bin/loader.wasm")?.write_all(&loader.wasm)?; - println!("Loader (including base module): {} bytes", loader.len()); + println!("Loader (including base module): {} bytes", loader.wasm.len()); println!("Compiling platform module"); let platform = curlywas::compile_file("src/platform.cwa", curlywas::Options::default())?; println!("Compressing platform module"); let platform = uw8_tool::pack( - &platform, + &platform.wasm, &uw8_tool::PackConfig::default().with_compression_level(4), )?; File::create("bin/platform.uw8")?.write_all(&platform)?; diff --git a/platform/src/platform.cwa b/platform/src/platform.cwa index 67ef63e..8cc97bc 100644 --- a/platform/src/platform.cwa +++ b/platform/src/platform.cwa @@ -256,6 +256,11 @@ export fn line(x1: f32, y1: f32, x2: f32, y2: f32, col: i32) { p = y1; } + if max_axis == 0 as f32 { + setPixel(x1 as i32, y1 as i32, col); + return; + } + let steps = floor(p + max_axis) as i32 - floor(p) as i32; p = floor(p) + 0.5 - p; if max_axis < 0 as f32 { @@ -267,7 +272,7 @@ export fn line(x1: f32, y1: f32, x2: f32, y2: f32, col: i32) { dy = dy / max_axis; let f = min(max_axis, max(0 as f32, p)); - setPixel((x1 + f * dx) as i32, (y1 + f * dy) as i32, col); + setPixel(i32.trunc_sat_f32_s(x1 + f * dx), i32.trunc_sat_f32_s(y1 + f * dy), col); if !steps { return; @@ -280,7 +285,7 @@ export fn line(x1: f32, y1: f32, x2: f32, y2: f32, col: i32) { loop pixels { if steps := steps - 1 { - setPixel(x1 as i32, y1 as i32, col); + setPixel(i32.trunc_sat_f32_s(x1), i32.trunc_sat_f32_s(y1), col); x1 = x1 + dx; y1 = y1 + dy; branch pixels; @@ -288,7 +293,7 @@ export fn line(x1: f32, y1: f32, x2: f32, y2: f32, col: i32) { } f = min(max_axis, p) - p; - setPixel((x1 + f * dx) as i32, (y1 + f * dy) as i32, col); + setPixel(i32.trunc_sat_f32_s(x1 + f * dx), i32.trunc_sat_f32_s(y1 + f * dy), col); } //////////