@swf2es/runtime 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/LICENSE.third-party +422 -0
- package/README.md +29 -2
- package/dist/avm1/activation.d.ts +108 -0
- package/dist/avm1/activation.d.ts.map +1 -0
- package/dist/avm1/activation.js +90 -0
- package/dist/avm1/activation.js.map +1 -0
- package/dist/avm1/case.d.ts +3 -0
- package/dist/avm1/case.d.ts.map +1 -0
- package/dist/avm1/case.js +250 -0
- package/dist/avm1/case.js.map +1 -0
- package/dist/avm1/clips.d.ts +68 -0
- package/dist/avm1/clips.d.ts.map +1 -0
- package/dist/avm1/clips.js +335 -0
- package/dist/avm1/clips.js.map +1 -0
- package/dist/avm1/control.d.ts +54 -0
- package/dist/avm1/control.d.ts.map +1 -0
- package/dist/avm1/control.js +281 -0
- package/dist/avm1/control.js.map +1 -0
- package/dist/avm1/errors.d.ts +49 -0
- package/dist/avm1/errors.d.ts.map +1 -0
- package/dist/avm1/errors.js +51 -0
- package/dist/avm1/errors.js.map +1 -0
- package/dist/avm1/functions.d.ts +94 -0
- package/dist/avm1/functions.d.ts.map +1 -0
- package/dist/avm1/functions.js +250 -0
- package/dist/avm1/functions.js.map +1 -0
- package/dist/avm1/globals/array.d.ts +8 -0
- package/dist/avm1/globals/array.d.ts.map +1 -0
- package/dist/avm1/globals/array.js +550 -0
- package/dist/avm1/globals/array.js.map +1 -0
- package/dist/avm1/globals/broadcaster.d.ts +22 -0
- package/dist/avm1/globals/broadcaster.d.ts.map +1 -0
- package/dist/avm1/globals/broadcaster.js +132 -0
- package/dist/avm1/globals/broadcaster.js.map +1 -0
- package/dist/avm1/globals/date.d.ts +10 -0
- package/dist/avm1/globals/date.d.ts.map +1 -0
- package/dist/avm1/globals/date.js +437 -0
- package/dist/avm1/globals/date.js.map +1 -0
- package/dist/avm1/globals/global.d.ts +23 -0
- package/dist/avm1/globals/global.d.ts.map +1 -0
- package/dist/avm1/globals/global.js +345 -0
- package/dist/avm1/globals/global.js.map +1 -0
- package/dist/avm1/globals/math.d.ts +7 -0
- package/dist/avm1/globals/math.d.ts.map +1 -0
- package/dist/avm1/globals/math.js +140 -0
- package/dist/avm1/globals/math.js.map +1 -0
- package/dist/avm1/globals/number.d.ts +11 -0
- package/dist/avm1/globals/number.d.ts.map +1 -0
- package/dist/avm1/globals/number.js +94 -0
- package/dist/avm1/globals/number.js.map +1 -0
- package/dist/avm1/globals/string.d.ts +8 -0
- package/dist/avm1/globals/string.d.ts.map +1 -0
- package/dist/avm1/globals/string.js +202 -0
- package/dist/avm1/globals/string.js.map +1 -0
- package/dist/avm1/globals/timers.d.ts +49 -0
- package/dist/avm1/globals/timers.d.ts.map +1 -0
- package/dist/avm1/globals/timers.js +130 -0
- package/dist/avm1/globals/timers.js.map +1 -0
- package/dist/avm1/host.d.ts +146 -0
- package/dist/avm1/host.d.ts.map +1 -0
- package/dist/avm1/host.js +6 -0
- package/dist/avm1/host.js.map +1 -0
- package/dist/avm1/index.d.ts +15 -0
- package/dist/avm1/index.d.ts.map +1 -0
- package/dist/avm1/index.js +15 -0
- package/dist/avm1/index.js.map +1 -0
- package/dist/avm1/inheritance.d.ts +25 -0
- package/dist/avm1/inheritance.d.ts.map +1 -0
- package/dist/avm1/inheritance.js +133 -0
- package/dist/avm1/inheritance.js.map +1 -0
- package/dist/avm1/numbers.d.ts +21 -0
- package/dist/avm1/numbers.d.ts.map +1 -0
- package/dist/avm1/numbers.js +299 -0
- package/dist/avm1/numbers.js.map +1 -0
- package/dist/avm1/objects.d.ts +245 -0
- package/dist/avm1/objects.d.ts.map +1 -0
- package/dist/avm1/objects.js +897 -0
- package/dist/avm1/objects.js.map +1 -0
- package/dist/avm1/operators.d.ts +45 -0
- package/dist/avm1/operators.d.ts.map +1 -0
- package/dist/avm1/operators.js +171 -0
- package/dist/avm1/operators.js.map +1 -0
- package/dist/avm1/realm.d.ts +126 -0
- package/dist/avm1/realm.d.ts.map +1 -0
- package/dist/avm1/realm.js +530 -0
- package/dist/avm1/realm.js.map +1 -0
- package/dist/avm1/runtime.d.ts +294 -0
- package/dist/avm1/runtime.d.ts.map +1 -0
- package/dist/avm1/runtime.js +883 -0
- package/dist/avm1/runtime.js.map +1 -0
- package/dist/avm1/scope.d.ts +77 -0
- package/dist/avm1/scope.d.ts.map +1 -0
- package/dist/avm1/scope.js +386 -0
- package/dist/avm1/scope.js.map +1 -0
- package/dist/avm1/urls.d.ts +25 -0
- package/dist/avm1/urls.d.ts.map +1 -0
- package/dist/avm1/urls.js +181 -0
- package/dist/avm1/urls.js.map +1 -0
- package/dist/avm1/values.d.ts +52 -0
- package/dist/avm1/values.d.ts.map +1 -0
- package/dist/avm1/values.js +98 -0
- package/dist/avm1/values.js.map +1 -0
- package/dist/avm2/amf-classes.d.ts +28 -0
- package/dist/avm2/amf-classes.d.ts.map +1 -0
- package/dist/avm2/amf-classes.js +67 -0
- package/dist/avm2/amf-classes.js.map +1 -0
- package/dist/avm2/amf.d.ts +96 -0
- package/dist/avm2/amf.d.ts.map +1 -0
- package/dist/avm2/amf.js +802 -0
- package/dist/avm2/amf.js.map +1 -0
- package/dist/avm2/array-conversion.d.ts +31 -0
- package/dist/avm2/array-conversion.d.ts.map +1 -0
- package/dist/avm2/array-conversion.js +101 -0
- package/dist/avm2/array-conversion.js.map +1 -0
- package/dist/avm2/builtin-library.d.ts +2 -0
- package/dist/avm2/builtin-library.d.ts.map +1 -0
- package/dist/avm2/builtin-library.js +22 -0
- package/dist/avm2/builtin-library.js.map +1 -0
- package/dist/avm2/cache-fill.d.ts +14 -0
- package/dist/avm2/cache-fill.d.ts.map +1 -0
- package/dist/avm2/cache-fill.js +87 -0
- package/dist/avm2/cache-fill.js.map +1 -0
- package/dist/avm2/classes.d.ts +17 -0
- package/dist/avm2/classes.d.ts.map +1 -0
- package/dist/avm2/classes.js +212 -0
- package/dist/avm2/classes.js.map +1 -0
- package/dist/avm2/definitions.d.ts +28 -0
- package/dist/avm2/definitions.d.ts.map +1 -0
- package/dist/avm2/definitions.js +70 -0
- package/dist/avm2/definitions.js.map +1 -0
- package/dist/avm2/descriptors.d.ts +118 -0
- package/dist/avm2/descriptors.d.ts.map +1 -0
- package/dist/avm2/descriptors.js +6 -0
- package/dist/avm2/descriptors.js.map +1 -0
- package/dist/avm2/dictionary-keys.d.ts +73 -0
- package/dist/avm2/dictionary-keys.d.ts.map +1 -0
- package/dist/avm2/dictionary-keys.js +296 -0
- package/dist/avm2/dictionary-keys.js.map +1 -0
- package/dist/avm2/domain-memory.d.ts +23 -0
- package/dist/avm2/domain-memory.d.ts.map +1 -0
- package/dist/avm2/domain-memory.js +76 -0
- package/dist/avm2/domain-memory.js.map +1 -0
- package/dist/avm2/domain.d.ts +108 -0
- package/dist/avm2/domain.d.ts.map +1 -0
- package/dist/avm2/domain.js +281 -0
- package/dist/avm2/domain.js.map +1 -0
- package/dist/avm2/dynamic-properties.d.ts +62 -0
- package/dist/avm2/dynamic-properties.d.ts.map +1 -0
- package/dist/avm2/dynamic-properties.js +183 -0
- package/dist/avm2/dynamic-properties.js.map +1 -0
- package/dist/avm2/enumeration.d.ts +75 -0
- package/dist/avm2/enumeration.d.ts.map +1 -0
- package/dist/avm2/enumeration.js +394 -0
- package/dist/avm2/enumeration.js.map +1 -0
- package/dist/avm2/errors.d.ts +20 -0
- package/dist/avm2/errors.d.ts.map +1 -0
- package/dist/avm2/errors.js +46 -0
- package/dist/avm2/errors.js.map +1 -0
- package/dist/avm2/float-library.d.ts +2 -0
- package/dist/avm2/float-library.d.ts.map +1 -0
- package/dist/avm2/float-library.js +67 -0
- package/dist/avm2/float-library.js.map +1 -0
- package/dist/avm2/float.d.ts +9 -0
- package/dist/avm2/float.d.ts.map +1 -0
- package/dist/avm2/float.js +27 -0
- package/dist/avm2/float.js.map +1 -0
- package/dist/avm2/hooks.d.ts +77 -0
- package/dist/avm2/hooks.d.ts.map +1 -0
- package/dist/avm2/hooks.js +20 -0
- package/dist/avm2/hooks.js.map +1 -0
- package/dist/avm2/index.d.ts +32 -0
- package/dist/avm2/index.d.ts.map +1 -0
- package/dist/avm2/index.js +39 -0
- package/dist/avm2/index.js.map +1 -0
- package/dist/avm2/messages.d.ts +2 -0
- package/dist/avm2/messages.d.ts.map +1 -0
- package/dist/avm2/messages.js +178 -0
- package/dist/avm2/messages.js.map +1 -0
- package/dist/avm2/method-factories.d.ts +35 -0
- package/dist/avm2/method-factories.d.ts.map +1 -0
- package/dist/avm2/method-factories.js +96 -0
- package/dist/avm2/method-factories.js.map +1 -0
- package/dist/avm2/modules.d.ts +40 -0
- package/dist/avm2/modules.d.ts.map +1 -0
- package/dist/avm2/modules.js +106 -0
- package/dist/avm2/modules.js.map +1 -0
- package/dist/avm2/names.d.ts +143 -0
- package/dist/avm2/names.d.ts.map +1 -0
- package/dist/avm2/names.js +249 -0
- package/dist/avm2/names.js.map +1 -0
- package/dist/avm2/natives/aliases.d.ts +3 -0
- package/dist/avm2/natives/aliases.d.ts.map +1 -0
- package/dist/avm2/natives/aliases.js +48 -0
- package/dist/avm2/natives/aliases.js.map +1 -0
- package/dist/avm2/natives/array.d.ts +5 -0
- package/dist/avm2/natives/array.d.ts.map +1 -0
- package/dist/avm2/natives/array.js +391 -0
- package/dist/avm2/natives/array.js.map +1 -0
- package/dist/avm2/natives/bytearray.d.ts +180 -0
- package/dist/avm2/natives/bytearray.d.ts.map +1 -0
- package/dist/avm2/natives/bytearray.js +1228 -0
- package/dist/avm2/natives/bytearray.js.map +1 -0
- package/dist/avm2/natives/case.d.ts +5 -0
- package/dist/avm2/natives/case.d.ts.map +1 -0
- package/dist/avm2/natives/case.js +89 -0
- package/dist/avm2/natives/case.js.map +1 -0
- package/dist/avm2/natives/concurrent.d.ts +24 -0
- package/dist/avm2/natives/concurrent.d.ts.map +1 -0
- package/dist/avm2/natives/concurrent.js +200 -0
- package/dist/avm2/natives/concurrent.js.map +1 -0
- package/dist/avm2/natives/date.d.ts +5 -0
- package/dist/avm2/natives/date.d.ts.map +1 -0
- package/dist/avm2/natives/date.js +582 -0
- package/dist/avm2/natives/date.js.map +1 -0
- package/dist/avm2/natives/define.d.ts +58 -0
- package/dist/avm2/natives/define.d.ts.map +1 -0
- package/dist/avm2/natives/define.js +131 -0
- package/dist/avm2/natives/define.js.map +1 -0
- package/dist/avm2/natives/describe.d.ts +3 -0
- package/dist/avm2/natives/describe.d.ts.map +1 -0
- package/dist/avm2/natives/describe.js +352 -0
- package/dist/avm2/natives/describe.js.map +1 -0
- package/dist/avm2/natives/dictionary.d.ts +3 -0
- package/dist/avm2/natives/dictionary.d.ts.map +1 -0
- package/dist/avm2/natives/dictionary.js +13 -0
- package/dist/avm2/natives/dictionary.js.map +1 -0
- package/dist/avm2/natives/float-vector.d.ts +20 -0
- package/dist/avm2/natives/float-vector.d.ts.map +1 -0
- package/dist/avm2/natives/float-vector.js +82 -0
- package/dist/avm2/natives/float-vector.js.map +1 -0
- package/dist/avm2/natives/float.d.ts +5 -0
- package/dist/avm2/natives/float.d.ts.map +1 -0
- package/dist/avm2/natives/float.js +97 -0
- package/dist/avm2/natives/float.js.map +1 -0
- package/dist/avm2/natives/index.d.ts +7 -0
- package/dist/avm2/natives/index.d.ts.map +1 -0
- package/dist/avm2/natives/index.js +65 -0
- package/dist/avm2/natives/index.js.map +1 -0
- package/dist/avm2/natives/json.d.ts +3 -0
- package/dist/avm2/natives/json.d.ts.map +1 -0
- package/dist/avm2/natives/json.js +515 -0
- package/dist/avm2/natives/json.js.map +1 -0
- package/dist/avm2/natives/number.d.ts +15 -0
- package/dist/avm2/natives/number.d.ts.map +1 -0
- package/dist/avm2/natives/number.js +163 -0
- package/dist/avm2/natives/number.js.map +1 -0
- package/dist/avm2/natives/object.d.ts +8 -0
- package/dist/avm2/natives/object.d.ts.map +1 -0
- package/dist/avm2/natives/object.js +238 -0
- package/dist/avm2/natives/object.js.map +1 -0
- package/dist/avm2/natives/proxy.d.ts +5 -0
- package/dist/avm2/natives/proxy.d.ts.map +1 -0
- package/dist/avm2/natives/proxy.js +76 -0
- package/dist/avm2/natives/proxy.js.map +1 -0
- package/dist/avm2/natives/regexp.d.ts +21 -0
- package/dist/avm2/natives/regexp.d.ts.map +1 -0
- package/dist/avm2/natives/regexp.js +486 -0
- package/dist/avm2/natives/regexp.js.map +1 -0
- package/dist/avm2/natives/shell-workers.d.ts +140 -0
- package/dist/avm2/natives/shell-workers.d.ts.map +1 -0
- package/dist/avm2/natives/shell-workers.js +405 -0
- package/dist/avm2/natives/shell-workers.js.map +1 -0
- package/dist/avm2/natives/shell.d.ts +12 -0
- package/dist/avm2/natives/shell.d.ts.map +1 -0
- package/dist/avm2/natives/shell.js +558 -0
- package/dist/avm2/natives/shell.js.map +1 -0
- package/dist/avm2/natives/sort.d.ts +7 -0
- package/dist/avm2/natives/sort.d.ts.map +1 -0
- package/dist/avm2/natives/sort.js +378 -0
- package/dist/avm2/natives/sort.js.map +1 -0
- package/dist/avm2/natives/string.d.ts +5 -0
- package/dist/avm2/natives/string.d.ts.map +1 -0
- package/dist/avm2/natives/string.js +133 -0
- package/dist/avm2/natives/string.js.map +1 -0
- package/dist/avm2/natives/sync.d.ts +215 -0
- package/dist/avm2/natives/sync.d.ts.map +1 -0
- package/dist/avm2/natives/sync.js +822 -0
- package/dist/avm2/natives/sync.js.map +1 -0
- package/dist/avm2/natives/toplevel.d.ts +5 -0
- package/dist/avm2/natives/toplevel.d.ts.map +1 -0
- package/dist/avm2/natives/toplevel.js +140 -0
- package/dist/avm2/natives/toplevel.js.map +1 -0
- package/dist/avm2/natives/vector-elements.d.ts +10 -0
- package/dist/avm2/natives/vector-elements.d.ts.map +1 -0
- package/dist/avm2/natives/vector-elements.js +47 -0
- package/dist/avm2/natives/vector-elements.js.map +1 -0
- package/dist/avm2/natives/vector.d.ts +5 -0
- package/dist/avm2/natives/vector.d.ts.map +1 -0
- package/dist/avm2/natives/vector.js +407 -0
- package/dist/avm2/natives/vector.js.map +1 -0
- package/dist/avm2/natives/xml/access.d.ts +34 -0
- package/dist/avm2/natives/xml/access.d.ts.map +1 -0
- package/dist/avm2/natives/xml/access.js +634 -0
- package/dist/avm2/natives/xml/access.js.map +1 -0
- package/dist/avm2/natives/xml/build.d.ts +11 -0
- package/dist/avm2/natives/xml/build.d.ts.map +1 -0
- package/dist/avm2/natives/xml/build.js +292 -0
- package/dist/avm2/natives/xml/build.js.map +1 -0
- package/dist/avm2/natives/xml/chars.d.ts +9 -0
- package/dist/avm2/natives/xml/chars.d.ts.map +1 -0
- package/dist/avm2/natives/xml/chars.js +113 -0
- package/dist/avm2/natives/xml/chars.js.map +1 -0
- package/dist/avm2/natives/xml/escape.d.ts +5 -0
- package/dist/avm2/natives/xml/escape.d.ts.map +1 -0
- package/dist/avm2/natives/xml/escape.js +39 -0
- package/dist/avm2/natives/xml/escape.js.map +1 -0
- package/dist/avm2/natives/xml/names.d.ts +46 -0
- package/dist/avm2/natives/xml/names.d.ts.map +1 -0
- package/dist/avm2/natives/xml/names.js +205 -0
- package/dist/avm2/natives/xml/names.js.map +1 -0
- package/dist/avm2/natives/xml/node.d.ts +94 -0
- package/dist/avm2/natives/xml/node.d.ts.map +1 -0
- package/dist/avm2/natives/xml/node.js +273 -0
- package/dist/avm2/natives/xml/node.js.map +1 -0
- package/dist/avm2/natives/xml/operators.d.ts +7 -0
- package/dist/avm2/natives/xml/operators.d.ts.map +1 -0
- package/dist/avm2/natives/xml/operators.js +70 -0
- package/dist/avm2/natives/xml/operators.js.map +1 -0
- package/dist/avm2/natives/xml/parser.d.ts +51 -0
- package/dist/avm2/natives/xml/parser.d.ts.map +1 -0
- package/dist/avm2/natives/xml/parser.js +357 -0
- package/dist/avm2/natives/xml/parser.js.map +1 -0
- package/dist/avm2/natives/xml/strings.d.ts +10 -0
- package/dist/avm2/natives/xml/strings.d.ts.map +1 -0
- package/dist/avm2/natives/xml/strings.js +192 -0
- package/dist/avm2/natives/xml/strings.js.map +1 -0
- package/dist/avm2/natives/xml/values.d.ts +48 -0
- package/dist/avm2/natives/xml/values.d.ts.map +1 -0
- package/dist/avm2/natives/xml/values.js +123 -0
- package/dist/avm2/natives/xml/values.js.map +1 -0
- package/dist/avm2/natives/xml/xml.d.ts +5 -0
- package/dist/avm2/natives/xml/xml.d.ts.map +1 -0
- package/dist/avm2/natives/xml/xml.js +646 -0
- package/dist/avm2/natives/xml/xml.js.map +1 -0
- package/dist/avm2/number-strings.d.ts +28 -0
- package/dist/avm2/number-strings.d.ts.map +1 -0
- package/dist/avm2/number-strings.js +111 -0
- package/dist/avm2/number-strings.js.map +1 -0
- package/dist/avm2/numbers.d.ts +12 -0
- package/dist/avm2/numbers.d.ts.map +1 -0
- package/dist/avm2/numbers.js +559 -0
- package/dist/avm2/numbers.js.map +1 -0
- package/dist/avm2/options.d.ts +105 -0
- package/dist/avm2/options.d.ts.map +1 -0
- package/dist/avm2/options.js +17 -0
- package/dist/avm2/options.js.map +1 -0
- package/dist/avm2/player-messages.d.ts +3 -0
- package/dist/avm2/player-messages.d.ts.map +1 -0
- package/dist/avm2/player-messages.js +551 -0
- package/dist/avm2/player-messages.js.map +1 -0
- package/dist/avm2/property-cache.d.ts +61 -0
- package/dist/avm2/property-cache.d.ts.map +1 -0
- package/dist/avm2/property-cache.js +136 -0
- package/dist/avm2/property-cache.js.map +1 -0
- package/dist/avm2/runtime.d.ts +588 -0
- package/dist/avm2/runtime.d.ts.map +1 -0
- package/dist/avm2/runtime.js +2645 -0
- package/dist/avm2/runtime.js.map +1 -0
- package/dist/avm2/traits.d.ts +233 -0
- package/dist/avm2/traits.d.ts.map +1 -0
- package/dist/avm2/traits.js +510 -0
- package/dist/avm2/traits.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -3
- package/src/avm1/activation.ts +114 -0
- package/src/avm1/case.ts +257 -0
- package/src/avm1/clips.ts +440 -0
- package/src/avm1/control.ts +339 -0
- package/src/avm1/errors.ts +60 -0
- package/src/avm1/functions.ts +271 -0
- package/src/avm1/globals/array.ts +676 -0
- package/src/avm1/globals/broadcaster.ts +185 -0
- package/src/avm1/globals/date.ts +548 -0
- package/src/avm1/globals/global.ts +420 -0
- package/src/avm1/globals/math.ts +152 -0
- package/src/avm1/globals/number.ts +122 -0
- package/src/avm1/globals/string.ts +254 -0
- package/src/avm1/globals/timers.ts +144 -0
- package/src/avm1/host.ts +155 -0
- package/src/avm1/index.ts +69 -0
- package/src/avm1/inheritance.ts +159 -0
- package/src/avm1/numbers.ts +348 -0
- package/src/avm1/objects.ts +1080 -0
- package/src/avm1/operators.ts +229 -0
- package/src/avm1/realm.ts +704 -0
- package/src/avm1/runtime.ts +1291 -0
- package/src/avm1/scope.ts +482 -0
- package/src/avm1/urls.ts +226 -0
- package/src/avm1/values.ts +145 -0
- package/src/avm2/amf-classes.ts +80 -0
- package/src/avm2/amf.ts +913 -0
- package/src/avm2/array-conversion.ts +117 -0
- package/src/avm2/builtin-library.ts +28 -0
- package/src/avm2/cache-fill.ts +124 -0
- package/src/avm2/classes.ts +235 -0
- package/src/avm2/definitions.ts +93 -0
- package/src/avm2/descriptors.ts +137 -0
- package/src/avm2/dictionary-keys.ts +345 -0
- package/src/avm2/domain-memory.ts +95 -0
- package/src/avm2/domain.ts +335 -0
- package/src/avm2/dynamic-properties.ts +209 -0
- package/src/avm2/enumeration.ts +506 -0
- package/src/avm2/errors.ts +54 -0
- package/src/avm2/float-library.ts +66 -0
- package/src/avm2/float.ts +31 -0
- package/src/avm2/hooks.ts +97 -0
- package/src/avm2/index.ts +84 -0
- package/src/avm2/messages.ts +178 -0
- package/src/avm2/method-factories.ts +130 -0
- package/src/avm2/modules.ts +120 -0
- package/src/avm2/names.ts +292 -0
- package/src/avm2/natives/aliases.ts +59 -0
- package/src/avm2/natives/array.ts +482 -0
- package/src/avm2/natives/bytearray.ts +1474 -0
- package/src/avm2/natives/case.ts +98 -0
- package/src/avm2/natives/concurrent.ts +268 -0
- package/src/avm2/natives/date.ts +678 -0
- package/src/avm2/natives/define.ts +176 -0
- package/src/avm2/natives/describe.ts +426 -0
- package/src/avm2/natives/dictionary.ts +18 -0
- package/src/avm2/natives/float-vector.ts +99 -0
- package/src/avm2/natives/float.ts +116 -0
- package/src/avm2/natives/index.ts +70 -0
- package/src/avm2/natives/json.ts +600 -0
- package/src/avm2/natives/number.ts +194 -0
- package/src/avm2/natives/object.ts +272 -0
- package/src/avm2/natives/proxy.ts +98 -0
- package/src/avm2/natives/regexp.ts +580 -0
- package/src/avm2/natives/shell-workers.ts +474 -0
- package/src/avm2/natives/shell.ts +707 -0
- package/src/avm2/natives/sort.ts +438 -0
- package/src/avm2/natives/string.ts +158 -0
- package/src/avm2/natives/sync.ts +964 -0
- package/src/avm2/natives/toplevel.ts +163 -0
- package/src/avm2/natives/vector-elements.ts +61 -0
- package/src/avm2/natives/vector.ts +511 -0
- package/src/avm2/natives/xml/access.ts +767 -0
- package/src/avm2/natives/xml/build.ts +381 -0
- package/src/avm2/natives/xml/chars.ts +127 -0
- package/src/avm2/natives/xml/escape.ts +46 -0
- package/src/avm2/natives/xml/names.ts +256 -0
- package/src/avm2/natives/xml/node.ts +339 -0
- package/src/avm2/natives/xml/operators.ts +90 -0
- package/src/avm2/natives/xml/parser.ts +414 -0
- package/src/avm2/natives/xml/strings.ts +241 -0
- package/src/avm2/natives/xml/values.ts +162 -0
- package/src/avm2/natives/xml/xml.ts +829 -0
- package/src/avm2/number-strings.ts +127 -0
- package/src/avm2/numbers.ts +605 -0
- package/src/avm2/options.ts +125 -0
- package/src/avm2/player-messages.ts +552 -0
- package/src/avm2/property-cache.ts +160 -0
- package/src/avm2/runtime.ts +3274 -0
- package/src/avm2/traits.ts +584 -0
- package/src/index.ts +8 -0
|
@@ -0,0 +1,600 @@
|
|
|
1
|
+
import { FloatValue } from "../float.js";
|
|
2
|
+
import { FloatVector } from "./float-vector.js";
|
|
3
|
+
// JSON's natives, as avmplus' JSONParser and JSONSerializer: the parser's
|
|
4
|
+
// tokens and SyntaxError 1132, and stringify's toJSON (public only: see
|
|
5
|
+
// toJSONOf), replacers, gaps, numbers as the host writes them, and a
|
|
6
|
+
// class instance's public variables and readable accessors before its
|
|
7
|
+
// dynamic properties, leaving out [Transient] ones.
|
|
8
|
+
//
|
|
9
|
+
// Translated from avmplus' core/JSONClass.cpp, this file is subject to the
|
|
10
|
+
// Mozilla Public License, v. 2.0: http://mozilla.org/MPL/2.0/.
|
|
11
|
+
|
|
12
|
+
import type { AsObject, Value } from "../descriptors.js";
|
|
13
|
+
import { NS_Public, publicQname } from "../names.js";
|
|
14
|
+
import type { Runtime } from "../runtime.js";
|
|
15
|
+
import type { Traits } from "../traits.js";
|
|
16
|
+
import type { Natives } from "./define.js";
|
|
17
|
+
|
|
18
|
+
/** Whether each traits binds a public toJSON, found once. */
|
|
19
|
+
const boundToJSON = new WeakMap<Traits, boolean>();
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* As JSONParser, through the host's JSON.parse, then its values made AS3's
|
|
23
|
+
* in place. The text the host rejects goes to parse(): avmplus reads some
|
|
24
|
+
* of it (numbers with leading zeros, as 01), and fails the rest as
|
|
25
|
+
* SyntaxError 1132.
|
|
26
|
+
*/
|
|
27
|
+
function parseText(rt: Runtime, text: string): Value {
|
|
28
|
+
let tree: unknown;
|
|
29
|
+
try {
|
|
30
|
+
tree = JSON.parse(text);
|
|
31
|
+
} catch {
|
|
32
|
+
return parse(rt, text);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return fromHost(rt, tree);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** How deep fromHost recurses before it continues with a stack of its own. */
|
|
39
|
+
const RECURSION_DEPTH = 500;
|
|
40
|
+
const LITERALS = ["null", "true", "false"];
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* A value of the host's JSON.parse as AS3's: an array as an Array holding
|
|
44
|
+
* it, its elements made AS3's in place, and an object as an Object with its
|
|
45
|
+
* keys, each where a public name of a plain Object is set (JSON's
|
|
46
|
+
* `__proto__` is a key of the object's own). Deeper than RECURSION_DEPTH,
|
|
47
|
+
* as deepFromHost does, as avmplus reads any depth.
|
|
48
|
+
*/
|
|
49
|
+
function fromHost(rt: Runtime, v: unknown, depth = 0): Value {
|
|
50
|
+
if (typeof v !== "object" || v === null) {
|
|
51
|
+
return v;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (depth > RECURSION_DEPTH) {
|
|
55
|
+
return deepFromHost(rt, v);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (Array.isArray(v)) {
|
|
59
|
+
for (let i = 0; i < v.length; i++) {
|
|
60
|
+
v[i] = fromHost(rt, v[i], depth + 1);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return rt.array(v);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const o = rt.newObject([]);
|
|
67
|
+
const d: Map<string, Value> = o.$d;
|
|
68
|
+
const from = v as Record<string, unknown>;
|
|
69
|
+
for (const key in from) {
|
|
70
|
+
d.set(key, fromHost(rt, from[key], depth + 1));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return o;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** As fromHost, with a stack of its own, not the host's: slower, and at any depth. */
|
|
77
|
+
function deepFromHost(rt: Runtime, root: object): Value {
|
|
78
|
+
const pending: [unknown, AsObject][] = [];
|
|
79
|
+
const wrap = (v: unknown): Value => {
|
|
80
|
+
if (typeof v !== "object" || v === null) {
|
|
81
|
+
return v;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const o = Array.isArray(v) ? rt.array(v) : rt.newObject([]);
|
|
85
|
+
pending.push([v, o]);
|
|
86
|
+
return o;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const result = wrap(root);
|
|
90
|
+
for (let next = pending.pop(); next; next = pending.pop()) {
|
|
91
|
+
const [host, o] = next;
|
|
92
|
+
if (Array.isArray(host)) {
|
|
93
|
+
for (let i = 0; i < host.length; i++) {
|
|
94
|
+
host[i] = wrap(host[i]);
|
|
95
|
+
}
|
|
96
|
+
} else {
|
|
97
|
+
const d: Map<string, Value> = o.$d;
|
|
98
|
+
const from = host as Record<string, unknown>;
|
|
99
|
+
for (const key in from) {
|
|
100
|
+
d.set(key, wrap(from[key]));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** As JSONParser: the JSON text to a value, or SyntaxError 1132. */
|
|
109
|
+
function parse(rt: Runtime, text: string): Value {
|
|
110
|
+
let i = 0;
|
|
111
|
+
let token = "";
|
|
112
|
+
// The current token, read through a function: advance() changes it.
|
|
113
|
+
const current = (): string => token;
|
|
114
|
+
let value: Value;
|
|
115
|
+
const fail = (): never => {
|
|
116
|
+
throw rt.error("SyntaxError", 1132);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const digits = () => {
|
|
120
|
+
const start = i;
|
|
121
|
+
while (i < text.length && text.charCodeAt(i) >= 48 && text.charCodeAt(i) <= 57) {
|
|
122
|
+
i++;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (i <= start) {
|
|
126
|
+
fail();
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const advance = () => {
|
|
131
|
+
token = "";
|
|
132
|
+
while (i < text.length) {
|
|
133
|
+
const c = text[i];
|
|
134
|
+
switch (c) {
|
|
135
|
+
case "\t":
|
|
136
|
+
case "\n":
|
|
137
|
+
case "\r":
|
|
138
|
+
case " ":
|
|
139
|
+
i++;
|
|
140
|
+
continue;
|
|
141
|
+
case ",":
|
|
142
|
+
case ":":
|
|
143
|
+
case "{":
|
|
144
|
+
case "}":
|
|
145
|
+
case "[":
|
|
146
|
+
case "]":
|
|
147
|
+
i++;
|
|
148
|
+
token = c;
|
|
149
|
+
return;
|
|
150
|
+
case '"': {
|
|
151
|
+
i++;
|
|
152
|
+
let s = "";
|
|
153
|
+
let start = i;
|
|
154
|
+
while (i < text.length) {
|
|
155
|
+
const code = text.charCodeAt(i);
|
|
156
|
+
if (code < 32) {
|
|
157
|
+
fail();
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (code === 34) {
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (code === 92) {
|
|
165
|
+
s += text.slice(start, i);
|
|
166
|
+
i++;
|
|
167
|
+
if (i === text.length) {
|
|
168
|
+
fail();
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const e = text[i];
|
|
172
|
+
const simple: Record<string, string> = {
|
|
173
|
+
'"': '"',
|
|
174
|
+
"/": "/",
|
|
175
|
+
"\\": "\\",
|
|
176
|
+
b: "\b",
|
|
177
|
+
f: "\f",
|
|
178
|
+
n: "\n",
|
|
179
|
+
r: "\r",
|
|
180
|
+
t: "\t",
|
|
181
|
+
};
|
|
182
|
+
if (e in simple) {
|
|
183
|
+
s += simple[e];
|
|
184
|
+
} else if (e === "u") {
|
|
185
|
+
const hex = text.slice(i + 1, i + 5);
|
|
186
|
+
if (!/^[0-9a-fA-F]{4}$/.test(hex)) {
|
|
187
|
+
fail();
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
s += String.fromCharCode(Number.parseInt(hex, 16));
|
|
191
|
+
i += 4;
|
|
192
|
+
} else {
|
|
193
|
+
fail();
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
i++;
|
|
197
|
+
start = i;
|
|
198
|
+
} else {
|
|
199
|
+
i++;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (i === text.length) {
|
|
204
|
+
fail();
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
value = s + text.slice(start, i);
|
|
208
|
+
i++;
|
|
209
|
+
token = '"';
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
case "-":
|
|
213
|
+
case ".":
|
|
214
|
+
case "0":
|
|
215
|
+
case "1":
|
|
216
|
+
case "2":
|
|
217
|
+
case "3":
|
|
218
|
+
case "4":
|
|
219
|
+
case "5":
|
|
220
|
+
case "6":
|
|
221
|
+
case "7":
|
|
222
|
+
case "8":
|
|
223
|
+
case "9": {
|
|
224
|
+
const start = i;
|
|
225
|
+
if (text[i] === "-") {
|
|
226
|
+
i++;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
digits();
|
|
230
|
+
if (text[i] === ".") {
|
|
231
|
+
i++;
|
|
232
|
+
digits();
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
if (text[i] === "e" || text[i] === "E") {
|
|
236
|
+
i++;
|
|
237
|
+
if (text[i] === "-" || text[i] === "+") {
|
|
238
|
+
i++;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
digits();
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
value = text.slice(start, i);
|
|
245
|
+
token = "0";
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
default:
|
|
249
|
+
for (const word of LITERALS) {
|
|
250
|
+
if (text.startsWith(word, i)) {
|
|
251
|
+
i += word.length;
|
|
252
|
+
token = word[0];
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
fail();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
const parseValue = (): Value => {
|
|
263
|
+
switch (current()) {
|
|
264
|
+
case "n":
|
|
265
|
+
advance();
|
|
266
|
+
return null;
|
|
267
|
+
case "t":
|
|
268
|
+
advance();
|
|
269
|
+
return true;
|
|
270
|
+
case "f":
|
|
271
|
+
advance();
|
|
272
|
+
return false;
|
|
273
|
+
case '"': {
|
|
274
|
+
const s = value;
|
|
275
|
+
advance();
|
|
276
|
+
return s;
|
|
277
|
+
}
|
|
278
|
+
case "0": {
|
|
279
|
+
const n = Number(value);
|
|
280
|
+
advance();
|
|
281
|
+
return n;
|
|
282
|
+
}
|
|
283
|
+
case "[": {
|
|
284
|
+
advance();
|
|
285
|
+
const a: Value[] = [];
|
|
286
|
+
if (current() !== "]") {
|
|
287
|
+
for (;;) {
|
|
288
|
+
a.push(parseValue());
|
|
289
|
+
if (current() !== ",") {
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
advance();
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
if (current() !== "]") {
|
|
298
|
+
fail();
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
advance();
|
|
302
|
+
return rt.array(a);
|
|
303
|
+
}
|
|
304
|
+
case "{": {
|
|
305
|
+
advance();
|
|
306
|
+
const o = rt.newObject([]);
|
|
307
|
+
if (current() !== "}") {
|
|
308
|
+
for (;;) {
|
|
309
|
+
if (current() !== '"') {
|
|
310
|
+
fail();
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const name = parseValue();
|
|
314
|
+
if (current() !== ":") {
|
|
315
|
+
fail();
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
advance();
|
|
319
|
+
rt.setProperty(o, publicQname(name, rt.userVersions), parseValue());
|
|
320
|
+
if (current() !== ",") {
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
advance();
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
if (current() !== "}") {
|
|
329
|
+
fail();
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
advance();
|
|
333
|
+
return o;
|
|
334
|
+
}
|
|
335
|
+
default:
|
|
336
|
+
return fail();
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
advance();
|
|
341
|
+
const result = parseValue();
|
|
342
|
+
if (current() !== "") {
|
|
343
|
+
fail();
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
return result;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/** A class instance's public variables and readable accessors but [Transient] ones, the class's own first, as TypeDescriber lists them. */
|
|
350
|
+
function describedNames(traits: Traits, apiVersion: number): [string[], string[]] {
|
|
351
|
+
const variables: string[] = [];
|
|
352
|
+
const accessors: string[] = [];
|
|
353
|
+
for (let t: Traits | null = traits; t && t.name !== "Object"; t = t.base) {
|
|
354
|
+
for (const [name, list] of t.bindings) {
|
|
355
|
+
for (const b of list) {
|
|
356
|
+
// A member of a later version, AIR-only or VM-internal, is not the code's to see.
|
|
357
|
+
if (
|
|
358
|
+
b.ns.kind !== NS_Public ||
|
|
359
|
+
b.ns.uri !== "" ||
|
|
360
|
+
b.version > apiVersion ||
|
|
361
|
+
traits.isTransient(b.value)
|
|
362
|
+
) {
|
|
363
|
+
continue;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
const kind = b.value & 7;
|
|
367
|
+
if (kind === 2 || kind === 3) {
|
|
368
|
+
variables.push(name);
|
|
369
|
+
} else if (kind === 5 || kind === 7) {
|
|
370
|
+
accessors.push(name);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
return [variables, accessors];
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* As JSONSerializer, in two steps, as Ruffle's does: the walk over the AS3
|
|
381
|
+
* values, calling toJSON and the replacer in avmplus' order and failing a
|
|
382
|
+
* cycle as it does, builds a tree of the host's values, which the host's
|
|
383
|
+
* JSON.stringify writes, gap and all. The text need not be avmplus' own:
|
|
384
|
+
* key order, escapes and numbers' digits differ, and it reads back as the
|
|
385
|
+
* same keys and values.
|
|
386
|
+
*/
|
|
387
|
+
class Serializer {
|
|
388
|
+
private readonly active = new Set<AsObject>();
|
|
389
|
+
|
|
390
|
+
constructor(
|
|
391
|
+
private readonly rt: Runtime,
|
|
392
|
+
private readonly propertyList: string[] | null,
|
|
393
|
+
private readonly replacer: AsObject | null,
|
|
394
|
+
private readonly gap: string,
|
|
395
|
+
) {}
|
|
396
|
+
|
|
397
|
+
stringify(v: Value): Value {
|
|
398
|
+
const wrapper = this.rt.newObject([]);
|
|
399
|
+
wrapper.$d.set("", v);
|
|
400
|
+
const tree = this.str("", v, wrapper);
|
|
401
|
+
return tree === undefined ? undefined : JSON.stringify(tree, null, this.gap);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/**
|
|
405
|
+
* As StrFoundValue: the value to write for `valueIn`, the host's, or
|
|
406
|
+
* undefined for none. A number the host writes as null if it is not
|
|
407
|
+
* finite, as avmplus does.
|
|
408
|
+
*/
|
|
409
|
+
private str(key: string, valueIn: Value, holder: AsObject): unknown {
|
|
410
|
+
const rt = this.rt;
|
|
411
|
+
let value = valueIn;
|
|
412
|
+
if (value !== null && value !== undefined) {
|
|
413
|
+
const probe = this.toJSONOf(value);
|
|
414
|
+
if (probe?.$f) {
|
|
415
|
+
value = rt.callValue(probe, value, [key], null);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
if (this.replacer) {
|
|
420
|
+
value = rt.callValue(this.replacer, holder, [key, value], null);
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
if (value instanceof FloatValue) {
|
|
424
|
+
return value.value;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
switch (typeof value) {
|
|
428
|
+
case "boolean":
|
|
429
|
+
case "string":
|
|
430
|
+
case "number":
|
|
431
|
+
return value;
|
|
432
|
+
case "object":
|
|
433
|
+
break;
|
|
434
|
+
default:
|
|
435
|
+
return undefined;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
if (value === null) {
|
|
439
|
+
return null;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
if (value.$f) {
|
|
443
|
+
return undefined;
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
const traits: Traits = rt.traitsOf(value);
|
|
447
|
+
if (isA(traits, "Array") || isVector(traits)) {
|
|
448
|
+
return this.array(value);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
return this.object(value, traits);
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* As the probe of StrFoundValue: `value`'s toJSON, or null. A public
|
|
456
|
+
* binding first; else, as hasProperty finds a public name that is not an
|
|
457
|
+
* index, the object's own dynamic one and then its prototype chain's.
|
|
458
|
+
*
|
|
459
|
+
* avmplus probes the AS3 namespace before the public one, with the
|
|
460
|
+
* builtin's own AS3 namespace, which sees AS3 bindings only at the
|
|
461
|
+
* builtin's API version: no class of avmshell's binds an AS3 toJSON
|
|
462
|
+
* (theirs are its prototypes'), and a script's AS3 toJSON is never
|
|
463
|
+
* found, even when it has no public one. So only the public one is.
|
|
464
|
+
*/
|
|
465
|
+
private toJSONOf(value: Value): Value {
|
|
466
|
+
const rt = this.rt;
|
|
467
|
+
const traits = rt.traitsOf(value);
|
|
468
|
+
let bound = boundToJSON.get(traits);
|
|
469
|
+
if (bound === undefined) {
|
|
470
|
+
bound = traits.find(rt.toJSONName) !== 0;
|
|
471
|
+
boundToJSON.set(traits, bound);
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
if (bound) {
|
|
475
|
+
return rt.getProperty(value, rt.toJSONName);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
const own: Map<string, Value> | null | undefined =
|
|
479
|
+
typeof value === "object" ? value.$d : undefined;
|
|
480
|
+
if (own?.has("toJSON")) {
|
|
481
|
+
return own.get("toJSON");
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
for (let p = rt.protoOf(value); p; p = p.$p) {
|
|
485
|
+
if (p.$d?.has("toJSON")) {
|
|
486
|
+
return p.$d.get("toJSON");
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
return null;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
private enter(value: AsObject): void {
|
|
494
|
+
if (this.active.has(value)) {
|
|
495
|
+
throw this.rt.error("TypeError", 1129);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
this.active.add(value);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/** As JO: the property list, or the described properties and then the dynamic ones. */
|
|
502
|
+
private object(value: AsObject, traits: Traits): Record<string, unknown> {
|
|
503
|
+
const rt = this.rt;
|
|
504
|
+
this.enter(value);
|
|
505
|
+
const out: Record<string, unknown> = {};
|
|
506
|
+
const own: Map<string, Value> | null = value.$d;
|
|
507
|
+
const prop = (name: string) => {
|
|
508
|
+
// A dynamic property of its own is where getProperty would find it.
|
|
509
|
+
const v = own?.has(name)
|
|
510
|
+
? own.get(name)
|
|
511
|
+
: rt.getProperty(value, publicQname(name, rt.userVersions));
|
|
512
|
+
const written = this.str(name, v, value);
|
|
513
|
+
if (written === undefined) {
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
if (name === "__proto__") {
|
|
518
|
+
// Assigned, it would set the prototype, not the key.
|
|
519
|
+
Object.defineProperty(out, name, { value: written, enumerable: true, writable: true });
|
|
520
|
+
} else {
|
|
521
|
+
out[name] = written;
|
|
522
|
+
}
|
|
523
|
+
};
|
|
524
|
+
|
|
525
|
+
if (this.propertyList) {
|
|
526
|
+
for (const name of this.propertyList) {
|
|
527
|
+
prop(name);
|
|
528
|
+
}
|
|
529
|
+
} else {
|
|
530
|
+
const [variables, accessors] = describedNames(traits, rt.apiVersion);
|
|
531
|
+
for (const name of [...variables, ...accessors]) {
|
|
532
|
+
prop(name);
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
for (const name of rt.enumerableNames(value)) {
|
|
536
|
+
prop(name);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
this.active.delete(value);
|
|
541
|
+
return out;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/** As JAfinish: each element, null for one that writes nothing. */
|
|
545
|
+
private array(value: AsObject): unknown[] {
|
|
546
|
+
this.enter(value);
|
|
547
|
+
const length: number = value.$a.length;
|
|
548
|
+
const out = new Array<unknown>(length);
|
|
549
|
+
for (let i = 0; i < length; i++) {
|
|
550
|
+
// The elements as they are now: toJSON or the replacer may have
|
|
551
|
+
// changed them, or the Vector its storage. A hole, or an element
|
|
552
|
+
// since removed, is got as getUintProperty gets it: from the
|
|
553
|
+
// prototype chain, or a Vector's RangeError.
|
|
554
|
+
const elements: Value[] = value.$a;
|
|
555
|
+
const element =
|
|
556
|
+
!(elements instanceof FloatVector) && i in elements
|
|
557
|
+
? elements[i]
|
|
558
|
+
: this.rt.getProperty(value, this.rt.publicName(i));
|
|
559
|
+
const written = this.str(String(i), element, value);
|
|
560
|
+
out[i] = written === undefined ? null : written;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
this.active.delete(value);
|
|
564
|
+
return out;
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
function isVector(traits: Traits): boolean {
|
|
569
|
+
for (let t: Traits | null = traits; t; t = t.base) {
|
|
570
|
+
if (t.name.startsWith("__AS3__.vec::Vector$")) {
|
|
571
|
+
return true;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
return false;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
function isA(traits: Traits, name: string): boolean {
|
|
579
|
+
for (let t: Traits | null = traits; t; t = t.base) {
|
|
580
|
+
if (t.name === name) {
|
|
581
|
+
return true;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
return false;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
export function jsonNatives(): Natives {
|
|
589
|
+
return {
|
|
590
|
+
"JSON.JSON::parseCore": (rt) => (text: Value) => parseText(rt, rt.toString(text)),
|
|
591
|
+
"JSON.JSON::stringifySpecializedToString":
|
|
592
|
+
(rt) => (value: Value, propertyList: Value, replacer: Value, gap: Value) =>
|
|
593
|
+
new Serializer(
|
|
594
|
+
rt,
|
|
595
|
+
propertyList?.$a ? propertyList.$a.map((n: Value) => rt.toString(n)) : null,
|
|
596
|
+
replacer?.$f ? replacer : null,
|
|
597
|
+
gap === null || gap === undefined ? "" : rt.toString(gap),
|
|
598
|
+
).stringify(value),
|
|
599
|
+
};
|
|
600
|
+
}
|