* Use `TryFlags` instead of hard-coded binary literals.
* Rename `try_length`, `catch_length`, `finally_length` to `try_size`,
`catch_size`, `finally_size` to match SWF19 namings.
* Refactor write and fix a few bugs there:
* The actions length should not include the try, catch, finally
bodies, only the metadata of `flags`, `try_size`, `catch_size`,
`finally_size` and catch variable (either as `u8` or `SwfStr`).
* A placeholder byte should be written in place of the catch variable
when there is no catch clause.
* `try_actions` -> `try_body`
* `catch` -> `catch_body`
* `finally` -> `finally_body`
This aligns with the names used in SWF19, and is more consistent.
Each function is reduced to just 3 opcodes on x86:
https://godbolt.org/z/n6q6zxnh6
WebAssembly benefits as well: https://godbolt.org/z/fcETE9GYn
This should improve load-time performance because read_f64_me is
used frequently (for each AVM1 double constant).
While switching swf to return slices, I noticed ActionPush was
potentially allocating a huge vector by mistake.
Switch to SmallVec<[Value; 4]> to fix this and avoid the
allocation in general (this was fairly high up in the profiler).
TODO: Return an iterator instead of any sort of vec.
Improves the error handling for the swf crate:
* Custom swf::error::Error type added to handle various errors
in SWF parsing.
* Invalid parsing of tags/AVM1 ops results in a Error::ParseError
that can include info about the underlying failure.
* Implement Display for these errors. Output descriptive
names for the tag/opcode when it fails to parse.
* Handle out of bounds reads in avm1::Reader::read_slice.
Previously this would panic, now it returns an io::Error.
Closes#85.