Fork of daniellemaywood.uk/gleam — Wasm codegen work
2

Configure Feed

Select the types of activity you want to include in your feed.

improve float division on js

+95 -32
+4
CHANGELOG.md
··· 230 230 compiler. 231 231 ([Giacomo Cavalieri](https://github.com/giacomocavalieri)) 232 232 233 + - The code generated for floating point division on the JavaScript target has 234 + been improved to avoid performing needless checks. 235 + ([Giacomo Cavalieri](https://github.com/giacomocavalieri)) 236 + 233 237 ### Build tool 234 238 235 239 - `gleam update`, `gleam deps update`, and `gleam deps download` will now print
+13 -4
compiler-core/src/javascript/expression.rs
··· 1455 1455 } 1456 1456 1457 1457 fn div_float(&mut self, left: &'a TypedExpr, right: &'a TypedExpr) -> Document<'a> { 1458 - let left = 1458 + let left_doc = 1459 1459 self.not_in_tail_position(Some(Ordering::Strict), |this| this.child_expression(left)); 1460 - let right = 1460 + let right_doc = 1461 1461 self.not_in_tail_position(Some(Ordering::Strict), |this| this.child_expression(right)); 1462 - self.tracker.float_division_used = true; 1463 - docvec!["divideFloat", wrap_arguments([left, right])] 1462 + 1463 + if right.non_zero_compile_time_number() { 1464 + if let TypedExpr::BinOp { .. } = left { 1465 + docvec![left_doc.surround("(", ")"), " / ", right_doc] 1466 + } else { 1467 + docvec![left_doc, " / ", right_doc] 1468 + } 1469 + } else { 1470 + self.tracker.float_division_used = true; 1471 + docvec!["divideFloat", wrap_arguments([left_doc, right_doc])] 1472 + } 1464 1473 } 1465 1474 1466 1475 fn equal(
+27
compiler-core/src/javascript/tests/numbers.rs
··· 430 430 " 431 431 ); 432 432 } 433 + 434 + #[test] 435 + fn division_by_zero_float() { 436 + assert_js!( 437 + "pub fn main() { 438 + 1.1 /. 0.0 439 + }" 440 + ) 441 + } 442 + 443 + #[test] 444 + fn division_by_non_zero_float() { 445 + assert_js!( 446 + "pub fn main() { 447 + 1.1 /. 2.3 448 + }" 449 + ) 450 + } 451 + 452 + #[test] 453 + fn complex_division_by_non_zero_float() { 454 + assert_js!( 455 + "pub fn main() { 456 + { 1.1 +. 2.0 } /. 2.3 457 + }" 458 + ) 459 + }
+13
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__complex_division_by_non_zero_float.snap
··· 1 + --- 2 + source: compiler-core/src/javascript/tests/numbers.rs 3 + expression: "pub fn main() {\n { 1.1 +. 2.0 } /. 2.3\n}" 4 + --- 5 + ----- SOURCE CODE 6 + pub fn main() { 7 + { 1.1 +. 2.0 } /. 2.3 8 + } 9 + 10 + ----- COMPILED JAVASCRIPT 11 + export function main() { 12 + return (1.1 + 2.0) / 2.3; 13 + }
+13
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__division_by_non_zero_float.snap
··· 1 + --- 2 + source: compiler-core/src/javascript/tests/numbers.rs 3 + expression: "pub fn main() {\n 1.1 /. 2.3\n}" 4 + --- 5 + ----- SOURCE CODE 6 + pub fn main() { 7 + 1.1 /. 2.3 8 + } 9 + 10 + ----- COMPILED JAVASCRIPT 11 + export function main() { 12 + return 1.1 / 2.3; 13 + }
+15
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__division_by_zero_float.snap
··· 1 + --- 2 + source: compiler-core/src/javascript/tests/numbers.rs 3 + expression: "pub fn main() {\n 1.1 /. 0.0\n}" 4 + --- 5 + ----- SOURCE CODE 6 + pub fn main() { 7 + 1.1 /. 0.0 8 + } 9 + 10 + ----- COMPILED JAVASCRIPT 11 + import { divideFloat } from "../gleam.mjs"; 12 + 13 + export function main() { 14 + return divideFloat(1.1, 0.0); 15 + }
+8 -15
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__float_divide_complex_expr.snap
··· 1 1 --- 2 2 source: compiler-core/src/javascript/tests/numbers.rs 3 - assertion_line: 121 4 3 expression: "\npub fn go() {\n case 1.0 >=. 0.0 {\n True -> 2.0\n False -> 4.0\n } /. 2.0\n}\n" 5 - snapshot_kind: text 6 4 --- 7 5 ----- SOURCE CODE 8 6 ··· 15 13 16 14 17 15 ----- COMPILED JAVASCRIPT 18 - import { divideFloat } from "../gleam.mjs"; 19 - 20 16 export function go() { 21 - return divideFloat( 22 - (() => { 23 - let $ = 1.0 >= 0.0; 24 - if ($) { 25 - return 2.0; 26 - } else { 27 - return 4.0; 28 - } 29 - })(), 30 - 2.0 31 - ); 17 + return (() => { 18 + let $ = 1.0 >= 0.0; 19 + if ($) { 20 + return 2.0; 21 + } else { 22 + return 4.0; 23 + } 24 + })() / 2.0; 32 25 }
+1 -5
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__float_operators.snap
··· 1 1 --- 2 2 source: compiler-core/src/javascript/tests/numbers.rs 3 - assertion_line: 102 4 3 expression: "\npub fn go() {\n 1.0 +. 1.4 // => 2.4\n 5.0 -. 1.5 // => 3.5\n 5.0 /. 2.0 // => 2.5\n 3.0 *. 3.1 // => 9.3\n\n 2.0 >. 1.0 // => True\n 2.0 <. 1.0 // => False\n 2.0 >=. 1.0 // => True\n 2.0 <=. 1.0 // => False\n}\n" 5 - snapshot_kind: text 6 4 --- 7 5 ----- SOURCE CODE 8 6 ··· 20 18 21 19 22 20 ----- COMPILED JAVASCRIPT 23 - import { divideFloat } from "../gleam.mjs"; 24 - 25 21 export function go() { 26 22 1.0 + 1.4; 27 23 5.0 - 1.5; 28 - divideFloat(5.0, 2.0); 24 + 5.0 / 2.0; 29 25 3.0 * 3.1; 30 26 2.0 > 1.0; 31 27 2.0 < 1.0;
+1 -8
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__numbers__wide_float_div.snap
··· 1 1 --- 2 2 source: compiler-core/src/javascript/tests/numbers.rs 3 - assertion_line: 135 4 3 expression: "\npub fn go() {\n 111111111111111111111111111111. /. 22222222222222222222222222222222222.\n}\n" 5 - snapshot_kind: text 6 4 --- 7 5 ----- SOURCE CODE 8 6 ··· 12 10 13 11 14 12 ----- COMPILED JAVASCRIPT 15 - import { divideFloat } from "../gleam.mjs"; 16 - 17 13 export function go() { 18 - return divideFloat( 19 - 111111111111111111111111111111., 20 - 22222222222222222222222222222222222. 21 - ); 14 + return 111111111111111111111111111111. / 22222222222222222222222222222222222.; 22 15 }