compiler/ lib/ scripts/ seed/ sublime/ test/ tests/ generic.module/ generic.trait.cross.module/ generic.trait.nominal.identity/ wildcard.import.owner/ abi.sizes.rad 3.4 KiB addfn.rad 52 B addfn.ril 76 B aggregate.return.rad 4.1 KiB arith.assignment.rad 631 B arith.basic.rad 191 B arith.modulo.rad 111 B arith.subword.rad 3.9 KiB arith.subword.ril 4.3 KiB arith.sum.rad 192 B arith.w64.rad 4.1 KiB arith.w64.ril 5.2 KiB array.aggregate.stride.rad 753 B array.aggregate.stride.ril 1.1 KiB array.assign.rad 225 B array.assign.ril 526 B array.bounds.check.rad 321 B array.fn.assign.rad 265 B array.index.assign.rad 422 B array.index.rad 280 B array.index.ril 496 B array.len.const.rad 348 B array.len.const.ril 200 B array.length.rad 285 B array.literal.rad 136 B array.literal.ril 329 B array.math.rad 1.2 KiB array.nested.assign.rad 327 B array.nested.rad 325 B array.nested.ril 922 B array.record.elements.rad 1.7 KiB array.repeat.edge.rad 548 B array.repeat.rad 828 B array.repeat.ril 3.0 KiB array.return.rad 345 B array.slice.empty.rad 123 B array.slice.full.rad 110 B array.slice.full.ril 168 B array.slice.gen.end.rad 141 B array.slice.gen.index.rad 154 B array.slice.gen.open.rad 140 B array.slice.gen.start.end.rad 142 B array.slice.gen.start.rad 141 B array.slice.openend.rad 134 B array.slice.openend.ril 351 B array.slice.openstart.rad 134 B array.slice.openstart.ril 289 B array.slice.rad 774 B as.precedence.rad 226 B asm.basic.text.program.ras 187 B asm.branch.comparisons.ras 648 B asm.call.return.flow.ras 203 B asm.compare.set.logic.ras 611 B asm.csr.system.instructions.ras 221 B asm.data.directives.ras 439 B asm.data.symbol.fixup.ras 227 B asm.directive.boundary.values.ras 809 B asm.fence.ras 76 B asm.global.scoped.symbols.ras 207 B asm.instruction.matrix.alu.ras 566 B asm.instruction.matrix.mem.control.ras 355 B asm.instruction.matrix.system.ras 115 B asm.label.fixups.ras 235 B asm.li.expressions.ras 212 B asm.link.rad 103 B asm.link.ras 85 B asm.load.store.widths.ras 711 B asm.mul.div.rem.ras 769 B asm.rodata.prefix.rad 226 B asm.rodata.prefix.ras 163 B asm.scoped.symbols.la.ras 147 B asm.scoped.symbols.tail.ras 157 B asm.section.switching.ras 173 B asm.space.constant.expressions.ras 358 B asm.string.directive.lists.ras 326 B asm.word.dword.constants.ras 372 B asm.word.shift.ops.ras 870 B assert.basic.rad 402 B assert.basic.ril 624 B assert.fail.rad 138 B assert.false.rad 140 B assert.message.rad 123 B assert.message.ril 141 B assert.true.rad 115 B assign.loop.rad 213 B assign.loop.ril 242 B assign.multi.var.rad 194 B assign.multi.var.ril 73 B assign.mutable.rad 6.3 KiB assign.param.rad 150 B assign.param.ril 96 B assign.rad 156 B assign.self.ref.rad 161 B assign.self.ref.ril 92 B assign.sequential.rad 163 B assign.sequential.ril 52 B assign.shadow.mutable.rad 489 B assign.use.intermediate.rad 191 B assign.use.intermediate.ril 99 B average.rad 189 B average.ril 378 B binop.arith.rad 479 B binop.arith.ril 389 B binop.bitwise.rad 1.2 KiB binop.bitwise.ril 1.2 KiB binop.cmp.rad 441 B binop.logical.rad 216 B binop.logical.ril 373 B binop.shift.rad 197 B binop.shift.ril 149 B binop.unsigned.rad 317 B binop.unsigned.ril 236 B bool.comparison.array.rad 688 B bool.comparison.nested.gen.rad 1.0 KiB bool.comparison.opt.rad 905 B bool.comparison.record.gen.rad 1.0 KiB bool.comparison.record.rad 1.1 KiB bool.comparison.slice.gen.rad 157 B bool.comparison.slice.rad 4.1 KiB bool.comparison.slice.record.gen.rad 2.0 KiB bool.comparison.slice.union.gen.rad 2.5 KiB bool.comparison.union.ctor.rad 705 B bool.comparison.union.gen.rad 1.2 KiB bool.comparison.union.record.gen.rad 1.5 KiB bool.comparison.union.simple.gen.rad 296 B bool.operators.complex.rad 384 B bool.operators.rad 831 B bool.short.circuit.rad 2.3 KiB bool.simple.rad 209 B bool.values.rad 787 B builtin.alignof.rad 692 B builtin.alignof.ril 287 B builtin.memory.fence.rad 108 B builtin.size.align.rad 1.2 KiB builtin.sizeof.rad 650 B builtin.sizeof.ril 282 B builtin.sliceof.invalid.cap.rad 250 B builtin.sliceof.mut.rad 653 B builtin.sliceof.rad 521 B byte.load.store.rad 380 B byte.load.store.ril 730 B call.aggregate.arg.snapshot.rad 514 B call.arg.clobber.rad 732 B call.basic.rad 256 B call.clobber.rad 481 B call.tests.rad 764 B call.tests.ril 603 B cast.basic.rad 848 B cast.basic.ril 594 B cast.narrow.rad 583 B cast.narrow.ril 557 B cast.same.size.rad 1.0 KiB cast.same.size.ril 1.1 KiB casting.numbers.rad 1.5 KiB char.literal.rad 180 B cmp.rel.rad 733 B cmp.rel.ril 467 B cmp.unsigned.rad 733 B cmp.unsigned.ril 467 B coercion.implicit.rad 917 B coercion.implicit.ril 1.1 KiB compare.literal.first.u64.rad 301 B compound.assign.field.rad 312 B compound.assign.index.once.rad 431 B compound.assign.rad 1.2 KiB compound.assign.ril 2.0 KiB cond.assign.merge.basic.rad 221 B cond.assign.merge.basic.ril 172 B cond.assign.merge.rad 214 B cond.assign.merge.ril 169 B cond.assign.rad 766 B cond.elseif.rad 204 B cond.elseif.ril 181 B cond.expr.aggregate.rad 1.2 KiB cond.expr.literal-first.rad 326 B cond.expr.rad 1.9 KiB cond.expr.ril 3.5 KiB cond.for.else.break.rad 349 B cond.for.indexed.rad 257 B cond.for.rad 184 B cond.for.range.indexed.rad 549 B cond.for.range.rad 190 B cond.for.unsigned.range.rad 671 B cond.forever.break.continue.rad 201 B cond.forever.break.rad 255 B cond.fused.rad 941 B cond.if.case.rad 2.2 KiB cond.if.else.min.rad 158 B cond.if.else.rad 244 B cond.if.elseif.rad 443 B cond.if.noelse.rad 139 B cond.if.rad 880 B cond.ifelse.rad 104 B cond.ifelse.ril 117 B cond.iflet.case.rad 170 B cond.iflet.case.ril 114 B cond.iflet.guard.rad 182 B cond.iflet.guard.ril 165 B cond.iflet.mut.rad 195 B cond.iflet.mut.ril 217 B cond.iflet.noelse.rad 156 B cond.iflet.noelse.ril 225 B cond.iflet.optional.rad 184 B cond.iflet.optional.ril 118 B cond.iflet.optional.value.rad 194 B cond.iflet.optional.value.ril 206 B cond.letelse.case.rad 146 B cond.letelse.case.ril 149 B cond.letelse.guard.rad 160 B cond.letelse.guard.ril 200 B cond.letelse.mut.rad 185 B cond.letelse.mut.ril 252 B cond.letelse.optional.rad 160 B cond.letelse.optional.ril 153 B cond.match.fallthrough.rad 388 B cond.match.guard.rad 1.4 KiB cond.match.guard.regalloc.rad 1.4 KiB cond.nested.rad 138 B cond.nested.ril 185 B cond.simple.rad 86 B cond.simple.ril 118 B cond.while.else.break.rad 305 B cond.while.rad 138 B const-cast-wrap.rad 450 B const-expr-array-size.rad 365 B const-expr-cast.rad 1.1 KiB const-expr-literal.rad 652 B const-expr-refs.rad 752 B const.array.copy.mutate.rad 397 B const.array.ident.rad 247 B const.array.ident.ril 146 B const.array.rad 217 B const.array.record.ident.rad 390 B const.array.record.ident.ril 353 B const.array.repeat.record.rad 219 B const.array.repeat.record.ril 399 B const.array.repeat.string.slice.rad 303 B const.array.repeat.string.slice.ril 1.1 KiB const.array.ril 392 B const.array.strings.slice.rad 274 B const.array.strings.slice.ril 579 B const.basic.rad 349 B const.char.rad 180 B const.fn.array.rad 670 B const.i32.shift.right.rad 244 B const.local.duplicate.rad 474 B const.local.duplicate.ril 787 B const.negative.rad 331 B const.negative.ril 338 B const.record.array.rad 1.2 KiB const.record.array.simple.rad 553 B const.record.ctor.rad 188 B const.record.ctor.ril 415 B const.record.fn.rad 356 B const.record.mutcopy.rad 460 B const.record.mutcopy.ril 385 B const.record.nested.rad 396 B const.record.nested.ril 474 B const.record.packed.rad 269 B const.record.packed.ril 284 B const.record.padded.rad 269 B const.record.padded.ril 318 B const.record.rad 200 B const.record.ril 221 B const.record.union.rad 596 B const.record.union.ril 673 B const.scalar.rad 105 B const.scalar.ril 82 B const.shift.negative.count.rad 305 B const.slice.of.slices.rad 238 B const.slice.of.slices.ril 956 B const.slice.param.rad 336 B const.string.rad 114 B const.string.ril 309 B const.string.scoped.names.rad 263 B const.string.scoped.names.ril 904 B const.u32.shift.mask.rad 249 B const.u64.compare.rad 188 B const.u64.divide.rad 174 B const.union.payload.ctor.rad 367 B const.union.payload.ctor.ril 507 B const.union.payload.fn.array.rad 1.0 KiB const.union.payload.record.array.rad 1.5 KiB const.union.record.literal.rad 377 B const.union.record.literal.ril 506 B data.array.rad 803 B data.bool.rad 237 B data.i16.rad 288 B data.i32.rad 308 B data.i8.rad 275 B data.record.rad 585 B data.simple.rad 454 B data.u16.rad 244 B data.u32.rad 264 B data.u8.rad 232 B data.union.rad 919 B debug.tag.rad 557 B div.u8.immediate.wrap.rad 213 B ecall.i64.rad 490 B edge.cases.2.rad 355 B edge.cases.3.rad 600 B edge.cases.4.rad 1.2 KiB edge.cases.5.rad 1.1 KiB edge.cases.6.rad 2.6 KiB edge.cases.7.addr.bug.rad 232 B edge.cases.8.bug.rad 527 B edge.cases.rad 241 B error.basic.rad 174 B error.catch.rad 1.6 KiB error.catch.return.rad 403 B error.catch.return.ril 634 B error.division.zero.rad 164 B error.modulo.zero.rad 162 B error.multi.basic.rad 699 B error.multi.catch.rad 807 B error.multi.catch.typed.binding.rad 818 B error.multi.catch.typed.catchall.rad 1.0 KiB error.multi.catch.typed.rad 1.1 KiB error.multi.propagate.multi.rad 988 B error.multi.propagate.rad 852 B error.multi.try.optional.rad 522 B error.slice.bounds.rad 219 B error.throw.coercion.rad 318 B error.try.bang.success.rad 370 B error.try.catch.binding.rad 2.0 KiB error.try.optional.rad 1.9 KiB error.try.rad 4.0 KiB extern.inferred.rad 70 B externfn.rad 32 B externfn.ril 37 B fibonacci.rad 122 B fibonacci.ril 247 B field.aggregate.rad 793 B field.aggregate.ril 782 B fn.block.scope.rad 508 B fn.callback.nested.rad 1.2 KiB fn.default.rad 146 B fn.local.rad 155 B fn.ptr.assign.rad 277 B fn.ptr.assign.ril 143 B fn.ptr.call.rad 258 B fn.ptr.call.ril 183 B fn.ptr.param.rad 356 B fn.ptr.param.ril 282 B fn.recursion.2.rad 239 B fn.void.rad 165 B for.else.continue.rad 1.1 KiB frame.large.rad 586 B generic.bound.dispatch.rad 531 B generic.bound.dispatch.ril 603 B generic.constant.dependency.rad 365 B generic.constant.dependency.ril 259 B generic.constant.rad 795 B generic.constant.ril 438 B generic.constant.union.rad 278 B generic.constant.union.ril 80 B generic.function.call.rad 1.1 KiB generic.function.graph.rad 1.1 KiB generic.function.graph.ril 1.2 KiB generic.function.rad 1.5 KiB generic.function.ril 2.4 KiB generic.module.rad 231 B generic.nested.rad 555 B generic.record.rad 421 B generic.record.ril 217 B generic.recursive.rad 363 B generic.template.rad 715 B generic.trait.cross.module.rad 201 B generic.trait.nominal.identity.rad 418 B generic.trait.self.rad 1023 B generic.union.rad 384 B if-let-mut.rad 1.2 KiB iflet.shadow.else.rad 408 B iflet.shadow.leak.rad 317 B index.eval.order.rad 368 B index.u8.rad 594 B int.default.i64.rad 1.1 KiB integer.bitwise.basic.rad 708 B integer.overflow.rad 1.8 KiB intrinsic.ebreak.rad 90 B intrinsic.ebreak.ril 76 B intrinsic.ecall.rad 168 B intrinsic.ecall.ril 131 B large.blit.store.rad 2.1 KiB let.copy.semantics.rad 871 B let.copy.semantics.ril 879 B let.guard.rad 1.9 KiB let.placeholder.rad 291 B let.placeholder.ril 220 B linear.let-else.rad 402 B linear.ownership.rad 374 B linear.ownership.ril 353 B linear.reference.rad 642 B linear.reference.ril 623 B linear.unsafe.rad 532 B linear.unsafe.ril 286 B literal.char.rad 209 B literal.char.ril 127 B literal.slice.bytes.rad 124 B literal.slice.bytes.ril 263 B literal.slice.dedup.rad 199 B literal.slice.dedup.ril 434 B literal.slice.empty.rad 100 B literal.slice.empty.ril 157 B literal.slice.multi.rad 170 B literal.slice.multi.ril 496 B literal.slice.rad 123 B literal.slice.record.rad 211 B literal.slice.record.ril 694 B literal.slice.ril 272 B literal.string.dedup.rad 179 B literal.string.dedup.ril 422 B literal.string.empty.rad 93 B literal.string.empty.ril 248 B literal.string.fns.rad 180 B literal.string.fns.ril 470 B literal.string.multi.rad 153 B literal.string.multi.ril 480 B literal.string.rad 108 B literal.string.ril 247 B literal.w64.rad 1.7 KiB load.u32.high.rad 1.8 KiB loc.addr.offset.bug.rad 429 B loc.addr.opt.to.opt.rad 452 B loc.addr.optional.assign.rad 427 B loc.addr.record.assign.rad 466 B local.multi.rad 85 B local.multi.ril 67 B local.mut.rad 79 B local.mut.ril 45 B local.simple.rad 60 B local.simple.ril 45 B loop.break.rad 156 B loop.break.ril 228 B loop.complex.flow.rad 1.0 KiB loop.continue.rad 219 B loop.continue.ril 327 B loop.for.array.rad 223 B loop.for.array.ril 315 B loop.for.break.bound.rad 161 B loop.for.break.bound.ril 264 B loop.for.continue.rad 403 B loop.for.continue.ril 741 B loop.for.indexed.rad 149 B loop.for.indexed.ril 285 B loop.for.placeholder.rad 321 B loop.for.placeholder.ril 457 B loop.for.rad 120 B loop.for.ril 220 B loop.for.slice.rad 216 B loop.for.slice.ril 362 B loop.for.unsigned.range.rad 317 B loop.for.unsigned.range.ril 481 B loop.infinite.rad 41 B loop.infinite.ril 78 B loop.mutable.rad 375 B loop.mutable.ril 617 B loop.nested.break.rad 392 B loop.nested.break.ril 461 B loop.nested.continue.rad 418 B loop.nested.continue.ril 581 B loop.return.rad 141 B loop.return.ril 179 B loop.sealblock.rad 942 B loop.while.false.noparams.rad 175 B loop.while.false.noparams.ril 171 B loop.while.nested.shortcircuit.rad 872 B loop.while.nested.shortcircuit.ril 589 B loop.while.rad 164 B loop.while.ril 241 B loop.whilelet.case.rad 259 B loop.whilelet.case.ril 204 B loop.whilelet.guard.rad 265 B loop.whilelet.guard.ril 256 B loop.whilelet.optional.rad 212 B loop.whilelet.optional.ril 217 B loop.whilelet.union.rad 376 B loop.whilelet.union.ril 382 B lower.const.record.ident.rad 279 B lower.const.record.ident.ril 387 B lower.private.union.const.rad 247 B lower.private.union.const.ril 317 B lower.record.scalar.record.const.rad 232 B lower.record.scalar.record.const.ril 321 B match.array.rad 3.5 KiB match.char.rad 1.6 KiB match.more.rad 647 B match.more.ril 683 B match.multi.seal.rad 1002 B match.multi.seal.ril 924 B match.multi.survive.rad 1.6 KiB match.mutref.push.rad 1.0 KiB match.mutref.union.rad 681 B match.nested.call.rad 1.7 KiB match.nested.deep.rad 2.2 KiB match.nested.deref.rad 3.7 KiB match.nested.guard.rad 1.6 KiB match.nested.iflet.guard.rad 1.6 KiB match.nested.iflet.rad 1.4 KiB match.nested.iflet.ril 2.3 KiB match.nested.letelse.rad 828 B match.nested.letelse.union.rad 1.3 KiB match.nested.literal.rad 3.1 KiB match.nested.multi.rad 2.4 KiB match.nested.pattern.rad 5.2 KiB match.nested.pattern.ril 8.3 KiB match.nested.record.rad 2.1 KiB match.nested.record.ril 3.5 KiB match.nested.union.rad 2.3 KiB match.nested.union.ril 4.5 KiB match.nested.whilelet.rad 2.4 KiB match.optional.aggregate.rad 222 B match.optional.aggregate.ril 578 B match.optional.rad 183 B match.optional.ref.rad 212 B match.optional.ref.ril 232 B match.optional.ril 164 B match.optional.wildcard.rad 282 B match.record.pattern.rad 325 B match.record.pattern.ril 287 B match.simple.rad 367 B match.simple.ril 347 B match.string.rad 1.8 KiB match.switch.rad 217 B match.switch.ril 187 B match.value.copy.rad 2.0 KiB match.void.then.or.rad 1.6 KiB memzero.result.bug.rad 829 B memzero.union.bug.rad 599 B method.basic.rad 562 B method.chain.rad 568 B method.multiple.rad 904 B method.ptr.rad 666 B method.pub.rad 241 B method.return.rad 599 B method.throws.rad 837 B method.union.rad 424 B method.with.trait.rad 644 B mixedtypes.rad 79 B mixedtypes.ril 82 B multi.throw.basic.rad 272 B multi.throw.basic.ril 526 B multi.throw.catch.typed.rad 444 B multi.throw.catch.typed.ril 1015 B multi.throw.propagate.rad 335 B multi.throw.propagate.ril 873 B multiplefns.rad 110 B multiplefns.ril 146 B mutref.call.result.rad 316 B mutref.loop.bug.rad 1.8 KiB mutref.loop.rad 289 B mutref.loop.ril 368 B mutref.scalar.rad 232 B mutref.scalar.ril 324 B nil.cmp.rad 622 B nil.cmp.ril 423 B noparams.rad 38 B noparams.ril 43 B opt.array.hint.rad 951 B opt.assignment.bug.rad 1.3 KiB opt.bug.test.rad 1.4 KiB opt.if.let.complex.rad 6.2 KiB opt.if.let.guard.rad 809 B opt.if.let.rad 956 B opt.nil.check.rad 1.5 KiB opt.ptr.return.nil.rad 85 B opt.ptr.return.nil.ril 51 B opt.record.eq.rad 854 B opt.record.eq.rev.rad 307 B opt.record.eq.rev.ril 635 B opt.record.eq.ril 3.4 KiB opt.record.rad 667 B opt.return.array.rad 289 B opt.return.nested.rad 797 B opt.return.nil.rad 82 B opt.return.nil.ril 114 B opt.return.record.rad 344 B opt.return.value.rad 91 B opt.return.value.ril 138 B opt.slice.npo.rad 2.8 KiB opt.slice.npo.ril 6.8 KiB opt.type.rad 227 B opt.while.let.complex.rad 412 B optional.aggregate.eq.rad 286 B optional.aggregate.eq.ril 695 B optional.eq.rad 131 B optional.eq.ril 253 B optional.ptr.eq.rad 313 B optional.ptr.eq.ril 309 B optional.record.value.match.rad 600 B panic.basic.rad 70 B panic.basic.ril 46 B panic.rad 111 B parser.call.record.argument.rad 203 B parser.condition.array.record.rad 226 B parser.condition.subscript.record.rad 272 B placeholder.basic.rad 148 B placeholder.comprehensive.rad 581 B pointer.copy.edge.case.rad 1.4 KiB pointer.slice.index.rad 284 B pointer.slice.store.rad 916 B pointerfn.rad 50 B pointerfn.ril 54 B prog.ackermann.rad 5.0 KiB prog.bignum.rad 9.7 KiB prog.binsearch.rad 2.5 KiB prog.bubblesort.rad 2.0 KiB prog.cordic.rad 7.0 KiB prog.crc32.rad 2.8 KiB prog.dijkstra.rad 7.9 KiB prog.eval.rad 6.3 KiB prog.hanoi.rad 3.8 KiB prog.huffman.rad 9.5 KiB prog.hybridsort.rad 3.1 KiB prog.linkedlist.rad 5.9 KiB prog.lzw.rad 6.9 KiB prog.matmul.rad 2.9 KiB prog.mersenne.rad 5.4 KiB prog.nqueens.rad 3.5 KiB prog.rbtree.rad 8.5 KiB prog.regex.rad 10.4 KiB prog.sha256.rad 7.2 KiB prog.sieve.rad 2.8 KiB prog.symtab.rad 10.2 KiB prog.tokenizer.rad 13.9 KiB prog.vm.rad 17.8 KiB ptr.addressof.field.rad 132 B ptr.addressof.field.ril 78 B ptr.addressof.local.rad 455 B ptr.addressof.local.ril 280 B ptr.addressof.rad 119 B ptr.addressof.ril 213 B ptr.assign.rad 141 B ptr.assign.ril 130 B ptr.deref.rad 622 B ptr.deref.record.rad 282 B ptr.deref.record.ril 190 B ptr.deref.ril 1.1 KiB ptr.eq.rad 981 B ptr.mutate.rad 256 B ptr.opaque.rad 1.4 KiB ptr.subscript.assign.rad 133 B ptr.subscript.assign.ril 288 B range.arithmetic.rad 723 B record.access.rad 300 B record.alignment.rad 194 B record.array.elements.rad 1.7 KiB record.assign.blit.rad 115 B record.assign.blit.ril 158 B record.copy.rad 2.1 KiB record.ctor.tuple.rad 69 B record.ctor.tuple.ril 127 B record.empty.eq.rad 272 B record.empty.eq.ril 226 B record.eq.rad 223 B record.eq.ril 214 B record.field.assign.rad 211 B record.field.assign.ril 308 B record.literal.labeled.rad 103 B record.literal.labeled.ril 127 B record.mixed.layout.rad 116 B record.mixed.layout.ril 149 B record.nested.calls.2.rad 616 B record.nested.calls.3.rad 749 B record.nested.eq.rad 246 B record.nested.eq.ril 522 B record.nested.lit.rad 170 B record.nested.lit.ril 188 B record.param.lit.rad 368 B record.ptr.access.rad 242 B record.ptr.access.ril 198 B record.ptr.mutate.rad 243 B record.shorthand.rad 1.5 KiB record.unlabeled.deref.rad 1.4 KiB record.unlabeled.rad 407 B ref.if.bug.rad 527 B ref.immut.loop.bug.rad 674 B ref.mut.ptr.rad 263 B reference.array.repeat.rad 135 B reference.array.repeat.ril 260 B regalloc.callee.save.rad 1.5 KiB regalloc.spill.reuse.rad 488 B reserve.loop.rad 415 B reserve.loop.ril 473 B result.void.success.rad 705 B return.lit.rad 45 B return.lit.ril 50 B return.param.rad 48 B return.param.ril 54 B rv64.u32.compare.rad 2.1 KiB set.keyword.rad 442 B simplefn.rad 45 B simplefn.ril 51 B slice.alloc.loop.rad 807 B slice.append.rad 4.1 KiB slice.append.ril 18.4 KiB slice.assign.mismatch.rad 220 B slice.assign.rad 1.4 KiB slice.basic.rad 742 B slice.basic.ril 818 B slice.cap.rad 956 B slice.delete.rad 986 B slice.delete.ril 4.8 KiB slice.empty.suffix.rad 551 B slice.eq.rad 126 B slice.eq.ril 209 B slice.index.rad 104 B slice.index.ril 278 B slice.mutable.rad 297 B slice.mutable.ril 1.5 KiB slice.of.rad 475 B slice.range.bounds.check.rad 285 B slice.range.dynamic.rad 863 B slice.range.order.check.rad 284 B slice.range.rad 606 B slice.range.ril 1.8 KiB slice.runtime.i32.rad 237 B slice.runtime.i32.ril 725 B slice.runtime.literal.rad 243 B slice.runtime.literal.ril 455 B slice.subslice.rad 1.4 KiB spill.blockarg.clobber.rad 3.6 KiB spill.loop.rad 1.6 KiB stack.local.corrupt.rad 335 B start.default.rad 62 B start.default.start.ras 29 B start.exit.rad 54 B start.exit.start.ras 53 B static.array.mutate.rad 427 B static.assign.rad 131 B static.assign.ril 244 B static.basic.rad 347 B static.fn.array.rad 628 B static.local.decl.rad 201 B static.local.decl.ril 420 B static.record.array.rad 526 B static.scalar.rad 109 B static.scalar.ril 135 B static.slice.index.assign.rad 424 B static.slice.offset.rad 703 B static.zero.bss.rad 1.1 KiB string.basic.rad 164 B string.escape.rad 364 B string.index.rad 131 B switch.blockargs.clobber.rad 1.4 KiB trait.aggregate.ret.rad 1.5 KiB trait.array.optional.rad 1.7 KiB trait.basic.rad 584 B trait.control.flow.rad 1.2 KiB trait.dispatch.rad 327 B trait.dispatch.ril 544 B trait.fn.param.rad 1.7 KiB trait.multiple.methods.rad 1.2 KiB trait.multiple.traits.rad 1.2 KiB trait.multiple.types.rad 1.3 KiB trait.object.rad 360 B trait.object.ril 554 B trait.supertrait.forward.rad 617 B trait.supertrait.rad 2.6 KiB trait.supertrait.ril 4.1 KiB trait.throws.rad 1.0 KiB trait.writer.rad 2.6 KiB trivial.phi.rad 1.1 KiB trivial.phi.ril 512 B try.basic.rad 391 B try.basic.ril 879 B try.catch.rad 339 B try.catch.ril 837 B try.optional.rad 363 B try.optional.ril 760 B try.panic.rad 351 B try.panic.ril 639 B type.unify.rad 4.5 KiB undefined.aggregate.rad 152 B undefined.aggregate.ril 84 B undefined.primitive.rad 115 B undefined.primitive.ril 48 B undefined.rad 452 B undefined.record.field.rad 1.6 KiB undefined.record.field.ril 751 B union-tag.rad 926 B union.bitfield.rad 1.2 KiB union.ctor.rad 552 B union.ctor.ril 385 B union.discriminant.cast.rad 389 B union.edge.case.2.rad 694 B union.edge.case.3.rad 627 B union.eq.rad 783 B union.eq.ril 1.4 KiB union.eq.void.ctor.rad 378 B union.eq.void.ctor.ril 131 B union.eq.void.rad 178 B union.eq.void.ril 75 B union.match.bind.rad 259 B union.match.bind.ril 238 B union.match.ref.rad 1.1 KiB union.match.ref.ril 1.2 KiB union.match.tag.rad 858 B union.match.tag.ril 820 B union.mixed.assign.rad 1000 B union.payload.mutref.rad 1.4 KiB union.payload.rad 595 B union.payload.record.eq.rad 292 B union.payload.record.eq.ril 984 B union.record.forward.rad 1.3 KiB union.record.literal.rad 444 B union.record.literal.ril 391 B union.variant.access.rad 731 B union.variant.access.ril 506 B union.void.match.rad 418 B union.void.rad 839 B unop.rad 699 B unop.ril 506 B unsigned.compare.rad 1.9 KiB var.align.rad 1.0 KiB var.infer.rad 568 B var.shadow.rad 244 B var.shadow.ril 145 B void.throw.rad 270 B void.throw.ril 707 B voidfn.rad 18 B voidfn.ril 43 B wildcard.import.owner.rad 198 B run 2.7 KiB runner.rad 10.2 KiB vim/ .gitignore 336 B .gitsigners 112 B LICENSE 1.1 KiB Makefile 3.7 KiB README 4.8 KiB STYLE 2.5 KiB std.lib 1.2 KiB std.lib.test 347 B
test/tests/prog.huffman.rad 9.5 KiB raw
1
//! returns: 0
2
//! Huffman encoding.
3
//! Build a Huffman tree from character frequencies, generate prefix codes,
4
//! encode a message, decode it, and verify round-trip correctness.
5
6
constant MAX_SYMBOLS: u32 = 32;
7
constant MAX_NODES: u32 = 63;
8
constant MAX_BITS: u32 = 512;
9
10
/// A node in the Huffman tree.
11
union HNodeKind {
12
    /// Leaf node with a symbol index.
13
    Leaf(u32),
14
    /// Interior node (no symbol).
15
    Interior,
16
}
17
18
record HNode {
19
    freq: u32,
20
    kind: HNodeKind,
21
    left: u32,
22
    right: u32,
23
}
24
25
constant NIL: u32 = 0xFFFFFFFF;
26
27
record HuffState {
28
    nodes: *mut [HNode],
29
    nodeCount: u32,
30
    heap: *mut [u32],
31
    heapSize: u32,
32
    codeBits: *mut [u32],
33
    codeLen: *mut [u32],
34
    bitstream: *mut [u8],
35
    bitCount: u32,
36
}
37
38
fn newLeaf(s: *mut HuffState, freq: u32, symbol: u32) -> u32 {
39
    let idx: u32 = s.nodeCount;
40
    set s.nodes[idx] = HNode { freq, kind: HNodeKind::Leaf(symbol), left: NIL, right: NIL };
41
    set s.nodeCount += 1;
42
    return idx;
43
}
44
45
fn newInterior(s: *mut HuffState, freq: u32, left: u32, right: u32) -> u32 {
46
    let idx: u32 = s.nodeCount;
47
    set s.nodes[idx] = HNode { freq, kind: HNodeKind::Interior, left, right };
48
    set s.nodeCount += 1;
49
    return idx;
50
}
51
52
/// Get the symbol from a node, or nil if it's an interior node.
53
fn nodeSymbol(node: *HNode) -> ?u32 {
54
    match node.kind {
55
        case HNodeKind::Leaf(sym) => {
56
            return sym;
57
        }
58
        case HNodeKind::Interior => {
59
            return nil;
60
        }
61
    }
62
}
63
64
fn heapSwap(s: *mut HuffState, i: u32, j: u32) {
65
    let tmp: u32 = s.heap[i];
66
    set s.heap[i] = s.heap[j];
67
    set s.heap[j] = tmp;
68
}
69
70
fn heapFreq(s: *HuffState, i: u32) -> u32 {
71
    return s.nodes[s.heap[i]].freq;
72
}
73
74
fn siftUp(s: *mut HuffState, pos: u32) {
75
    let mut i: u32 = pos;
76
    while i > 0 {
77
        let parent: u32 = (i - 1) / 2;
78
        if heapFreq(s, i) < heapFreq(s, parent) {
79
            heapSwap(s, i, parent);
80
            set i = parent;
81
        } else {
82
            return;
83
        }
84
    }
85
}
86
87
fn siftDown(s: *mut HuffState, pos: u32) {
88
    let mut i: u32 = pos;
89
    while true {
90
        let left: u32 = 2 * i + 1;
91
        let right: u32 = 2 * i + 2;
92
        let mut smallest: u32 = i;
93
94
        if left < s.heapSize and heapFreq(s, left) < heapFreq(s, smallest) {
95
            set smallest = left;
96
        }
97
        if right < s.heapSize and heapFreq(s, right) < heapFreq(s, smallest) {
98
            set smallest = right;
99
        }
100
        if smallest == i {
101
            return;
102
        }
103
        heapSwap(s, i, smallest);
104
        set i = smallest;
105
    }
106
}
107
108
fn heapPush(s: *mut HuffState, nodeIdx: u32) {
109
    set s.heap[s.heapSize] = nodeIdx;
110
    set s.heapSize += 1;
111
    siftUp(s, s.heapSize - 1);
112
}
113
114
fn heapPop(s: *mut HuffState) -> u32 {
115
    let result: u32 = s.heap[0];
116
    set s.heapSize -= 1;
117
    set s.heap[0] = s.heap[s.heapSize];
118
    if s.heapSize > 0 {
119
        siftDown(s, 0);
120
    }
121
    return result;
122
}
123
124
fn buildTree(s: *mut HuffState, freqs: *[u32]) -> u32 {
125
    set s.nodeCount = 0;
126
    set s.heapSize = 0;
127
128
    for freq, sym in freqs {
129
        if freq > 0 {
130
            let idx: u32 = newLeaf(s, freq, sym);
131
            heapPush(s, idx);
132
        }
133
    }
134
135
    while s.heapSize > 1 {
136
        let left: u32 = heapPop(s);
137
        let right: u32 = heapPop(s);
138
        let combinedFreq: u32 = s.nodes[left].freq + s.nodes[right].freq;
139
        let parent: u32 = newInterior(s, combinedFreq, left, right);
140
        heapPush(s, parent);
141
    }
142
143
    return heapPop(s);
144
}
145
146
fn generateCodes(s: *mut HuffState, nodeIdx: u32, code: u32, depth: u32) {
147
    match s.nodes[nodeIdx].kind {
148
        case HNodeKind::Leaf(sym) => {
149
            set s.codeBits[sym] = code;
150
            set s.codeLen[sym] = depth;
151
        }
152
        case HNodeKind::Interior => {
153
            if s.nodes[nodeIdx].left <> NIL {
154
                generateCodes(s, s.nodes[nodeIdx].left, code << 1, depth + 1);
155
            }
156
            if s.nodes[nodeIdx].right <> NIL {
157
                generateCodes(s, s.nodes[nodeIdx].right, (code << 1) | 1, depth + 1);
158
            }
159
        }
160
    }
161
}
162
163
fn writeBit(s: *mut HuffState, bit: u32) {
164
    let byteIdx: u32 = s.bitCount / 8;
165
    let bitIdx: u32 = 7 - (s.bitCount % 8);
166
    if bit == 1 {
167
        set s.bitstream[byteIdx] |= (1 as u8 << bitIdx as u8);
168
    }
169
    set s.bitCount += 1;
170
}
171
172
fn readBit(s: *HuffState, pos: u32) -> u32 {
173
    let byteIdx: u32 = pos / 8;
174
    let bitIdx: u32 = 7 - (pos % 8);
175
    return (s.bitstream[byteIdx] >> bitIdx as u8) as u32 & 1;
176
}
177
178
fn encode(s: *mut HuffState, msg: *[u32]) {
179
    set s.bitCount = 0;
180
    let mut i: u32 = 0;
181
    while i < MAX_BITS {
182
        set s.bitstream[i] = 0;
183
        set i += 1;
184
    }
185
186
    for sym in msg {
187
        let bits: u32 = s.codeBits[sym];
188
        let len: u32 = s.codeLen[sym];
189
        let mut b: u32 = 0;
190
        while b < len {
191
            let bit: u32 = (bits >> (len - 1 - b)) & 1;
192
            writeBit(s, bit);
193
            set b += 1;
194
        }
195
    }
196
}
197
198
fn decode(s: *HuffState, root: u32, numSymbols: u32, out: *mut [u32]) -> u32 {
199
    let mut bitPos: u32 = 0;
200
    let mut decoded: u32 = 0;
201
202
    while decoded < numSymbols {
203
        let mut cur: u32 = root;
204
        // Walk the tree until we find a leaf.
205
        while nodeSymbol(&s.nodes[cur]) == nil {
206
            let bit: u32 = readBit(s, bitPos);
207
            set bitPos += 1;
208
            if bit == 0 {
209
                set cur = s.nodes[cur].left;
210
            } else {
211
                set cur = s.nodes[cur].right;
212
            }
213
        }
214
        let sym = nodeSymbol(&s.nodes[cur]) else {
215
            return decoded;
216
        };
217
        set out[decoded] = sym;
218
        set decoded += 1;
219
    }
220
    return decoded;
221
}
222
223
fn resetCodes(s: *mut HuffState) {
224
    let mut i: u32 = 0;
225
    while i < MAX_SYMBOLS {
226
        set s.codeBits[i] = 0;
227
        set s.codeLen[i] = 0;
228
        set i += 1;
229
    }
230
}
231
232
fn testBasic(s: *mut HuffState) -> i32 {
233
    let freqs: [u32; 5] = [5, 9, 12, 13, 16];
234
    let root: u32 = buildTree(s, &freqs[..]);
235
236
    assert s.nodes[root].freq == 55;
237
238
    resetCodes(s);
239
    generateCodes(s, root, 0, 0);
240
241
    // All symbols should have non-zero code lengths.
242
    let mut i: u32 = 0;
243
    while i < 5 {
244
        assert s.codeLen[i] <> 0;
245
        set i += 1;
246
    }
247
248
    // No two symbols at the same depth should have the same code.
249
    let mut a: u32 = 0;
250
    while a < 5 {
251
        let mut b: u32 = a + 1;
252
        while b < 5 {
253
            if s.codeLen[a] == s.codeLen[b] {
254
                assert s.codeBits[a] <> s.codeBits[b];
255
            }
256
            set b += 1;
257
        }
258
        set a += 1;
259
    }
260
261
    return 0;
262
}
263
264
fn testRoundTrip(s: *mut HuffState) -> i32 {
265
    let freqs: [u32; 5] = [5, 9, 12, 13, 16];
266
    let root: u32 = buildTree(s, &freqs[..]);
267
268
    resetCodes(s);
269
    generateCodes(s, root, 0, 0);
270
271
    let msg: [u32; 16] = [4, 3, 2, 1, 0, 0, 1, 2, 3, 4, 2, 2, 3, 3, 4, 4];
272
    encode(s, &msg[..]);
273
274
    let mut decoded: [u32; 16] = [0; 16];
275
    let count: u32 = decode(s, root, 16, &mut decoded[..]);
276
277
    assert count == 16;
278
279
    // Verify round-trip.
280
    for expected, i in msg {
281
        if decoded[i] <> expected {
282
            return i as i32 + 2;
283
        }
284
    }
285
286
    return 0;
287
}
288
289
fn testSkewed(s: *mut HuffState) -> i32 {
290
    let freqs: [u32; 6] = [100, 1, 1, 1, 1, 1];
291
    let root: u32 = buildTree(s, &freqs[..]);
292
293
    resetCodes(s);
294
    generateCodes(s, root, 0, 0);
295
296
    // The most frequent symbol should have the shortest code.
297
    let mut shortestLen: u32 = 100;
298
    let mut shortestSym: u32 = 0;
299
    let mut i: u32 = 0;
300
    while i < 6 {
301
        if s.codeLen[i] > 0 and s.codeLen[i] < shortestLen {
302
            set shortestLen = s.codeLen[i];
303
            set shortestSym = i;
304
        }
305
        set i += 1;
306
    }
307
    assert shortestSym == 0;
308
309
    let msg: [u32; 12] = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2];
