Commit Graph

1171 Commits

Author SHA1 Message Date
David Wendt aa0946c64c avm2: Impl `Vector.fixed` 2021-09-02 17:57:58 -06:00
David Wendt 841ed4b5e4 avm2: Setting to an out-of-bounds index on a growable `Vector` should grow it 2021-09-02 17:57:58 -06:00
David Wendt 238959d7f8 avm2: Impl `Vector.join` and `toString` 2021-09-02 17:57:58 -06:00
David Wendt 1ce7e4e642 avm2: `Vector` is a final class (no matter what the docs say) 2021-09-02 17:57:58 -06:00
David Wendt dba9b18540 avm2: Impl `Vector.concat` 2021-09-02 17:57:58 -06:00
David Wendt 96afc5a6c2 avm2: Cache all `Vector` applications on the `Vector` class object.
This matches Flash Player behavior: notably, multiple applications of the same types see the same class and prototype, but different applications actually create new objects that don't share properties.
2021-09-02 17:57:58 -06:00
David Wendt 888fcc85ca avm2: Impl `Vector.length` 2021-09-02 17:57:58 -06:00
David Wendt 9d08a7c299 avm2: Impl `Vector`'s instance initializer 2021-09-02 17:57:58 -06:00
David Wendt 49d79b8e73 avm2: Vector indices are stored in a package namespace 2021-09-02 17:57:58 -06:00
David Wendt 3d3b80f8af avm2: ES3 class instances should be treated as instances of the ES4 class `Object`. 2021-09-02 17:57:58 -06:00
David Wendt 6b377bed64 avm2: Impl `apply` for ES4 classes to allow type parameterization 2021-09-02 17:57:58 -06:00
David Wendt 65a23d5833 avm2: Move applytype next to other operations that create classes 2021-09-02 17:57:58 -06:00
David Wendt 074c093504 avm2: Implement op `ApplyType` 2021-09-02 17:57:58 -06:00
David Wendt 4b021fe92c avm2: `Vector` lives in a separate package from other globals 2021-09-02 17:57:58 -06:00
David Wendt 74cb32dd46 avm2: Allow constructing static `TypeName`s (for naming `Vector` classes) 2021-09-02 17:57:58 -06:00
David Wendt 7e71ecac16 avm2: Add stub impl of `Vector` 2021-09-02 17:57:58 -06:00
David Wendt 6f49e62b96 avm2: First pass on implementing vector storage 2021-09-02 17:57:58 -06:00
David Wendt f4dfc4d778 avm2: First pass at type-aware vector storage 2021-09-02 17:57:58 -06:00
David Wendt 686872812d avm2: Add a `TObject` method for applying arguments to a generic type. 2021-09-02 17:57:58 -06:00
David Wendt fe8373739d avm2: Add the ability to fork a `Class` to one that holds it's type arguments. 2021-09-02 17:57:58 -06:00
David Wendt 86616b748f avm2: Allow parsing generic typenames into a multiname 2021-09-02 17:57:58 -06:00
David Wendt 47e3b2229a swf: Add support for the `TypeName` multiname type. 2021-09-02 17:57:58 -06:00
David Wendt 80c5bbcd83 avm2: Stub `Font.enumerateFonts` and `Font.registerFont` 2021-08-30 17:53:39 -06:00
David Wendt 2d57bed82e avm2: Impl `Font.hasGlyphs` 2021-08-30 17:53:39 -06:00
David Wendt 37af9be533 avm2: Implement `Font` for embedded fonts. 2021-08-30 17:53:39 -06:00
EmperorBale 358e0641eb avm2: Use rsplit_once instead of split_once 2021-08-29 20:41:20 -06:00
EmperorBale 05b4ee6b61 avm2: Dont panic if as_class returns None 2021-08-29 20:41:20 -06:00
EmperorBale 547aac0e85 chore: Cleanup QName::to_qualified_name 2021-08-29 20:41:20 -06:00
EmperorBale 5dd21cdf8e avm2: Add QName::from_qualified_name and QName::to_qualified_name 2021-08-29 20:41:20 -06:00
EmperorBale 2b748a4870 avm2: Implement getQualifiedClassName, getQualifiedSuperclassName, and getDefinitionByName 2021-08-29 20:41:20 -06:00
Adrian Wielgosik b5ee94aff1 avm2: Stub flash.system.Security. 2021-08-26 23:50:42 +02:00
lukaszN 8e596c2a35 avm2: Rectangle fix clippy 2021-08-23 15:44:14 -06:00
lukaszN b7b66ab9b8 avm2: impl Rectangle isEmpty, offset, offsetPoint, setEmpty, union 2021-08-23 15:44:14 -06:00
lukaszN f5c491a14f avm2: impl Rectangle intersection, intersects 2021-08-23 15:44:14 -06:00
lukaszN e22cd6bdbd avm2: impl Rectangle inflate, inflatePoint 2021-08-23 15:44:14 -06:00
lukaszN 129cd1af58 avm2: impl Rectangle contains, containsPoint, containsRect, copyFrom 2021-08-23 15:44:14 -06:00
lukaszN 3670676e2d avm2: Impl Rectangle topLeft, size, clone, equals 2021-08-23 15:44:14 -06:00
lukaszN 85afeb1de7 avm2: Impl Rectangle setters and getters 2021-08-23 15:44:14 -06:00
lukaszN ee9e70b71f avm2: Initial rectangle impl 2021-08-23 15:44:14 -06:00
Tal Hayon 7b9049cedf core: Add DefineBinaryData and SymbolClass connection (Part of #1368) 2021-08-21 12:24:46 -06:00
Ray Redondo 27e06af003
avm2: Initial MouseEvent stubs (#5065)
* avm2: Start MouseEvent stubs

* avm2: More MouseEvent work

* chore: clippy

* chore: fmt

Co-authored-by: Adrian Wielgosik <adrian.wielgosik@gmail.com>
2021-08-21 01:26:34 +02:00
Chris Midgley 58c907e985
avm2: implement string.split for undefined (#5064)
* avm2: implement string.split for undefined

* chore: cargo fmt

* dev: avoid explicit ArrayStorage
2021-08-18 18:02:41 +02:00
Ray Redondo cfb2bb99d6 chore: appease clippy 2021-08-14 00:52:38 +02:00
Ray Redondo 638eaf4a55 avm2: Rename function, add runtime warnings 2021-08-14 00:52:38 +02:00
Ray Redondo 171a41b908 avm2: Add define_public_builtin_class_traits and repair Capabilities to use it 2021-08-14 00:52:38 +02:00
Ray Redondo c43f57e5f5 avm2: Implement `String.split` 2021-08-14 00:52:38 +02:00
Ray Redondo 22c6f7321e avm2: start flash.system.Capabilities stubs 2021-08-14 00:52:38 +02:00
EmperorBale 1dee1e4166 avm2: Implement flash.crypto.generateRandomBytes 2021-07-21 18:09:21 +02:00
David Wendt db86ca84b9 avm2: `get_property` does not mutate the underlying object (anymore) so it should not be flagged as mutably borrowing it. 2021-07-20 22:14:05 -04:00
David Wendt c30014baed avm2: Remove `ScriptObjectClass` and replace with separately implemented methods on `ClassObject` 2021-07-20 22:12:33 -04:00
David Wendt 4d89341e19 avm2: Cache the instance allocator on class objects 2021-07-20 22:12:33 -04:00
David Wendt 2c927f2b6b avm2: Make `coerce_to_type` take a class object instead of a multiname. 2021-07-20 22:12:33 -04:00
David Wendt bd2f758976 avm2: Don't call native initializers when coercing primitives into objects.
The former native initializer call was incorrect and would cause spurious coercion failures. Since existing code assumes the error fork of `coerce_to_object` means undefined or null, this was causing coercions and parameter typechecks against primitives to fail in the most general case.

Attempting to fix this by providing the primitive value as native initializer argument instead causes a stack overflow. This is because native initializer arguments still have to be typechecked, and in the most general case this means... coercing the primitive value we're already coercing into an object... into another object. This won't work.

Since primitive initializers aren't going to do anything that native coercions need to care about, I'm just removing the initializer call.
2021-07-20 22:12:32 -04:00
David Wendt 30b4c4386b avm2: Replace the `call_strict` mechanism with checking to see if free functions are unchecked. 2021-07-20 22:12:32 -04:00
David Wendt ddd73b3cd6 avm2: Supercalls should fall back to normal receiver access if there is no matching supertrait to use. 2021-07-20 22:12:31 -04:00
David Wendt e9b9d64cb6 avm2: Rename `StageObject::graphics_of` to just `graphics` 2021-07-20 22:12:30 -04:00
David Wendt 7871912d92 avm2: Calling ES4 class objects is treated as a coercion to that type. 2021-07-20 22:12:28 -04:00
David Wendt b469ef8a3f avm2: Replace `deriver` language with `allocator` language 2021-07-20 22:12:28 -04:00
David Wendt 8af0481a23 avm2: Retire the use of "constructor" outside of literal reference to class initializer or instance initializer code.
Instead, the following terms are used:

 * Static classes, to refer to `Class<'gc>`. Shortened to "class" in contexts where this is not ambiguous.
 * Class objects, to refer to objects that represent a particular class. Also shortened to "class" in non-ambiguous contexts.

Downstream of this, the `base_constr` (referring to the class that a currently called trait has been pulled from) is now called `subclass_object` and several `TObject` methods have also been renamed.
2021-07-20 22:12:23 -04:00
David Wendt 6d907a0d10 avm2: Rename `ArrayObject::empty_array` to `ArrayObject::empty`. 2021-07-20 22:10:36 -04:00
David Wendt 05b7de7453 avm2: Avoid double iteration in `Names.contains_name` 2021-07-20 22:10:36 -04:00
David Wendt 6e2e686e0d avm2: Rename `Method::Entry` to `Method::Bytecode` 2021-07-20 22:10:35 -04:00
David Wendt b049f2e717 avm2: Rename `Method::from_builtin_only` to `Method::from_builtin` 2021-07-20 22:10:35 -04:00
David Wendt d4fcca9787 avm2: Rename `call_initializer` and `call_native_initializer` to `call_init` and `call_native_init` 2021-07-20 22:10:34 -04:00
David Wendt f5431a781e docs: Fix stale comments in avm2 2021-07-20 22:10:34 -04:00
David Wendt ccfa605260 avm2: Use `extend_from_slice` 2021-07-20 22:10:34 -04:00
David Wendt a60a499f31 avm2: Rename `resolve_parameter_value` to `resolve_parameter` 2021-07-20 22:10:33 -04:00
David Wendt 9e997e6571 avm2: Split out `Method` and `Executable`'s native fork into `NativeMethod` and `NativeExecutable`, respectively.
This also implies renaming the existing type alias of the same name to `NativeMethodImpl`.
2021-07-20 22:10:33 -04:00
David Wendt c7858f9447 avm2: Simplify/correct the value numerical checks 2021-07-20 22:10:32 -04:00
David Wendt 5018421eef avm2: Rename `SystemConstructors` to `SystemClasses` 2021-07-20 22:08:27 -04:00
David Wendt 2c2f03ba23 chore: Clippy compliance on Rust nightly 2021-07-20 22:05:37 -04:00
David Wendt d0478a1f40 avm2: Allow builtins to also hold parameter type metadata.
This is limited by the fact that we currently cannot store type metadata in static tables. I don't think it's necessary to do so as of yet as pretty much every actual parameter type I *could* shove in here turned out to be optional and broke tests if it wasn't. Still, it's probably useful enough for new classes to include.
2021-07-20 22:05:36 -04:00
David Wendt e38b1bc281 avm2: Make numbers appear to be of any numeric type that can represent them.
This also prevents an exception from being fired when testing `undefined` or `null`, which are valid inputs to `istype`.
2021-07-20 22:05:35 -04:00
David Wendt 974fe152ff avm2: Include the parameter coercions into `op_coerce` 2021-07-20 22:05:34 -04:00
David Wendt 8b48b79f5d avm2: Make the `pool_` and `table_` functions no longer take a superfluous mutation context.
This also adds a new `pool_multiname_static_any` method that treats zero as `*` instead of an error.
2021-07-20 22:05:33 -04:00
David Wendt abc9d0800a avm2: `undefined` is normalized to `null` for string and object coercions 2021-07-20 22:05:32 -04:00
David Wendt b779804075 avm2: Relax the maximum arguments check for functions called from native code. 2021-07-20 22:02:11 -04:00
David Wendt ae086d6aa7 avm2: Implement implicit coercion for primitive types 2021-07-20 22:02:10 -04:00
David Wendt 63cf6a7b47 avm2: Implement parameter typechecking for script functions.
This commit breaks 15 tests, mostly due to implicit coercion that happens at function call time. This will be implemented shortly.
2021-07-20 22:02:10 -04:00
David Wendt 5c6c3191ef avm2: Enforce `final` on traits. 2021-07-20 22:02:09 -04:00
David Wendt 7d86c93ddc Check to make sure that overrides only apply to already-installed properties. 2021-07-20 22:02:08 -04:00
David Wendt 5662527c9e avm2: Enforce `interface` checks: classes cannot extend interfaces and cannot implement other classes. 2021-07-20 22:02:08 -04:00
David Wendt 7eca7d5331 avm2: Enforce `final` on classes 2021-07-20 22:02:07 -04:00
David Wendt 3888d5bb27 avm2: `install_dynamic_property` now checks to see if the object is sealed, and if so, throws an error. 2021-07-20 22:02:07 -04:00
David Wendt 03980f4f3d avm2: `Function.prototype`'s properties are not methods. 2021-07-20 22:02:06 -04:00
David Wendt c10a25fb3f avm2: Remove the special global constructor scope mode we added two commits ago. 2021-07-20 22:02:05 -04:00
David Wendt 0e40552c2a avm2: Don't instantiate classes or functions at trait install time. 2021-07-20 22:02:05 -04:00
David Wendt 377730301f avm2: Add a special object mode for `globals` so that it can get it's own scope during trait installation.
This is very wrong: Strictly speaking, we should not be instantiating anything that needs a scope when we install the trait. We just create a slot for it to go into. Script initializers are responsible for providing a scope stack to instantiate traits into.
2021-07-20 22:02:04 -04:00
David Wendt a112192c96 avm2: Remove `_slot_local` methods as we no longer do anything special with slots. 2021-07-20 22:02:04 -04:00
David Wendt 5dcc3a58f2 avm2: Remove lazy trait initialization 2021-07-20 22:02:03 -04:00
David Wendt 1c72167287 avm2: Make `istype` use the constructor chain, not the prototype chain.
This pushes a few more ancillary changes:

 * `has_proto_in_chain` no longer checks interfaces (since it exists to serve `instanceof`, which does not respect them)
  * Interfaces no longer live on prototypes. They now live on class constructors.
2021-07-20 22:01:57 -04:00
David Wendt 713ab3e95c avm2: Remove all remaining accesses to `SystemPrototypes`, save for one technicality with the global scope prototype. 2021-07-20 22:00:34 -04:00
David Wendt f84f01b2a5 avm2: Adjust the `FunctionObject` associated constructors so that there's a path that doesn't require the user hit `SystemPrototypes`.
Because we have stuff running in early globals, we stlil need a more elaborate version of this function that *does* take `fn_proto`. We also can't pull `scope` from the activation since this gets called to install traits.
2021-07-20 22:00:34 -04:00
David Wendt e4201625a1 avm2: Split `StageObject` associated constructors into two versions: allocation-only (`for_display_object`) and allocation-and-initialization (`for_display_object_childless`).
The latter is intended for display objects that *do not* have children and can be both allocated and initialized in one shot. Hence the name.
2021-07-20 22:00:33 -04:00
David Wendt 46a4da9dc5 avm2: Remove `XmlObject::empty_object` as it does not appear to be in use and will need further elaboration when XML is unstubbed. 2021-07-20 22:00:32 -04:00
David Wendt 602895e2de avm2: Make `RegExpObject::from_regexp` pull it's own constructor and call it's own initializer.
This doesn't appear to actually be in use, but I'm doing it for completeness' sake.
2021-07-20 22:00:32 -04:00
David Wendt c167912f52 avm2: `PrimitiveObject::from_primitive` should now select it's own class and construct it.
This also includes protections on `String` to prevent it from overwriting itself. All user-constructed primitive objects start out boxing `Value::Undefined` and future constructor implementations should check what's already been boxed before overwriting it with user arguments.
2021-07-20 22:00:31 -04:00
David Wendt 261cb40a22 avm2: Make `NamespaceObject`'s sole associated method build and construct a `Namespace` instance. 2021-07-20 22:00:29 -04:00
David Wendt b30c7509ba avm2: Make `LoaderInfo`'s associated methods call initializers and pull their constrs/protos as necessary 2021-07-20 21:59:21 -04:00
David Wendt 60eb1b4409 avm2: Don't ask for a `proto` in `EventObject::from_event`.
For various reasons, this is kind of incomplete:

1. We need to support native event subclasses, so we can't just pull one class from `activation` (yet).
2. We can't run native instance initializers without overwriting the native object.

I expect these to be fixed in a future PR where I start adding native event types.
2021-07-20 21:59:21 -04:00
David Wendt 22fedf4dca avm2: Make all domain object construction (save for the global domain) pull the constructor and call it in `from_domain`.
This also adds `DomainObject::script_global`, which does the same thing but picks the `global` class instead of `ApplicationDomain`.
2021-07-20 21:59:20 -04:00
David Wendt 6fe44c3862 avm2: Clean up `ClassObject` initialization.
This also makes it more difficult to accidentally build a class without calling it's initializer. Native/builtin class initializers should also be running now, too.

The only minor bit of jank is that we need a class initialized bit to flag classes we've already run, because our current lazy-init design for traits causes classes to be constructed twice. This is temporary and I intend to remove it along with lazy-init traits.
2021-07-20 21:59:18 -04:00
David Wendt 31faf62baf avm2: Remove all alternative `ByteArrayObject` constructors.
The only way to build a `ByteArrayObject` now is to invoke it's constructor.
2021-07-20 21:58:06 -04:00
David Wendt 9604b525d5 avm2: Tie `ArrayObject`'s constructors to the system `Array` class.
This effectively turns calling `ArrayObject`'s associated methods into an alternate constructor path. We even make sure to run instance initializers. You also no longer have to grab the `array` system constructor, so we get to remove that code.
2021-07-20 21:58:05 -04:00
David Wendt 46db756f67 avm2: Don't run `Point`'s constructor twice when natively constructing one. 2021-07-20 21:58:04 -04:00
David Wendt c8cd6e0322 avm2: Split native and script instance initializers for non-constructable classes.
This also includes new errors for attempting to construct non-constructables like `System`.
2021-07-20 21:58:04 -04:00
David Wendt dcbb5e4284 avm2: Add a notion of native instance initializers.
Native initializers are a separate, parallel initialization chain intended for all object construction that is not directly triggered by `Op::Construct` and friends. This allows us to implement classes that cannot be directly constructed by user code, but can be constructed by native code or supercalled into from non-native.
2021-07-20 21:58:03 -04:00
David Wendt 4bc1d37029 avm2: Remove unnecessary manual accesses of the `constructor` property on prototypes.
All native object allocation in the project now pulls prototypes or constructors as necessary from the following sources:

 * System prototype or constructor lists
 * Instance `constr`s

This also resulted in the removal of a few unnecessary prototype accesses.
2021-07-20 21:57:56 -04:00
David Wendt afd5a65a1e avm2: Create a new list of system constructors alongside the existing list of system prototypes. 2021-07-20 21:55:30 -04:00
David Wendt 6deaa6f441 avm2: Remove the prototype setter exception as prototypes no longer provide setters to instances. 2021-07-20 21:55:29 -04:00
David Wendt a8fd0622b2 avm2: Filter traits in `call_instance_xyz` by the trait type before actually getting trait fields.
Fixes the `as3_virtual_properties` test, where the old approach would accidentally grab a `Getter` and then think there's no setter (there is, you just have to look further down the list).
2021-07-20 21:55:29 -04:00
David Wendt a2cd7443e8 avm2: Do not attempt to `super_init` the `LoaderInfo` object.
This is a temporary fix for failing tests; it is invalid in the sense that attempting to grab loader events will now fail. We can't actually correctly init the loader without two planned changes:

1. Moving all object initialization into the object helper functions (e.g. `LoaderInfoObject::from_movie`)
2. A notion of "native-only" constructors separate from the existing constructor chain

Once those are in place, loaders should be proper event dispatchers again.
2021-07-20 21:55:29 -04:00
David Wendt 1ad512e3c9 avm2: Allow constructing activation objects (since we now force instance constructors to run) 2021-07-20 21:55:28 -04:00
David Wendt 323da9ded3 avm2: Move the class association from prototypes to instances.
This also incurred a large number of ancillary changes, as it turns out nearly every native object is currently pulling a prototype and sticking it into an object. Right now, I have it instead pulling the constructor out of the prototype, but a future PR will also remove `system_prototypes` as well.

Other ancillary changes include:

 * `Domain` now supports partial initialization to avoid an order-of-events issue. Accessing domain memory on a partially-initialized `Domain` will panic.
 * `Domain` construction requires a full `activation` now, except for `global_scope` which needs to be initialized later with valid domain memory before user code runs.
 * Pretty much every native object constructor now takes a proto/constr pair
 * Trait lookup was rewritten to handle this. It's still buggy - seven tests don't work
 * `TObject.construct` now actually does the full object construction dance. This allows `ClassObject` to implement the ES4 object construction pathway directly while `FunctionObject` maintains ES3 compatibility.

This is a tentative commit; there are still seven failing tests that I need to fix.
2021-07-20 21:55:25 -04:00
David Wendt f26f193508 avm2: Store instance derivers as a `Class` property instead of keeping them only as a globals concept 2021-07-20 21:47:00 -04:00
David Wendt 47de2364c1 avm2: Split `Class` and `Function` object types 2021-07-20 21:46:54 -04:00
relrelb d2eb46d3be chore: Reserve capacity for vectors
This avoids unnecessary re-allocations and thus should improve
performance in both memory and time terms.
2021-07-20 16:25:23 -07:00
Adrian Wielgosik 633c23c7f3 avm2: Do timeout check every 2000 actions, same as avm1 2021-07-09 22:09:13 +02:00
relrelb 1cbbdecccf swf: Introduce and use `Color::to_rgba` 2021-07-09 19:56:52 +03:00
relrelb 8b35aad657 core: Take advantage of or patterns
Rust 1.53.0 ships with or patterns, which allow a little more
elegant code:
https://blog.rust-lang.org/2021/06/17/Rust-1.53.0.html#or-patterns
2021-06-24 01:15:22 -07:00
relrelb 38a2650c0e chore: Use Value into() in more places 2021-06-24 01:11:16 -07:00
EmperorBale 1ee61cca57
avm2: ByteArray updates 2021-06-22 01:26:27 -07:00
Mike Welsh 9357fd7b4f avm2: Wire up Stage.quality 2021-06-17 13:55:56 -07:00
Mike Welsh 1f96af6b64 core: Add Avm1::exec_list to manage global list of display objects 2021-06-14 14:04:28 -07:00
relrelb ede9650899 chore: Avoid unused_variables annotations
Instead prefix the unused variables with an underscore.
2021-06-11 16:16:53 +03:00
relrelb f82faf9603 chore: Appease clippy 2021-06-05 10:16:00 -07:00
Mike Welsh 2b98c878f0 swf: Use Fixed in more places 2021-05-30 21:24:03 -07:00
Mike Welsh 1304b2c55a avm2: Move Object properties to Object.prototype 2021-05-24 17:52:15 -07:00
Mike Welsh 3ddb97d2f6 core: Add SwfMovie::frame_rate and num_frames 2021-05-23 23:02:38 -07:00
Mike Welsh 172ad82aa5 core: Add SwfMovie::uncompressed_len 2021-05-23 23:02:38 -07:00
Mike Welsh 077c7f045e core: Add SwfMovie::stage_size
Change `SwfMovie::width` and `height` to return `Twips`.
2021-05-23 23:02:38 -07:00
Mike Welsh e1439f4105 swf: Add HeaderExt struct providing additional info
When reading an SWF, search for FileAttributes and
SetBackgroundColor and return this along with the header data
because it's useful (in particular, the AS3 flag).
2021-05-23 23:02:38 -07:00
Mike Welsh 2176e30e22 avm2: Use define_public_builtin_instance_properties for SimpleButton 2021-05-16 17:53:07 -07:00
David Wendt e555a6b488 avm2: Impl `SimpleButton.useHandCursor` 2021-05-16 17:53:07 -07:00
David Wendt 6f6e2c1b9f avm2: Impl `SimpleButton.enabled` 2021-05-16 17:53:07 -07:00
David Wendt 514c51510c avm2: Impl `SimpleButton.trackAsMenu` 2021-05-16 17:53:07 -07:00
David Wendt 71bb0c901a avm2: Impl the constructor parameters for `SimpleButton` 2021-05-16 17:53:07 -07:00
David Wendt 6a9249e52f core: Store the root of each loaded movie and use it as a last-ditch way to get the root 2021-05-16 17:53:07 -07:00
David Wendt 9ded256c23 core: Implement the AVM2 concept of `stage`. 2021-05-16 17:53:07 -07:00
David Wendt 39e9ef9dc5 core: Implement a separate `avm2_root` method that provides an AS3 notion of root 2021-05-16 17:53:07 -07:00
David Wendt c936ccd4b4 avm2: When constructing new `SimpleButton`s, make sure the display object sees it's AVM2 side, else we replace all it's contents with AVM1 objects somehow(?!) 2021-05-16 17:53:07 -07:00
David Wendt 434563da2f avm2: `SimpleButton` should build a button when constructed 2021-05-16 17:53:07 -07:00
David Wendt 67c7f156ac avm2: `instanceof` accepts `null` and `undefined` 2021-05-16 17:53:07 -07:00
David Wendt 7f294f5209 avm2: Constructor-based symbol instantiation should also post-instantiate before constructing a frame 2021-05-16 17:53:07 -07:00
David Wendt 11d7fe5107 core: Correct the order of events that are fired when an `Avm2Button` is instantiated on the timeline. 2021-05-16 17:53:07 -07:00
David Wendt cb44554135 avm2: Add setters and getters for the four states of `SimpleButton` 2021-05-16 17:53:07 -07:00
David Wendt 22eac776be avm2: Stub `flash.display.SimpleButton` 2021-05-16 17:53:07 -07:00
David Wendt cffa739a54 avm2: Store the sprite proto 2021-05-16 17:53:07 -07:00
Mike Welsh 69a0700ca1 core: Remove collect::CollectWrapper
No longer necessary, it is possible to mark individual fields
as `#[collect(require_static)]`.
2021-05-13 23:24:10 -07:00
Mike Welsh b882284fc9 core: Use bitflags for HitTestOptions 2021-05-12 23:02:06 -07:00
Adrian Wielgosik 5319a5bb81 Remove lifetime from constants 2021-05-06 10:54:33 -07:00
Adrian Wielgosik faa0e50e89 avm2: Unify NativeMethod and GenericNativeMethod 2021-05-06 10:54:33 -07:00
Adrian Wielgosik 46ddb9be82 avm2: Generate class traits from const arrays 2021-05-06 10:54:33 -07:00
Adrian Wielgosik 8312243f42 avm2: Don't repeatedly call class.write(mc) 2021-05-06 10:54:33 -07:00
Mike Welsh e8ec02418b avm2: Fix Array.splice
Fix `Array.splice` in cases where elements are added but not
deleted, and when the starting index is larger than the length
of the array.
2021-04-30 13:48:27 -07:00
David Wendt 041003f256 avm2: Slot lookups don't need the whole trait list, just the first one we find. 2021-04-28 00:01:47 -07:00
David Wendt fd08a6ebf6 avm2: Instantiate slot traits on `get_slot`, `set_slot` etc.
Previously, we only instantiated slot traits when named as a property, which is only half the picture.
2021-04-28 00:01:47 -07:00
David Wendt e35d1edbf0 avm2: Allow pulling traits by slot id 2021-04-28 00:01:47 -07:00
David Wendt 9318028b52 avm2: `newactivation` should return an object which implements the traits listed in the associated method `body`'s trait list 2021-04-28 00:01:47 -07:00
David Wendt 6c5098d3c7 avm2: Fix order in which `setslot` takes it's parameters 2021-04-28 00:01:47 -07:00
Adrian Wielgosik c3a16cb992 avm2: Support Stage.showDefaultContextMenu 2021-04-27 16:42:02 -07:00
Mike Welsh 98befe678e avm2: Add flash.display.StageScaleMode and Stage.scaleMode 2021-04-26 01:15:42 -07:00
David Wendt 52c3b0f1bc avm2: `Stage.color` yields background color alpha (always 0xFF) in the high bits of the u32 2021-04-26 01:15:42 -07:00
David Wendt 41fe51e9db avm2: Impl `flash.display.StageQuality` enum 2021-04-26 01:15:42 -07:00
David Wendt 93d7f0b450 avm2: Stub `Stage.quality` 2021-04-26 01:15:42 -07:00
David Wendt 327a425fde avm2: Stub `Stage.allowsFullScreen` and `Stage.allowsFullScreenInteractive` 2021-04-26 01:15:42 -07:00
David Wendt cb167e0814 avm2: Impl `Stage.stageWidth`/`Stage.stageHeight`, sorta 2021-04-26 01:15:42 -07:00
David Wendt 1ee5bbf7ba avm2: Impl `Stage.frameRate` 2021-04-26 01:15:42 -07:00
David Wendt 5d8f70d695 avm2: Implement `Stage.focus` 2021-04-26 01:15:42 -07:00
David Wendt 524f5fe57f avm2: Impl `Stage.color`'s setter 2021-04-26 01:15:42 -07:00
David Wendt 6c6bd74af9 avm2: Impl `Stage.displayState`'s getter 2021-04-26 01:15:42 -07:00
David Wendt ae080fd65f avm2: Impl `flash.display.StageDisplayState` 2021-04-26 01:15:42 -07:00
David Wendt b858f74139 avm2: Impl `Stage.contentsScaleFactor` 2021-04-26 01:15:42 -07:00
David Wendt 247f7e3de4 avm2: Impl `Stage.color` 2021-04-26 01:15:42 -07:00
David Wendt d7a0d15fd8 avm2: Expose `Stage.browserZoomFactor` 2021-04-26 01:15:42 -07:00
David Wendt 98788ef194 avm2: Impl `flash.display.StageAlign` 2021-04-26 01:15:42 -07:00
David Wendt 2a30887660 avm2: Support the half-broken `loaderInfo` on the `Stage` 2021-04-26 01:15:42 -07:00
David Wendt ef4db9ba16 avm2: Add overrides for every property that cannot be set on the `Stage`.
Yes, this includes properties that aren't implemented yet. They'll return a different error, but they'll still error out regardless, so I'm fine with this.
2021-04-26 01:15:42 -07:00
David Wendt 716d492006 avm2: The stage's name should be `null`, not an empty string; and setting it should except. 2021-04-26 01:15:42 -07:00
David Wendt 01f74f6eb1 avm2: Add a convenience method for marking a builtin override trait. 2021-04-26 01:15:42 -07:00
David Wendt 8452e23382 avm2: Allow access to the `Stage`, both directly and indirectly 2021-04-26 01:15:42 -07:00
David Wendt 81de112774 avm2: Add `Stage` class stub 2021-04-26 01:15:42 -07:00
David Wendt f33976f4c0 avm2: Store symbol / class relationships using the class constructor, not the prototype. 2021-04-23 00:26:10 -07:00
David Wendt aa6dc600c0 avm2: Treat construction of symbol classes as symbol instantiation. 2021-04-23 00:26:10 -07:00
David Wendt 68c270e7c0 avm2: Impl `Eq`, `Hash` for `Object` using ptr values 2021-04-23 00:26:10 -07:00
Adrian Wielgosik 8176e0a633
avm2: minor changes to domain memory
* Do not use as_bytearray_mut when we don't need mutability
* Set default domain memory size to 1024b.
2021-04-21 15:08:13 -07:00
CUB3D 9812fab9f8 chore: Format and fix clippy lints 2021-04-21 00:33:11 -07:00
CUB3D 7c4eb0d7ff avm2: Implement ApplicationDomain.domainMemory 2021-04-21 00:33:11 -07:00
CUB3D b3b1e69fc2 avm2: Store ByteArrayObject in Domain rather than ByteArrayStorage 2021-04-21 00:33:11 -07:00
CUB3D 4dc1210b37 avm2: Use try_into for converting slice->array 2021-04-21 00:33:11 -07:00
CUB3D 397ceed33c avm2: Dont panic when domain memory not available 2021-04-21 00:33:11 -07:00
CUB3D 136add866a chore: Fix clippy lints 2021-04-21 00:33:11 -07:00
CUB3D 63120806bf avm2: Correct Sxi8 and Sxi16 2021-04-21 00:33:11 -07:00
CUB3D 6d2339b151 avm2: Add tests for Op::Sxi1 2021-04-21 00:33:11 -07:00
CUB3D f34579926c chore: Format 2021-04-21 00:33:11 -07:00
CUB3D 99edb5ab2b avm2: Implement Op::Sxi1 2021-04-21 00:33:11 -07:00
CUB3D 9ffa4f1f50 avm2: Implement Op::Lf64 2021-04-21 00:33:11 -07:00
CUB3D b4736413fa avm2: Implement Op::Sf64 2021-04-21 00:33:11 -07:00
CUB3D 2b4becf41f avm2: Implement Op::Lf32 2021-04-21 00:33:11 -07:00
CUB3D 509392db8e avm2: Implement Op::Sf32 2021-04-21 00:33:11 -07:00
CUB3D dce2626482 avm2: Use from/to_le_bytes 2021-04-21 00:33:11 -07:00
CUB3D 35d7c5a7e3 chore: Format 2021-04-21 00:33:11 -07:00
CUB3D ae9d5fd328 avm2: Implement Op::Li32 2021-04-21 00:33:11 -07:00
CUB3D 951d557a90 avm2: Implement Op::Si32 2021-04-21 00:33:11 -07:00
CUB3D 96ad0e3d00 avm2: Implement Op::Li16 2021-04-21 00:33:11 -07:00
CUB3D aaaf6ace3e avm2: Implement Op::Si16 2021-04-21 00:33:11 -07:00
CUB3D f437539f73 avm2: Some domain memory is available by default and error when range invalid 2021-04-21 00:33:11 -07:00
CUB3D 5a0cdf60bc avm2: Implement Op::Si8 and Op::Li8 badly 2021-04-21 00:33:11 -07:00
CUB3D 12a198f671 avm2: Implement Op::Coerce and add tests 2021-04-21 00:33:11 -07:00
TÖRÖK Attila 46ddc31254 avm2: Call the super initializer of LoaderInfo after construction 2021-04-19 18:16:47 -07:00
relrelb a2e162be0d avm1: Add Value::is_primitive
This provides a more convenient and readable way compared to
using matches!(Value::Object(_)).
2021-04-16 15:25:22 -07:00
EmperorBale 04d80e5e4e chore: Fix more typos 2021-04-15 00:02:40 -07:00
EmperorBale d227c6cbce chore: Fix formatting 2021-04-15 00:02:40 -07:00
EmperorBale cbf8d77006 avm2: Fix IsType 2021-04-15 00:02:40 -07:00
EmperorBale ca2709f594 avm2: Implement AsType 2021-04-15 00:02:40 -07:00
EmperorBale 17acebb108 chore: Fix formatting 2021-04-15 00:02:40 -07:00
EmperorBale c0a56b14c0 avm2: Implement AsTypeLate 2021-04-15 00:02:40 -07:00
Mike Welsh b9d84c0a82 chore: Appease clippy
Honor the branches-sharing-code lint.
2021-04-15 00:02:27 -07:00
Mike Welsh d87be39e3c avm2: Don't parse "inf" as Infinity 2021-04-14 21:51:48 -07:00
relrelb 20d6fcc128 chore: Remove unnecessary type annotations 2021-04-10 18:39:16 -07:00
desuwa 4f90b9d161 avm1: Support masks when mouse-picking. 2021-04-09 22:11:07 -07:00
David Wendt 5d198952e8 chore: Fix merge conflict mis-resolution 2021-04-05 16:18:37 -06:00
David Wendt 5cba07111e avm2: Impl `LoaderInfo.parameters` 2021-04-05 16:18:37 -06:00
David Wendt de1b0d4d0c core: Add support for an explicit loader URL (though nothing sets it yet) and expose it in `LoaderInfo`. 2021-04-05 16:18:37 -06:00
David Wendt 4eee8be911 avm2: Impl `SWFVersion` enumeration 2021-04-05 16:18:37 -06:00
David Wendt 4c314a47cc avm2: Impl `LoaderInfo.bytes` 2021-04-05 16:18:37 -06:00
David Wendt a9328b228f avm2: Allow writing to `ByteArrayStorage` 2021-04-05 16:18:37 -06:00
David Wendt f61ea0b290 chore: Clippy beta/nightly compliance 2021-04-05 16:18:37 -06:00
David Wendt 46bf1b33c4 avm2: Impl `LoaderInfo.width` 2021-04-05 16:18:37 -06:00
David Wendt 28a1cb4308 avm2: Impl `LoaderInfo.url` 2021-04-05 16:18:37 -06:00
David Wendt 5941d6cf66 avm2: Impl `LoaderInfo.swfVersion` 2021-04-05 16:18:37 -06:00
David Wendt 6814fb9c22 avm2: Stub `LoaderInfo.isURLInaccessible` 2021-04-05 16:18:37 -06:00
David Wendt b6e31d8be5 avm2: Impl `LoaderInfo.height` 2021-04-05 16:18:37 -06:00
David Wendt e795da0358 avm2: Impl `LoaderInfo.frameRate` 2021-04-05 16:18:37 -06:00
David Wendt cbd167fd6c avm2: Stub `LoaderInfo.contentType` 2021-04-05 16:18:37 -06:00
David Wendt 7b7d250ce9 avm2: This is a getter, not a method 2021-04-05 16:18:37 -06:00
David Wendt 2a01260f52 avm2: `bytesLoaded` etc reports the compressed file length, not the uncompressed length 2021-04-05 16:18:37 -06:00
David Wendt d0ad894f70 avm2: Impl `LoaderInfo.content` 2021-04-05 16:18:37 -06:00
David Wendt b4cb01d2c9 avm2: Impl `LoaderInfo.bytesTotal`, and `.bytesLoaded`
`bytesLoaded` is currently aliased to `bytesTotal` as we do not yet support streaming loads
2021-04-05 16:18:37 -06:00
David Wendt 55e448ebaa avm2: Impl `LoaderInfo.applicationDomain` 2021-04-05 16:18:37 -06:00
David Wendt 12dcfe7c62 avm2: Impl `LoaderInfo.actionScriptVersion` 2021-04-05 16:18:37 -06:00
David Wendt 1a7b33a1af avm2: Impl `ActionScriptVersion` 2021-04-05 16:18:37 -06:00
David Wendt fc26c26d1d avm2: Allow access to `loaderInfo` on root movies 2021-04-05 16:18:37 -06:00
David Wendt 60c92dde49 avm2: Add Loader Info class & object type 2021-04-05 16:18:37 -06:00
CUB3D e2f124ee34 avm2: Rename current_position -> instruction_start 2021-04-03 16:37:47 -06:00
CUB3D c22ebc1de3 chore: Format on stable 2021-04-03 16:37:47 -06:00
CUB3D d5c2e5559b avm2: Don't mutably borrow for pos() 2021-04-03 16:37:47 -06:00
CUB3D 96f89a1643 avm2: Implement Op::LookupSwitch 2021-04-03 16:37:47 -06:00
CUB3D 209b9cec36 chore: Format 2021-03-31 18:36:24 -06:00
CUB3D 0ea564f75c avm2: Implement Op::EscXAttr and Op::EscXElem 2021-03-31 18:36:24 -06:00
CUB3D 68527c13da avm2: Implement flash.utils.getTimer 2021-03-29 20:46:02 -06:00
Mike Welsh f96a414036 avm2: Lazily initialize Graphics object
Initialize a Sprite/Shape's Graphics object on the first access,
so that `shape.graphics == shape.graphics` is `true`.
2021-03-24 13:18:06 -07:00
Mike Welsh 040da925e4 avm2: Fix incorrect color in drawing API 2021-03-24 13:18:06 -07:00
Mike Welsh 9a08b9ae4f avm2: flash.display.Graphics is final 2021-03-24 13:18:06 -07:00
David Wendt 1d64f38bb7 avm2: Impl `drawRect` 2021-03-24 13:18:06 -07:00
David Wendt e3f2d0f213 avm2: Allow constructing new `Shape`s. 2021-03-24 13:18:06 -07:00
David Wendt 62a779444d avm2: `graphics` is a `Sprite` property, not a `MovieClip` property 2021-03-24 13:18:06 -07:00
David Wendt 5e7327d041 avm2: Allow drawing on `Shape`s. 2021-03-24 13:18:06 -07:00
David Wendt e8b6d1a52a core: Migrate clip drawing commands to exposing the internal `Drawing` to mutation 2021-03-24 13:18:06 -07:00
David Wendt 1a6f401f1f avm2: Implement `Graphics.moveTo` 2021-03-24 13:18:06 -07:00
David Wendt 15d3a1e99d avm2: Implement `Graphics.lineTo` 2021-03-24 13:18:06 -07:00
David Wendt 9464a8800a avm2: Implement `CapsStyle` 2021-03-24 13:18:06 -07:00
David Wendt f7f98cc69e avm2: Implement `LineScaleMode` 2021-03-24 13:18:06 -07:00
David Wendt 582d2447cd avm2: Implement `JointStyle` 2021-03-24 13:18:06 -07:00
David Wendt 6396b90890 avm2: Implement `Graphics.lineStyle` 2021-03-24 13:18:06 -07:00
David Wendt 41ad756792 avm2: Implement `Graphics.endFill` 2021-03-24 13:18:06 -07:00
David Wendt 3dfeeacfcc avm2: Implement `Graphics.curveTo` 2021-03-24 13:18:06 -07:00
David Wendt 71b6bca100 avm2: Implement `Graphics.clear` 2021-03-24 13:18:06 -07:00
David Wendt f1febe33b9 avm2: Implement `Graphics.beginFill` 2021-03-24 13:18:06 -07:00
David Wendt 124e144d02 avm2: Add a class for `graphics` 2021-03-24 13:18:06 -07:00
David Wendt 05dc538a25 avm2: Use the actual `FromIterator` trait 2021-03-19 12:39:57 -07:00
David Wendt 1baadb93c2 chore: cargo fmt is fickle 2021-03-19 12:39:57 -07:00
David Wendt a40755154d avm2: `TextField` and `TextFormat` are sealed (non-dynamic) classes 2021-03-19 12:39:57 -07:00
David Wendt a05423d48c avm2: Setting a given text property also sets or resets the `html` mode (since it's not a separate property like in AS2) 2021-03-19 12:39:57 -07:00
David Wendt f188306f4f avm2: `setTextFormat` is range-checked 2021-03-19 12:39:57 -07:00
David Wendt 78c519cce0 avm2: Don't except when creating a dynamic TextField. 2021-03-19 12:39:57 -07:00
David Wendt 4ef01000a8 avm2: Impl `TextField.setTextFormat` 2021-03-19 12:39:57 -07:00
David Wendt a115db49ba avm2: Impl `TextField.setSelection` 2021-03-19 12:39:57 -07:00
David Wendt 7902914aa4 avm2: Impl `TextField.replaceText` 2021-03-19 12:39:57 -07:00
David Wendt c22f30fdf0 avm2: Impl `TextField.replaceSelectedText` 2021-03-19 12:39:57 -07:00
David Wendt b4d97ca183 avm2: Impl `TextField.getTextFormat` 2021-03-19 12:39:57 -07:00
David Wendt f45c9d1889 avm2: Impl `TextField.appendText` 2021-03-19 12:39:57 -07:00
David Wendt 42f717deb8 avm2: Impl `TextField.wordWrap` 2021-03-19 12:39:57 -07:00
David Wendt 4bfc3cfda4 avm2: Impl `TextField.type` 2021-03-19 12:39:57 -07:00
David Wendt 1c2ef3154a avm2: Impl `TextFieldType` 2021-03-19 12:39:57 -07:00
David Wendt da563266d5 avm2: Impl `TextField.textHeight` and `TextField.textWidth` 2021-03-19 12:39:57 -07:00
David Wendt 8165aa5c4a avm2: Impl `TextField.textColor` 2021-03-19 12:39:57 -07:00
David Wendt c0a2547be3 avm2: Impl `TextField.text` 2021-03-19 12:39:57 -07:00
David Wendt dee937ac3a avm2: Impl `TextField.selectable` 2021-03-19 12:39:57 -07:00
David Wendt b6a1bf80c1 avm2: Impl `TextField.multiline` 2021-03-19 12:39:57 -07:00
David Wendt 053b6bd4cc avm2: Impl `TextField.length` 2021-03-19 12:39:57 -07:00
David Wendt 1ce868c51e avm2: Impl `TextField.htmlText` 2021-03-19 12:39:57 -07:00
David Wendt 89c131bf52 avm2: Impl `TextField.embedFonts`
This assumes `embedFonts` is the opposite of device fonts, which sounds reasonable.
2021-03-19 12:39:57 -07:00
David Wendt 62ec106afb avm2: Impl `TextField.displayAsPassword` 2021-03-19 12:39:57 -07:00
David Wendt fa5145b884 avm2: Impl `TextField.defaultTextFormat` 2021-03-19 12:39:57 -07:00
David Wendt 3d8bf90794 core: Also allow converting `TextFormat` back into an AVM2 object. 2021-03-19 12:39:57 -07:00
David Wendt 3d2d2072af avm2: Impl `TextFormatAlign` 2021-03-19 12:39:57 -07:00
David Wendt 50f992b9e6 avm2: Implement `TextField.borderColor` 2021-03-19 12:39:57 -07:00
David Wendt 8913297514 avm2: Fix type of `TextField.backgroundColor` 2021-03-19 12:39:57 -07:00
David Wendt 8d1e0992b5 avm2: Impl `TextField.border` 2021-03-19 12:39:57 -07:00
David Wendt 436b3b2ed3 avm2: Impl `TextField.backgroundColor` 2021-03-19 12:39:57 -07:00
David Wendt a84acd55c3 avm2: Impl `TextFieldAutoSize` 2021-03-19 12:39:57 -07:00
David Wendt e35f66fafe avm2: Impl `TextField.autoSize` 2021-03-19 12:39:57 -07:00
David Wendt b6adc18c9c avm2: Impl `flash.text.TextFormat` 2021-03-19 12:39:57 -07:00
David Wendt f44e54246d avm2: Text fields on AVM2 movies should have AVM2 objects. 2021-03-19 12:39:57 -07:00
David Wendt 9e739f8ceb avm2: Ensure constructed text fields have a DisplayObject side 2021-03-19 12:39:57 -07:00
David Wendt b71286f1c4 avm2: Stub `flash.text.TextField` 2021-03-19 12:39:57 -07:00
relrelb cdb2c279c0 avm2: Implement Nop 2021-03-19 12:39:23 -07:00
Callum Thomson a570d96433
avm2: Implement flash.geom.Point (#3681) 2021-03-18 12:03:04 -07:00
relrelb 8f21c17683 chore: Rename MutationContext parameters to gc_context 2021-03-06 23:30:06 -08:00
relrelb fff6eb2ffd chore: Use bitflags set method 2021-03-06 23:30:06 -08:00
EmperorBale b68eeeae26
avm2: Implement ByteArray 2021-03-05 15:01:02 -08:00
paq d866f73c5e avm2: Implement RegExp 2021-03-03 03:37:34 -08:00
David Wendt 540a68fb68 avm2: Grant each event it's own, separate broadcast list. 2021-03-03 03:08:01 -08:00
David Wendt a5b4e168d3 avm2: Stub `flash.display.Shape`. 2021-03-03 03:08:01 -08:00
David Wendt 69e8a33a8e Debug event dispatches. 2021-03-03 03:08:01 -08:00
David Wendt a2d56016cb avm2: Don't except when dispatching events on unconstructed objects. 2021-03-03 03:08:01 -08:00
David Wendt ac6a206257 Fire `exitFrame`, `enterFrame`, and `frameConstructed` events as broadcasts. 2021-03-03 03:08:01 -08:00
David Wendt d1ffa3254b Store a list of every constructed event dispatcher so we can broadcast events on them. 2021-03-03 03:08:01 -08:00
David Wendt 731c18ad80 avm2: Issue (or attempt to issue) events for entering, exiting, and constructing, a frame. 2021-03-03 03:08:01 -08:00
David Wendt 3df97d8da2 avm2: Stub `System.gc`.
Our current garbage collector design precludes the ability to actually collect garbage during player updates, so this is a no-op.
2021-03-03 03:08:01 -08:00
David Wendt 464f388324 avm2: Unstaged display objects are treated as unrooted. 2021-03-03 03:08:01 -08:00
David Wendt 76ef0d4740 avm2: Event phase should be counted from 1 in `valueOf`. 2021-03-03 03:08:01 -08:00
David Wendt c4a5c6f4d3 avm2: Constructed events start in phase 2, not 3 2021-03-03 03:08:01 -08:00
David Wendt 4521c2b599 avm2: Manually-constructed movie clips (and their subclasses) should be accessible from the display object tree. 2021-03-03 03:08:01 -08:00
David Wendt 63af38be9a avm2: Add convenience method for natively-dispatched events. 2021-03-03 03:08:01 -08:00
Mads Marquart dad21d4398 swf: Make avm2 Reader operate directly with byte slices 2021-02-27 17:04:42 -08:00
Aaron Hill 6050dd8204
Replace most manual `Collect` impls with `#[derive(Collect)]`
* Replace most unsafe impls with Collect.
 * Switch to local gc-arena fork.
2021-02-17 18:38:55 -08:00
Aaron Hill f745c39a42
chore: Remove `Collect` impls from `Activation` and `UpdateContext`
Neither of these impls are actually used.

As a result of this change, several fields in `avm2::Activation` became
unused. I assumed that these fields will become used as more of avm2 is
implemented, so I suppressed the warnings for now
2021-02-16 20:35:26 -08:00
CUB3D b93e556f89 avm2: Implement Op::Typeof and dummy XML/XMLList 2021-02-16 20:21:40 -08:00
David Wendt 4905e9a83d avm2: `Video` is a sealed class. 2021-02-16 19:03:48 -08:00
David Wendt 02b94649c3 avm2: Stub the `Video` class. 2021-02-16 19:03:48 -08:00
relrelb bb89391f3a chore: Avoid deprecated constants
The Rust documentation considers numeric constants prefixed with std::
as deprecated.
For example: https://doc.rust-lang.org/std/u16/constant.MAX.html.
2021-02-12 06:36:17 -08:00
paq 5cca3884d6 avm2: Implement `Array.length`'s setter 2021-02-07 23:49:52 -08:00
paq 8aaead90de avm2: Implement String.charCodeAt 2021-02-07 16:11:24 -08:00
paq c7c025277f avm2: Implement String.charAt 2021-02-07 16:11:24 -08:00
paq 2ec21bdd07 avm2: Implement String.length 2021-02-07 16:11:24 -08:00
paq 4a87d707f0 avm2: Implement String constructor 2021-02-07 16:11:24 -08:00
paq 48d59c0340 chore: Minor refactor names.rs 2021-02-02 10:16:41 -08:00
paq e9ad1587a4 chore: Rename Namespace::public_namespace to Namespace::public 2021-01-24 11:53:43 -08:00
paq b58fcf3b05 chore: Use Namespace::public_namespace() instead of Namespace::package("") 2021-01-24 11:53:43 -08:00
Aaron Hill b2f5f807de avm2: Print full multiname for "Property does not exist" errors (#2740)
This makes it easy to see when the error is a result of something in the
"flash" package being unimplemented.
2021-01-21 17:52:17 -08:00
relrelb b05c6540e1
chore: Migrate from enumset to bitflags 2021-01-21 16:35:46 -08:00
Mike Welsh da1e2801a2 chore: Appease clippy 2021-01-18 21:23:50 -08:00
Mike Welsh fae1d6fd6a chore: Appease clippy 2021-01-04 13:17:26 -08:00
paq 8baa36e801 avm2: Implement isFinite 2020-12-27 23:02:39 -08:00
paq ce2d7efac3 avm2: Implement isNaN 2020-12-27 23:02:39 -08:00
David Wendt b848e4c5ff avm2: Get rid of `RufflePrivate` and just use regular private namespaces scoped to our own domain. 2020-12-21 21:47:29 -08:00
David Wendt 30d8dc21be avm2: Remove weird `into` constructor on `EventHandler` 2020-12-21 21:47:29 -08:00
David Wendt 7baa3cc06d avm2: Seal the `EventDispatcher` class 2020-12-21 21:47:29 -08:00
David Wendt 3ff9b87261 avm2: `RufflePrivate` namespaces should be treated as private namespaces. 2020-12-21 21:47:29 -08:00
David Wendt 19219ad0c1 avm2: Implement `dispatchEvent`.
Event dispatch is a surprisingly complicated procedure, so this makes sure to test:

1. Event dispatch on bare dispatchers
2. Event dispatch on hierarchial dispatchers (movieclips)
3. Event cancellation (which is reported by `dispatchEvent`)
4. The implicit `this` on unbound event handlers. I'm not yet sure if this is a special property of event dispatch or if all unbound functions inherit their global scope as `this`.
5. The execution order of handlers on both bare and hierarchial dispatchers
6. Delegation to hierarchial dispatchers
7. Modification of the dispatch list during dispatch of an event. Surprisingly enough, you can add handlers to the event you're handling and expect them to execute, *if* you added them to a further object in the order *or* you added a bubble handler in the capture phase.
2020-12-21 21:47:29 -08:00
David Wendt f33e5f893a avm2: Allow builtins to get at the global scope. 2020-12-21 21:47:29 -08:00
David Wendt 8efaed40a0 avm2: `event.eventPhase` is enumerated from 1 2020-12-21 21:47:29 -08:00
David Wendt 87ff679898 avm2: Implement `EventDispatcher.willTrigger` 2020-12-21 21:47:29 -08:00
David Wendt a071800117 avm2: `EventDispatcher` should supercall, too. 2020-12-21 21:47:29 -08:00
David Wendt e8163e43ab avm2: Builtin constructors should supercall. 2020-12-21 21:47:29 -08:00
David Wendt be4e37a55c avm2: Implement `addEventListener`, `removeEventListener`, and `hasEventListener`. 2020-12-21 21:47:29 -08:00
David Wendt 2faf5259ca avm2: Add a representation for event dispatch lists.
For various reasons, we store the dispatch list for an object on a separate property of an `EventDispatcher` rather than dictating that all children of `EventDispatcher` use a specific object type. This is because `EventDispatcher` is a very general class with lots of object representations it needs to cover. So instead, we introduce a new object representation for a *property* and store it in a Ruffle private namespace that is as isolated from user code as alternate object representations are.
2020-12-21 21:47:29 -08:00
David Wendt b02897637f avm2: Add a new namespace type to store runtime-internal properties we don't want user code being able to access ever. 2020-12-21 21:47:29 -08:00
Mike Welsh 8a0e55d74a chore: Bump to rand 0.8 2020-12-19 14:33:12 -08:00
David Wendt 09f9e99fbb avm2: Implement `rest` parameters in function calls. 2020-12-17 13:21:44 -08:00
David Wendt 453e013c2c avm2: Implement `arguments`. 2020-12-17 13:21:44 -08:00
David Wendt 217890f4a6 avm2: Implement `Function.apply` 2020-12-17 13:21:44 -08:00
David Wendt acadcb8fc0 avm2: `Event` is a sealed class. 2020-12-14 16:46:33 -08:00
David Wendt f7f51dcde2 avm2: `EventPhase` and `PropagationMode` should be `Eq` 2020-12-14 16:46:33 -08:00
David Wendt 6caaf0d222 avm2: Implement all of the `Event` class constants.
I'm not writing tests for these, my wrists hurt enough as is.
2020-12-14 16:46:33 -08:00
David Wendt 8a787e6153 avm2: Implement `Event.toString` (which matches it's valueof behavior) 2020-12-14 16:46:33 -08:00
David Wendt dc32d7894c avm2: Remove redundant event phase accessor 2020-12-14 16:46:33 -08:00
David Wendt ec63ff55cb avm2: Implement `Event.stopPropagation` and `Event.stopImmediatePropagation`.
These aren't testable yet.
2020-12-14 16:46:33 -08:00
David Wendt d393a5f4f8 avm2: Implement `Event.preventDefault` and `Event.isDefaultPrevented` 2020-12-14 16:46:33 -08:00
David Wendt 8b9a804ae9 avm2: Implement `Event.formatToString`. 2020-12-14 16:46:33 -08:00
David Wendt 584c6c8b11 avm2: Implement `Event.clone` 2020-12-14 16:46:33 -08:00
David Wendt 3d12929914 avm2: Expose `Event.target`, `currentTarget`, and `eventPhase`.
These have no tests because these properties can only be updated by an event broadcaster.
2020-12-14 16:46:33 -08:00
David Wendt 90da20579c avm2: Implement `Event.bubbles`, `cancelable`, and `type`. 2020-12-14 16:46:33 -08:00
David Wendt 58f4470dc5 avm2: Add `Event` class, object type, and native representation 2020-12-14 16:46:33 -08:00
David Wendt afd033898c avm2: Implement `hitTestObject` 2020-12-09 14:00:06 -08:00
David Wendt d9172780c5 avm2: Implement `hitTestPoint`. 2020-12-09 14:00:06 -08:00
David Wendt b18b87e566 avm2: Implement `mouseX` and `mouseY`.
Note that we cannot write a reproducible test for this.
2020-12-09 14:00:06 -08:00
David Wendt 06ba2f898a avm2: Implement `visible`. 2020-12-09 14:00:06 -08:00
David Wendt d489aca377 avm2: Expose `DisplayObject.root` 2020-12-09 14:00:06 -08:00
David Wendt 0069d51dad swf: `pushshort` should be read as a `u30` and then cast to an `i16` as it's parsed representation. 2020-12-09 14:00:06 -08:00
David Wendt 1b2a4708d6 avm2: Implement `DisplayObject.parent`. 2020-12-09 14:00:06 -08:00
David Wendt c053f2c87c avm2: Expose DisplayObject `name` property 2020-12-09 14:00:06 -08:00
David Wendt 19f9e99954 avm2: Expose and test `rotation`. 2020-12-09 14:00:06 -08:00
David Wendt 200581e1e3 avm2: Expose `x` and `y` properties. 2020-12-09 14:00:06 -08:00
David Wendt abca120628 avm2: Expose `width` to AS3 code. 2020-12-09 14:00:06 -08:00
David Wendt 6da658a845 avm2: `pushshort` has an undocumented coercion step 2020-12-09 14:00:06 -08:00
David Wendt 90e203b004 avm2: `this.height` ignores negative values 2020-12-09 14:00:06 -08:00
David Wendt bd00bea744 avm2: Expose `alpha`, `height`, `scaleY`, and `scaleX` to script code. 2020-12-09 14:00:06 -08:00
bbb651 92bd0874e1 Fixed "Swap" only working for i32 2020-12-03 15:51:37 -08:00
bbb651 8baf35e7af Added AVM2 op "Swap" 2020-12-03 15:51:37 -08:00
David Wendt 5a2f17a642 core: Consistently refer to render list positions as an `index` for consistency with Rust naming conventions 2020-11-27 13:23:34 -08:00
David Wendt c011c028de avm2: Correctly coerce render list indicies as `i32`, not `u32`. 2020-11-27 13:23:34 -08:00
David Wendt 8764831533 chore: cargo 1.47 changed the formatting algorithm 2020-11-27 13:23:34 -08:00
David Wendt 74b50f2586 core: AVM2-locked children should still be removable from the depth list. 2020-11-27 13:23:34 -08:00
David Wendt 35bc43cce2 avm2: Swapping children should lock them from depth manipulation. 2020-11-27 13:23:34 -08:00
David Wendt c8cd4a9192 avm2: Remove outdated documentation on some internal functions. 2020-11-27 13:23:34 -08:00
David Wendt 6cb3ff9632 avm2: Stub `getObjectsUnderPoint` and `areInaccessibleObjectsUnderPoint` as we do not yet support the `Point` class 2020-11-27 13:23:34 -08:00
David Wendt 86e1037940 avm2: Implement `stopAllMovieClips` 2020-11-27 13:23:34 -08:00
David Wendt 3cac03857c chore: Clippy beta compliance 2020-11-27 13:23:34 -08:00
David Wendt e2e598edde avm2: Implement `swapChildren` and `swapChildrenAt`. 2020-11-27 13:23:34 -08:00
David Wendt 71cdbd7194 avm2: Implement `setChildIndex` 2020-11-27 13:23:34 -08:00
David Wendt cf0ab2d82f avm2: Implement `removeChildren`.
This also changes the underlying `DisplayObjectContainer` method to accept any type of range. Turns out enum trait objects aren't actually trait objects and don't need to worry about object safety!
2020-11-27 13:23:34 -08:00
David Wendt 38fd29ae5f avm2: Implement `removeChildAt` 2020-11-27 13:23:34 -08:00
David Wendt 80d7409fc5 core: Separate off container management into a separate `DisplayObjectContainer` trait 2020-11-27 13:23:34 -08:00
David Wendt 759a590d76 avm2: Implement `getChildIndex` 2020-11-27 13:23:34 -08:00
David Wendt 85fa8f327d avm2: Impl `contains` w/ test 2020-11-27 13:23:34 -08:00
David Wendt 1f2c194ffd avm2: Remove unnecessary execution list accesses and debugging statements from `DisplayObjectContainer`. 2020-11-27 13:23:34 -08:00
David Wendt ab4dd984e8 core: Refactor display list management into a separate `ChildContainer` struct.
`ChildContainer` is responsible for maintaining child lists for all display objects that can hold children. Currently, this is just `Button` and `MovieClip` since those are the only objects in AVM1 that can have children, but this will be extended to other objects in future commits.

The number of lists managed has also increased from two to three. The execution list is unchanged save for it's migration into the `ChildContainer` struct. The render list has been split in two to support AS3. Specifically, the render list is now a `Vec`. Render children are still rendered in order but they are now referenced by AS3 `id`s rather than depths. The old `BTreeMap` that served as a render list is now the depth list and serves to maintain compatibility with SWF tags and AVM1 code that refers to things on the timeline by depth.
2020-11-27 13:23:34 -08:00
David Wendt a5f09d3c09 avm2: Implement `removeChild`. 2020-11-27 13:23:34 -08:00
David Wendt a5ea9795f6 avm2: Implement `addChild` and `addChildAt`, with tests 2020-11-27 13:23:34 -08:00
David Wendt 4817e92992 avm2: `getChildAt` works in reverse execution list order, not by depth 2020-11-27 13:23:34 -08:00
David Wendt 8c9f8520b3 avm2: Implement `DisplayObjectContainer.numChildren` 2020-11-27 13:23:34 -08:00
David Wendt f748576927 avm2: Implement `getChildByName` 2020-11-27 13:23:34 -08:00
David Wendt 827567bb58 avm2: `toString` of stage objects should work the same way as other objects 2020-11-27 13:23:34 -08:00
David Wendt dc629af177 avm2: `getChildById` indexes by zero, but it gives me the child at depth one. 2020-11-27 13:23:34 -08:00
David Wendt d04f131cfe avm2: Implement `DisplayObjectContainer.getChildAt`.
This test doesn't work yet because it needs `avm2-domainscope` to get merged in.
2020-11-27 13:23:34 -08:00
relrelb 2e0509694c docs: Miscellaneous spelling corrections 2020-11-12 13:34:05 -08:00
Mike Welsh 3ce8bc3c4b avm2: Implement Math 2020-11-12 04:24:47 -08:00
Mike Welsh b927acb2c2 avm2: trace accepts multiple arguments 2020-11-10 17:05:56 -08:00
Mike Welsh 316bc4e920 chore: Appease clippy 2020-11-09 01:52:57 -08:00
David Wendt 50d6ffb510 avm2: Prevent circularly referential scripts from causing stack overflows or double-borrows. 2020-10-17 03:32:09 -07:00
David Wendt d27360b282 avm2: Enable lazy initialization for ABCs that request it. 2020-10-17 03:32:09 -07:00
David Wendt cdab885979 avm2: Implement `ApplicationDomain` and all methods that don't require `Vector` or domain memory 2020-10-17 03:32:09 -07:00
David Wendt 1aceb7776d avm2: Superclasses should resolve out of the current scope stack. 2020-10-17 03:32:09 -07:00
David Wendt 00fcc5ffa4 avm2: Reference the current domain at the bottom of the scope stack. 2020-10-17 03:32:09 -07:00
David Wendt 1792939212 avm2: Script scopes should hold the domains they are a part of.
Also, this means we have a `TObject` representation for domains now.
2020-10-17 03:32:09 -07:00
David Wendt 6a736b0d2b avm2: Wrap all player globals in a separate appdomain and script.
This entirely abolishes the "global scope object" in AVM2. I even had to redefine several global object functions to work with the bottom of the scope stack, which seems to be where ASC likes to stick the script scope.
2020-10-17 03:32:09 -07:00
David Wendt add7c4d43d avm2: Collect all script definition names and associated scripts into a `Domain`. 2020-10-17 03:32:09 -07:00
David Wendt 02e05e3d7f Add separate scope object for each script. 2020-10-17 03:32:09 -07:00
Nathan Adams 4abd02e2f7 core: Implement a timeout for script execution, defaulting to 15 seconds. Fixes #554 2020-10-11 13:34:15 -07:00
David Wendt 5abebd5433 avm2: Yield an error if the caller specifies a label/scene pair and the label is not present within the scene. 2020-10-06 06:03:22 -07:00
David Wendt ef665acaec avm2: Movie clips not explicitly granted a `symbol_class` should be constructed using the `MovieClip` class directly 2020-10-06 06:03:22 -07:00
David Wendt 007d54b389 avm2: Remove redundant implementations of `prev_frame` and `next_frame` 2020-10-06 06:03:22 -07:00
David Wendt 4c44ca8e77 avm2: Non-integer numbers should be handled as strings and integer-parsible strings should be handled as numbers. 2020-10-06 06:03:22 -07:00
David Wendt 896a5b37a5 avm2: Implement `new MovieClip()`. 2020-10-06 06:03:22 -07:00
David Wendt d399811eb8 avm2: Allow `MovieClip` to be constructed by users. 2020-10-06 06:03:22 -07:00
David Wendt 50dd9a6733 avm2: Implement the programmatically-playing flag that governs `isPlaying` behavior. 2020-10-06 06:03:22 -07:00
David Wendt 8152400a39 avm2: Implement `MovieClip.scenes`. 2020-10-06 06:03:22 -07:00
David Wendt c682868205 avm2: Implement `MovieClip.currentScene` 2020-10-06 06:03:22 -07:00
David Wendt 2483201bcd avm2: Store the lengths of each scene in a movie. 2020-10-06 06:03:22 -07:00
David Wendt 8a13d5fe10 avm2: Implement `Scene` object. 2020-10-06 06:03:22 -07:00
David Wendt 5e31c44b81 All objects should default to `toString`ing with their own classname. 2020-10-06 06:03:22 -07:00
David Wendt de186ed5f3 avm2: Implement `MovieClip.currentLabels` 2020-10-06 06:03:22 -07:00
David Wendt 77a86aef9b avm2: Implement `FrameLabel`. 2020-10-06 06:03:22 -07:00
David Wendt 542147d657 avm2: Run all AVM2 frame scripts on the action queue.
This is the same way that AVM1 actions run and it appears that frame scripts work exactly the same way. It fixes all outstanding bugs with movie clip navigation in AVM2 and allows me to remove a lot of weird workarounds I was writing for the old, incorrect behavior.

I'm also removing the "last run script frame" rule as `run_frame_internal` already had rules to prevent stopped clips from rerunning actions.
2020-10-06 06:03:22 -07:00
David Wendt 996d7528d5 avm2: Implement `prevScene` and `nextScene`. 2020-10-06 06:03:22 -07:00
David Wendt 864c6a37f9 avm2: Dynamic properties should be retrievable before they are actually set. 2020-10-06 06:03:22 -07:00
David Wendt 6d0befad97 avm2: Implement `prevFrame` and `nextFrame`, with tests. 2020-10-06 06:03:22 -07:00
David Wendt 97048fb8bd avm2: Implement `stop` and `play`, with tests for the former. 2020-10-06 06:03:22 -07:00
David Wendt 556c951b1c avm2: Implement `gotoAndPlay`/`gotoAndStop`, with test. 2020-10-06 06:03:22 -07:00
David Wendt 3513918149 avm2: Allow typechecking by prototype, rather than just by constructor. 2020-10-06 06:03:22 -07:00
David Wendt 3b6f8cff4e avm2: Implement `framesLoaded`, `isPlaying`, and `totalFrames`. 2020-10-06 06:03:22 -07:00
David Wendt 7ca34452a1 avm2: Implement `currentFrameLabel` and `currentFrame`. 2020-10-06 06:03:22 -07:00
David Wendt c1b14b7639 avm2: Implement `currentFrame`. 2020-10-06 06:03:22 -07:00
David Wendt c04bf7d53c `addFrameScript` indexes by zero, not by one. 2020-10-06 06:03:22 -07:00
David Wendt ab45b9084d avm2: Parse `SymbolClass` package paths correctly. 2020-10-06 06:03:22 -07:00
David Wendt d991c49774 Implement `addFrameScript`. 2020-10-06 06:03:22 -07:00
David Wendt 664152d739 avm2: Mark `EventDispatcher` as implementing `IEventDispatcher`.
This doesn't actually implement any of it's methods yet, which *would* cause an error *if* we were verifying that.
2020-10-06 06:03:22 -07:00
David Wendt e72c9776ec avm2: Implement `IEventDispatcher`. 2020-10-06 06:03:22 -07:00
David Wendt c899b3080a avm2: Add function to unwrap a `StageObject` as it's underlying `DisplayObject`. 2020-10-06 06:03:22 -07:00
David Wendt a70e1be466 Add code to instantiate AVM2 movie clips correctly.
This also includes several bits to build an effective VM barrier.
2020-10-06 06:03:22 -07:00
David Wendt 3128bbcda6 core: Implement `SymbolClass` tag. 2020-10-06 06:03:22 -07:00
David Wendt 63f411d231 avm2: Add `StageObject` object implementation for holding display objects in AVM2. 2020-10-06 06:03:22 -07:00
Mike Welsh ead845ff33 chore: Appease clippy 2020-09-26 18:19:37 -07:00
Luca Weiss d5cb396331 *: fix spelling mistakes 2020-09-19 16:17:58 -07:00
David Wendt f2380d828a chore: Don't capitalize our type arguments. 2020-09-15 02:20:11 -07:00
David Wendt 7e91c45950 avm2: Move trait methods into the AS3 namespace.
`toString`, `toLocaleString`, and `valueOf` are still `public`, because they're not supposed to be trait methods at all.
2020-09-15 02:20:11 -07:00
David Wendt 27eda5cdf1 avm2: Remove `ArrayIterator` trait.
I originally added this with the anticipation that `impl` return syntax only allowed one trait plus OIBITs. This was prior experience in Rust but apparantly the compiler accepts this just fine, so I suppose my defensive coding practice was a bad/outdated idea.
2020-09-15 02:20:11 -07:00
David Wendt de0bc93839 Fix `hasOwnProperty` yielding false on populated non-hole array indicies. 2020-09-15 02:20:11 -07:00
David Wendt e581704559 avm2: `new Array()` should reject negative and `NaN` length arguments as errors. 2020-09-15 02:20:11 -07:00
David Wendt 582df3bd7d avm2: Misc perf fixes and nits in Array globals. 2020-09-15 02:20:11 -07:00
David Wendt 07e14463e2 avm2: Array `join` and `toString` treat `undefined` and `null` as empty strings. 2020-09-15 02:20:11 -07:00
David Wendt 3b7922d222 avm2: Implement `Array.sortOn` 2020-09-15 02:20:11 -07:00
David Wendt 0aa2c50118 avm2: Implement `Array.sort` 2020-09-15 02:20:11 -07:00
David Wendt bb19699739 avm2: Add convenience method for converting a `Value` into an `EnumSet`. 2020-09-15 02:20:11 -07:00
David Wendt a653a62a93 avm2: Add array sorting constants. 2020-09-15 02:20:11 -07:00
David Wendt ca4982029b avm2: Impl `Array.toLocaleString`. 2020-09-15 02:20:11 -07:00
David Wendt 2ae3b6445b avm2: Partially implement `toLocaleString` insamuch as is necessary to run Array tests on it.
This appears to work almost like it's own TObject method; you can run `Object.prototype.toLocaleString` on all sorts of things and it has separate behavior to what the class method for it might be. I have attempted to match Flash Player as best as I can.
2020-09-15 02:20:11 -07:00
David Wendt dbaef812fa avm2: Impl `Array.splice`. 2020-09-15 02:20:11 -07:00
David Wendt 53b564bb52 avm2: Implement `Array.slice`. 2020-09-15 02:20:11 -07:00
David Wendt 036f7cbb90 avm2: Implement `Array.shift` and `Array.unshift`.
This also updates `Array.push` to support it's ability to push multiple arguments at once.
2020-09-15 02:20:11 -07:00
David Wendt 879aff3669 avm2: Implement `Array.reverse` 2020-09-15 02:20:11 -07:00
David Wendt 1ce78388a3 avm2: Implement `Array.push` and `Array.pop` 2020-09-15 02:20:11 -07:00
David Wendt 0ece924877 avm2: Implement `indexOf` and `lastIndexOf` 2020-09-15 02:20:11 -07:00
David Wendt 7aa1ab82e4 avm2: Avoid locking the array when running user code.
The array being iterated is explicitly handed to all callbacks, and it is legal for the callback to mutate the array. Hence, we can't actually hold a `Ref` to the array storage when we call user code. Instead, we implement a custom `Iterator` which iterates over the object like user code would.

This actually can't be an `Iterator` impl due to limitations of the underlying trait. Hence, we have to `while let` instead of `for`.
2020-09-15 02:20:11 -07:00
David Wendt 832bbdd711 avm2: Implement `forEach`, `map`, `filter`, `every`, and `some` on `Array`.
This also comes with some refactoring: building the resulting array object and resolving holes is now done in helper methods.
2020-09-15 02:20:11 -07:00
David Wendt 0eeee72be6 avm2: Implement `Array.join`, `Array.toString`, and `Array.valueOf` (w/tests) 2020-09-15 02:20:11 -07:00
David Wendt 505018c3b8 avm2: Implement `newarray`. 2020-09-15 02:20:11 -07:00
David Wendt 04828663e8 avm2: `deleteproperty` should only ever yield `false` when attempting to delete unknown properties on a sealed class object. 2020-09-15 02:20:11 -07:00
David Wendt 6d9b9c9218 avm2: Attempts to get unknown properties on dynamic objects should yield `undefined`. 2020-09-15 02:20:11 -07:00
David Wendt 966dfc3902 avm2: Add method to get at the `Class` of non-class objects with a prototype.
The only unclassed objects should be bare objects, which are hard to get at.
2020-09-15 02:20:11 -07:00
David Wendt cac1717780 avm2: Add utility method `is_sealed` for `Class`. 2020-09-15 02:20:11 -07:00
David Wendt 5a29b781ec avm2: Ensure `ArrayObject` offers access to it's array properties for reading and writing. 2020-09-15 02:20:11 -07:00
David Wendt e054456286 avm2: Add method to check if a particular namespace is the public namespace. 2020-09-15 02:20:11 -07:00
David Wendt a09ba9d263 avm2: Implement `length`. 2020-09-15 02:20:11 -07:00
David Wendt aaf586e3a7 avm2: `define_instance_trait` should actually define instance traits. 2020-09-15 02:20:11 -07:00
David Wendt 45c95cae02 avm2: Impl `Array.concat` 2020-09-15 02:20:11 -07:00
David Wendt 1092bf2bc5 avm2: Add the ability to wrap an already-constructed array in an object. 2020-09-15 02:20:11 -07:00