Repository navigation
ForkDifferences
github-actions[bot] edited this page Oct 12, 2026
·
4 revisions
This page summarizes the main changes introduced in this fork (ax4) compared to upstream ax3.
It is a high-level overview, not a changelog.
- ax3 was primarily used for HTML5 migration; this fork is primarily optimized for C++ migration while still supporting HTML5.
- Stronger conversion reliability for real-world AS3 code (fewer "unknown identifier/field" and conversion edge-case failures).
- Much broader non-Flash target support, especially C++/hxcpp-oriented compatibility behavior.
- Significant expansion of compatibility runtime (
compat/) and tests (compat-test/). - Better handling of dynamic access, dictionary/object semantics, XML/E4X patterns, arrays/vectors, and coercions.
- Stronger AVM2 fidelity on awkward-but-valid AS3 (Boolean in arithmetic, switch fall-through,
voidused as a condition) instead of aborting, and AS3 runtime conversions (int()wrapping,TypeErroron failed implicit coercions). - End-of-run diagnostics summary (counts by warning kind) plus a Diagnostics catalogue.
- Distributed on lib.haxe.org:
haxelib run ax4converts,-lib ax4adds the compat runtime. - More practical project tooling/docs (new docs set, troubleshooting guidance, wiki sync workflow, compat call audit).
Main areas improved in typing/filtering/generation:
- Dynamic property access and assignments:
- safer rewrites for reads/writes/compound assignments on dynamic values
- improved
hasOwnPropertyhandling and undefined lookup rewrites
- Type inference and coercions:
- better local inference in loops and cyclic flows
- improved numeric/bitwise coercions and Any/Object conversions
- Boolean operands in
+/ arithmetic accepted like AVM2ToNumber - Number to
intconversions wrap like AS3int()(NaN and infinities give 0) on every target - implicit coercions from untyped values throw
TypeError#1034 on a type mismatch, as in AVM2 -
voidused as Bool rewritten to preserve side effects and falsy AVM2undefinedsemantics
- Control flow:
- switch fall-through rewritten by duplicating executed case-body suffixes
- Class/constructor handling:
- fixes for ctor initialization ordering and super-call placement
- better handling of class casts and
newon dynamic/callable values
- API-specific rewrites:
- improvements for Array/Vector APIs, function apply/call, URL loading patterns, Embed handling, flash/global utility shims
- E4X/XML support:
- expanded parser/filter/runtime handling for XML/XMLList and related patterns
compat/ has grown substantially and now covers more AS3 behavior used by converted output, including:
-
ASAny,ASDictionary,ASArrayBase,ASProxyBasebehavior refinements - non-Flash parity for dynamic/property access semantics, including
for each/for...inover untyped arrays - additional XML/XMLList, RegExp, describeType, ByteArray, and related utility behavior
compat-test/ includes dedicated tests for this layer, run on JS, C++ and Flash, and should be updated together with runtime changes.
Compared to baseline ax3 usage, target priorities are different:
- Primary focus: C++/hxcpp migration and runtime parity.
- Secondary but still supported target: HTML5.
To support that, this fork includes more explicit effort toward non-Flash portability:
- multiple fixes targeting C++/hxcpp behavior
- fallback paths for non-Flash runtime semantics
- adjustments to avoid target-specific pitfalls (closure binding, varargs wrapping, numeric corner cases)
Notable workflow/config changes include:
- project renamed to
ax4, installable withhaxelib install ax4 - non-AS asset handling improvements:
-
copyNonAsoption (defaulttrue) -
dataoutfallback behavior and filtering withdataext/datafiles
-
- added docs structure under
docs/and one-way wiki sync -
skipXmlLiteralsto neutralize AS3 XML literals instead of failing the run - field initializers moved into constructors keep ASC order by default;
settings.reorderFieldInitsForCtorDepsopts into placing them after the constructor assigns they read - diagnostic aggregation at end of conversion (see Diagnostics)
If you are coming from ax3:
- Read Quickstart and Config reference first.
- Ensure
compat/is included in your target project (-lib ax4, or a copy ofcompat/). - Re-check any custom assumptions around dynamic behavior, array/vector helpers, and XML/E4X conversions.
- If output still fails to compile, use Troubleshooting and reduce to a repro in
tests/src/. - After conversion, read the diagnostics summary and Diagnostics before assuming warnings are converter bugs.