Les SWC produits par Flex Builder contiennent un SWF étrange.
Je bosse actuellement sur un système de tests unitaires en AS3, car FlexUnit ne me convenait pas par la lourdeur (certainement subjective) de son utilisation. Le principe de base consiste à compiler le projet de tests unitaires sous forme d’un SWC, qui est ensuite chargé et décompressé par le système, qui en extrait le SWF de librairies afin de le charger, pour pouvoir exécuter le code des classes de tests.
Tout marche vachement bien, et hier soir, je me dis que je vais le ramener à la maison pour trifouiller un peu ce week-end. Et là, crack, impossible de le faire marcher de chez moi. Wtf? En fait, lorsque le SWF est chargé par un Loader
, ce dernier ne produit pas d’évènement INIT
, ni d’évènement COMPLETE
. Il produit par contre des évènements PROGRESS
, dont un où bytesLoaded == bytesTotal
. Mais les classes contenues par le SWF ne sont (visiblement) jamais ajoutées à l’ApplicationDomain
précisé dans le LoaderContext
.
Après une petite analyse, il apparait que les SWC produits par FlexBuilder ne sont pas strictement identiques à un SWC produit par compc
. À coup de Swfmill, la différence apparaît clairement:
SWF contenu dans un SWC produit par compc
, exemple de contenu pour le tag 0×52 (ABC pour AVM2), en Base64 :
AAAAAFVuaXRUZXN0aW5nQ29t(...)
SWF contenu dans un SWC produit par FlexBuilder, même segment du même tag, en Base64 :
AQAAAFVuaXRUZXN0aW5nQ29t(...)
Ne me demandez pas ce que fout ce Q
là, mais en le remplaçant par un A
, le SWF fonctionne à nouveau. Si une personne connaissant mieux le bytecode AVM2 que moi (ce qui n’est pas difficile), et ayant une idée de ce que signifie ces entêtes, toute info est la bienvenue. Allez, salut.
Le lutin qui écrit le bytecode dans ton FlexBuilder est sans doute français mais comme tu as un clavier suisse qwertz, il s’est emmêlé les pinceaux à cause de son habitude de l’azerty ~