Fuzion Logo
fuzion-lang.dev — The Fuzion Language Portal
JavaScript seems to be disabled. Functionality is limited.

2026-02-20: Fuzion February Update

A lot of work went into performance optimization of the Fuzion base library and the Fuzion toolchain, mostly guided by the development of the fzweb web server. Performance and capabilities are close to reaching a level that makes us expect that we can go live with fzweb soon!

  • General
    • There will be a presentation on the Fuzion Language at the Embedded World Conference in Nuremberg on 10 March at 14h45 in Session 5.2 Software & Systems Engineering.

  • Fuzion language
    • rename keyword inv as invariant (#6516, #6543)

    • Flag ambiguous else in nested if and loop statements in a single line (#6531)

      Nested code in a single line like

          if x then if y then a else b
                
      is no longer accepted, explicit nesting using braces { and } is required to distinguish
          if x then { if y then a else b }
                
      from
          if x then { if y then a } else b
                
      The same holds for nesting of loops and if statements. Nesting of several loops in a single line always requires braces.

  • Base library
    • New library features

      • add error code to error (#6456)

      • add i128.as_f64 (#6481)

      • add io.write, change arg types of io.file.write (#6434)

      • add stackoverflow effect (#6477)

        It can be used as follows to handle a stack overflow

          s := (0..20000).map (Sequence i32) i->[i] .fold1 (++)
        
          fuzion.runtime.stackoverflow
            .try ()->
                say s
            .catch e->
                say "*** error: $e"
                      
        Support for stack overflow detection is currently only available in the jvm backend.

      • bool now implements hashable (#6441)

      • add data_size and byte_unit to create human-readable string such as 1.00 TB or 931 GiB (#6433)

      • add u128.as_f64 (#6454)

    • Changed library features

      • buffered_writer, simplify, remove use of local mutate (#6497)

      • Added comment to Sequence.concat logic that avoids quadratic performance (#6389)

      • error: do not allow line breaks at the end of the message (#6487)

      • hand-picked AI improvements to comments (#6485)

      • improve runtime of Sequence.split_if (#6399)

      • simplify code, Sequence.split_at (#6499)

      • concur.sync: add lock_effect to ensure unlocking of mutex, even on abort (#6498)

      • change time.duration.as_string to not add padding by default (#6470)

      • lock_free.Sieve_Cache: add get feature to check if a value is present and wrap it in an option if it does (#6473)

      • String.join use fold instead of foldr to fix excessive memory usage (#6544)

    • fix off-by-one error in String.split (#6458)

  • Parser
    • Cleanup: Remove parser state for if statement parsing (#6538)

    • bug fix: only apply special handling for else if when both are in the same line (#6460)

    • add dangling else error when everything is in one line (#4989)

    • cleanup of semicolon handling (#6560)

  • Front end
    • Cleanup: block/loop, remove hasImplicitResult (#6437)

    • Cleanup: checkLegalVisibility, minor code simplification (#6515)

    • cleanup Feature constructors (#6475)

    • do not create unnecessary cotypes (#6517)

    • for outerref set sourceposition to not available (#6474)

    • bug fix: fix NullPointerException: invoke feature not found only if target feature != null (#6514)

    • Cleanup: remove special handling of bool const (#6448)

    • Cleanup: remove unused resolved types (#6505)

    • Cleanup: simplify AbstractType.compareTo (#6506)

    • Cleanup: use replaceGenericsAndOuter instead of ResolvedNormalType.create (#5678)

    • fix ArrayIndexOutOfBoundsException (#6491)

    • LibraryModule cache result of moduleSourceFilesPos (#6518)

  • DFA
    • Call.result, minor refactoring to detect unmet assumptions earlier (#6524)

    • cleanup newInstance (#6418)

    • disable tracking different floating point values (#6534)

    • Cleanup: fix logic, s < 0 => s == NO_SITE (#6396)

    • Cleanup: fix outdated comment (#6521)

    • fix require condition when running fzweb with debug=0 (#6395)

    • support intrinsics for addition and subtraction (#6338)

    • Cleanup: newCall, remove ugly code that uses String comparison (#6529)

    • NumericValue of unknown contains all other values (#6520)

    • Add env var / property to set ONLY_ONE_INSTANCE (#6535)

    • refine equality intrinsic (#6322)

    • refine lteq intrinsic (#6326)

    • remove unused _missingEffects (#6501)

    • remove unused _uniqueCallId (#6527)

    • reset one instance of clazz after pre phase of DFA (#6420)

    • reset universe after pre phase of DFA (#6539)

    • set utf8-bytes of const_string (#6536)

    • slightly modify debug output (#6523)

  • IR
    • cleanup: refine contract (remove a workaround) (#6507)

  • FUIR
    • consider argcount when assigning special clazz (#6461)

    • optimization: LibraryFuir, cache SourceFile instances (#6512)

    • Cleanup: remove hack for compile_time_type_casts (#6504)

    • Cleanup: remove special clazz error (#6462)

    • Cleanup: rename methods according to our naming style (#6480)

    • Cleanup: set _isUnitType for clazz of unit type in constructor (#6519)

    • Cleanup: remove SpecialClazz.c_unit (#6482)

  • C backend
    • explicitly free memory (#6503)

    • get rid of strcpy (#6466)

    • set_last_error in fzE_bind (#6510)

  • JVM backend
    • effect.instate, catch all trowables, used to support stack overflow checking (#6442)

  • Windows
    • call WSAStartup only once (#6486)

    • disable test mod_wolfssl (#6459)

    • try align semantics of fzE_file_read (#6542)

    • fix getDependencies on Windows (#6471)

    • fuzion_rt, windows: replace pthreads (#5102)

  • macOS
    • partially revert commit (#6557)

    • try fix workflow failure, missing jmods (#6554)

    • actions: try using brew --prefix to find JAVA_HOME (#6559)

  • LSP
    • make starter posix shell compatible (#6449)

    • reduce heap usage (#6513)

    • remove endOfFeature heuristic, fix Block.pos (#6483)

  • Tests
    • run_tests: do not limit to six threads if more available (#6492)

    • add regression test for #1643 (#6463)

  • Build
    • profiler: strip dev.flang. prefix in flame graph an Xprof output (#6496)

    • debian package (#6450)

    • build fat fuzion.jar instead of lsp.jar (#6451)

    • workflow: add interpreter tests (#6508)

    • ci/linux: separate off unrelated tasks from the run_tests step (#6532)

    • Dockerfile: add wolfssl (#6546)

    • Dockerfile: attempt to fix Jenkins permission issue (#6545, #6548)

    • Dockerfile: fix syntax, missing backslash (#6547)

    • gh action: set permissions in interpreter.yml (#6522)

    • implement fuir backends in simple_inp.mk and others (#6467)

  • Fuzion Webserver
    • add global, effect for holding global state in the webserver (#307)

    • add return_code_string: send 200 OK instead of 200 NYI (#303)

    • benchmarks: add difficult case docs/base/index (#297)

    • benchmarks: add pathological case (#313)

    • cleanup: feature names (#290)

    • construct navigation only once instead of twice (#300)

    • fix next page link box at the bottom (#291)

    • fix template.doc_links (#301)

    • fix “Unused, non public field ‘suffix’” (#305)

    • read email content and footer from template files (#295)

    • refactor Session.type.get (#311)

    • refactor type.get_data_path_unsafe, remove use of mut (#312)

    • remove unused feature (#306)

    • send 404 response on Not Found (#304)

    • send_response, deduplicate/cleanup some code (#314)

    • src/content: implement hack to find docs (#296)

    • src/content: return option path in get_data_path (#299)

    • src/content: use existential quantifier feature instead of loop (#309)

    • src/template: doc_links: make percent decoding more tolerant (#292)

    • src/util/parse_multipart_form_data: remove mutable variable (#315)

    • update syntax (#308)

    • use Sieve_Cache for sessions (#288)

  • Feeze
    • gfx: Fix performance and accuracy when zooming (#12)

    • gfx: Remove redundant if in paintPanorama (#11)

    • gfx: Speed up mouse wheel scrolling, fix #10 (#13)

Cheers,

--The Fuzion Team.

last changed: 2026-02-23