310
    encode(s, &msg[..]);
311
312
    let mut decoded: [u32; 12] = [0; 12];
313
    let count: u32 = decode(s, root, 12, &mut decoded[..]);
314
    assert count == 12;
315
316
    for expected, i in msg {
317
        assert decoded[i] == expected;
318
    }
319
320
    return 0;
321
}
322
323
fn testUniform(s: *mut HuffState) -> i32 {
324
    let freqs: [u32; 8] = [10, 10, 10, 10, 10, 10, 10, 10];
325
    let root: u32 = buildTree(s, &freqs[..]);
326
327
    assert s.nodes[root].freq == 80;
328
329
    resetCodes(s);
330
    generateCodes(s, root, 0, 0);
331
332
    // All 8 symbols should have code length 3 (8 = 2^3).
333
    let mut i: u32 = 0;
334
    while i < 8 {
335
        assert s.codeLen[i] == 3;
336
        set i += 1;
337
    }
338
339
    let msg: [u32; 8] = [0, 1, 2, 3, 4, 5, 6, 7];
340
    encode(s, &msg[..]);
341
342
    assert s.bitCount == 24;
343
344
    let mut decoded: [u32; 8] = [0; 8];
345
    let count: u32 = decode(s, root, 8, &mut decoded[..]);
346
    assert count == 8;
347
    for expected, i in msg {
348
        assert decoded[i] == expected;
349
    }
350
351
    return 0;
352
}
353
354
@default fn main() -> i32 {
355
    let mut nodes: [HNode; 63] = [HNode { freq: 0, kind: HNodeKind::Interior, left: 0xFFFFFFFF, right: 0xFFFFFFFF }; 63];
356
    let mut heap: [u32; 63] = [0; 63];
357
    let mut codeBits: [u32; 32] = [0; 32];
358
    let mut codeLen: [u32; 32] = [0; 32];
359
    let mut bitstream: [u8; 512] = [0; 512];
360
361
    let mut s: HuffState = HuffState {
362
        nodes: &mut nodes[..],
363
        nodeCount: 0,
364
        heap: &mut heap[..],
365
        heapSize: 0,
366
        codeBits: &mut codeBits[..],
367
        codeLen: &mut codeLen[..],
368
        bitstream: &mut bitstream[..],
369
        bitCount: 0,
370
    };
371
372
    let r1: i32 = testBasic(&mut s);
373
    if r1 <> 0 {
374
        return 10 + r1;
375
    }
376
377
    let r2: i32 = testRoundTrip(&mut s);
378
    if r2 <> 0 {
379
        return 20 + r2;
380
    }
381
382
    let r3: i32 = testSkewed(&mut s);
383
    if r3 <> 0 {
384
        return 30 + r3;
385
    }
386
387
    let r4: i32 = testUniform(&mut s);
388
    if r4 <> 0 {
389
        return 40 + r4;
390
    }
391
392
    return 0;
393
}