Adrian Wielgosik
4230d1f19f
avm2: Add Mouse.hide(), Mouse.show()
2021-12-21 17:32:57 +01:00
relrelb
b1151b2ab2
html: Rewrite `FormatSpans::to_html`
...
The new implementation doesn't use the `xml` crate, nor `quick-xml`,
but rather just iterates the `TextSpan`s and builds the formatted HTML
string.
2021-12-20 08:31:59 +02:00
Adrian Wielgosik
5d81a0ce64
avm2: Remove .clone() calls now that Index is Copy
2021-12-17 21:09:40 -07:00
Adrian Wielgosik
a8fb1c2b16
avm2: pass Multiname to resolve_type() by reference
2021-12-17 21:09:40 -07:00
Adrian Wielgosik
22a0711d85
avm2: Use TU's method cache for callstatic, newfunction opcodes
2021-12-17 21:09:40 -07:00
Adrian Wielgosik
4b23f4dfb7
avm2: Set correct value type in op_convert_u/i
2021-12-17 21:06:33 -07:00
David Wendt
2aee3555ab
chore: Fix all new clippy lints added in latest Rust nightly
2021-12-17 20:53:26 -07:00
Adrian Wielgosik
726ec47f19
avm2: Support inheritance of protected traits
2021-12-15 22:26:41 +01:00
Adrian Wielgosik
11534a4b34
avm2: Implement parseInt, parseFloat
2021-12-15 22:16:49 +01:00
Adrian Wielgosik
49feb23649
avm2: Move toplevel functions to separate file
2021-12-15 22:16:49 +01:00
EmperorBale
30f2e0f8b1
avm2: Implement JSON ( #5172 )
...
* avm2: Implement JSON.parse
* avm2: Add AvmSerializer for serializing AVM values to JSON
* avm2: Add support for replacer objects
* avm2: use *const ObjectPtr for object stack
* avm2: Add support for space parameter is JSON.stringify
* avm2: Refactor AvmSerializer design
* avm2: Restrict spaces to a maximum of 10
* avm2: Refactor map_value
* tests: Add JSON.parse test
* chore: Appease clippy
* avm2: Check if value is undefined before inserting
* tests: Add test for JSON.stringify
* tests: Improve JSON.stringify test
* chore: Replace map_or with explicit match statements
* chore: Use QName::dynamic_name
* avm2: Use Object<'gc> instead of ObjectPtr
* chore: Use explicit match in deserialize_value
* Rebase fixes
Co-authored-by: Adrian Wielgosik <adrian.wielgosik@gmail.com>
2021-12-13 18:32:04 +01:00
Adrian Wielgosik
ad1442dbaa
avm2: Add a basic ContextMenu stub
2021-12-13 18:31:03 +01:00
Adrian Wielgosik
1f5979f168
chore: clippy
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
1311b0a3d0
avm2: refactor Domain::get_defining_script
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
0fb075a309
chore: cargo fmt
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
3d8f611651
avm2: Update comments.
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
b747541709
avm2: Panic upon encountering CallMethod opcode
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
1d8c556944
avm2: Handle TODOs, throw errors where applicable
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
24247dff0b
avm2: install_const_late always appends slots
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
4bd12ae4b3
avm2: Get prototypes from classes without get_property()
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
49d16dea8b
avm2: Rip out `receiver` from get/set/call_property
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
ee0798b258
avm2: Cleanup slots/global initialization some more
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
21865edf9b
avm2: Support const slots, fill some TODOs
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
b272d8722e
avm2: Reword slot/disp_id assignment, remove Slot.
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
4d8999c012
avm2: Make all prototypes ScriptObjects; also cleanup vector enumeration, Proxy
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
3706db86d2
avm2: move properties from instances to vtable
2021-12-11 20:48:09 +01:00
Adrian Wielgosik
6594d4159d
avm2: Use Vec instead of HashMap for loaded constants
2021-12-11 10:03:29 +01:00
relrelb
7966d850dd
core: Normalize `\r` to `\n` in `avm_trace`
...
Fixes #3120 .
2021-12-10 19:54:35 +02:00
EmperorBale
0a25ebbc32
chore: Remove more explicit clones
2021-12-08 22:14:45 +01:00
EmperorBale
d6b7d0c915
chore: Fix formatting
2021-12-08 22:14:45 +01:00
EmperorBale
847a4fb61a
chore: Remove explicit clones in value
2021-12-08 22:14:45 +01:00
EmperorBale
1709ea94e7
chore: Remove explicit clones in object
2021-12-08 22:14:45 +01:00
EmperorBale
8ea41bc151
chore: Remove explicit clones in slot
2021-12-08 22:14:45 +01:00
EmperorBale
15378bcfde
chore: Remove explicit clones from vector
2021-12-08 22:14:45 +01:00
EmperorBale
2f71360c3b
chore: Remove explicit clones from primitive_object
2021-12-08 22:14:45 +01:00
EmperorBale
a7f86e679c
chore: Remove explicit clones from uint
2021-12-08 22:14:45 +01:00
EmperorBale
0a8b964754
chore: Remove explicit clones from number
2021-12-08 22:14:45 +01:00
EmperorBale
8f27196356
chore: Remove explicit clones in int
2021-12-08 22:14:45 +01:00
EmperorBale
a0bbc96b4a
chore: Remove explicit clones in function
2021-12-08 22:14:45 +01:00
EmperorBale
7027046588
chore: Remove explicit clones in shape
2021-12-08 22:14:45 +01:00
EmperorBale
51f909691f
chore: Remove explicit clones in movieclip
2021-12-08 22:14:45 +01:00
EmperorBale
96eb14fdab
chore: Remove explicit clones in boolean
2021-12-08 22:14:45 +01:00
EmperorBale
60fc4cd0c0
chore: Remove explicit clones in activation
2021-12-08 22:14:45 +01:00
EmperorBale
002158a1b0
chore: Remove explicit clones in array
2021-12-08 22:14:45 +01:00
EmperorBale
7fce022293
avm2: Derive Copy for Value
2021-12-08 22:14:45 +01:00
relrelb
da4b5986b1
chore: Appease clippy
2021-12-08 22:36:55 +02:00
David Wendt
9f30a9d4a6
avm2: When passing namespaces around, use a `SmallVec` of one element for memory savings.
2021-12-02 16:30:21 -07:00
David Wendt
1302ea9986
avm2: Pass everything around as `SmallVec`s.
2021-12-02 16:30:21 -07:00
David Wendt
5e03382f5d
avm2: Smallvec the property maps.
2021-12-02 16:30:21 -07:00
David Wendt
a18faeb047
avm2: Also put definition scripts in a `PropertyMap` and query them the same way we do objects
2021-12-02 16:30:21 -07:00
David Wendt
92697c9f1e
avm2: Use FNV hashing for all other parts of the VM.
2021-12-02 16:30:21 -07:00
David Wendt
3329e2a965
avm2: Use FNV hashes for property lookup.
2021-12-02 16:30:21 -07:00
David Wendt
769c45add5
avm2: Make `QName` a copy type.
2021-12-02 16:30:21 -07:00
David Wendt
d53abfebf4
avm2: Also preresolve all class traits, too.
2021-12-02 16:30:21 -07:00
David Wendt
44162ae698
avm2: Don't clone the multiname set on each lookup
2021-12-02 16:30:21 -07:00
David Wendt
3a7dd48c81
avm2: Build a flattened traits list per class and use that in lieu of a full trait lookup.
2021-12-02 16:30:21 -07:00
David Wendt
722dd6aabf
avm2: Refactor multiname resolution to take advantage of the new value storage structure.
2021-12-02 16:30:21 -07:00
David Wendt
c99231b610
avm2: Index the property map by local name and bucket all namespaces together into a single list.
2021-12-02 16:30:21 -07:00
David Wendt
0bc2ddfc7b
avm2: Remove prototype lookups from `resolve_any`
2021-12-02 16:30:21 -07:00
David Wendt
d83a7c909c
avm2: Don't scan the prototype for each multiname check.
2021-12-02 16:30:21 -07:00
David Wendt
fa179dc63f
avm2: Unpublish a bunch of primclass methods
2021-11-28 18:40:21 -07:00
David Wendt
6d48126124
avm2: And, finally, `uint`.
2021-11-28 18:40:21 -07:00
David Wendt
640763bfda
avm2: Also do the same for `int`
2021-11-28 18:40:21 -07:00
David Wendt
593158cb04
avm2: Also allow calling `Number` methods on the prototype in the `public` namespace.
2021-11-28 18:40:21 -07:00
David Wendt
6bfca1af5f
avm2: Expose `Boolean` methods in the `public` namespace via prototypes.
2021-11-28 18:40:21 -07:00
David Wendt
3e8f13b70a
avm2: `Number.MIN_VALUE` is the machine epsilon, not the lowest possible finite value.
2021-11-28 18:40:21 -07:00
David Wendt
7569994f1f
avm2: Impl `Boolean.toString` and `Boolean.valueOf`.
2021-11-28 18:40:21 -07:00
David Wendt
aa01a682e1
avm2: Implement `uint`'s various formatting methods, too.
2021-11-28 18:40:21 -07:00
David Wendt
e43d18f7b0
avm2: Impl `int` versions of `toFixed`, `toString`, `toExponential`, and `toPrecision`
2021-11-28 18:40:21 -07:00
David Wendt
cabfe5e20c
avm2: All documented primitive class methods are in the AS3 namespace.
2021-11-28 18:40:21 -07:00
David Wendt
9e62b05157
avm2: Implement `Number.AS3::toString` and `Number.AS3::valueOf`.
...
This method has an odd flaw that we don't emulate yet. Actually, two:
1. Precision limits that are specific to the chosen radix
2. Occasional and intermittent corruption in the resulting 0 padding; usually manifesting as `x`, `W`, or `°` characters
The first could be emulated, but I've chosen not to... because the second thing listed not only isn't really possible to emulate, but actively prohibits approx-testing the results. So I'm marking the test as ignored and hoping no movies actually rely on the precision limits in `toString`.
2021-11-28 18:40:21 -07:00
David Wendt
4a09dfa3d0
avm2: Implement `Number.toFixed` and `Number.toPrecision`
2021-11-28 18:40:21 -07:00
David Wendt
55a7a1882d
avm2: Implement `Number.toExponential`
2021-11-28 18:40:21 -07:00
David Wendt
16597e0d7b
avm2: Fill out class constants for `uint`, `int`, and `Number`.
2021-11-28 18:40:21 -07:00
Varun Ramesh
7c87f35d8d
avm2: Implement `flash.display.PixelSnapping` ( #5718 )
...
* Add flash.display.PixelSnapping enum class
* Run 'cargo format --all'
* Add 'final' class attribute
2021-11-28 07:31:39 +02:00
Moulins
9701b817f5
core: Replace WStr<'_> and WStrMut<'_> by a single DST type WStr
2021-11-27 11:20:47 -07:00
Moulins
ee326e31b7
core: Reduce allocations in AvmString::new_utf8
...
Also remove some useless back-and-forth conversions between
AvmString and String
2021-11-27 11:20:47 -07:00
Moulins
fa30e1bc43
chore: rename AvmString::{new -> new_utf8, new_ucs2 -> new}
2021-11-27 11:20:47 -07:00
Moulins
45fe1e86ae
core: remove AvmString::as_str, and the extra UTF8 String inside
2021-11-27 11:20:47 -07:00
Moulins
e24af59197
core: remove last instances of AvmString::as_str
2021-11-27 11:20:47 -07:00
Moulins
824263d2bc
core: adapt TextField, Font & Html handling code to use WStr
2021-11-27 11:20:47 -07:00
Moulins
f149c9efce
core: remove some AvmString::as_str calls
2021-11-27 11:20:47 -07:00
Moulins
053758d77c
avm2: use WString in QName methods
2021-11-27 11:20:47 -07:00
Moulins
5ca911209b
core: implement WStr::join
2021-11-27 11:20:47 -07:00
Moulins
87400b829d
core: use WStrings for display object's frame and scene labels
2021-11-27 11:20:47 -07:00
Moulins
84b4e33036
core: implement FromWStr for various enum types
2021-11-27 11:20:47 -07:00
Moulins
5db23ddbf3
avm2: use WStr in date parsing logic
2021-11-27 11:20:47 -07:00
Moulins
f49ce49d28
core: add FromWStr trait and WStr::parse
2021-11-27 11:20:47 -07:00
Moulins
d850085d2b
avm1: partially rewrite Value::primitive_as_number
2021-11-27 11:20:47 -07:00
Moulins
4a09088d42
avm2: rewrite regexp module to not rely on AvmString::as_str
...
This is a little tricky, because we have to map the utf8 indices
returned by the regex engine to utf16 indices usable by Ruffle.
To limit the impact on performance, the regex, the string we're
currently matching on, and the last known (utf8, utf16) positions
are cached, avoiding extra utf8 conversions in common use cases
where a single string is repeatedly searched with increasing
`lastIndex`.
2021-11-27 11:20:47 -07:00
Moulins
110f568aa4
core: Remove some useless utf8<->utf16 conv. in {avm1,avm2}/activation.rs
2021-11-27 11:20:47 -07:00
Moulins
8885175550
core: Replace string::utils *_ignore_case functions by methods on WStr
2021-11-27 11:20:47 -07:00
Moulins
7f4af210b8
core: Reimplement AVM string methods using our UCS2 API
...
This generally means that methods are more efficient, as we
don't need to encode to UTF16 on-the-fly to have correct indices.
This also fix some bugs:
- charCode now properly handle surrogate pairs
- calling lastIndexOf with the empty pattern and an OoB index now
properly returns the string length
Still missing is AVM2's String.match
2021-11-27 11:20:47 -07:00
relrelb
e2b821e92f
chore: Replace `min` + `max` with `clamp`
...
`clamp` is a bit more efficient, in both runtime and size terms.
2021-11-26 20:54:48 +02:00
Adrian Wielgosik
da4ed75bc8
avm2: Compare QNames by local name first
2021-11-22 17:59:00 -07:00
Adrian Wielgosik
c2d521df41
avm2: refactor: Merge has-setter-and-no-getter into one lookup
2021-11-22 17:59:00 -07:00
Adrian Wielgosik
370186dc3c
avm2: refactor: Make trait lookups return a single item
2021-11-22 17:59:00 -07:00
relrelb
3760e0e275
core: De-duplicate `round_to_even` function
...
Put a single implementation in `ecma_conversions.rs`.
Need to consider what to do with the similar implementation in `matrix.rs`.
2021-11-20 13:36:06 +02:00
relrelb
7c6d006862
avm2: Correct `TextFormat` properties coercion
2021-11-20 13:36:06 +02:00
David Wendt
068e7acc6f
avm2: Remove the need for `lazy_static`
2021-11-19 20:43:53 -07:00
David Wendt
dda8a73899
avm2: Refactor so we don't need to rebox and unbox the numbers into values.
...
Also, use an actual constant table for the ellipsises.
2021-11-19 20:43:53 -07:00
David Wendt
4665a6c210
avm2: None of `Graphics`' methods need to be `pub`.
2021-11-19 20:43:53 -07:00
David Wendt
c719e69693
avm2: Also implement `drawEllipse` using `drawRoundRect`.
2021-11-19 20:43:53 -07:00
David Wendt
ef46d780ba
avm2: Implement `Graphics.drawCircle` using `drawRoundRect`
2021-11-19 20:43:53 -07:00
David Wendt
b318eb9969
avm2: Implement `Graphics.drawRoundRect`
2021-11-19 20:43:53 -07:00
David Wendt
c0874f445d
avm2: Functions are functions.
2021-11-11 17:12:49 -07:00
David Wendt
7dd9776d40
avm2: Implement `uint`, `Number`, and `Boolean`'s constructors, too.
2021-11-11 16:34:11 -07:00
David Wendt
7cc7f0fe7f
avm2: Impl `int`'s instance initializer.
2021-11-11 16:34:11 -07:00
David Wendt
be3e126ebb
avm2: Stub the `Sprite` constructor as just creating a `MovieClip`.
2021-11-11 16:33:33 -07:00
Tal Hayon
7ed38850fd
core: implement displayState for Stage in avm1/2
2021-11-11 16:20:05 -07:00
relrelb
cf05137c1f
core: `EditText::html_text` cannot fail
2021-11-11 08:05:33 +02:00
relrelb
a900aae63e
core: Make `EditText::set_html_text` accept a `&str`
2021-11-11 08:05:33 +02:00
relrelb
0787662079
core: Make `EditText::set_text` accept a `&str`
2021-11-11 08:05:33 +02:00
David Wendt
67e7526517
avm2: `EventDispatcher` contains an undocumented `toString` method.
2021-11-10 18:16:26 -07:00
David Wendt
360ae1f044
avm2: Private classes in different scripts are allowed to share the same name without conflicting.
2021-11-10 17:43:02 -07:00
David Wendt
60eb88b326
avm2: Note currently incorrect behavior intended to be fixed in a future PR.
2021-11-09 17:28:33 -07:00
David Wendt
4cfa3253d5
avm2: Impl `Proxy`'s enumeration-related methods.
2021-11-09 17:28:33 -07:00
David Wendt
4289f89350
avm2: Split out enumerant values into a separate method as well.
2021-11-09 17:28:33 -07:00
David Wendt
297526269c
avm2: Allow objects to assign arbitrary enumerant indexes, by having objects drive the enumeration process rather than just counting from one
2021-11-09 17:28:33 -07:00
David Wendt
1170385c3b
avm2: Implement `Proxy.hasproperty`
2021-11-09 17:28:33 -07:00
David Wendt
427b2bf17a
avm2: Implement `Proxy.deleteproperty`
2021-11-09 17:28:33 -07:00
David Wendt
503dc08594
avm2: Refactor `Object.delete_property` to work similar to get/set
2021-11-09 17:28:33 -07:00
David Wendt
e67ca1afe0
avm2: Implement `Proxy.callproperty`
2021-11-09 17:28:33 -07:00
David Wendt
301fd1020f
avm2: Implement `Proxy.setproperty`
2021-11-09 17:28:33 -07:00
David Wendt
8f47f494e7
avm2: Implement `Proxy`'s `getproperty` behavior.
2021-11-09 17:28:33 -07:00
David Wendt
f05e92c974
avm2: Fix `RTQNameL`'s parameters being popped backwards
2021-11-09 17:28:33 -07:00
David Wendt
d225d03043
avm2: Implement `flash.utils.Proxy`
2021-11-09 17:28:33 -07:00
David Wendt
c78e5e31fd
core: Store `DisplayObjectBase` in `InteractiveObjectBase`.
...
This also necessitated removing the `impl_display_object` family of macros, as you cannot name a field of a field in a macro expression. I tried. So instead I've reverted to standard default method inheritance, in the same way we did with AVM2 objects.
2021-11-09 16:48:29 -07:00
David Wendt
e71c749db5
avm2: Implement accessors for new `InteractiveObject` flags.
2021-11-09 16:48:29 -07:00
relrelb
89718475df
avm2: Introduce `TextFormatObject`
2021-11-09 16:21:35 -07:00
relrelb
9308513ae8
chore: Appease clippy
2021-11-06 10:44:01 +02:00
David Wendt
6c7d10e4d4
avm2: Requests for instance traits instead resolve to an associated public-namespace method
2021-11-02 16:54:38 -06:00
David Wendt
b0b1c79143
avm2: Split the `slot_id` and `disp_id` accessors.
2021-10-31 00:52:58 -07:00
David Wendt
0cc55df5ca
avm2: Remove `FINAL` flag and associated machinery as we now validate traits at class construction time.
2021-10-31 00:52:58 -07:00
David Wendt
a1be42abfb
avm2: Exempt system classes from class validation.
2021-10-31 00:52:58 -07:00
David Wendt
dd4717e08e
avm2: Move `final`/`override` check enforcement to class construction time.
...
This is an O(n^2) algorithm, which sucks, but at least it only runs once per class rather than per *object allocation*.
2021-10-31 00:52:58 -07:00
David Wendt
8d40e41ee1
avm2: Make `Executable` zero-alloc
2021-10-31 00:52:58 -07:00
David Wendt
cea3997396
avm2: Remove `superclass_object` and related parameters from `TObject.call` and other downstream functions.
...
Turns out there's a *lot* of downstream functions.
2021-10-31 00:52:58 -07:00
David Wendt
272b1784b8
avm2: Don't skip method binding in `callproperty` if the method requires `arguments`, as it may access `callee`.
2021-10-31 00:52:58 -07:00
David Wendt
1b5869e15a
avm2: Preserve ability to `callmethod` on slot IDs that have not yet been bound, by binding them at that time.
2021-10-31 00:52:58 -07:00
David Wendt
d0d19bcf38
avm2: Stop instantiating methods at object construction time.
2021-10-31 00:52:58 -07:00
David Wendt
bfbd2271b0
avm2: Allow uninstantiated methods to be created on-the-fly.
2021-10-31 00:52:58 -07:00
David Wendt
3562c50dee
avm2: `call_property` on classes should also call unbound methods
2021-10-31 00:52:58 -07:00
David Wendt
477add3dd0
avm2: Add `ClassObject` methods for pulling unbound methods or bound method objects from the class or instance.
2021-10-31 00:52:58 -07:00
David Wendt
9c031070b3
avm2: `ClassObject` should include class traits in `TObject` methods that reference the current object's traits.
2021-10-31 00:52:58 -07:00
David Wendt
74fb965301
avm2: Call methods directly if we can find a class with an instance trait matching it's name.
2021-10-31 00:52:58 -07:00
David Wendt
039777c41e
avm2: `Object.hasOwnProperty`, `propertyIsEnumerable`, and `setPropertyIsEnumerable` only work with public-NS properties.
2021-10-30 11:44:29 -06:00
EmperorBale
5ac8e75239
avm2: Make ObjectEncoding C-like
2021-10-25 16:32:55 -07:00
EmperorBale
bab74f83fc
avm2: Remove all unsafe from bytearray
2021-10-25 16:32:55 -07:00
EmperorBale
9126c9297c
avm2: Derive PartialEq and Eq for enums
2021-10-25 16:32:55 -07:00