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

Configure Feed

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

use instanceof checks to check lists are empty in decision tree

+58 -30
+10
compiler-core/src/javascript.rs
··· 134 134 self.register_prelude_usage(&mut imports, "toList", None); 135 135 }; 136 136 137 + if self.tracker.list_empty_class_used { 138 + self.register_prelude_usage(&mut imports, "Empty", Some("$Empty")); 139 + }; 140 + 141 + if self.tracker.list_non_empty_class_used { 142 + self.register_prelude_usage(&mut imports, "NonEmpty", Some("$NonEmpty")); 143 + }; 144 + 137 145 if self.tracker.prepend_used { 138 146 self.register_prelude_usage(&mut imports, "prepend", Some("listPrepend")); 139 147 }; ··· 838 846 pub(crate) struct UsageTracker { 839 847 pub ok_used: bool, 840 848 pub list_used: bool, 849 + pub list_empty_class_used: bool, 850 + pub list_non_empty_class_used: bool, 841 851 pub prepend_used: bool, 842 852 pub error_used: bool, 843 853 pub int_remainder_used: bool,
+8 -2
compiler-core/src/javascript/decision.rs
··· 376 376 377 377 docvec![var_value, " instanceof ", qualification, match_.name()] 378 378 } 379 - RuntimeCheck::NonEmptyList { .. } => docvec!["!", var_value, ".hasLength(0)"], 380 - RuntimeCheck::EmptyList => docvec![var_value, ".hasLength(0)"], 379 + RuntimeCheck::NonEmptyList { .. } => { 380 + self.expression_generator.tracker.list_non_empty_class_used = true; 381 + docvec![var_value, " instanceof $NonEmpty"] 382 + } 383 + RuntimeCheck::EmptyList => { 384 + self.expression_generator.tracker.list_empty_class_used = true; 385 + docvec![var_value, " instanceof $Empty"] 386 + } 381 387 } 382 388 } 383 389
+3 -3
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case__case_branches_guards_are_wrapped_in_parentheses.snap
··· 13 13 14 14 15 15 ----- COMPILED JAVASCRIPT 16 - import { toList } from "../gleam.mjs"; 16 + import { toList, Empty as $Empty } from "../gleam.mjs"; 17 17 18 18 function anything() { 19 19 while (true) { 20 20 let $ = toList([]); 21 - if ($.hasLength(0)) { 21 + if ($ instanceof $Empty) { 22 22 23 23 } else { 24 24 let pattern = $.tail; 25 - if (pattern.hasLength(0)) { 25 + if (pattern instanceof $Empty) { 26 26 if (false || true) { 27 27 let a = $.head; 28 28 return a;
+5 -3
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case__guard_variable_only_brought_into_scope_when_needed.snap
··· 15 15 16 16 17 17 ----- COMPILED JAVASCRIPT 18 + import { Empty as $Empty } from "../gleam.mjs"; 19 + 18 20 function go(x) { 19 - if (x.hasLength(0)) { 21 + if (x instanceof $Empty) { 20 22 return 2; 21 23 } else { 22 24 let pattern = x.tail; 23 - if (pattern.hasLength(0)) { 25 + if (pattern instanceof $Empty) { 24 26 return 2; 25 27 } else { 26 28 let pattern$1 = pattern.tail; 27 - if (pattern$1.hasLength(0)) { 29 + if (pattern$1 instanceof $Empty) { 28 30 let a = x.head; 29 31 if (a === 1) { 30 32 let b = pattern.head;
+5 -5
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case__nested_string_prefix_match.snap
··· 13 13 14 14 15 15 ----- COMPILED JAVASCRIPT 16 - import { Ok, toList } from "../gleam.mjs"; 16 + import { Ok, toList, Empty as $Empty } from "../gleam.mjs"; 17 17 18 18 function main() { 19 19 let $ = new Ok(toList(["a", "b c", "d"])); 20 20 let pattern = $[0]; 21 - if (pattern.hasLength(0)) { 21 + if (pattern instanceof $Empty) { 22 22 return 1; 23 23 } else { 24 24 let pattern$1 = pattern.tail; 25 - if (pattern$1.hasLength(0)) { 25 + if (pattern$1 instanceof $Empty) { 26 26 return 1; 27 27 } else { 28 28 let pattern$2 = pattern$1.tail; 29 - if (pattern$2.hasLength(0)) { 29 + if (pattern$2 instanceof $Empty) { 30 30 return 1; 31 31 } else { 32 32 let pattern$3 = pattern$2.tail; 33 - if (pattern$3.hasLength(0)) { 33 + if (pattern$3 instanceof $Empty) { 34 34 let pattern$4 = pattern$2.head; 35 35 if (pattern$4 === "d") { 36 36 let pattern$5 = pattern$1.head;
+4 -4
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case__nested_string_prefix_match_that_would_crash_on_js.snap
··· 13 13 14 14 15 15 ----- COMPILED JAVASCRIPT 16 - import { Ok, toList } from "../gleam.mjs"; 16 + import { Ok, toList, Empty as $Empty } from "../gleam.mjs"; 17 17 18 18 function main() { 19 19 let $ = new Ok(toList(["b c", "d"])); 20 20 let pattern = $[0]; 21 - if (pattern.hasLength(0)) { 21 + if (pattern instanceof $Empty) { 22 22 return 1; 23 23 } else { 24 24 let pattern$1 = pattern.tail; 25 - if (pattern$1.hasLength(0)) { 25 + if (pattern$1 instanceof $Empty) { 26 26 return 1; 27 27 } else { 28 28 let pattern$2 = pattern$1.tail; 29 - if (pattern$2.hasLength(0)) { 29 + if (pattern$2 instanceof $Empty) { 30 30 let pattern$3 = pattern$1.head; 31 31 if (pattern$3 === "d") { 32 32 let pattern$4 = pattern.head;
+5 -3
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__alternative_patterns_assignment.snap
··· 12 12 13 13 14 14 ----- COMPILED JAVASCRIPT 15 + import { Empty as $Empty } from "../gleam.mjs"; 16 + 15 17 export function main(xs) { 16 - if (xs.hasLength(0)) { 18 + if (xs instanceof $Empty) { 17 19 return 1; 18 20 } else { 19 21 let pattern = xs.tail; 20 - if (pattern.hasLength(0)) { 22 + if (pattern instanceof $Empty) { 21 23 let x = xs.head; 22 24 return x; 23 25 } else { 24 26 let pattern$1 = pattern.tail; 25 - if (pattern$1.hasLength(0)) { 27 + if (pattern$1 instanceof $Empty) { 26 28 let x = pattern.head; 27 29 return x; 28 30 } else {
+5 -3
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__alternative_patterns_guard.snap
··· 12 12 13 13 14 14 ----- COMPILED JAVASCRIPT 15 + import { Empty as $Empty } from "../gleam.mjs"; 16 + 15 17 export function main(xs) { 16 - if (xs.hasLength(0)) { 18 + if (xs instanceof $Empty) { 17 19 return 0; 18 20 } else { 19 21 let pattern = xs.tail; 20 - if (pattern.hasLength(0)) { 22 + if (pattern instanceof $Empty) { 21 23 let x = xs.head; 22 24 if (x === 1) { 23 25 return x; ··· 26 28 } 27 29 } else { 28 30 let pattern$1 = pattern.tail; 29 - if (pattern$1.hasLength(0)) { 31 + if (pattern$1 instanceof $Empty) { 30 32 let x = pattern.head; 31 33 if (x === 1) { 32 34 return x;
+5 -3
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__case_clause_guards__alternative_patterns_list.snap
··· 12 12 13 13 14 14 ----- COMPILED JAVASCRIPT 15 + import { Empty as $Empty } from "../gleam.mjs"; 16 + 15 17 export function main(xs) { 16 - if (xs.hasLength(0)) { 18 + if (xs instanceof $Empty) { 17 19 return 1; 18 20 } else { 19 21 let pattern = xs.tail; 20 - if (pattern.hasLength(0)) { 22 + if (pattern instanceof $Empty) { 21 23 let pattern$1 = xs.head; 22 24 if (pattern$1 === 1) { 23 25 return 0; ··· 26 28 } 27 29 } else { 28 30 let pattern$1 = pattern.tail; 29 - if (pattern$1.hasLength(0)) { 31 + if (pattern$1 instanceof $Empty) { 30 32 let pattern$2 = pattern.head; 31 33 if (pattern$2 === 2) { 32 34 let pattern$3 = xs.head;
+3 -1
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__functions__tail_call.snap
··· 13 13 14 14 15 15 ----- COMPILED JAVASCRIPT 16 + import { Empty as $Empty } from "../gleam.mjs"; 17 + 16 18 export function count(loop$xs, loop$n) { 17 19 while (true) { 18 20 let xs = loop$xs; 19 21 let n = loop$n; 20 - if (xs.hasLength(0)) { 22 + if (xs instanceof $Empty) { 21 23 return n; 22 24 } else { 23 25 let xs$1 = xs.tail;
+5 -3
compiler-core/src/javascript/tests/snapshots/gleam_core__javascript__tests__lists__case.snap
··· 15 15 16 16 17 17 ----- COMPILED JAVASCRIPT 18 + import { Empty as $Empty } from "../gleam.mjs"; 19 + 18 20 function go(xs) { 19 - if (xs.hasLength(0)) { 21 + if (xs instanceof $Empty) { 20 22 return 0; 21 23 } else { 22 24 let pattern = xs.tail; 23 - if (pattern.hasLength(0)) { 25 + if (pattern instanceof $Empty) { 24 26 return 1; 25 27 } else { 26 28 let pattern$1 = pattern.tail; 27 - if (pattern$1.hasLength(0)) { 29 + if (pattern$1 instanceof $Empty) { 28 30 return 2; 29 31 } else { 30 32 return 9999;