Downloading Haxe 4.1.0

If your download does not begin automatically please click here.

Support the Haxe Foundation

Thank you for downloading Haxe. If you'd like to support the Haxe Foundation please consider donating to keep our open source efforts thriving.

Monthly Donation Amount

Get Technical Help

Get support directly from the Haxe team. The Haxe Foundation offers several support tiers to help with your organization's technical challenges.

Explore our support plans

What next?

Release Notes

Dear Community,

On behalf of the Haxe Foundation, we are proud to announce the official release of Haxe 4.1.0!

This time, we've focused on a smaller set of features to keep the release cycle short.

The most notable changes:

  • the JVM target is no longer experimental
  • we reworked exception handling.

We've gone into more detail about that in this blog post.

Haxe 4.1.0 also includes over one hundred other additions, optimizations, improvements, and bugfixes.

Check out the changelog below for more information.

If you have any suggestions or run into any problems, absolutely open an issue on GitHub.

Thanks to everyone involved!

Change Log

2020-05-13: 4.1.0

New features:

  • all : added tail recursion elimination (#8908)
  • all : added unified exception handling (#9124)
  • all : allow try {} catch(e) {} as a shortcut for try {} catch(e:haxe.Exception) {} (#9269)
  • eval : added SSL support (#9009)
  • jvm : the JVM target is no longer considered experimental

General improvements:

  • all : implemented different display support approach (#8962)
  • all : improved display services related to reference finding
  • all : added go-to-implementation support (#9043)
  • all : made various improvements to diagnostics
  • all : support completion for map keys (#9133)
  • all : improved parser robustness for incomplete syntax (#9148)
  • all : disallowed the combination of @:overload and inline (#3846)
  • all : improved renaming of local variables (#9304)
  • all : better inlining of for-loops with anonymous iterators (#8848)
  • all : remove redundant final return in Void functions (#6420)
  • all : remove redundant continue in loops (#8952)
  • all : improved various compilation errors reporting
  • all : allowed (get,default) property access combination (#6195, #8825)
  • all : allowed ++ and -- on member properties of abstracts (#8930)
  • js : use abstract type name for generating its implementation class (#9006)
  • js : improve haxe.ds.StringMap implementation (#8909)
  • js : improve interface checking and make it more minifier-friendly (#9178)
  • js : generate let instead of var when compiler with -D js-es=6 (#9280)
  • js : optimize .bind on constructors (#9227)
  • jvm : rewrote function handling to me much faster and more portable (#9208)
  • jvm : generate interfaces for typedefs for improved performance (#9195)
  • jvm : added support for haxe.MainLoop
  • jvm : support @:jvm.synthetic and use it to hide some generated fields (#9213)
  • jvm : respect @:private and @:protected
  • lua : improve error handling behavior when throwing objects/instances
  • lua : optimize haxe.iterators.StringIterator
  • php : optimize Std.isOfType for String, Bool and Float
  • php : make Haxe Array implement native interfaces Iterator, IteratorAggregate, Countable (#8821, 9377)
  • cs : support @:assemblyMeta and @:assemblyStrict (#8347)
  • python : added __contains__ and __getitem__ implementations to generated python code for _hx_AnonObject, so it is subscribable and behaves like a python dict (#9109)

Standard Library:

  • all : negative startIndex argument of String.indexOf and String.lastIndexOf is unspecified (#8365)
  • all : changed Array.iterator() to return instances of haxe.iterators.ArrayIterator (#8987)
  • all : added Array.contains (#9179)
  • all : added Array.keyValueIterator (#7422)
  • all : added haxe.Constraints.NotVoid (#8357)
  • all : added Lambda.findIndex() (#9071)
  • all : added Lambda.foldi() (#9054)
  • all : added array access and key-value iteration support to haxe.ds.HashMap (#9056)
  • jvm : added JVM-specific versions of sys.thread.Lock and sys.thread.Thread
  • jvm : added JVM-specific version of haxe.ds.StringMap
  • java/jvm : use native versions of MD-5, SHA-1 and SHA-256 for haxe.crypto modules (#9298)
  • macro : added haxe.macro.Context.containsDisplayPosition(pos) (#9077)
  • nullsafety : treat Strict as a single-threaded mode; added StrictThreaded (#8895)

Deprecations:

  • all : deprecated Std.is; use Std.isOfType instead (#2976)
  • all : added a warning for an uninitialized variable usage captured in a closure (#7447)
  • js : deprecated untyped __js__(code, args); use js.Syntax.code(code, args) instead
  • php/neko : deprecated neko.Web and php.Web; will be moved to hx4compat library later (#9153)

Bugfixes:

  • all : fixed display support for static imports (#9012)
  • all : fixed completion in macro mode picking up the wrong type (#7703)
  • all : fixed wonky analyzer transformation related to locals captured in closures (#9305)
  • all : allow return; in abstract constructors (#7809)
  • all : fixed static @:op([]) functions (#9347)
  • all : fixed @:optional handling in the inheritance of @:structInit classes (#7559)
  • all : support negative numbers as constant type parameters for @:generic types (#9149)
  • all : fixed false positive compilation server error with empty methods in inheritance (#9029)
  • all : fixed default values for manually defined @:structInit constructors (#9177, #9258)
  • all : fixed inference of Void return type for arrow functions (#9181)
  • all : fixed inconsistencies in wildcard imports resolution (#9189, #9190)
  • all : fix array comprehension for a chain of if..else if without final else (#9040)
  • all : prohibit @:structInit on interfaces (#9017)
  • macro : fixed handling TAnonymous in haxe.macro.TypeTools.map (#9147)
  • eval : fixed EReg.matchSub handling with negative length (#9333)
  • eval : fixed extern classes being generated and causing errors in some cases (#9366)
  • eval : fixed StringBuf.addSub unicode handling (#9382)
  • jvm : fixed Void being generated with the wrong casing (#8717)
  • jvm : fixed debugging-related data being generated in the wrong place
  • jvm : fixed switches on string values being too optimistic
  • jvm : fixed problems with Std.parseInt and Std.parseFloat
  • jvm : made sure type parameter types are boxed
  • jvm : fixed dynamic access on null yielding null (#8452)
  • cpp : fixed native compilation if there is a hx package in a project (#8543)
  • cs : fixed null to 0 conversion in parametrized functions for Null<Int> params (#7428)
  • cs : fixed integer division handling (#9232)
  • php : fixed closure creation out of fields with null value (#9316)
  • js : fixed interface generation for minification with Google Closure Compiler in advanced mode (#9172)
  • js : fixed a crash at startup in IE8 (#9062)
  • hl : fixed BLOB handling in SQLite (#9048)

Getting Started With Haxe

Now that you've downloaded Haxe, you can get started with a specific platform. Click on a logo to learn how to set up the development environment and how to proceed from there:

For getting started with Haxe, take a look at our introduction, read through the Haxe Manual or look at these use cases for Haxe, including tutorials and popular libraries: