David Wendt
f042e453a3
Add a test for interactions between prototype and class-trait properties.
...
This is the test that broke the old object model's back, please see parent commit's description for more details.
2020-07-13 17:44:27 -04:00
David Wendt
2f95a7a81b
Completely overhaul the way traits are defined on objects.
...
Previously, we were treating ES4 classes like syntactic sugar over a prototype chain (like ES6 classes); e.g. each declared trait was set in the given prototype and then property look-ups happened as normal.
This already caused problems with virtual properties, which could be partially-defined in subclasses and required careful checks to make sure we stopped checking the prototype chain on the *correct* half of the property.
However, this is a hint of a larger problem, which is that ES4 classes don't actually define anything on the prototype chain. Instead, the instance itself constructs class properties and methods on itself. This allows things like methods automatically binding `this`, which isn't included in this commit but will be implemented really soon.
The prototype chain still exists even on pure ES4 classes, due to the need for backwards compatibility with ES3 code. Object, for example, still defines it's methods as prototype methods and thus there needs to be a prototype chain to reach them. I actually could have gotten away with using the prototype chain if AS3 *hadn't* retained this "legacy" detail of ES3 allowing this class/prototype distinction to leak out into upcoming tests.
We still actually use the prototype chain for one other thing: trait resolution. When we look for a trait to install onto an object, we pull traits from the prototype chain using a special set of `TObject` methods. This happens in opposite order from normal prototype lookups so that subclassing and verification can proceed correctly.
`super` somehow became even harder to implement: we now actually construct the parent class so we can get traits from it, which is going to complicate method binding as mentioned above.
2020-07-13 17:44:27 -04:00
David Wendt
353017576a
`ScriptObject` now holds a reference to a class and allows retrieving traits from it.
2020-07-13 17:44:27 -04:00
David Wendt
f10920adc0
Implement `Object.prototype.hasOwnProperty` and resolution of `Namespace::Any`.
2020-07-13 17:44:26 -04:00
David Wendt
67744650f1
Pass the ABC name and lazy init flag to the AVM2.
2020-07-13 17:44:25 -04:00
David Wendt
6cc3f7ecc3
Add a test for stored properties as well.
...
This test passed with no errors.
2020-07-13 17:44:24 -04:00
David Wendt
5abc78d3bd
Add test of AVM2 virtual properties.
...
This tests:
* Getter invocation
* Setter invocation
* Properties with one or the other, but not both
* Inheritance
* Superproperty getters and setters
* Getters with inherited setter
* Setters with inherited getter
2020-07-13 17:44:24 -04:00
David Wendt
c5e3af2053
When resolving `get_property`, skip over virtual properties that do not have a defined getter.
2020-07-13 17:44:23 -04:00
David Wendt
54b792ef3a
Ensure that called setters are properly resolved so that errors in setters propagate up the Rust stack correctly.
...
The previous system for handling setters would execute the setter and then return a value to indicate whether or not the caller needed to resolve a stack frame. However, no caller of `Property.set` actually did this. Ergo, errors in setters and getters would not resolve up the stack at the correct time.
This problem also exists in AVM1 but is far less noticable as AVM1 only has two very uncommon runtime errors and very few movies use `throw`.
2020-07-13 17:44:23 -04:00
David Wendt
b8106d24d2
Ensure virtual setters are run when defined on a prototype.
...
Normally, `set_property` only affects the object it was called on, which makes sense: otherwise, we couldn't override values that originate from a class prototype without accidentally monkey-patching the prototype. However, virtual setters only exist in prototypes and need to be accessible from child objects.
The solution to this is to have a specific method to check if a virtual setter exists. Virtual setters are then resolved through the prototype chain. If no virtual setter exists, then the reciever object is handed the value.
Note that we always use the `reciever` object rather than `self` so that `setsuper` can work correctly. In `setsuper`, we resolve the base class, and then set properties on it with the actual object in question as it's reciever. If a virtual setter is called, it will get the actual object it should be manipulating; and otherwise, prototypes will not be modified or consulted.
2020-07-13 17:44:22 -04:00
David Wendt
665d7a4342
Implement `getsuper` and `setsuper`.
...
This required the reintroduction of dedicated reciever parameters to `Object.get_property_local` and `Object.set_property`, which I had removed from the AVM1 code I copied it from. It turns out being able to change the reciever was actually necessary in order to make super set/get work.
2020-07-13 17:44:22 -04:00
David Wendt
785832b7f3
Add `as3_inheritance` test, which is primarily designed to test method calls, constructor execution, and usage of `super`.
2020-07-13 17:44:22 -04:00
David Wendt
e8fbac6cf2
Refactor the base_proto system to more accurately record what prototype methods come from.
...
The previous system primarily relied on `Executable` to automatically start and continue a super chain. This works, but only for class hierarchies without *override gaps* - methods that override another method not defined by the direct superclass of the method. In that case, the override method would be called twice as the `base_class` was moved up one prototype at a time, which is wrong.
The new system relies on the call site to accurately report the prototype from which the current method was retrieved from. Super calls then start the resolution process *from the superclass of this prototype*, to ensure that the already-called method is skipped.
It should be noted that the proper `base_class` for things like `callmethod`, `callstatic`, `call`, `get`/`set` methods, and other call opcodes that don't use property look-up are best-effort guesses that may need to be amended later with better tests.
To facilitate `base_proto` resolution, a new `Object` method has been added. It's similar to `get_property`, but instead returns the closest prototype that can resolve the given `QName`, rather than the actual property's `ReturnValue`. Call operations use this to resolve the `base_proto`, and then resolve the method being called in `base_proto`. The existing `exec_super` method was removed and a `base_proto` method added to `exec` and `call`.
2020-07-13 17:44:21 -04:00
David Wendt
43da7ac952
`resolve_multiname` should actually return it's prototype's return value.
2020-07-13 17:44:20 -04:00
David Wendt
ab5a95c05b
Add a test for various types of class methods.
2020-07-13 17:44:19 -04:00
David Wendt
1c3b9c50fe
Implement prototype awareness for `get_property`, `has_property`, and `resolve_multiname`.
...
Furthermore, implement `has_own_property`.
2020-07-13 17:44:19 -04:00
David Wendt
fa4369da72
Execute static class initializers.
...
This also fixes the lack of function prototype on classes.
2020-07-13 17:44:18 -04:00
David Wendt
687a82f643
Constructors should also inherit closure scope.
2020-07-13 17:44:18 -04:00
David Wendt
73966f1b31
Make sure that we actually call the super constructor, not our own constructor.
2020-07-13 17:44:17 -04:00
David Wendt
1b67bb94c8
Impl `callsuper`, `callsupervoid`, and `constructsuper`.
...
This works primarily by retaining the current superclass prototype in the activation object and then using it to retrieve the super method.
For constructors, we implement the `constructor` property, which is probably not the correct way to do this.
2020-07-13 17:44:15 -04:00
David Wendt
f3dee5c310
Add (currently failing) test for constructors.
2020-07-13 17:44:14 -04:00
David Wendt
a77f676279
`construct` and `constructprop` should push the object that was just constructed.
2020-07-13 17:44:13 -04:00
David Wendt
0fc9b9a287
`construct` and `constructprop` should take their args in reverse-order like the call functions do.
2020-07-13 17:44:13 -04:00
David Wendt
9431e02802
The class function should use the *instance* initializer as it's callable, not the class initializer.
2020-07-13 17:44:13 -04:00
David Wendt
bedf5cb459
Add a basic test for function calls.
2020-07-13 17:44:13 -04:00
David Wendt
38868fbdfe
Args are pushed onto the stack in normal order, so we need to pop them off in reverse order.
2020-07-13 17:44:12 -04:00
David Wendt
a2dfffc56e
Add our first AVM2 regression test: hello world!
2020-07-13 17:44:09 -04:00
David Wendt
7d576203c9
Impl `coerce_a`.
...
This currently treats `coerce_a` as a no-op. Strictly speaking, this is for type verification purposes, but we currently don't type-verify ABC code. Ergo, this requires no VM support at this time.
2020-07-13 17:43:50 -04:00
David Wendt
a0ab978bed
Impl `callmethod`, `callproperty`, `callproplex`, `callpropvoid`, and `callstatic`.
...
Also, implement a method table that method traits can optionally add themselves to.
Also also, add the ability to invoke a method without a `this` object. This required a non-trivial refactoring of the activation machinery, and changes to the signature of `NativeFunction`, and all native AVM2 functions.
2020-07-13 17:43:49 -04:00
David Wendt
68cf9e8869
Upon encountering an `Err`, dispose of the current AVM2 stack.
...
In the future, the `unwrap_stack_frame` mechanism should be expanded upon to allow running exception handlers and recovering from a Rust error - but not today.
2020-07-13 17:43:49 -04:00
David Wendt
a7ff2de476
Don't spam the test log with `Resolving Multiname` messages for each scope that gets checked
2020-07-13 17:43:48 -04:00
David Wendt
dd6b0a8728
Remove unused reference to slot property fields
2020-07-13 17:43:48 -04:00
David Wendt
bf45f7f161
Fix crash when reading or writing a property that redirects to a slot.
2020-07-13 17:43:48 -04:00
David Wendt
7792fd5581
Impl `trace`, which is a free function rather than an opcode this time.
2020-07-13 17:43:48 -04:00
David Wendt
a557867c71
Add the entire class hierarchy of `MovieClip` and `Sprite`.
2020-07-13 17:43:47 -04:00
David Wendt
f6e2ca1fe5
Clean up the current set of builtins to accurately reflect the namespace hierarchy.
2020-07-13 17:43:47 -04:00
David Wendt
38b1524a49
Fix the error messages for `findpropstrict` and `getlex` to be more informative.
2020-07-13 17:43:47 -04:00
David Wendt
843de29460
Impl `newobject`
2020-07-13 17:43:46 -04:00
David Wendt
7201f6c4fe
Impl `debug`, `debugfile` and `debugline`.
2020-07-13 17:43:46 -04:00
David Wendt
1d1bad1ab4
Impl `getglobalscope`
2020-07-13 17:43:46 -04:00
David Wendt
074ba94c17
Impl `newfunction` and `newclass`.
...
Notably, this also removes `new_closure_scope` as it is not needed. AVM1 does not capture `with` scopes in closures, but AVM2 (as well as modern ECMAScript) does.
2020-07-13 17:43:46 -04:00
David Wendt
1fe73b3329
Impl `dup`
2020-07-13 17:43:45 -04:00
David Wendt
0ff1c04697
Impl `initproperty`
2020-07-13 17:43:45 -04:00
David Wendt
5042fc1bc7
Debug all multiname resolutions
2020-07-13 17:43:44 -04:00
David Wendt
5c0e095ab5
`getlex` does not support runtime multinames according to spec.
2020-07-13 17:43:44 -04:00
David Wendt
9e120c216b
Propagate arguments into local registers when calling AVM functions.
2020-07-13 17:43:44 -04:00
David Wendt
5b00c1fd96
Ensure that `this` is properly populated into local registers.
2020-07-13 17:43:44 -04:00
David Wendt
b2f5307213
Add `flash.display.Sprite` because Flash Builder tests demand it.
2020-07-13 17:43:42 -04:00
David Wendt
4ab9a46515
Impl `getscopeobject`
2020-07-13 17:43:41 -04:00
David Wendt
5f98a198cb
Remove dead code in Activation
2020-07-13 17:43:41 -04:00
David Wendt
279d90ec22
Remove `define_value` from AVM2 objects.
...
We already have a menagerie of `install_*` functions for adding static properties to a an object; and we don't have to support any kind of asinine nonsense liks `ASSetPropFlags` here. Ergo, we don't need this.
2020-07-13 17:43:39 -04:00
David Wendt
cbce8660bc
Implement `deleteproperty`.
2020-07-13 17:43:37 -04:00
David Wendt
d19d9ef90e
Clean up unused variables
2020-07-13 17:43:35 -04:00
David Wendt
8b56973d29
Remove scope methods that aren't necessary.
...
In AVM1, these are necessary because `ActionGetVariable` et. all directly interface with the scope chain. In AVM2, you `findpropstrict` up the scope chain, which gives you a normal object that you can interact with as you like. Ergo, the scope chain doesn't need set/get property methods.
2020-07-13 17:43:34 -04:00
David Wendt
fd275bdcf3
Implement constant slots and traits.
...
Class and Function traits now generate const slots, too.
2020-07-13 17:43:33 -04:00
David Wendt
412c3d8489
Implement `Function` traits.
2020-07-13 17:43:29 -04:00
David Wendt
af70024f62
Implement slot traits.
2020-07-13 17:43:28 -04:00
David Wendt
200c10b4a2
Classes can fit in slots, so let's stick them in there.
2020-07-13 17:43:27 -04:00
David Wendt
d42b16f021
Add stub impl of `flash.display.MovieClip`.
2020-07-13 17:43:27 -04:00
David Wendt
ebcfee4676
Add specific error messages for unresolvable super classes
2020-07-13 17:43:27 -04:00
David Wendt
362294181f
Implement constant pool default values (index 0).
...
All constant pools in an ABC file are actually numbered starting from one; there's an implicit 0 entry not stored in the file that the runtime is expected to retrieve when pulling constants from the pool.
The AVM2/ABC spec only mentions this in passing.
2020-07-13 17:43:27 -04:00
David Wendt
e1916519dd
Add debug for trait installs
2020-07-13 17:43:26 -04:00
David Wendt
cfe0e333be
Fix invalid script index when loading an ABC file.
2020-07-13 17:43:26 -04:00
David Wendt
bc0bdf8496
The public namespace appears to just be an unnamed package namespace, not a regular namespace.
2020-07-13 17:43:25 -04:00
David Wendt
04879fc419
Implement class traits.
...
This allows the AVM to declare classes, which necessitated some refactoring to avoid double-borrows or having to do something "magic" that would dodge virtual properties.
2020-07-13 17:43:25 -04:00
David Wendt
ecfd5abb41
Impl `construct` and `constructprop`.
2020-07-13 17:43:24 -04:00
David Wendt
1ab4091050
Implement slots and related opcodes.
2020-07-13 17:43:24 -04:00
David Wendt
88957b2b3d
Add stub builtins for Object and Function. These are more-or-less identical to the way we did it in AVM1 (e.g. no fancy player globals file)
2020-07-13 17:43:24 -04:00
David Wendt
1945f36dc0
When running the initial script, also install it's traits onto the global scope.
2020-07-13 17:43:23 -04:00
David Wendt
35c36a807b
Always execute the last script when loading an ABC file
2020-07-13 17:43:23 -04:00
David Wendt
560900e708
ABC files are always pre-loaded.
...
Frame actions are handled as syntactic sugar on top of a `MovieClip` subclass and event handlers. ABC scripts do not live on the normal timeline.
2020-07-13 17:43:23 -04:00
David Wendt
502936f0fe
Implement non-slot trait properties (Method, Getter, and Setter)
2020-07-13 17:43:22 -04:00
David Wendt
12e9fbbffb
Impl virtual property slots
2020-07-13 17:43:22 -04:00
David Wendt
eb0c9dcaec
Allow constructing a function around a particular class definition.
...
I'm writing all this code assuming that classes and traits are syntactic sugar around ES3-style prototype chains on function objects. Hence, `FunctionObject` is still our workhorse object type for implementing typing.
2020-07-13 17:43:21 -04:00
David Wendt
cf490bedfb
Unstub `proto`.
2020-07-13 17:43:20 -04:00
David Wendt
b12c6e0ff1
Implement closure scope stacks.
2020-07-13 17:43:20 -04:00
David Wendt
7d75255a1a
Add global scope which is automatically included on all new activations.
2020-07-13 17:43:20 -04:00
David Wendt
984e701142
Swap out `has_property`'s stub impl.
2020-07-13 17:43:19 -04:00
David Wendt
e5142e85e9
Replace `get_property` and `set_property` with slightly-less-stub impls.
2020-07-13 17:43:17 -04:00
David Wendt
d56db06447
Implement `resolve_multiname`, sort of.
2020-07-13 17:43:16 -04:00
David Wendt
78a1c9a7e3
Implement `pushscope`, `popscope`, and `pushwith`.
2020-07-13 17:43:16 -04:00
David Wendt
5e6fc79f42
Implement `getproperty`, `setproperty`
2020-07-13 17:43:15 -04:00
David Wendt
60c16b0a60
Implement `findproperty`, `findpropstrict`, and `getlex`; which are necessary for interacting with global scope.
2020-07-13 17:43:15 -04:00
David Wendt
3c8035f871
clippy pls
2020-07-13 17:43:14 -04:00
David Wendt
12223d524a
Add support methods in `Scope` to support opcodes that traverse the scope chain.
2020-07-13 17:43:14 -04:00
David Wendt
0ff1ba7120
Multiname resolution is another object method.
2020-07-13 17:43:14 -04:00
David Wendt
376d1a8ca6
Add scope support
2020-07-13 17:43:13 -04:00
David Wendt
3b476cba9e
Implement `pushnamespace` since that's a value type now
2020-07-13 17:43:13 -04:00
David Wendt
1a6acb9440
Implement late binding and runtime qualifications for names.
2020-07-13 17:43:12 -04:00
David Wendt
2f3a3aff6f
Add exact type assertion methods for strings and namespace values.
2020-07-13 17:43:11 -04:00
David Wendt
6d8dc6e63d
Pull ABC constant pool methods out of Avm2 and into Value.
...
The old methods still exist and do the same thing, but the Value methods
accept arbitrary AbcFile references.
2020-07-13 17:42:51 -04:00
David Wendt
c65d93d063
Implement multinames, sans runtime namespace support.
2020-07-13 17:42:50 -04:00
David Wendt
6bd94d6bc9
`from_abc_namespace` should accept a namespace index and retrieve it from the file's constant pool itself.
2020-07-13 17:42:50 -04:00
David Wendt
43f1080fab
Implement namespaces as a value type
2020-07-13 17:42:49 -04:00
David Wendt
52ac7a6583
Implement call/return for bare functions
2020-07-13 17:42:49 -04:00
David Wendt
115f0393aa
Add `call` method to the object trait. Only functions are callable in AVM2, all others error out.
2020-07-13 17:42:48 -04:00
David Wendt
d1aeae8e02
Add support for local registers in the interpreter.
2020-07-13 17:42:47 -04:00
David Wendt
4d000e1ce0
Implement `pushxyz` opcodes for all value types that we currently support.
2020-07-13 17:42:46 -04:00
David Wendt
5600ac477c
Always execute any AVM2 code that may have been queued as a result of loading ABC files.
2020-07-13 17:42:45 -04:00
David Wendt
7f60fab1e5
Add the bare minimum necessary to get opcodes out of an ABC and into an interpreter loop.
...
Surprisingly enough, the "bare minimum" includes a stack, object model, and values already.
2020-07-13 17:42:45 -04:00
David Wendt
e80c887261
Add a very basic object model to the AVM2 interpreter.
2020-07-13 17:42:44 -04:00
David Wendt
b7f257e7c8
Add a path to get from the movie clip to the Avm2.
2020-07-13 17:42:43 -04:00
David Wendt
a852a6939a
Add an extremely trivial implementation for the AVM2 interpreter state.
2020-07-13 17:42:31 -04:00
Nathan Adams
fba8ccda81
avm1: Rename Avm1String to AvmString
2020-07-13 10:12:54 -07:00
Nathan Adams
d8f043fa1a
avm1: Value::coerce_to_string returns an Avm1String, as it can avoid a clone-and-reallocate
2020-07-13 10:12:54 -07:00
Nathan Adams
f0ef68cb16
avm1: Reenabled paused string-value tests during string refactor
2020-07-13 10:12:54 -07:00
Nathan Adams
c60b2cf4fc
avm1: Implement From<&'static str> for Value
2020-07-13 10:12:54 -07:00
Nathan Adams
e03e3f6c4e
avm1: Allow Avm1String to contain &'static str
2020-07-13 10:12:54 -07:00
Nathan Adams
ad733f2f21
avm1: Add Avm1String which wraps Gc<String>
2020-07-13 10:12:54 -07:00
Nathan Adams
016b9db3c5
avm1: Change Value::String(String) to Value::String(Gc<String>)
2020-07-13 10:12:54 -07:00
CUB3D
0591c0fe4b
core: Add functions to prototypes
2020-07-12 15:25:58 -07:00
CUB3D
ab022b66e9
chore: Format and cleanup clippy lints
2020-07-12 15:25:58 -07:00
CUB3D
83cca044ad
core: Add tests for ContextMenu and ContextMenuItem
2020-07-12 15:25:58 -07:00
CUB3D
46cd8eb507
core: Add ContextMenuItem
2020-07-12 15:25:58 -07:00
CUB3D
04ca652f98
core: ContextMenu fully implemented
2020-07-12 15:25:58 -07:00
CUB3D
73a98c7f78
core: Implement copy() for ContextMenu
2020-07-12 15:25:58 -07:00
CUB3D
f3aa6f7f01
core: Add stub of ContextMenuItem
2020-07-12 15:25:58 -07:00
CUB3D
c8fefc56b5
core: Add stubs for context menu
2020-07-12 15:25:58 -07:00
dependabot-preview[bot]
aaf42d1948
build(deps): bump syn from 1.0.33 to 1.0.34
...
Bumps [syn](https://github.com/dtolnay/syn ) from 1.0.33 to 1.0.34.
- [Release notes](https://github.com/dtolnay/syn/releases )
- [Commits](https://github.com/dtolnay/syn/compare/1.0.33...1.0.34 )
Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-12 15:01:43 -07:00
Nathan Adams
180891c58e
avm1: Add impl_custom_object!() macro to simplify custom object types
2020-07-10 16:48:05 -07:00
Nathan Adams
eb94cc54b2
chore: Move avm1 objects to their own module, we have plenty of them now
2020-07-10 16:48:05 -07:00
Mike Welsh
3322c2d916
avm1: Implement updateAfterEvent
2020-07-10 14:38:48 -07:00
Mike Welsh
8715589f50
tests: Add setInterval test
2020-07-10 14:38:48 -07:00
Mike Welsh
98e7da7d93
avm1: Implement setInterval
2020-07-10 14:38:48 -07:00
Mike Welsh
a1ff80bb18
avm1: Object.watch is case insensitive on SWFv6
2020-07-10 12:02:26 -07:00
Nathan Adams
8a0430d744
avm1: Implement Object.watch & Object.unwatch ( #268 )
2020-07-10 12:02:26 -07:00
Nathan Adams
ecbab536b5
avm1: Respect ScriptLimits for recursion depth, and use that in infinite_recursion_function
2020-07-08 14:47:38 -07:00
Nathan Adams
2b30fd32b7
avm1: Activation depth can be up to u16.
2020-07-08 14:47:38 -07:00
Nathan Adams
51ec5739c6
avm1: Throw errors when functions (user-called, or special) go too deep
2020-07-08 14:47:38 -07:00
Nathan Adams
aa98c2c24f
avm1: Track the reason for executions, if it's a function call vs
...
something special, like a getter
2020-07-08 14:47:38 -07:00
Nathan Adams
65396ba87a
avm1: All errors are ignored during getters or setters
2020-07-08 14:47:38 -07:00
Nathan Adams
3ee1902117
avm1: Don't log errors at every Activation, only at the "root" frames
2020-07-08 14:47:38 -07:00
Nathan Adams
8218e14824
avm1: Remove unused field is_executing from Activation
2020-07-08 14:47:38 -07:00
dependabot-preview[bot]
a3bdb20cf1
build(deps): bump smallvec from 1.4.0 to 1.4.1
...
Bumps [smallvec](https://github.com/servo/rust-smallvec ) from 1.4.0 to 1.4.1.
- [Release notes](https://github.com/servo/rust-smallvec/releases )
- [Commits](https://github.com/servo/rust-smallvec/compare/v1.4.0...v1.4.1 )
Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-06 20:30:41 -07:00
Mike Welsh
2cbbe32412
tests: Add test for GetVariable/SetVariable on _x, etc.
2020-07-05 15:15:31 -07:00
Mike Welsh
804385347f
tests: Add test for virtual properties on prototype
2020-07-05 15:15:31 -07:00
Mike Welsh
fec8cf5e52
tests: Add tests for with from issue #792
2020-07-05 15:15:31 -07:00
Mike Welsh
bd7f986594
avm1: Allow overwriting _parent
2020-07-05 15:15:31 -07:00
Mike Welsh
ad6e2ceed4
avm1: Remove TObject::is_property_overwritable
...
Local virtual properties take precedence over prototype/parent
scopes, even for read-only propreties.
2020-07-05 15:15:31 -07:00
Mike Welsh
1240c79f70
avm1: StageObject::has_property should return true for _x, etc.
2020-07-05 15:15:31 -07:00
Mike Welsh
6feb266576
avm1: with(undefined) or with(null) is ignored
2020-07-05 15:15:31 -07:00
CUB3D
00d55b05a0
chore: Fix formatting
2020-07-05 13:49:59 -07:00
CUB3D
64eed4def9
chore: Cleanup
2020-07-05 13:49:59 -07:00
CUB3D
ab58cff8b3
core: Add tests for ColorTransform and cleanup code
2020-07-05 13:49:59 -07:00
CUB3D
0dcbd05f5d
chore: Fix formatting
2020-07-05 13:49:59 -07:00
CUB3D
68eb6a6342
core: Fix ColorTransformObject virtual prototype setters
2020-07-05 13:49:59 -07:00
CUB3D
73e9dc1a82
core: Refactor ColorTransform
2020-07-05 13:49:59 -07:00
CUB3D
26ae182584
core: Update to reflect avm changes
2020-07-05 13:49:59 -07:00
CUB3D
431cc532be
core: ColorTransform no longer passed through engine ColorTransform object
2020-07-05 13:49:59 -07:00
CUB3D
a8b1be2afa
core: Remove useless to_owned in color_transform
2020-07-05 13:49:59 -07:00
CUB3D
c0315dce3f
chore: Format
2020-07-05 13:49:59 -07:00
CUB3D
a8f7638d99
core: Implement ColorTransform
2020-07-05 13:49:59 -07:00
dependabot-preview[bot]
328246dc10
build(deps): bump jpeg-decoder from 0.1.19 to 0.1.20
...
Bumps [jpeg-decoder](https://github.com/image-rs/jpeg-decoder ) from 0.1.19 to 0.1.20.
- [Release notes](https://github.com/image-rs/jpeg-decoder/releases )
- [Changelog](https://github.com/image-rs/jpeg-decoder/blob/master/CHANGELOG.md )
- [Commits](https://github.com/image-rs/jpeg-decoder/compare/v0.1.19...v0.1.20 )
Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-04 15:29:45 -07:00
Mike Welsh
7b4045f32b
core: Remove some unneccessary `take` calls in tag functions
2020-07-03 18:52:26 -07:00
Mike Welsh
08569ae979
core: Limit tag parsing to slice of tag data
2020-07-03 18:52:26 -07:00
Nathan Adams
c50c835790
avm1: Made Executable::Action take in a Gc to Avm1Function, reducing the size of the struct significantly
2020-07-03 18:47:34 -07:00
Nathan Adams
c4980d0bf5
core: Make XMLName::node_name return Cow<str>. It's not always owned, and we don't always need it to be.
2020-07-03 17:30:59 -07:00
Nathan Adams
c036e2cf88
avm1: Made f64_to_string return Cow<str> instead of String, as we sometimes return static values
2020-07-03 17:30:59 -07:00
Nathan Adams
938d644d7d
core: Made PropertyMap::insert take &str instead of String, as ownership isn't always needed
2020-07-03 17:30:59 -07:00
Nathan Adams
fb84999778
core: Made VacantEntry store a &str instead of a String, avoiding allocation until insertation is requested
2020-07-03 17:30:59 -07:00
Nathan Adams
f4921fad45
core: Made PropertyMap::entry take &str instead of String. We often don't need ownership here.
2020-07-03 17:30:59 -07:00
Nathan Adams
b5c06be8a2
avm1: Anonymous function names for debugging when not in debug mode
2020-07-03 17:24:20 -07:00
Nathan Adams
51321713b5
avm1: Show stack frame with the avm_debug feature
2020-07-03 17:24:20 -07:00
Nathan Adams
c976cf8efb
avm1: Replace action.avm() with activation.avm to help with borrow checker in next commit
2020-07-03 17:24:20 -07:00
Mike Welsh
07814fdf53
tests: Add test for Error
2020-07-02 20:58:01 -07:00
Jon Pacheco
48c65f02a1
avm1: Implement Error object (see #251 )
2020-07-02 20:58:01 -07:00
Adrian Wielgosik
301d696670
Add a fast path for ASCII case conversions
2020-07-02 12:48:50 -07:00
Mike Welsh
3a4d432645
tests: Edit textfield_variable test for #777
2020-07-02 01:29:41 -07:00
Mike Welsh
dd32acd8fc
avm1: Empty text field does not initialize variable binding
...
If a text field with a variable binding is placed on the stage,
usually the variable is initialized with the initial text. However,
if the text field is empty, the variable remains undefined.
Fixes #777 .
2020-07-02 01:29:41 -07:00
Mike Welsh
b05da5ef0f
avm1: CastOp fails for primitive values
2020-07-01 17:30:56 -07:00
Nathan Adams
d86761db5d
avm1: Implement try {..} catch {..} finally {..} - #731
2020-07-01 17:30:56 -07:00
Nathan Adams
7c0b0a7a57
avm1: Fix instanceof checks with primitives
2020-07-01 16:36:54 -07:00
Nathan Adams
d1732dd3d6
avm1: Returning from with{} should return from the parent activation
2020-07-01 16:21:43 -07:00
Mike Welsh
4b4370b90d
avm: Refactor Avm1, move execution to StackFrame (merge #767 )
...
AVM1 refactoring: moving execution from Avm1 to StackFrame
2020-07-01 15:56:09 -07:00
Nathan Adams
8bc3eedc43
avm1: Rename StackFrame to Activation now that they're merged
2020-07-02 00:09:43 +02:00
dependabot-preview[bot]
41e262d745
build(deps): bump libflate from 1.0.1 to 1.0.2
...
Bumps [libflate](https://github.com/sile/libflate ) from 1.0.1 to 1.0.2.
- [Release notes](https://github.com/sile/libflate/releases )
- [Commits](https://github.com/sile/libflate/compare/1.0.1...1.0.2 )
Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-01 11:43:31 -07:00
Nathan Adams
9b66b496d0
avm1: Fix double-borrow when calling a getter that calls another method
2020-07-01 18:53:16 +02:00
dependabot-preview[bot]
aa9100395f
build(deps): bump downcast-rs from 1.1.1 to 1.2.0
...
Bumps [downcast-rs](https://github.com/marcianx/downcast-rs ) from 1.1.1 to 1.2.0.
- [Release notes](https://github.com/marcianx/downcast-rs/releases )
- [Changelog](https://github.com/marcianx/downcast-rs/blob/master/CHANGELOG.md )
- [Commits](https://github.com/marcianx/downcast-rs/compare/v1.1.1...v1.2.0 )
Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-30 17:32:47 -07:00
Nathan Adams
987375299b
avm1: Replace 'run_in_avm' with just building a StackFrame object, letting Rust borrowchecker do our stack management for us
2020-06-30 21:57:51 +02:00
Nathan Adams
47a806a5ee
avm1: Removed errors that are no longer possible to run into
2020-06-30 21:28:32 +02:00
Nathan Adams
a989aa235a
avm1: We don't need to lock StackFrames anymore, the borrow checker will steer us right
2020-06-30 21:26:57 +02:00
Nathan Adams
2288919663
avm1: We don't need to store data in StackFrame, it's only used when actually running data
2020-06-30 21:24:46 +02:00
Nathan Adams
45c3967deb
avm1: Merge Activation into StackFrame
2020-06-30 21:08:42 +02:00
Nathan Adams
d889b98043
avm1: Merge Activation::from_function and Activation::from_action as they're identical
2020-06-30 20:34:05 +02:00
Nathan Adams
6e4dd506da
avm1: Activation doesn't need to be in a GcCell
2020-06-30 20:31:49 +02:00
Nathan Adams
4d24bc7f09
avm1: Removed pc from Activation, it's no longer needed
2020-06-30 19:42:18 +02:00
Nathan Adams
3e9c380ba1
avm1: Remove is_function from Activation, it's no longer needed
2020-06-30 19:40:21 +02:00
Nathan Adams
ec4affcf10
avm1: Use child activations when already running from another activation
2020-06-29 10:13:59 +02:00
Nathan Adams
aaa082fb60
avm1: Replace run_with_stack_frame with run_in_avm
2020-06-29 10:13:57 +02:00
Nathan Adams
0dd2ece371
avm1: Introduce parents to StackFrame, and move run_activation from avm1 to StackFrame
2020-06-29 10:12:17 +02:00
Nathan Adams
9b630bd305
avm1: Remove ReturnValue, it's no longer needed
2020-06-29 10:12:16 +02:00
Nathan Adams
ab4304d634
avm1: Properly and more explicitly work around the double-borrow issue in setters
2020-06-29 10:10:38 +02:00
Nathan Adams
a2103d906d
avm1: Remove dead code from Avm1
2020-06-29 10:10:24 +02:00
Nathan Adams
f85684fec0
avm1: Move current_swf_version and is_case_sensitive from avm1 to stackframe
2020-06-29 10:10:11 +02:00
Nathan Adams
d470c52aea
avm1: Move root_object, target_clip_or_root, target_clip and base_clip from avm1 to StackFrame
2020-06-29 10:09:57 +02:00
Nathan Adams
ca305684db
avm1: Removed unused return_value on Activation
2020-06-29 10:09:40 +02:00
Nathan Adams
da8ca1379f
avm1: Change from 'avm, context' to 'activation, context' and restructured to support this
2020-06-29 10:09:38 +02:00
Nathan Adams
a841743962
avm1: Make current_stack_frame return a Result for easy chaining
2020-06-29 10:07:48 +02:00
Nathan Adams
cdfd58d619
avm1: Move register get/setting from avm1 to StackFrame
2020-06-29 10:07:31 +02:00
Nathan Adams
63e66c29eb
avm1: We already have our stack frame, don't refetch it in actions
2020-06-29 10:07:14 +02:00
Nathan Adams
3a093dddbd
avm1: Run activations immediate, not queued up for some-time-later
2020-06-29 10:07:12 +02:00
Nathan Adams
10b8f4abaf
avm1: Handle stack poping in avm
2020-06-29 08:55:50 +02:00
Nathan Adams
84a5fae43f
avm1: Only perform stack-frame adjustments in one place, not scattered throughout actions
2020-06-29 08:51:34 +02:00
Nathan Adams
9109d89daa
avm1: Allow for frame control in StackFrame from any action
2020-06-29 08:51:34 +02:00
Nathan Adams
329716bfe7
avm1: Don't refetch activation.data every action
2020-06-29 08:51:33 +02:00
Nathan Adams
af72f68f0f
avm1: Run entire stack frames at once
2020-06-29 08:51:33 +02:00
Nathan Adams
c6b9de883f
avm1: Add Activation to StackFrame, removing lots of get-and-unwraps
2020-06-29 08:51:33 +02:00
Nathan Adams
4d76e8b24d
avm1: Move all actions from Avm1 to a new StackFrame
2020-06-29 08:51:33 +02:00
Mike Welsh
3bc3d4acb2
text: Fix bindings being incorrectly cleared in StageObject
...
Call to `Vec::retain` was backwards, causing bindings to be
incorrectly cleared/not cleared when a text field was removed.
2020-06-28 23:38:58 -07:00
Mike Welsh
93cf7a1386
text: Use retire_stack_frame after firing text bindings
2020-06-28 23:37:50 -07:00
Mike Welsh
ed82d984d2
text: Properly set text field position when created dynamically
2020-06-28 18:36:10 -07:00
Mike Welsh
7eeda7d93e
chore: clippy
2020-06-28 18:36:10 -07:00
Mike Welsh
ef31a6bea4
text: Don't override TextField::set_matrix and other layout changes
...
Don't override set_matrix and set_x for TextFields, and leave the
bounds intact.
TODO: There are still some wrapping issues in the tests, but
this allows the simple case of single-line texts to render
correctly.
2020-06-28 18:36:10 -07:00
Mike Welsh
b40f9d4c1a
avm1: Implement TextField.html
2020-06-28 18:36:10 -07:00
Mike Welsh
d97a515330
tests: Add text field variable test
2020-06-28 18:36:10 -07:00
Mike Welsh
618fa11acb
avm1: Implement text field variable binding
2020-06-28 18:36:10 -07:00
Mike Welsh
51d66c53f0
core: Edit text sets variables on instantiation
2020-06-28 18:36:10 -07:00
Mike Welsh
12fca71b21
avm1: Move StageObjectData behind a GC pointer
2020-06-28 18:36:10 -07:00
Mike Welsh
a922fd559f
avm1: Add EditText variable property
...
Add `EditText::variable` as well as `TextField.variable` property.
This commit only adds the getter/setter and does not yet add the
binding functionality.
2020-06-28 18:36:10 -07:00
Mike Welsh
dd50071240
core: Move frame and goto methods from MovieClipData to MovieClip
2020-06-28 18:36:10 -07:00
Mike Welsh
8da0f43412
tests: Add test for DefineLocal and issue #760
2020-06-28 15:15:45 -07:00
Mike Welsh
52fbb77e99
avm1: DefineLocal respects virtual properties and prototype chain ( fix #760 )
...
DefineLocal will call a virtual setter if the property already exists
on the local object, including the local object's prototype chain.
DefineLocal2 will also not overwrite a property if it already exists
on the local object, including the local object's prototype chain.
2020-06-28 15:15:45 -07:00
Mike Welsh
905f9d7ac6
core: Clear mouse down flag even if there is no hovered object
2020-06-27 23:34:19 -07:00
Mike Welsh
a846d92d8c
core: Don't fire rollOut events if clip is removed
...
Allows the inventory to work in The Room Tribute.
2020-06-27 21:24:49 -07:00
Mike Welsh
0833c15e25
tests: Add test for enumerating array indices
2020-06-27 20:25:45 -07:00
Mike Welsh
478d88b22d
tests: Test hasOwnProperty for array indices in array_properties
2020-06-27 20:25:45 -07:00
Mike Welsh
8e3b96f1b1
tests: Add tests for non-string params in hasOwnProperty:
2020-06-27 20:25:45 -07:00
Mike Welsh
ccf33eedf6
avm1: Array indices are enumerable
2020-06-27 20:25:45 -07:00
Mike Welsh
ecc54d01f7
avm1: Disallow setting "" property
...
object[""] has no effect.
2020-06-27 20:25:45 -07:00
Mike Welsh
ef82fc472e
avm1: Object.hasOwnProperty should coerce_to_string
2020-06-27 20:25:45 -07:00
Mike Welsh
b37b74e0b6
tests: Add test for __constructor__ being DontEnum
2020-06-27 18:54:01 -07:00
Mike Welsh
054194026e
avm1: Mark __constructor__ and constructor as DontEnum
2020-06-27 18:54:01 -07:00
dependabot-preview[bot]
63beea22a2
build(deps): bump weak-table from 0.2.3 to 0.3.0
...
Bumps [weak-table](https://github.com/tov/weak-table-rs ) from 0.2.3 to 0.3.0.
- [Release notes](https://github.com/tov/weak-table-rs/releases )
- [Changelog](https://github.com/tov/weak-table-rs/blob/master/release.toml )
- [Commits](https://github.com/tov/weak-table-rs/compare/0.2.3...0.3.0 )
Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-27 16:08:52 -07:00
dependabot-preview[bot]
82a86d6139
build(deps): bump png from 0.16.5 to 0.16.6
...
Bumps [png](https://github.com/image-rs/image-png ) from 0.16.5 to 0.16.6.
- [Release notes](https://github.com/image-rs/image-png/releases )
- [Changelog](https://github.com/image-rs/image-png/blob/master/CHANGES.md )
- [Commits](https://github.com/image-rs/image-png/commits )
Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-06-27 16:08:11 -07:00
Nathan Adams
463b79f063
avm1: Implement Action::Throw
2020-06-25 02:03:15 -07:00
Nathan Adams
70e4a40f01
avm1: Allow for user errors inside avm1::error::Error
2020-06-25 02:03:15 -07:00
Mike Welsh
81d75c6256
text: Text formatting for EditText fields (merge #615 )
...
First implementation of HTML parsing and formatting for text fields.
2020-06-24 23:06:11 -07:00
Mike Welsh
5d9701313e
text: Fix TextField.embedFonts setter
2020-06-24 22:46:59 -07:00
Mike Welsh
b2c96336fd
text: Cull text field if offscreen
2020-06-24 22:46:54 -07:00
David Wendt
74af7b345c
Adjust `BoxBounds` to use `Copy` instead of `Clone`.
2020-06-24 23:40:27 -04:00
David Wendt
d7a257f93f
Adjust `LayoutContext` and `LayoutBox` to construct a `Vec` of boxes rather than an intrusive, garbage-collected linked list.
2020-06-24 23:34:38 -04:00
David Wendt
d281452fe1
Expose the device font flag to AVM1 code.
2020-06-24 22:55:50 -04:00
David Wendt
453cf6c0f1
Remove *extremely* out of date documentation on `BoxBounds`.
2020-06-24 22:36:36 -04:00
David Wendt
2723c3f6d9
Rename `Collec` to `CollectWrapper`
2020-06-24 22:34:04 -04:00
David Wendt
5b36522258
Remove out-of-date doccomment on `LayoutBox`.
2020-06-24 22:19:16 -04:00
David Wendt
0b8d0e8c85
Move the internal padding to a separate constant.
2020-06-24 21:53:58 -04:00
David Wendt
e4d4d996f9
Don't push each line of text down with the leading adjustment.
...
We already adjust the cursor with the same adjustment, so we don't need to move the text down.
2020-06-24 21:32:59 -04:00
David Wendt
bfb150ec05
Remove hardcoded 3px margin.
...
This was originally intended to correctly position text within the border, but it appears borders are weird and this doesn't jive with what unbordered text does.
2020-06-24 21:32:59 -04:00
Mike Welsh
0f794489a4
text: Don't create underline drawing if no underline exists
2020-06-24 12:53:51 -07:00
Mike Welsh
3558e42c34
text: Always fallback to Noto Sans if text field is set to use device fonts
2020-06-24 12:19:06 -07:00