From 72f2f5bf488ebddafcbfad162ab63af50d33dce9 Mon Sep 17 00:00:00 2001 From: Ed Lee Date: Tue, 15 Apr 2014 12:14:08 -0700 Subject: [PATCH 01/20] Bug 991111 - Middle clicks on tiles are not counted [r=adw] Move the click listener to the xul window to correctly get the click event to filter for site-related clicks. --HG-- extra : rebase_source : 3fd8b2c658a695fbc9aa79d09f461acaeef2078f --- browser/base/content/newtab/sites.js | 11 +++++++++-- browser/base/content/test/newtab/browser.ini | 1 + .../test/newtab/browser_newtab_bug991111.js | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 browser/base/content/test/newtab/browser_newtab_bug991111.js diff --git a/browser/base/content/newtab/sites.js b/browser/base/content/newtab/sites.js index 00f48f7ab90..5fdc50729f0 100644 --- a/browser/base/content/newtab/sites.js +++ b/browser/base/content/newtab/sites.js @@ -169,7 +169,10 @@ Site.prototype = { this._node.addEventListener("dragstart", this, false); this._node.addEventListener("dragend", this, false); this._node.addEventListener("mouseover", this, false); - this._node.addEventListener("click", this, false); + + // XXX bug 991111 - Not all click events are correctly triggered when + // listening from the xhtml node, so listen from the xul window and filter + addEventListener("click", this, false); // Specially treat the sponsored icon to prevent regular hover effects let sponsored = this._querySelector(".newtab-control-sponsored"); @@ -240,7 +243,11 @@ Site.prototype = { handleEvent: function Site_handleEvent(aEvent) { switch (aEvent.type) { case "click": - this._onClick(aEvent); + // Check the bitmask if the click event is for the site's descendants + if (this._node.compareDocumentPosition(aEvent.target) & + this._node.DOCUMENT_POSITION_CONTAINED_BY) { + this._onClick(aEvent); + } break; case "mouseover": this._node.removeEventListener("mouseover", this, false); diff --git a/browser/base/content/test/newtab/browser.ini b/browser/base/content/test/newtab/browser.ini index 30440638db1..c07f872ebdb 100644 --- a/browser/base/content/test/newtab/browser.ini +++ b/browser/base/content/test/newtab/browser.ini @@ -15,6 +15,7 @@ skip-if = os == "mac" # Intermittent failures, bug 898317 [browser_newtab_bug752841.js] [browser_newtab_bug765628.js] [browser_newtab_bug876313.js] +[browser_newtab_bug991111.js] [browser_newtab_disable.js] [browser_newtab_drag_drop.js] [browser_newtab_drag_drop_ext.js] diff --git a/browser/base/content/test/newtab/browser_newtab_bug991111.js b/browser/base/content/test/newtab/browser_newtab_bug991111.js new file mode 100644 index 00000000000..4a597ae221e --- /dev/null +++ b/browser/base/content/test/newtab/browser_newtab_bug991111.js @@ -0,0 +1,19 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +function runTests() { + yield setLinks("0"); + yield addNewTabPageTab(); + + // Remember if the click handler was triggered + let cell = getCell(0); + let clicked = false; + cell.site._onClick = e => { + clicked = true; + executeSoon(TestRunner.next); + }; + + // Send a middle-click and make sure it happened + yield EventUtils.synthesizeMouseAtCenter(cell.node, {button: 1}, getContentWindow()); + ok(clicked, "middle click triggered click listener"); +} From a04b78f6217c1dca90c3d4321846204b89d4d00e Mon Sep 17 00:00:00 2001 From: Ed Lee Date: Tue, 15 Apr 2014 12:14:09 -0700 Subject: [PATCH 02/20] Bug 991210 - [new tab page] Tiles are sometimes arranged all in a single line (wrapping as appropriate, e.g. to two lines with 5 items and then 4 items), instead of 3x3 grid [r=adw] Always Grid_init before "load", defer size calculation to "load", and only wait for links cache for site rendering. Clean up timers triggered from previous tests to avoid unexpected updates. --HG-- extra : rebase_source : aba79dc12fd3660c50d8004197a6b2f5a23419cb --- browser/base/content/newtab/grid.js | 42 +++++++++---------- browser/base/content/newtab/page.js | 16 ++++--- browser/base/content/test/newtab/browser.ini | 1 + .../test/newtab/browser_newtab_bug991210.js | 41 ++++++++++++++++++ .../test/newtab/browser_newtab_update.js | 5 --- browser/base/content/test/newtab/head.js | 10 ++++- toolkit/modules/NewTabUtils.jsm | 4 -- 7 files changed, 77 insertions(+), 42 deletions(-) create mode 100644 browser/base/content/test/newtab/browser_newtab_bug991210.js diff --git a/browser/base/content/newtab/grid.js b/browser/base/content/newtab/grid.js index 514432af122..b108e6e32f8 100644 --- a/browser/base/content/newtab/grid.js +++ b/browser/base/content/newtab/grid.js @@ -37,7 +37,7 @@ let gGrid = { get sites() [cell.site for each (cell in this.cells)], // Tells whether the grid has already been initialized. - get ready() !!this._node, + get ready() !!this._ready, /** * Initializes the grid. @@ -46,7 +46,11 @@ let gGrid = { init: function Grid_init() { this._node = document.getElementById("newtab-grid"); this._createSiteFragment(); - this._render(); + this._renderGrid(); + gLinks.populateCache(() => { + this._renderSites(); + this._ready = true; + }); addEventListener("load", this); addEventListener("resize", this); }, @@ -69,14 +73,6 @@ let gGrid = { handleEvent: function Grid_handleEvent(aEvent) { switch (aEvent.type) { case "load": - // Save the cell's computed height/width including margin and border - let refCell = document.querySelector(".newtab-cell"); - this._cellMargin = parseFloat(getComputedStyle(refCell).marginTop) * 2; - this._cellHeight = refCell.offsetHeight + this._cellMargin; - this._cellWidth = refCell.offsetWidth + this._cellMargin; - this._resizeGrid(); - break; - case "resize": this._resizeGrid(); break; @@ -97,8 +93,11 @@ let gGrid = { }, this); // Render the grid again. - this._render(); - this._resizeGrid(); + if (this._shouldRenderGrid()) { + this._renderGrid(); + this._resizeGrid(); + } + this._renderSites(); }, /** @@ -185,21 +184,18 @@ let gGrid = { } }, - /** - * Renders the grid. - */ - _render: function Grid_render() { - if (this._shouldRenderGrid()) { - this._renderGrid(); - } - - this._renderSites(); - }, - /** * Make sure the correct number of rows and columns are visible */ _resizeGrid: function Grid_resizeGrid() { + // Save the cell's computed height/width including margin and border + if (this._cellMargin === undefined) { + let refCell = document.querySelector(".newtab-cell"); + this._cellMargin = parseFloat(getComputedStyle(refCell).marginTop) * 2; + this._cellHeight = refCell.offsetHeight + this._cellMargin; + this._cellWidth = refCell.offsetWidth + this._cellMargin; + } + let availSpace = document.documentElement.clientHeight - this._cellMargin - document.querySelector("#newtab-margin-top").offsetHeight; let visibleRows = Math.floor(availSpace / this._cellHeight); diff --git a/browser/base/content/newtab/page.js b/browser/base/content/newtab/page.js index 3b97298880d..8775e0f5a30 100644 --- a/browser/base/content/newtab/page.js +++ b/browser/base/content/newtab/page.js @@ -144,19 +144,17 @@ let gPage = { attributeFilter: ["allow-background-captures"], }); - gLinks.populateCache(function () { - // Initialize and render the grid. - gGrid.init(); + // Initialize and render the grid. + gGrid.init(); - // Initialize the drop target shim. - gDropTargetShim.init(); + // Initialize the drop target shim. + gDropTargetShim.init(); #ifdef XP_MACOSX - // Workaround to prevent a delay on MacOSX due to a slow drop animation. - document.addEventListener("dragover", this, false); - document.addEventListener("drop", this, false); + // Workaround to prevent a delay on MacOSX due to a slow drop animation. + document.addEventListener("dragover", this, false); + document.addEventListener("drop", this, false); #endif - }.bind(this)); }, /** diff --git a/browser/base/content/test/newtab/browser.ini b/browser/base/content/test/newtab/browser.ini index c07f872ebdb..c4e99a9ddfd 100644 --- a/browser/base/content/test/newtab/browser.ini +++ b/browser/base/content/test/newtab/browser.ini @@ -16,6 +16,7 @@ skip-if = os == "mac" # Intermittent failures, bug 898317 [browser_newtab_bug765628.js] [browser_newtab_bug876313.js] [browser_newtab_bug991111.js] +[browser_newtab_bug991210.js] [browser_newtab_disable.js] [browser_newtab_drag_drop.js] [browser_newtab_drag_drop_ext.js] diff --git a/browser/base/content/test/newtab/browser_newtab_bug991210.js b/browser/base/content/test/newtab/browser_newtab_bug991210.js new file mode 100644 index 00000000000..53bb0194cce --- /dev/null +++ b/browser/base/content/test/newtab/browser_newtab_bug991210.js @@ -0,0 +1,41 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +const PRELOAD_PREF = "browser.newtab.preload"; + +function runTests() { + // turn off preload to ensure that a newtab page loads + Services.prefs.setBoolPref(PRELOAD_PREF, false); + + // add a test provider that waits for load + let afterLoadProvider = { + getLinks: function(callback) { + this.callback = callback; + }, + addObserver: function() {}, + }; + NewTabUtils.links.addProvider(afterLoadProvider); + + // wait until about:newtab loads before calling provider callback + addNewTabPageTab(); + let browser = gWindow.gBrowser.selectedTab.linkedBrowser; + yield browser.addEventListener("load", function onLoad() { + browser.removeEventListener("load", onLoad, true); + // afterLoadProvider.callback has to be called asynchronously to make grid + // initilize after "load" event was handled + executeSoon(() => afterLoadProvider.callback([])); + }, true); + + let {_cellMargin, _cellHeight, _cellWidth, node} = getGrid(); + isnot(_cellMargin, null, "grid has a computed cell margin"); + isnot(_cellHeight, null, "grid has a computed cell height"); + isnot(_cellWidth, null, "grid has a computed cell width"); + let {height, maxHeight, maxWidth} = node.style; + isnot(height, "", "grid has a computed grid height"); + isnot(maxHeight, "", "grid has a computed grid max-height"); + isnot(maxWidth, "", "grid has a computed grid max-width"); + + // restore original state + NewTabUtils.links.removeProvider(afterLoadProvider); + Services.prefs.clearUserPref(PRELOAD_PREF); +} diff --git a/browser/base/content/test/newtab/browser_newtab_update.js b/browser/base/content/test/newtab/browser_newtab_update.js index 8c63f61c4b4..d08750cf29e 100644 --- a/browser/base/content/test/newtab/browser_newtab_update.js +++ b/browser/base/content/test/newtab/browser_newtab_update.js @@ -6,11 +6,6 @@ */ function runTests() { - if (NewTabUtils.allPages.updateScheduledForHiddenPages) { - // Wait for dynamic updates triggered by the previous test to finish. - yield whenPagesUpdated(null, true); - } - // First, start with an empty page. setLinks will trigger a hidden page // update because it calls clearHistory. We need to wait for that update to // happen so that the next time we wait for a page update below, we catch the diff --git a/browser/base/content/test/newtab/head.js b/browser/base/content/test/newtab/head.js index 8f823cf9738..4348867496a 100644 --- a/browser/base/content/test/newtab/head.js +++ b/browser/base/content/test/newtab/head.js @@ -14,7 +14,8 @@ Cu.import("resource://gre/modules/NewTabUtils.jsm", tmp); Cc["@mozilla.org/moz/jssubscript-loader;1"] .getService(Ci.mozIJSSubScriptLoader) .loadSubScript("chrome://browser/content/sanitize.js", tmp); -let {Promise, NewTabUtils, Sanitizer} = tmp; +Cu.import("resource://gre/modules/Timer.jsm", tmp); +let {Promise, NewTabUtils, Sanitizer, clearTimeout} = tmp; let uri = Services.io.newURI("about:newtab", null, null); let principal = Services.scriptSecurityManager.getNoAppCodebasePrincipal(uri); @@ -30,6 +31,13 @@ registerCleanupFunction(function () { Services.prefs.clearUserPref(PREF_NEWTAB_ENABLED); Services.prefs.clearUserPref(PREF_NEWTAB_DIRECTORYSOURCE); + + // Stop any update timers to prevent unexpected updates in later tests + let timer = NewTabUtils.allPages._scheduleUpdateTimeout; + if (timer) { + clearTimeout(timer); + delete NewTabUtils.allPages._scheduleUpdateTimeout; + } }); /** diff --git a/toolkit/modules/NewTabUtils.jsm b/toolkit/modules/NewTabUtils.jsm index ecaffd8a4cb..a97f9a44f06 100644 --- a/toolkit/modules/NewTabUtils.jsm +++ b/toolkit/modules/NewTabUtils.jsm @@ -281,10 +281,6 @@ let AllPages = { } }, - get updateScheduledForHiddenPages() { - return !!this._scheduleUpdateTimeout; - }, - /** * Implements the nsIObserver interface to get notified when the preference * value changes or when a new copy of a page thumbnail is available. From 1d519d6f3e6349fd1f5c344fb4f8977339a3fa21 Mon Sep 17 00:00:00 2001 From: Gijs Kruitbosch Date: Mon, 14 Apr 2014 17:01:41 +0100 Subject: [PATCH 03/20] Bug 982215 - bookmarks toolbar shrinks when removing the bookmarks toolbar items, r=mikedeboer --HG-- extra : rebase_source : 12b99d5e02b76f6fbe08c0efe7ec470b54aef1e9 --- browser/themes/osx/browser.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/browser/themes/osx/browser.css b/browser/themes/osx/browser.css index e904475801b..ce578014748 100644 --- a/browser/themes/osx/browser.css +++ b/browser/themes/osx/browser.css @@ -142,6 +142,8 @@ toolbarseparator { #PersonalToolbar { padding: 0 4px 4px; + /* 4px padding ^ plus 19px personal-bookmarks (see below) */ + min-height: 23px; } #navigator-toolbox > toolbar:not(#TabsToolbar):-moz-lwtheme { @@ -157,7 +159,7 @@ toolbarseparator { /* ----- BOOKMARK TOOLBAR ----- */ #personal-bookmarks { - min-height: 17px; /* 16px button height + 1px margin-bottom */ + min-height: 19px; /* 16px button height + 2px padding + 1px margin-bottom */ } toolbarbutton.chevron { From 609c516835c224525029c4d8f585e6d5030ce2a6 Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Tue, 15 Apr 2014 17:55:58 -0700 Subject: [PATCH 04/20] Bug 971900 - onLocaleReady incorrectly elides onConfigurationChange call if urlBar doesn't exist. r=nalexander --- mobile/android/base/GeckoApp.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/mobile/android/base/GeckoApp.java b/mobile/android/base/GeckoApp.java index 6cb7936023a..cc4d2b8125b 100644 --- a/mobile/android/base/GeckoApp.java +++ b/mobile/android/base/GeckoApp.java @@ -1394,6 +1394,13 @@ public abstract class GeckoApp * aware of the locale. * * Now we can display strings! + * + * You can think of this as being something like a second phase of onCreate, + * where you can do string-related operations. Use this in place of embedding + * strings in view XML. + * + * By contrast, onConfigurationChanged does some locale operations, but is in + * response to device changes. */ @Override public void onLocaleReady(final String locale) { @@ -1403,11 +1410,12 @@ public abstract class GeckoApp // The URL bar hint needs to be populated. TextView urlBar = (TextView) findViewById(R.id.url_bar_title); - if (urlBar == null) { - return; + if (urlBar != null) { + final String hint = getResources().getString(R.string.url_bar_default_text); + urlBar.setHint(hint); + } else { + Log.d(LOGTAG, "No URL bar in GeckoApp. Not loading localized hint string."); } - final String hint = getResources().getString(R.string.url_bar_default_text); - urlBar.setHint(hint); // Allow onConfigurationChanged to take care of the rest. onConfigurationChanged(getResources().getConfiguration()); From 3c5caf18095ee7714514f15d24e8c84e6ab67806 Mon Sep 17 00:00:00 2001 From: Robert Strong Date: Tue, 15 Apr 2014 19:23:03 -0700 Subject: [PATCH 05/20] Bug 996960 - Add new RTL languages to locales.nsi - Uyghur ug and Urdu ur. r=ehsan --- toolkit/mozapps/installer/windows/nsis/locales.nsi | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/toolkit/mozapps/installer/windows/nsis/locales.nsi b/toolkit/mozapps/installer/windows/nsis/locales.nsi index 359d97f87e9..938aef47f62 100755 --- a/toolkit/mozapps/installer/windows/nsis/locales.nsi +++ b/toolkit/mozapps/installer/windows/nsis/locales.nsi @@ -15,3 +15,9 @@ ; Persian !define fa_rtl + +; Uyghur +!define ug_rtl + +; Urdu +!define ur_rtl From 25798787536787dcaa8de470a027e62a0ccb265e Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Fri, 7 Mar 2014 14:25:03 -0600 Subject: [PATCH 06/20] Bug 980742 - Update Shumway to version 0.8.271. r=till --- .../avm2/generated/avm1lib/avm1lib.abc | Bin 26532 -> 24889 bytes .../avm2/generated/builtin/builtin.abc | Bin 81529 -> 80995 bytes .../shumway/content/flash/playerglobal.abc | Bin 726109 -> 0 bytes .../content/playerglobal/playerglobal.abcs | Bin 0 -> 210443 bytes .../content/playerglobal/playerglobal.json | 2841 +++ .../shumway/content/shumway-worker.js | 49 +- browser/extensions/shumway/content/shumway.js | 19086 +++++++--------- .../extensions/shumway/content/version.txt | 4 +- .../shumway/content/web/avm-sandbox.js | 12 +- 9 files changed, 11711 insertions(+), 10281 deletions(-) delete mode 100644 browser/extensions/shumway/content/flash/playerglobal.abc create mode 100644 browser/extensions/shumway/content/playerglobal/playerglobal.abcs create mode 100644 browser/extensions/shumway/content/playerglobal/playerglobal.json diff --git a/browser/extensions/shumway/content/avm2/generated/avm1lib/avm1lib.abc b/browser/extensions/shumway/content/avm2/generated/avm1lib/avm1lib.abc index cfa75d6d6ac01339a1ed2190e1114a05627c411d..9295f6df8f4a6c7f69b9e909b5c1fbe4f86e3ea8 100644 GIT binary patch literal 24889 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 diff --git a/browser/extensions/shumway/content/avm2/generated/builtin/builtin.abc b/browser/extensions/shumway/content/avm2/generated/builtin/builtin.abc index 86e367fc1698218dcfe42cc2693dcb3a023b7dd9..56268036afb9df5ebac4520d24f29160ce372db7 100644 GIT binary patch literal 80995 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%0A*oJXr{2@Hu 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

TYW!2P)aSkfFhl8IHa>>TP1;Fbid^{HE3s#p^ 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

2UW(HD_B)SSs32rw)NVut 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¡^gv5d*zdWpdxY=zg${hK@Du%ko@g08 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

-t3n(*p8^g7Mf<{Fz6$lEg2fJUnOp0laz|qLi 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%0AZ zP@&h3vp3X~H%xFYao^^=PrW z^2#b#WqDo0H1WO{N18NFt*o8Y2qVA|z2Y|B)pHkMd(czsOb*1!g9c*{ZpG+_+Q=TK>o> zF|~R!Jn%i1CR&?jDH9P8xVo-pYD{lvs%XRsYjpA6VH*F1sz6P3c5&M54HK&MMtcK4 zLkiZov!*%)ccpziH<}z%t6(5au~pPGRVCy7K4}u7Pc_wfVvtwosIRK5tsiIOMuuJV zAU56wcyt~ML9eX`o5(nnnSwjp({N~YT`Vs}DE!j$5;p!gIr%eIUE9=PtErw`Wy7^^ zvvI{;gC;xrbjWt!uxXJa(WZW{KGUzLtW5+mDEpzCZy6WQ&V27F)`x$jXXA z_FL!!6&a#Sf(rxzp#1@i-ug?55R(e?*_bj8AdsaGt1pVc`DZH%puQrwxx;@AF@CYW zxyS}mvjSTHEQ#=%Ma>8oP-+X5U}!dg1#OsdFU7E~hOyek`0Rz7?m#j%&_a1tu44Eh*w{D8Z#fTEg33g7I^EVJVi?AoZ1DD@Mw( zwG=GNNK1WuD;8N{tvL2Z>JMNmKc`3$92{wBna_@;U1&4EtNcidia17tkb&NZH7s}%d z<5v}-eneC)LyG;7Vz?h^0O#3<6UKAUP&?E z#09}4Ao9xsC{u!40cjCGA{^m)T8c*m5!-PK_)BqoyC3l*O6@3tUs{Aq>a!PN1{oOKxH?Gj)+U8I15J7hoR0_8o%-3DUaxQ1Nmowo)eFaklof3SFox*kc z3oMdKTqlJIwiGe7mH}64v2-F=&`W_FbCAj~dx!b9;awSO^HnxRWni1~t5K3#R;IH3 zRd%4t4pv#Y$|_Y>rLyrVt5(^eDx0XXT9qB9vIdnksceeMrmE~nl?7EcO$B2Eo364J zmCaPyER`LnvNSoDmzhSC#&pKm7S)tGgP*aRJIth6tWz$60#by7IGG3 zJ!B)~Y{ zJPLUn@+9PG$g_~=AumF9KwgHt3V9v!Cgg3%yO8%FA3#2Wd;<9l@&)88$TtwoQ?c(L zKR|wh`~vw6@(1KE$Ul&UxO$5rOCif4D1I3Te#CaICtTx1!5EUwSizPi+Fs?s8ibj%=NocE}x& zJ0W*L?uOh0xfgOD;0Rz?@rbp!UDrNg z2?U=%AEmPQvBL+D4?r>kn(ACd4;2_KX2aS5N0@JR`ulJIE>pONrc37?bjc?n;T@I?u?OSnVAmn3{y z!dE1GRl?UKd|kpfBz#lCwGK;k6Q8C*k!H-XP(P65b@?%@W=s;jI$hCgJT8-XY;#65b=>y%OFh;r$Xm zAmM`&J|yA85oq}J|*GP5 zvV^Zl_^O1jN%*>iZ%Fv2gl|dswuJ9U_^yOu3Ez|OeF;C1@IwhdlJH{*KaucL2|ttY za|yqY@Jk85lJIK@zmf1;2_q7AO8A|G-%I#|gg;97lY~D@_=|+UO8A?Ezf1Usgnvr- zmxO;y_>Y7O?6RkoaFK+IC0rumQVEwyxLm>&60VeRm4vG$TqEIH3D1=9ED6_1xL(2y z5^j`mlZ0nWc#eeUN_d`xnV#s_k0A;QJBH2(c#pcVFr&y)up?_ zEE}W}$$D~_<>2ert-He*{h?%!?g_L0h{2Phr-a!+tV&PSQ^Ra9QA(Pg7G`-^(Uq>J zhuJWqvI1`UKcWGH^g&^E0MWp~ z`rt4-h-lCdeMp#%B^sQk=Y?4X(U76~&@dZEls8Nt7G^rp(Bb;=2^i zBlHnrRzu_+sgDe^Nkk*|()S9pI--%I^ig3}Pqf$G`rcvINHl66eV;I!OtkmD`o3Xy zIMF_uu7%kVMEmCJ`C)bxkv3W%9cBhm{uq5sm>o?txWh>A<~(lBcyDk;;;!mNX+ zbU%H+Fgt;$Y=3?KFguB8zXS9G!t4~H{SVX+472|c9dM9-P?()gbl}1I!C|%l)KdqI z)yIa}BA|oI_3|)V0yMTluL!ecK;@NsWtgo1su-t_3$s-~l~sCGn5_XCr|Wu{oe5Mm zULPN3>wxqL`h+ms05rZ@uMV?KKobtp4+*n#fT|DG4-K>PfDWnAYr^b&phG9>6T@sP zP|YNLQkY!`G_h8%4YO@Plj`)kFuMe(_AvdhFuM$>u3oPXvnzlOYtS3Q>?)x8M!hl2 zt^sOj(woBUI-thM`s6UX0jOz;J|)a<0-Aidet4MO0yJf+J~hm413LT&{fIET18C}z z`jKIF7tj$$=|_dxJwQhW^(D#G>`S2b`TG1Y`x>a@ z1pS0C`xa>aiTa6Q)(LdNN%~1)_C3&vC+jDN*^fXcouZ!-Wrlq7Wg|Y_95?V(3GAL(4SxU=EUk+s*lx4Jn^c7Gx zKv_;JNnZ(N6OI@atV~PXg%rc={=T&+_y;IK<~4m3Nqg&eIxKNg*Lz`THgdb zT%nC{kJiry_A0aqj?(%$z#|koo8BY+T;P!kA&d0$fcH}9T>60Y&A_7+I*&di{e0lP z71~T6k-i0ZABE1Rk4fJOystuA=o8W}0M-=RN}rN`A#lDz7tm*`FY>LmRt;1Y$dr0+<-8n{%UtLS^uuK_Mo=xX|b^lO3lQ|KD{k@V|; z_gCmz`ib=Gfe%pVI{KOP8-Nc~=z98v^c#T>Qs@TymGql{4_4?#`i=CPfyXLz6a7y5 zEx_dp-AsRwek*W=LbuSLq~8WysnD(T7wNYHk5lM2`kVASfU6X`o&F*HPGDW3J7@vZ z?*bmL(4Dl9>30K9Q0OjN#PoZBs};JN7Bl@`;6oI;hn6t?KHx(YIKwYx`u)H)3f$tC zG5rDHi3%L#moxoA;7JNxdjCPV+07{xEQz0{8hE&c2Hc>~qqLUkj{`R<^cbDV^e2Fu6ndP_V)~Q7lNEY`)-nAl;3*0{N$Z*ZH1OdH zJw+Rs{tWO`g`TF3On(;m2!)=ZO-z3d_(+AGrL&p-Jn&HpJxAv-{RQBlLeJB=On(vB zQ0N6ZkLlZirz!LzZD#ro;G-4VPUkcICE#X-cF-24zYKhgLNC!)roRF_U7?rh0;azT zJVT*Z=t8Ey2Hc|1t8@|5Uk45;^crnr`WwJA6?&a6X8N1Jrb2JfB}{({c$PwM(xps) z8~9iSPu*oqe+T$D1y9}OOn(=6wt}bb3Z{pF=O}pUu4MXqz^w|Nx~rJ}KJZ)xPu0yn?6hTBd&l+@|2EyN>A}1Gg)9>aJ({C%_#Fp1K>D{weT$1y9|L zO#ck{1O-psO-%nB_(TOy-OWt@0{A2aPu(p{{}T9Q1y9|rO#ce_6a`P+ZA||f_*4Z? z-R(^O2Kavpp1M1j{w?rn3ZA+zOacZ%j=p)9-#eSxb8KOX80_j)!gw?Bd zpx@|zrvHQ;K|Am}o~Z|z{xdYjwLj@WrvCy>;o4vH5YvB!X5-r5^f1$ZgJ$R2KlBLG ze~0Ga+5+|{)Bk{`a%~~zKlDGLIk~n7Ga>q4&|F+wj5!hgZ)nL}Tf&}X`ajUzTw98H z5`6*YCp=tRh8YumA+!{(Eyvu6z6e?>*H&N_MPCdpjcY40pQ0~;md>?Rm|4-6Ld)RV zYRs|d%b;a)Z4G8y^ySd9xV9GaF8T^+*<3plGcfu}XnnYL7Up8~RnT&{whps0`f6yo zTw9O%8GQ}3zFgaYnHqg9w0>OMh&dbmOlbYNwh6O0`dQEhaP4f&N8bo-2-h}azDM5#Estw>t*Q8ez}h#==WS(5QZ?wLJ{ii_ zQn93wl96|e42DxGIVa1boRe7fW~)ZrKo2K4O|c(_xPhsh;55xK)lju`Q;lF*X0zec zGEFCV6r8gRmzHh1BGkuqypgQsn8^{!O+MLhYkf_3g!;J`lHt+%o1O>_@T?>wMH^_Q zL}*aTdNNYA!DecNhNNyLBTdUQ(;_r9?P4<0wP9v@godXhK2L_`H8UbKBI9NC^J7o!Tj}#FN%`f{-G4|6=F!zhliTnMg82f7{nFzXc^8O2L#sS(X<^d5p^?;Q&<3R0y z=7AA9?ZEXm;~?#H^PmWwanNR)aj>?4%!4DaEDyfeW{lMqkvTR(i)rlDHltiyLS}gc z7G(L&HlspYMrK6>R%6B8HltEoL1twHmSW|@He;N&ip+5lScl`Dwi#908ZxUQun4Pm z*bH4elT7r>unym}8RNBeWR8!(_#6L$&6uEVAag}Lb=oCl){h4%03p^RNgEv%_w+8}-^1WY$Mu zj@935HyX67$ZUwf2y1xMZZvAwkl7f4>DBnG-DuLTBeN+2gRALfyD?e2fy~Jfm|2tG zwi{Elo5-9JfpInEBfD|9b_4-n< z#*x}xWFCoE6&<jb{IkJJ~D$57)Zg54#UtMAk&DzEHbt@jA`0K zWKN5~7@Bse!#G-dgv_HOFoBM~)?qYjkCE9Nf#K79tHU@(dxFekA~1K3xz}M#*PbGC zdIUz!^hX`W4DA^*XGCDy%y`yev}n(f*%E<4)AF*z2x%{n8H&J+3BBzwW@_8XoEd@f zGV>#cVQMdtX+~hOm|r=JS=uXP&WgZLne~IiI97WNA8ZkrC&&KbFpksSAoI8gjFRIP ztHx~YEiz|EV2aFMtr~N*cgUO*fdMjSqiVEjVKQ4IFgseesK#9FeKO}pU~J62R5j*l zACfsQ0uy82wW@Kv_A!~qM_^bSf2(S=X`hnW7J)g@cCTu*YoC+Z9)S_j{-|nnXkU`q z5rOH@@vLgh*S;omegp=?{FhbZ1npZgPl&)wIN@#8I8o~)^TY^DgA+eejgz$R$vi0n zbKs<}RO4jrM>0>2z!*6B2h})5`tf#;8%ajDZ-K-wZ^E4mN9b?^yO^Py-s5>X)Bny82U=K_)({^gtS%6TmpSH zTk@>aSW4O&W-f)kmMwkRX)Gh{OlB^FeimEyw$oTn+B#+~hrXUI|Hx^qAZ-IPS3uv$ zR($0&R+6@fnJb~6%~t;4G**#z4l`FlKbNig!)dH0?L20#hQ67tUhFc~kaj*Z*FfLG z)~t3JYf0P6%(c)jU~4zJj5A5QkeO#fzlfc=#bumD+BRl#PN9q0S(mzub);Rw%yrN& zW$SKm8S5#yfkIfHy^%s2DY%J3n<#iTh0dnnITSjFg6C4`Tne5?q4OxXnL?W>cs_;B zr{ER}ZK2>+3T>s}1r)k~f)`TgLJD3)p^GTEjY8Wfcrk@8rr;$Mx`cw4Qs`0&UPhtI zD0n%AE~nrX6uN?fS5oLo3SLE_t0;Iig|4RHH59srg4a^$S_)oAq3bAkJ%z5P;0+YI zfr2+u=tc_OM4_7~cr%4=rr<3Ux`l$bQs`C+-bSI@D0n-CZl~ZK6uN_gcT(t13f@Jb zyC`@!h3=-{Jruf!g7;GBUJBkvq5CL!KZWq*KR}@eDEJ_S9;Dzy6ncn)4^!x23O+)i zM=1Cxg&w8gV-$Lff{#<^aSA>`p(iN#B!!-&;8PTOih@s5=xGW*L!oCV_$-BeX!H z*~!K`O<_BPu#{2 zP@iBoZSfetk$1BB8`LM+&6jzM-^n}0{2l63?3U|2#vkN8-24OT)9lteJjS2ooofCG z^%-{CgC65A@*ZLS1@&2W`_mrdZyJGj+~3fjV|TpdG5(2#HUjU#MbNjidw%v9i`j?=$y^M52fOzlkFkV} zz?*Ri^q1IuD^iT5Y{c7SE`|OwyMKL(v5bwtTW1;cSJ(sRrx?rGhak zVcs-z4b->TW1CWqwalAgu7&zGd;F19<4ooqZJr7B9rnbxsm58%JIXu@>bva8zf+BM z%sbp%2NmO`x1<^CnK#8;5A{9v^!7Ak1M?0rH$e3~^M0DKk$LBt8=<8>+nHu;V&3D; zP0-SxTaa#?&Ae^q+0ZhdUzcv2!@TY0Inc6S*p_ab%e)=txzKW6yeZu{k9p^t=Rxbc z{h@SYGxMHcZid!>$M$sNeC9pTJRjP?m)=h|wlMEW<`!s!U+zpdwleR@=2mEVuPn$g zE@0kM%nP6mdv#rgaUt`bYF-G<``We)<09t$pLr3qk+0vBVQgdG)68wqM!oS+hH)|T zo^D+cNXQs&J!FNOLcd;6M9<1*$QVO|FHBlga1na1VJ z+sC{d>c{Ne$1;s8nD=P&3aFp3@GF_dmCW00UJ3P6_TI;t##PLFjCmE*&)EAvW*S#B z?{xEOsGqYBmSh>%Fz*cW8mM2e4>x5Q*D`O5c`ej0*+-XU8P_py$h;2fSM1~4vW)AQ zccytg)UVkmk7XG*Ft2Ie0QDR8=_^^rjm$gCybdz=xhdPYm3e2Iw?h4%eRWy3aU1gW}Q39ofbm%sb4y1L{xg+i$XsJDGQ=c_-ALS!8n`<1Xgi%e)KfFRb&fKE~b5 zn{M6>^;h=Y$9;@@m^aV72kLL^`^7oNz0B(}?}hq1`{AY><38pcY2F9*5BB5QT;qP0 zPv-ql|71U%lWRP{@|pPn)W6uz7v&lcV)WE}5bEFTm#cD(hgiPNdO$rBM{|uwS-xsM3U!h4$8)*HV=UikJ_dEM^5?6$#^WsC zWj+pdiSk!C*LZ^EC!0?|U8?;3S+4OU%XgbkLS3f()0t~L#qvGoQ&5*HNx$V9PqX|K z^J%Cn6k62Rc!uStn$JL8sj$_3jb~YYn)xi$Rf@8yukjqqPdA@~x>~Va(ARjL`>wHn&4POL0Ej*Vw`G`Um1WhJMCdEPt^17Szp3=9YfO+bn;G`8L$^m8{G98Sk+CJo6oks>WvbfS08@>ANjT z=R^I#!2^Cj8ox%%J`N97V05Z2!=T=GiEjKH*wZ< z1kp9;wzgEYA{xYWL>I++Rkz+$Q!{N`Q(aBf;YrD%`Lkz_n?G-M%SrAD(Dhq(K4=2Gw~q#*3YFa@eA?@D2xNx)9^V;f%(3aU?^< z6uiTO8F<8cQTfoD-4P8ev|n`GZ7(_Q7Lem^2g`9cE7l7icdL(%yWz&gaS%Z!dNZeV zPDV~V>`RKclR?)mxYhYxtbUggzlUuL7W|33o_j0vf1L+M|MneQZ3Tmg@fIV*--&vZ zL;Jr*gO*j`Dp?Os_v&|w~Fk`^FH2t`_^E-I6_MjB% z@at=5iz{yzmrSHnov}iy z)k3>CG0xa;&yeRsa0`@{S={T^Z`?hnyG54T!#R;vCrfCpjP9YhpjGWcYrXrvwFuFa zv6vVOma*W>j|A(Iu_U(`3D*5$kr>waV(p%-3=92`@MW}EDag|zzEl;(hpbh)7iR_$HVMPi+70be3rP+Z3O zBAI4Pku_L^uzuN^|Ya5TS>mN44eg9(o%h7o!5ExH$sD zHd9hKO64dG$d(Rd%j77Fqii61A0T@!FV~ls>$lC}Od^9p-1Z75CImZ7Zhcis} z2le3KA$dcS(ng{CWl7oluzfWpU!rGbtUXIg9#n^2LnIEFRD##^9a7Ty_T!qx_i&&)h%hGX?WO#M6O{ zr-Kxp4z}@hh@Gc-4xSEGKT|p*3a9(-R5-z3=XVN-tkur%6@*cCcK)D5!zllVzYc^; z{t18Wrn~cJ{8dd)=P&r{G*dc%`*LZ=)}1v%xbBe zJ!@Xle+^0!uL0fHP606Eo5sYEMZD1M@MFM>jV`xCZ$osmSSQ|V;SetsjhsA#7q&=x zyVu$=7v$EW&h}lG11a}$4s= ze_5|5uN9nL;y3hKVjg(FL>8pEZ9$0OtV;_Y91f68BzI8Xo(iIf(^yCcd5j>gDl$WD$a4ww>Ni8H(S~qv-uBg zw+N370Q*TgL%9Fw} z8-G4+;7BNN#UDmQ87VGt#h*MdSr-J{36B;+i%)VlLCKg*XP3xzQ1`qY7Nem zyQTGnS#5J$=ir)(Me*ETDsZ&(JHMT?o|M5>P;e$nB}3l8kOQa6&8*6e%q% zO0kMWuRgd=K$anzFRmhIKq&}_UuWrlP`#+uHH29P5(K2M$XxO3VSV?4UjznVfh&HW zIikz)W4jE@9HGVu{46>Qi?JXzaF^XG-Y4HO8)+og2 z07!6rMTLcF+$PK!WFMA0NZ5qK`@<^iKeGQ`{rlv!C@C>5h0QCQRs;(;QS6|1bY7s`PeVI)TR1`^2z3{^QsRi>+{GgKv{Dl=8Z zbWLadgz<=gaNxMkOCla?#hJ%Ls>4Uhv(3#7$0Q{Uk`Bq>AtUYCJW^z47Kgb}n56W( zEXmP7FG(Gkmt-FT$;(S}a8~eru-Cq*PviCFqdqn|j~{Vh0W0(=evt-5S|ZXik?tqb z14Md|NXLq_LZstFs)NSt5P=RA=|quE5@}sMB{c}tDALIyJzS(mi1a9t2B%Td(E>Hk zvK>3Sb>4Av<{sb1Th=aeJ819_rz44Sk}Hd zD%KM>Gb=U_w=*j?QU*)U=vT3cGAXlv`Pr~Ivj&u(1J>{CffeUcAL=u(@;u6+oIw?v zDHmZmaq0TfU~ZK5L!^5crHJUcy&yWs;z~}1@pcfb!GpPpIhGrVSRj#{j@*|RvR`4a z30MLnvnJt(w^KM!ciq4Yy1kD`IY9v91Rg(^a)hBi7RDp5J<` zbrxpC3`8sN#4c*<@>}>DENWB!+Z|)(rGIzVXUrT#9h@_Nj&=6<5v@U}f4wV?x%++Q z&O;cAE{FTq`|Qzi<}{!5uaC3SJ~$3*pO@P8`g+7zgLSqnt9BQcQy$4a8F=;D1B#v#uuu zQImas*gx?|sXS;ZLUj}c5?-@eT~AlnftT#A8+&-qA{^u{$6vr{S5~Z)7V*&+yNY+M zGuJ8Jw66ZiJCD8~q8Eacd3fY9B}-NM@NpL#CxTIJ12F)j+J>kIKCJAeDw?W{Q5By` zgH$EiHH4+`*A_;;F|x7(Z|zh{PR4tizZc1-WNynyvS$O?b2!T7s4qwTIO-4N9-Krr z*U)X^?Uy!;4fiS|L^_hkQ59$(k?t$fe36b8X@N)!Md}x6Q2>GE_bVyeANw9~Ag}8n zkq_b-H%3FS?yUmhw30lPZoI8hDm*r{I;AoNVGwMo6{!wT`lnW=VM@V~R*~++%tBga z2I4+D)0+`e)|FA7iO~?eR6OLuOU1?`ha?Vlz~|QP7=b>&m`?!MlHdSoCnOG5+_@iO zMpU!T{V{Ywod@7$lWfC$K`9EKE5Zj1NZL%D@cnUgo{umOYUdUn?4ffjQaZ$;EO5Qr zc>(R%t|!ypofpy$j7@mt*u((5lti3WcgS53wBoFquC6bieXK6LwWVY9jJ7%ZO`bcS zf7L`;8>?GGbCVAJkMEvtHR1J>GH06gt-%AT_wA{Ox3H|(`rfqK)b%COYeUB*)GT`7 z=v0*l(YNMzm6GV(WL16iK6V>VS=E2ICjlQlRkkPF@R!4_Hjai6OnLVz4 zBLCFjAJxqr&C%}6VsR@4NgG%>(Z{00=^As<7Uw7j->EJv>^+2hi!^t~hBx>Ail+gF)QQR?1tlBH=7-eD5*)@sWJ_Y(D0_gijdBwJU$6^E+dSh zDxJ#-U6HMG1s}dd(`|Nlbk0%fT*I^Y?@$H^o7WpmjYg5j&?ldC;ZCatSN609K{cI}if{1w)g3K!qSX0rQ6Rc4nQw|_|JP`OJ0BmN zQE##3-E-#7Z*OUAZo@O2KAqp1(RSCKh;bzJU(-j-J6%tHtbe-; z4mDuTv{~&F<$Y4!+B`kRbG(0->)ovdz3#`G@}KuboA#h@2SKe3yrzXnFjL4mOp*Mb z&aQ2#Z7YgOIyyR%Wn0DuUmyfZ4CLZ~<15h1m|QxOPG|B3elTDUo-t(xn>KmNV=vRo z^cUKP{6?o=&_B^9bnSg4FeV{Pc-WGqqho1wy!YA{_Ch~Oe$R-yHJX=faxH}3h#(G) zh0(OrZttRH@lLf}D}C?*VrUHf2@+qh*HQn_n~`V}?Po>1S@XFMWjY@e0!E^l#kqWb z7K&OAkX5(T1=bGa#D0&sK@xk1Eph%gQuU1nC9<+%4Gia^l(uB~h| zyqohDN%0Fq8q#r;%Kd0lo{os&IIv_S5$BQ1C>R0^O{>+nD~4L5y?fYm*0JYoU=I^y zHm&;))I*k!SXNj*X1T?(%Cg3?&a%O>$+ER$8oRu=$MW+pXvQyj|0}bYB*ryA(=lNX zthtVbjmUNc4%)dMvUhTx=+vAAqEk}~M5pHFiB8SS6P;S306I0qP72^tv-}jS#@D8d zs#hdcuOQq~1ZuU2VAq1aFX<|k)@7B-D_x}m?T@Y!1Wr{rqCu{K|8ww6h=c{<3y7pW z3eO@Qv@s>(L^z@Rn;pK!_2^k4oi$ufrU-_o>vp|?*G&u(U0_t0Fj%Z_Tw?x03sUKP zhLL~LNR-K^D#eOhAqulQATdi4d0C2xyznT*?WMxMFi;yopmw4dQ{mri@Ky|LH6IzC zR}a?YWn>+(r1W4-UbbQ|c^UDMp`=F-{)cA{Fc_F$5B@ir8QcGk0}O`upi_b>Tn6ke z4NBE+a*(W2a**Oa$3@%^8PJ$Rw{|saQGdQgX6F2?Ki+$Ge$Xdp7axolp9sFE=76P( zxWFSE_<`@*p1Q^vpPru`_U-WyOu8pS6tjKbA4OGTADIP}Z>K$^qfSpWS2uw=R?Jsz zQ)22YHIueM72FFB-c0)3X8P4&0F4&G_1k}Ae0fx5c0L)7#@^HTsO*j3e0TU#tLIxy z`t0-s$%gT`e-ynCey(`F*y_%|@0o9*jdvQ=+|;G9ILH9J3D@v{s&pPTr)S9PsW;zGFZs9w)eHbN3Y1oSDDMmPf>W$qm!7O6Cx0n0#;q)-$kmP;&`*X@n_ z4=bAw9<4t%jje4uU*$9CaGRi*f^hZzzi2B_TKpF;o~8WbILf$wb!2?zju$T;%s zC_>O1P)givLn? zu{Mz2qGN7=%!bIa%(0wjxxg~dvQVNii@d*NrUQZt4!lg@1Or|sxsmWP2|V~6o4`Y| zBeAhl9XOn(#G16sG}a{iPg;=|E~lkzd2r!2+Uzz;b{ieIjp#cqNV+yjPr{M>$)t?Q z&)S{*h1^LCP9xk&5&mit7O=zLu$7=e{T*8er8|F+NxUdz6=A8H(Ummd#U!7SaxpaI Ef0va{DF6Tf diff --git a/browser/extensions/shumway/content/playerglobal/playerglobal.abcs b/browser/extensions/shumway/content/playerglobal/playerglobal.abcs new file mode 100644 index 0000000000000000000000000000000000000000..3f6f9591dc46a261ec3fd19930dc496f3dbbcca3 GIT binary patch literal 210443 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 MI9n4_P4XlE2M{pSGynhq literal 0 HcmV?d00001 diff --git a/browser/extensions/shumway/content/playerglobal/playerglobal.json b/browser/extensions/shumway/content/playerglobal/playerglobal.json new file mode 100644 index 00000000000..8bb1499fe1b --- /dev/null +++ b/browser/extensions/shumway/content/playerglobal/playerglobal.json @@ -0,0 +1,2841 @@ +[ + { + "name": "flash/accessibility/Accessibility", + "defs": [ + "flash.accessibility:Accessibility" + ], + "offset": 0, + "length": 355 + }, + { + "name": "flash/accessibility/AccessibilityImplementation", + "defs": [ + "flash.accessibility:AccessibilityImplementation" + ], + "offset": 355, + "length": 995 + }, + { + "name": "flash/accessibility/AccessibilityProperties", + "defs": [ + "flash.accessibility:AccessibilityProperties" + ], + "offset": 1350, + "length": 334 + }, + { + "name": "flash/accessibility/ISearchableText", + "defs": [ + "flash.accessibility:ISearchableText" + ], + "offset": 1684, + "length": 183 + }, + { + "name": "flash/accessibility/ISimpleTextSelection", + "defs": [ + "flash.accessibility:ISimpleTextSelection" + ], + "offset": 1867, + "length": 232 + }, + { + "name": "flash/desktop/Clipboard", + "defs": [ + "flash.desktop:Clipboard" + ], + "offset": 2099, + "length": 552 + }, + { + "name": "flash/desktop/ClipboardTransferMode", + "defs": [ + "flash.desktop:ClipboardTransferMode" + ], + "offset": 2651, + "length": 375 + }, + { + "name": "flash/desktop/ClipboardFormats", + "defs": [ + "flash.desktop:ClipboardFormats" + ], + "offset": 3026, + "length": 653 + }, + { + "name": "flash/errors/InvalidSWFError", + "defs": [ + "flash.errors:InvalidSWFError" + ], + "offset": 3679, + "length": 217 + }, + { + "name": "flash/errors/StackOverflowError", + "defs": [ + "flash.errors:StackOverflowError" + ], + "offset": 3896, + "length": 223 + }, + { + "name": "flash/errors/ScriptTimeoutError", + "defs": [ + "flash.errors:ScriptTimeoutError" + ], + "offset": 4119, + "length": 223 + }, + { + "name": "flash/display/ActionScriptVersion", + "defs": [ + "flash.display:ActionScriptVersion" + ], + "offset": 4342, + "length": 253 + }, + { + "name": "flash/display/AVM1Movie", + "defs": [ + "flash.display:AVM1Movie" + ], + "offset": 4595, + "length": 356 + }, + { + "name": "flash/display/Bitmap", + "defs": [ + "flash.display:Bitmap" + ], + "offset": 4951, + "length": 431 + }, + { + "name": "flash/display/BitmapData", + "defs": [ + "flash.display:BitmapData" + ], + "offset": 5382, + "length": 1515 + }, + { + "name": "flash/display/BitmapDataChannel", + "defs": [ + "flash.display:BitmapDataChannel" + ], + "offset": 6897, + "length": 274 + }, + { + "name": "flash/display/BitmapEncodingColorSpace", + "defs": [ + "flash.display:BitmapEncodingColorSpace" + ], + "offset": 7171, + "length": 355 + }, + { + "name": "flash/display/BlendMode", + "defs": [ + "flash.display:BlendMode" + ], + "offset": 7526, + "length": 624 + }, + { + "name": "flash/display/CapsStyle", + "defs": [ + "flash.display:CapsStyle" + ], + "offset": 8150, + "length": 256 + }, + { + "name": "flash/display/ColorCorrection", + "defs": [ + "flash.display:ColorCorrection" + ], + "offset": 8406, + "length": 262 + }, + { + "name": "flash/display/ColorCorrectionSupport", + "defs": [ + "flash.display:ColorCorrectionSupport" + ], + "offset": 8668, + "length": 314 + }, + { + "name": "flash/display/DisplayObject", + "defs": [ + "flash.display:DisplayObject" + ], + "offset": 8982, + "length": 1581 + }, + { + "name": "flash/display/DisplayObjectContainer", + "defs": [ + "flash.display:DisplayObjectContainer" + ], + "offset": 10563, + "length": 912 + }, + { + "name": "flash/display/FocusDirection", + "defs": [ + "flash.display:FocusDirection" + ], + "offset": 11475, + "length": 262 + }, + { + "name": "flash/display/FrameLabel", + "defs": [ + "flash.display:FrameLabel" + ], + "offset": 11737, + "length": 325 + }, + { + "name": "flash/display/Graphics", + "defs": [ + "flash.display:Graphics" + ], + "offset": 12062, + "length": 1042 + }, + { + "name": "flash/display/GradientType", + "defs": [ + "flash.display:GradientType" + ], + "offset": 13104, + "length": 239 + }, + { + "name": "flash/display/GraphicsBitmapFill", + "defs": [ + "flash.display:GraphicsBitmapFill" + ], + "offset": 13343, + "length": 346 + }, + { + "name": "flash/display/GraphicsEndFill", + "defs": [ + "flash.display:GraphicsEndFill" + ], + "offset": 13689, + "length": 215 + }, + { + "name": "flash/display/GraphicsGradientFill", + "defs": [ + "flash.display:GraphicsGradientFill" + ], + "offset": 13904, + "length": 697 + }, + { + "name": "flash/display/GraphicsPath", + "defs": [ + "flash.display:GraphicsPath" + ], + "offset": 14601, + "length": 1258 + }, + { + "name": "flash/display/GraphicsPathCommand", + "defs": [ + "flash.display:GraphicsPathCommand" + ], + "offset": 15859, + "length": 368 + }, + { + "name": "flash/display/GraphicsPathWinding", + "defs": [ + "flash.display:GraphicsPathWinding" + ], + "offset": 16227, + "length": 259 + }, + { + "name": "flash/display/GraphicsShaderFill", + "defs": [ + "flash.display:GraphicsShaderFill" + ], + "offset": 16486, + "length": 299 + }, + { + "name": "flash/display/GraphicsSolidFill", + "defs": [ + "flash.display:GraphicsSolidFill" + ], + "offset": 16785, + "length": 283 + }, + { + "name": "flash/display/GraphicsStroke", + "defs": [ + "flash.display:GraphicsStroke" + ], + "offset": 17068, + "length": 1542 + }, + { + "name": "flash/display/GraphicsTrianglePath", + "defs": [ + "flash.display:GraphicsTrianglePath" + ], + "offset": 18610, + "length": 680 + }, + { + "name": "flash/display/IBitmapDrawable", + "defs": [ + "flash.display:IBitmapDrawable" + ], + "offset": 19290, + "length": 105 + }, + { + "name": "flash/display/IDrawCommand", + "defs": [ + "flash.display:IDrawCommand" + ], + "offset": 19395, + "length": 102 + }, + { + "name": "flash/display/IGraphicsData", + "defs": [ + "flash.display:IGraphicsData" + ], + "offset": 19497, + "length": 103 + }, + { + "name": "flash/display/IGraphicsFill", + "defs": [ + "flash.display:IGraphicsFill" + ], + "offset": 19600, + "length": 103 + }, + { + "name": "flash/display/IGraphicsPath", + "defs": [ + "flash.display:IGraphicsPath" + ], + "offset": 19703, + "length": 103 + }, + { + "name": "flash/display/IGraphicsStroke", + "defs": [ + "flash.display:IGraphicsStroke" + ], + "offset": 19806, + "length": 105 + }, + { + "name": "flash/display/InteractiveObject", + "defs": [ + "flash.display:InteractiveObject" + ], + "offset": 19911, + "length": 778 + }, + { + "name": "flash/display/InterpolationMethod", + "defs": [ + "flash.display:InterpolationMethod" + ], + "offset": 20689, + "length": 254 + }, + { + "name": "flash/display/JointStyle", + "defs": [ + "flash.display:JointStyle" + ], + "offset": 20943, + "length": 258 + }, + { + "name": "flash/display/JPEGEncoderOptions", + "defs": [ + "flash.display:JPEGEncoderOptions" + ], + "offset": 21201, + "length": 216 + }, + { + "name": "flash/display/JPEGXREncoderOptions", + "defs": [ + "flash.display:JPEGXREncoderOptions" + ], + "offset": 21417, + "length": 295 + }, + { + "name": "flash/display/LineScaleMode", + "defs": [ + "flash.display:LineScaleMode" + ], + "offset": 21712, + "length": 307 + }, + { + "name": "flash/display/Loader", + "defs": [ + "flash.display:Loader" + ], + "offset": 22019, + "length": 1973 + }, + { + "name": "flash/display/LoaderInfo", + "defs": [ + "flash.display:LoaderInfo" + ], + "offset": 23992, + "length": 1276 + }, + { + "name": "flash/display/MorphShape", + "defs": [ + "flash.display:MorphShape" + ], + "offset": 25268, + "length": 230 + }, + { + "name": "flash/display/MovieClip", + "defs": [ + "flash.display:MovieClip" + ], + "offset": 25498, + "length": 885 + }, + { + "name": "flash/display/NativeMenu", + "defs": [ + "flash.display:NativeMenu" + ], + "offset": 26383, + "length": 207 + }, + { + "name": "flash/display/NativeMenuItem", + "defs": [ + "flash.display:NativeMenuItem" + ], + "offset": 26590, + "length": 293 + }, + { + "name": "flash/display/PixelSnapping", + "defs": [ + "flash.display:PixelSnapping" + ], + "offset": 26883, + "length": 264 + }, + { + "name": "flash/display/PNGEncoderOptions", + "defs": [ + "flash.display:PNGEncoderOptions" + ], + "offset": 27147, + "length": 224 + }, + { + "name": "flash/display/Scene", + "defs": [ + "flash.display:Scene" + ], + "offset": 27371, + "length": 344 + }, + { + "name": "flash/display/Shader", + "defs": [ + "flash.display:Shader" + ], + "offset": 27715, + "length": 368 + }, + { + "name": "flash/display/ShaderData", + "defs": [ + "flash.display:ShaderData" + ], + "offset": 28083, + "length": 195 + }, + { + "name": "flash/display/ShaderInput", + "defs": [ + "flash.display:ShaderInput" + ], + "offset": 28278, + "length": 334 + }, + { + "name": "flash/display/ShaderJob", + "defs": [ + "flash.display:ShaderJob" + ], + "offset": 28612, + "length": 492 + }, + { + "name": "flash/display/ShaderParameter", + "defs": [ + "flash.display:ShaderParameter" + ], + "offset": 29104, + "length": 308 + }, + { + "name": "flash/display/ShaderParameterType", + "defs": [ + "flash.display:ShaderParameterType" + ], + "offset": 29412, + "length": 618 + }, + { + "name": "flash/display/ShaderPrecision", + "defs": [ + "flash.display:ShaderPrecision" + ], + "offset": 30030, + "length": 237 + }, + { + "name": "flash/display/Shape", + "defs": [ + "flash.display:Shape" + ], + "offset": 30267, + "length": 280 + }, + { + "name": "flash/display/SimpleButton", + "defs": [ + "flash.display:SimpleButton" + ], + "offset": 30547, + "length": 682 + }, + { + "name": "flash/display/SpreadMethod", + "defs": [ + "flash.display:SpreadMethod" + ], + "offset": 31229, + "length": 264 + }, + { + "name": "flash/display/Sprite", + "defs": [ + "flash.display:Sprite" + ], + "offset": 31493, + "length": 718 + }, + { + "name": "flash/display/Stage", + "defs": [ + "flash.display:Stage" + ], + "offset": 32211, + "length": 3663 + }, + { + "name": "flash/display/Stage3D", + "defs": [ + "flash.display:Stage3D" + ], + "offset": 35874, + "length": 443 + }, + { + "name": "flash/display/StageAlign", + "defs": [ + "flash.display:StageAlign" + ], + "offset": 36317, + "length": 383 + }, + { + "name": "flash/display/StageDisplayState", + "defs": [ + "flash.display:StageDisplayState" + ], + "offset": 36700, + "length": 319 + }, + { + "name": "flash/display/StageQuality", + "defs": [ + "flash.display:StageQuality" + ], + "offset": 37019, + "length": 429 + }, + { + "name": "flash/display/StageScaleMode", + "defs": [ + "flash.display:StageScaleMode" + ], + "offset": 37448, + "length": 317 + }, + { + "name": "flash/display/SWFVersion", + "defs": [ + "flash.display:SWFVersion" + ], + "offset": 37765, + "length": 454 + }, + { + "name": "flash/display/TriangleCulling", + "defs": [ + "flash.display:TriangleCulling" + ], + "offset": 38219, + "length": 278 + }, + { + "name": "flash/external/ExternalInterface", + "defs": [ + "flash.external:ExternalInterface" + ], + "offset": 38497, + "length": 3261 + }, + { + "name": "flash/events/AccelerometerEvent", + "defs": [ + "flash.events:AccelerometerEvent" + ], + "offset": 41758, + "length": 817 + }, + { + "name": "flash/events/ActivityEvent", + "defs": [ + "flash.events:ActivityEvent" + ], + "offset": 42575, + "length": 505 + }, + { + "name": "flash/events/AsyncErrorEvent", + "defs": [ + "flash.events:AsyncErrorEvent" + ], + "offset": 43080, + "length": 522 + }, + { + "name": "flash/events/ContextMenuEvent", + "defs": [ + "flash.events:ContextMenuEvent" + ], + "offset": 43602, + "length": 829 + }, + { + "name": "flash/events/DataEvent", + "defs": [ + "flash.events:DataEvent" + ], + "offset": 44431, + "length": 546 + }, + { + "name": "flash/events/ErrorEvent", + "defs": [ + "flash.events:ErrorEvent" + ], + "offset": 44977, + "length": 494 + }, + { + "name": "flash/events/Event", + "defs": [ + "flash.events:Event" + ], + "offset": 45471, + "length": 2319 + }, + { + "name": "flash/events/EventDispatcher", + "defs": [ + "flash.events:EventDispatcher" + ], + "offset": 47790, + "length": 708 + }, + { + "name": "flash/events/EventPhase", + "defs": [ + "flash.events:EventPhase" + ], + "offset": 48498, + "length": 262 + }, + { + "name": "flash/events/FocusEvent", + "defs": [ + "flash.events:FocusEvent" + ], + "offset": 48760, + "length": 980 + }, + { + "name": "flash/events/FullScreenEvent", + "defs": [ + "flash.events:FullScreenEvent" + ], + "offset": 49740, + "length": 643 + }, + { + "name": "flash/events/GameInputEvent", + "defs": [ + "flash.events:GameInputEvent" + ], + "offset": 50383, + "length": 390 + }, + { + "name": "flash/events/GeolocationEvent", + "defs": [ + "flash.events:GeolocationEvent" + ], + "offset": 50773, + "length": 1137 + }, + { + "name": "flash/events/GestureEvent", + "defs": [ + "flash.events:GestureEvent" + ], + "offset": 51910, + "length": 1059 + }, + { + "name": "flash/events/GesturePhase", + "defs": [ + "flash.events:GesturePhase" + ], + "offset": 52969, + "length": 281 + }, + { + "name": "flash/events/HTTPStatusEvent", + "defs": [ + "flash.events:HTTPStatusEvent" + ], + "offset": 53250, + "length": 746 + }, + { + "name": "flash/events/IEventDispatcher", + "defs": [ + "flash.events:IEventDispatcher" + ], + "offset": 53996, + "length": 353 + }, + { + "name": "flash/events/IMEEvent", + "defs": [ + "flash.events:IMEEvent" + ], + "offset": 54349, + "length": 632 + }, + { + "name": "flash/events/IOErrorEvent", + "defs": [ + "flash.events:IOErrorEvent" + ], + "offset": 54981, + "length": 605 + }, + { + "name": "flash/events/KeyboardEvent", + "defs": [ + "flash.events:KeyboardEvent" + ], + "offset": 55586, + "length": 1044 + }, + { + "name": "flash/events/MouseEvent", + "defs": [ + "flash.events:MouseEvent" + ], + "offset": 56630, + "length": 2142 + }, + { + "name": "flash/events/NetDataEvent", + "defs": [ + "flash.events:NetDataEvent" + ], + "offset": 58772, + "length": 565 + }, + { + "name": "flash/events/NetFilterEvent", + "defs": [ + "flash.events:NetFilterEvent" + ], + "offset": 59337, + "length": 454 + }, + { + "name": "flash/events/NetMonitorEvent", + "defs": [ + "flash.events:NetMonitorEvent" + ], + "offset": 59791, + "length": 516 + }, + { + "name": "flash/events/NetStatusEvent", + "defs": [ + "flash.events:NetStatusEvent" + ], + "offset": 60307, + "length": 498 + }, + { + "name": "flash/events/OutputProgressEvent", + "defs": [ + "flash.events:OutputProgressEvent" + ], + "offset": 60805, + "length": 638 + }, + { + "name": "flash/events/PressAndTapGestureEvent", + "defs": [ + "flash.events:PressAndTapGestureEvent" + ], + "offset": 61443, + "length": 944 + }, + { + "name": "flash/events/ProgressEvent", + "defs": [ + "flash.events:ProgressEvent" + ], + "offset": 62387, + "length": 647 + }, + { + "name": "flash/events/SampleDataEvent", + "defs": [ + "flash.events:SampleDataEvent" + ], + "offset": 63034, + "length": 639 + }, + { + "name": "flash/events/SecurityErrorEvent", + "defs": [ + "flash.events:SecurityErrorEvent" + ], + "offset": 63673, + "length": 511 + }, + { + "name": "flash/events/ShaderEvent", + "defs": [ + "flash.events:ShaderEvent" + ], + "offset": 64184, + "length": 742 + }, + { + "name": "flash/events/SoftKeyboardEvent", + "defs": [ + "flash.events:SoftKeyboardEvent" + ], + "offset": 64926, + "length": 793 + }, + { + "name": "flash/events/SoftKeyboardTrigger", + "defs": [ + "flash.events:SoftKeyboardTrigger" + ], + "offset": 65719, + "length": 287 + }, + { + "name": "flash/events/StageVideoAvailabilityEvent", + "defs": [ + "flash.events:StageVideoAvailabilityEvent" + ], + "offset": 66006, + "length": 377 + }, + { + "name": "flash/events/StageVideoEvent", + "defs": [ + "flash.events:StageVideoEvent" + ], + "offset": 66383, + "length": 535 + }, + { + "name": "flash/events/StatusEvent", + "defs": [ + "flash.events:StatusEvent" + ], + "offset": 66918, + "length": 578 + }, + { + "name": "flash/events/SyncEvent", + "defs": [ + "flash.events:SyncEvent" + ], + "offset": 67496, + "length": 466 + }, + { + "name": "flash/events/TextEvent", + "defs": [ + "flash.events:TextEvent" + ], + "offset": 67962, + "length": 569 + }, + { + "name": "flash/events/ThrottleEvent", + "defs": [ + "flash.events:ThrottleEvent" + ], + "offset": 68531, + "length": 553 + }, + { + "name": "flash/events/ThrottleType", + "defs": [ + "flash.events:ThrottleType" + ], + "offset": 69084, + "length": 268 + }, + { + "name": "flash/events/TimerEvent", + "defs": [ + "flash.events:TimerEvent" + ], + "offset": 69352, + "length": 505 + }, + { + "name": "flash/events/TouchEvent", + "defs": [ + "flash.events:TouchEvent" + ], + "offset": 69857, + "length": 2322 + }, + { + "name": "flash/events/TransformGestureEvent", + "defs": [ + "flash.events:TransformGestureEvent" + ], + "offset": 72179, + "length": 1154 + }, + { + "name": "flash/events/UncaughtErrorEvent", + "defs": [ + "flash.events:UncaughtErrorEvent" + ], + "offset": 73333, + "length": 525 + }, + { + "name": "flash/events/UncaughtErrorEvents", + "defs": [ + "flash.events:UncaughtErrorEvents" + ], + "offset": 73858, + "length": 208 + }, + { + "name": "flash/events/VideoEvent", + "defs": [ + "flash.events:VideoEvent" + ], + "offset": 74066, + "length": 461 + }, + { + "name": "flash/geom/ColorTransform", + "defs": [ + "flash.geom:ColorTransform" + ], + "offset": 74527, + "length": 885 + }, + { + "name": "flash/geom/Matrix", + "defs": [ + "flash.geom:Matrix" + ], + "offset": 75412, + "length": 2147 + }, + { + "name": "flash/geom/Matrix3D", + "defs": [ + "flash.geom:Matrix3D" + ], + "offset": 77559, + "length": 1132 + }, + { + "name": "flash/geom/Orientation3D", + "defs": [ + "flash.geom:Orientation3D" + ], + "offset": 78691, + "length": 290 + }, + { + "name": "flash/geom/PerspectiveProjection", + "defs": [ + "flash.geom:PerspectiveProjection" + ], + "offset": 78981, + "length": 389 + }, + { + "name": "flash/geom/Point", + "defs": [ + "flash.geom:Point" + ], + "offset": 79370, + "length": 1010 + }, + { + "name": "flash/geom/Rectangle", + "defs": [ + "flash.geom:Rectangle" + ], + "offset": 80380, + "length": 1992 + }, + { + "name": "flash/geom/Transform", + "defs": [ + "flash.geom:Transform" + ], + "offset": 82372, + "length": 590 + }, + { + "name": "flash/geom/Utils3D", + "defs": [ + "flash.geom:Utils3D" + ], + "offset": 82962, + "length": 342 + }, + { + "name": "flash/geom/Vector3D", + "defs": [ + "flash.geom:Vector3D" + ], + "offset": 83304, + "length": 1664 + }, + { + "name": "flash/filters/BevelFilter", + "defs": [ + "flash.filters:BevelFilter" + ], + "offset": 84968, + "length": 808 + }, + { + "name": "flash/filters/BitmapFilter", + "defs": [ + "flash.filters:BitmapFilter" + ], + "offset": 85776, + "length": 200 + }, + { + "name": "flash/filters/BitmapFilterQuality", + "defs": [ + "flash.filters:BitmapFilterQuality" + ], + "offset": 85976, + "length": 256 + }, + { + "name": "flash/filters/BitmapFilterType", + "defs": [ + "flash.filters:BitmapFilterType" + ], + "offset": 86232, + "length": 268 + }, + { + "name": "flash/filters/BlurFilter", + "defs": [ + "flash.filters:BlurFilter" + ], + "offset": 86500, + "length": 393 + }, + { + "name": "flash/filters/ColorMatrixFilter", + "defs": [ + "flash.filters:ColorMatrixFilter" + ], + "offset": 86893, + "length": 337 + }, + { + "name": "flash/filters/ConvolutionFilter", + "defs": [ + "flash.filters:ConvolutionFilter" + ], + "offset": 87230, + "length": 675 + }, + { + "name": "flash/filters/DisplacementMapFilter", + "defs": [ + "flash.filters:DisplacementMapFilter" + ], + "offset": 87905, + "length": 743 + }, + { + "name": "flash/filters/DisplacementMapFilterMode", + "defs": [ + "flash.filters:DisplacementMapFilterMode" + ], + "offset": 88648, + "length": 315 + }, + { + "name": "flash/filters/DropShadowFilter", + "defs": [ + "flash.filters:DropShadowFilter" + ], + "offset": 88963, + "length": 742 + }, + { + "name": "flash/filters/GlowFilter", + "defs": [ + "flash.filters:GlowFilter" + ], + "offset": 89705, + "length": 608 + }, + { + "name": "flash/filters/GradientBevelFilter", + "defs": [ + "flash.filters:GradientBevelFilter" + ], + "offset": 90313, + "length": 784 + }, + { + "name": "flash/filters/GradientGlowFilter", + "defs": [ + "flash.filters:GradientGlowFilter" + ], + "offset": 91097, + "length": 781 + }, + { + "name": "flash/filters/ShaderFilter", + "defs": [ + "flash.filters:ShaderFilter" + ], + "offset": 91878, + "length": 626 + }, + { + "name": "flash/globalization/Collator", + "defs": [ + "flash.globalization:Collator" + ], + "offset": 92504, + "length": 692 + }, + { + "name": "flash/globalization/CollatorMode", + "defs": [ + "flash.globalization:CollatorMode" + ], + "offset": 93196, + "length": 257 + }, + { + "name": "flash/globalization/CurrencyFormatter", + "defs": [ + "flash.globalization:CurrencyFormatter" + ], + "offset": 93453, + "length": 1104 + }, + { + "name": "flash/globalization/CurrencyParseResult", + "defs": [ + "flash.globalization:CurrencyParseResult" + ], + "offset": 94557, + "length": 350 + }, + { + "name": "flash/globalization/DateTimeFormatter", + "defs": [ + "flash.globalization:DateTimeFormatter" + ], + "offset": 94907, + "length": 830 + }, + { + "name": "flash/globalization/DateTimeNameContext", + "defs": [ + "flash.globalization:DateTimeNameContext" + ], + "offset": 95737, + "length": 273 + }, + { + "name": "flash/globalization/DateTimeNameStyle", + "defs": [ + "flash.globalization:DateTimeNameStyle" + ], + "offset": 96010, + "length": 330 + }, + { + "name": "flash/globalization/DateTimeStyle", + "defs": [ + "flash.globalization:DateTimeStyle" + ], + "offset": 96340, + "length": 330 + }, + { + "name": "flash/globalization/LastOperationStatus", + "defs": [ + "flash.globalization:LastOperationStatus" + ], + "offset": 96670, + "length": 1104 + }, + { + "name": "flash/globalization/LocaleID", + "defs": [ + "flash.globalization:LocaleID" + ], + "offset": 97774, + "length": 560 + }, + { + "name": "flash/globalization/NationalDigitsType", + "defs": [ + "flash.globalization:NationalDigitsType" + ], + "offset": 98334, + "length": 1055 + }, + { + "name": "flash/globalization/NumberFormatter", + "defs": [ + "flash.globalization:NumberFormatter" + ], + "offset": 99389, + "length": 946 + }, + { + "name": "flash/globalization/NumberParseResult", + "defs": [ + "flash.globalization:NumberParseResult" + ], + "offset": 100335, + "length": 367 + }, + { + "name": "flash/globalization/StringTools", + "defs": [ + "flash.globalization:StringTools" + ], + "offset": 100702, + "length": 460 + }, + { + "name": "flash/media/AudioDecoder", + "defs": [ + "flash.media:AudioDecoder" + ], + "offset": 101162, + "length": 448 + }, + { + "name": "flash/media/Camera", + "defs": [ + "flash.media:Camera" + ], + "offset": 101610, + "length": 1029 + }, + { + "name": "flash/media/H264Level", + "defs": [ + "flash.media:H264Level" + ], + "offset": 102639, + "length": 613 + }, + { + "name": "flash/media/H264Profile", + "defs": [ + "flash.media:H264Profile" + ], + "offset": 103252, + "length": 233 + }, + { + "name": "flash/media/H264VideoStreamSettings", + "defs": [ + "flash.media:H264VideoStreamSettings" + ], + "offset": 103485, + "length": 1137 + }, + { + "name": "flash/media/ID3Info", + "defs": [ + "flash.media:ID3Info" + ], + "offset": 104622, + "length": 270 + }, + { + "name": "flash/media/Microphone", + "defs": [ + "flash.media:Microphone" + ], + "offset": 104892, + "length": 986 + }, + { + "name": "flash/media/MicrophoneEnhancedMode", + "defs": [ + "flash.media:MicrophoneEnhancedMode" + ], + "offset": 105878, + "length": 367 + }, + { + "name": "flash/media/MicrophoneEnhancedOptions", + "defs": [ + "flash.media:MicrophoneEnhancedOptions" + ], + "offset": 106245, + "length": 604 + }, + { + "name": "flash/media/Sound", + "defs": [ + "flash.media:Sound" + ], + "offset": 106849, + "length": 837 + }, + { + "name": "flash/media/SoundChannel", + "defs": [ + "flash.media:SoundChannel" + ], + "offset": 107686, + "length": 390 + }, + { + "name": "flash/media/SoundCodec", + "defs": [ + "flash.media:SoundCodec" + ], + "offset": 108076, + "length": 287 + }, + { + "name": "flash/media/SoundLoaderContext", + "defs": [ + "flash.media:SoundLoaderContext" + ], + "offset": 108363, + "length": 261 + }, + { + "name": "flash/media/SoundMixer", + "defs": [ + "flash.media:SoundMixer" + ], + "offset": 108624, + "length": 513 + }, + { + "name": "flash/media/SoundTransform", + "defs": [ + "flash.media:SoundTransform" + ], + "offset": 109137, + "length": 536 + }, + { + "name": "flash/media/StageVideo", + "defs": [ + "flash.media:StageVideo" + ], + "offset": 109673, + "length": 570 + }, + { + "name": "flash/media/StageVideoAvailability", + "defs": [ + "flash.media:StageVideoAvailability" + ], + "offset": 110243, + "length": 271 + }, + { + "name": "flash/media/Video", + "defs": [ + "flash.media:Video" + ], + "offset": 110514, + "length": 533 + }, + { + "name": "flash/media/VideoCodec", + "defs": [ + "flash.media:VideoCodec" + ], + "offset": 111047, + "length": 256 + }, + { + "name": "flash/media/VideoStatus", + "defs": [ + "flash.media:VideoStatus" + ], + "offset": 111303, + "length": 286 + }, + { + "name": "flash/media/VideoStreamSettings", + "defs": [ + "flash.media:VideoStreamSettings" + ], + "offset": 111589, + "length": 651 + }, + { + "name": "flash/profiler/Telemetry", + "defs": [ + "flash.profiler:Telemetry" + ], + "offset": 112240, + "length": 422 + }, + { + "name": "flash/printing/PrintJob", + "defs": [ + "flash.printing:PrintJob" + ], + "offset": 112662, + "length": 711 + }, + { + "name": "flash/printing/PrintJobOptions", + "defs": [ + "flash.printing:PrintJobOptions" + ], + "offset": 113373, + "length": 216 + }, + { + "name": "flash/printing/PrintJobOrientation", + "defs": [ + "flash.printing:PrintJobOrientation" + ], + "offset": 113589, + "length": 265 + }, + { + "name": "flash/security/CertificateStatus", + "defs": [ + "flash.security:CertificateStatus" + ], + "offset": 113854, + "length": 533 + }, + { + "name": "flash/security/X500DistinguishedName", + "defs": [ + "flash.security:X500DistinguishedName" + ], + "offset": 114387, + "length": 427 + }, + { + "name": "flash/security/X509Certificate", + "defs": [ + "flash.security:X509Certificate" + ], + "offset": 114814, + "length": 635 + }, + { + "name": "flash/sampler/ClassFactory", + "defs": [ + "flash.sampler:ClassFactory" + ], + "offset": 115449, + "length": 285 + }, + { + "name": "flash/sampler/DeleteObjectSample", + "defs": [ + "flash.sampler:DeleteObjectSample" + ], + "offset": 115734, + "length": 233 + }, + { + "name": "flash/sampler/NewObjectSample", + "defs": [ + "flash.sampler:NewObjectSample" + ], + "offset": 115967, + "length": 308 + }, + { + "name": "flash/sampler/Sample", + "defs": [ + "flash.sampler:Sample" + ], + "offset": 116275, + "length": 205 + }, + { + "name": "flash/sampler/StackFrame", + "defs": [ + "flash.sampler:StackFrame" + ], + "offset": 116480, + "length": 310 + }, + { + "name": "flash/system/ApplicationDomain", + "defs": [ + "flash.system:ApplicationDomain" + ], + "offset": 116790, + "length": 543 + }, + { + "name": "flash/system/ApplicationInstaller", + "defs": [ + "flash.system:ApplicationInstaller" + ], + "offset": 117333, + "length": 426 + }, + { + "name": "flash/system/AuthorizedFeatures", + "defs": [ + "flash.system:AuthorizedFeatures" + ], + "offset": 117759, + "length": 456 + }, + { + "name": "flash/system/AuthorizedFeaturesLoader", + "defs": [ + "flash.system:AuthorizedFeaturesLoader" + ], + "offset": 118215, + "length": 398 + }, + { + "name": "flash/system/Capabilities", + "defs": [ + "flash.system:Capabilities" + ], + "offset": 118613, + "length": 1133 + }, + { + "name": "flash/system/DomainMemoryWithStage3D", + "defs": [ + "flash.system:DomainMemoryWithStage3D" + ], + "offset": 119746, + "length": 191 + }, + { + "name": "flash/system/FSCommand", + "defs": [ + "flash.system:FSCommand", + "flash.system:fscommand" + ], + "offset": 119937, + "length": 285 + }, + { + "name": "flash/system/ImageDecodingPolicy", + "defs": [ + "flash.system:ImageDecodingPolicy" + ], + "offset": 120222, + "length": 257 + }, + { + "name": "flash/system/IME", + "defs": [ + "flash.system:IME" + ], + "offset": 120479, + "length": 507 + }, + { + "name": "flash/system/IMEConversionMode", + "defs": [ + "flash.system:IMEConversionMode" + ], + "offset": 120986, + "length": 432 + }, + { + "name": "flash/system/JPEGLoaderContext", + "defs": [ + "flash.system:JPEGLoaderContext" + ], + "offset": 121418, + "length": 309 + }, + { + "name": "flash/system/LoaderContext", + "defs": [ + "flash.system:LoaderContext" + ], + "offset": 121727, + "length": 515 + }, + { + "name": "flash/system/MessageChannel", + "defs": [ + "flash.system:MessageChannel" + ], + "offset": 122242, + "length": 584 + }, + { + "name": "flash/system/MessageChannelState", + "defs": [ + "flash.system:MessageChannelState" + ], + "offset": 122826, + "length": 278 + }, + { + "name": "flash/system/Security", + "defs": [ + "flash.system:Security" + ], + "offset": 123104, + "length": 773 + }, + { + "name": "flash/system/SecurityDomain", + "defs": [ + "flash.system:SecurityDomain" + ], + "offset": 123877, + "length": 265 + }, + { + "name": "flash/system/SecurityPanel", + "defs": [ + "flash.system:SecurityPanel" + ], + "offset": 124142, + "length": 430 + }, + { + "name": "flash/system/System", + "defs": [ + "flash.system:System" + ], + "offset": 124572, + "length": 629 + }, + { + "name": "flash/system/SystemUpdater", + "defs": [ + "flash.system:SystemUpdater" + ], + "offset": 125201, + "length": 322 + }, + { + "name": "flash/system/SystemUpdaterType", + "defs": [ + "flash.system:SystemUpdaterType" + ], + "offset": 125523, + "length": 241 + }, + { + "name": "flash/system/TouchscreenType", + "defs": [ + "flash.system:TouchscreenType" + ], + "offset": 125764, + "length": 268 + }, + { + "name": "flash/trace/Trace", + "defs": [ + "flash.trace:Trace" + ], + "offset": 126032, + "length": 488 + }, + { + "name": "flash/ui/ContextMenu", + "defs": [ + "flash.ui:ContextMenu" + ], + "offset": 126520, + "length": 1036 + }, + { + "name": "flash/ui/ContextMenuBuiltInItems", + "defs": [ + "flash.ui:ContextMenuBuiltInItems" + ], + "offset": 127556, + "length": 871 + }, + { + "name": "flash/ui/ContextMenuClipboardItems", + "defs": [ + "flash.ui:ContextMenuClipboardItems" + ], + "offset": 128427, + "length": 587 + }, + { + "name": "flash/ui/ContextMenuItem", + "defs": [ + "flash.ui:ContextMenuItem" + ], + "offset": 129014, + "length": 472 + }, + { + "name": "flash/ui/GameInput", + "defs": [ + "flash.ui:GameInput" + ], + "offset": 129486, + "length": 333 + }, + { + "name": "flash/ui/GameInputControl", + "defs": [ + "flash.ui:GameInputControl" + ], + "offset": 129819, + "length": 458 + }, + { + "name": "flash/ui/GameInputControlType", + "defs": [ + "flash.ui:GameInputControlType" + ], + "offset": 130277, + "length": 389 + }, + { + "name": "flash/ui/GameInputDevice", + "defs": [ + "flash.ui:GameInputDevice" + ], + "offset": 130666, + "length": 623 + }, + { + "name": "flash/ui/GameInputFinger", + "defs": [ + "flash.ui:GameInputFinger" + ], + "offset": 131289, + "length": 291 + }, + { + "name": "flash/ui/GameInputHand", + "defs": [ + "flash.ui:GameInputHand" + ], + "offset": 131580, + "length": 256 + }, + { + "name": "flash/ui/Keyboard", + "defs": [ + "flash.ui:Keyboard" + ], + "offset": 131836, + "length": 9336 + }, + { + "name": "flash/ui/KeyboardType", + "defs": [ + "flash.ui:KeyboardType" + ], + "offset": 141172, + "length": 266 + }, + { + "name": "flash/ui/KeyLocation", + "defs": [ + "flash.ui:KeyLocation" + ], + "offset": 141438, + "length": 273 + }, + { + "name": "flash/ui/Mouse", + "defs": [ + "flash.ui:Mouse" + ], + "offset": 141711, + "length": 397 + }, + { + "name": "flash/ui/MouseCursor", + "defs": [ + "flash.ui:MouseCursor" + ], + "offset": 142108, + "length": 302 + }, + { + "name": "flash/ui/MouseCursorData", + "defs": [ + "flash.ui:MouseCursorData" + ], + "offset": 142410, + "length": 352 + }, + { + "name": "flash/ui/Multitouch", + "defs": [ + "flash.ui:Multitouch" + ], + "offset": 142762, + "length": 435 + }, + { + "name": "flash/ui/MultitouchInputMode", + "defs": [ + "flash.ui:MultitouchInputMode" + ], + "offset": 143197, + "length": 279 + }, + { + "name": "flash/sensors/Accelerometer", + "defs": [ + "flash.sensors:Accelerometer" + ], + "offset": 143476, + "length": 357 + }, + { + "name": "flash/sensors/Geolocation", + "defs": [ + "flash.sensors:Geolocation" + ], + "offset": 143833, + "length": 351 + }, + { + "name": "flash/display3d/Context3D", + "defs": [ + "flash.display3D:Context3D" + ], + "offset": 144184, + "length": 2088 + }, + { + "name": "flash/display3d/Context3DBlendFactor", + "defs": [ + "flash.display3D:Context3DBlendFactor" + ], + "offset": 146272, + "length": 681 + }, + { + "name": "flash/display3d/Context3DClearMask", + "defs": [ + "flash.display3D:Context3DClearMask" + ], + "offset": 146953, + "length": 292 + }, + { + "name": "flash/display3d/Context3DProfile", + "defs": [ + "flash.display3D:Context3DProfile" + ], + "offset": 147245, + "length": 282 + }, + { + "name": "flash/display3d/Context3DProgramType", + "defs": [ + "flash.display3D:Context3DProgramType" + ], + "offset": 147527, + "length": 263 + }, + { + "name": "flash/display3d/Context3DRenderMode", + "defs": [ + "flash.display3D:Context3DRenderMode" + ], + "offset": 147790, + "length": 257 + }, + { + "name": "flash/display3d/Context3DCompareMode", + "defs": [ + "flash.display3D:Context3DCompareMode" + ], + "offset": 148047, + "length": 452 + }, + { + "name": "flash/display3d/Context3DStencilAction", + "defs": [ + "flash.display3D:Context3DStencilAction" + ], + "offset": 148499, + "length": 499 + }, + { + "name": "flash/display3d/Context3DTextureFormat", + "defs": [ + "flash.display3D:Context3DTextureFormat" + ], + "offset": 148998, + "length": 315 + }, + { + "name": "flash/display3d/Context3DTriangleFace", + "defs": [ + "flash.display3D:Context3DTriangleFace" + ], + "offset": 149313, + "length": 323 + }, + { + "name": "flash/display3d/Context3DVertexBufferFormat", + "defs": [ + "flash.display3D:Context3DVertexBufferFormat" + ], + "offset": 149636, + "length": 365 + }, + { + "name": "flash/display3d/IndexBuffer3D", + "defs": [ + "flash.display3D:IndexBuffer3D" + ], + "offset": 150001, + "length": 364 + }, + { + "name": "flash/display3d/Program3D", + "defs": [ + "flash.display3D:Program3D" + ], + "offset": 150365, + "length": 275 + }, + { + "name": "flash/display3d/VertexBuffer3D", + "defs": [ + "flash.display3D:VertexBuffer3D" + ], + "offset": 150640, + "length": 367 + }, + { + "name": "flash/display3d/textures/CubeTexture", + "defs": [ + "flash.display3D.textures:CubeTexture" + ], + "offset": 151007, + "length": 501 + }, + { + "name": "flash/display3d/textures/Texture", + "defs": [ + "flash.display3D.textures:Texture" + ], + "offset": 151508, + "length": 487 + }, + { + "name": "flash/display3d/textures/TextureBase", + "defs": [ + "flash.display3D.textures:TextureBase" + ], + "offset": 151995, + "length": 292 + }, + { + "name": "flash/net/DynamicPropertyOutput", + "defs": [ + "flash.net:DynamicPropertyOutput" + ], + "offset": 152287, + "length": 308 + }, + { + "name": "flash/net/FileFilter", + "defs": [ + "flash.net:FileFilter" + ], + "offset": 152595, + "length": 318 + }, + { + "name": "flash/net/FileReference", + "defs": [ + "flash.net:FileReference" + ], + "offset": 152913, + "length": 666 + }, + { + "name": "flash/net/FileReferenceList", + "defs": [ + "flash.net:FileReferenceList" + ], + "offset": 153579, + "length": 315 + }, + { + "name": "flash/net/GroupSpecifier", + "defs": [ + "flash.net:GroupSpecifier" + ], + "offset": 153894, + "length": 1492 + }, + { + "name": "flash/net/IDynamicPropertyOutput", + "defs": [ + "flash.net:IDynamicPropertyOutput" + ], + "offset": 155386, + "length": 197 + }, + { + "name": "flash/net/IDynamicPropertyWriter", + "defs": [ + "flash.net:IDynamicPropertyWriter" + ], + "offset": 155583, + "length": 225 + }, + { + "name": "flash/net/LocalConnection", + "defs": [ + "flash.net:LocalConnection" + ], + "offset": 155808, + "length": 495 + }, + { + "name": "flash/net/NetConnection", + "defs": [ + "flash.net:NetConnection" + ], + "offset": 156303, + "length": 906 + }, + { + "name": "flash/net/NetGroup", + "defs": [ + "flash.net:NetGroup" + ], + "offset": 157209, + "length": 1299 + }, + { + "name": "flash/net/NetGroupInfo", + "defs": [ + "flash.net:NetGroupInfo" + ], + "offset": 158508, + "length": 768 + }, + { + "name": "flash/net/NetGroupReceiveMode", + "defs": [ + "flash.net:NetGroupReceiveMode" + ], + "offset": 159276, + "length": 245 + }, + { + "name": "flash/net/NetGroupReplicationStrategy", + "defs": [ + "flash.net:NetGroupReplicationStrategy" + ], + "offset": 159521, + "length": 283 + }, + { + "name": "flash/net/NetGroupSendMode", + "defs": [ + "flash.net:NetGroupSendMode" + ], + "offset": 159804, + "length": 273 + }, + { + "name": "flash/net/NetGroupSendResult", + "defs": [ + "flash.net:NetGroupSendResult" + ], + "offset": 160077, + "length": 270 + }, + { + "name": "flash/net/NetMonitor", + "defs": [ + "flash.net:NetMonitor" + ], + "offset": 160347, + "length": 279 + }, + { + "name": "flash/net/NetStream", + "defs": [ + "flash.net:NetStream" + ], + "offset": 160626, + "length": 3103 + }, + { + "name": "flash/net/NetStreamAppendBytesAction", + "defs": [ + "flash.net:NetStreamAppendBytesAction" + ], + "offset": 163729, + "length": 315 + }, + { + "name": "flash/net/NetStreamMulticastInfo", + "defs": [ + "flash.net:NetStreamMulticastInfo" + ], + "offset": 164044, + "length": 2712 + }, + { + "name": "flash/net/NetStreamInfo", + "defs": [ + "flash.net:NetStreamInfo" + ], + "offset": 166756, + "length": 1958 + }, + { + "name": "flash/net/NetStreamPlayOptions", + "defs": [ + "flash.net:NetStreamPlayOptions" + ], + "offset": 168714, + "length": 355 + }, + { + "name": "flash/net/NetStreamPlayTransitions", + "defs": [ + "flash.net:NetStreamPlayTransitions" + ], + "offset": 169069, + "length": 406 + }, + { + "name": "flash/net/ObjectEncoding", + "defs": [ + "flash.net:ObjectEncoding" + ], + "offset": 169475, + "length": 345 + }, + { + "name": "flash/net/Responder", + "defs": [ + "flash.net:Responder" + ], + "offset": 169820, + "length": 239 + }, + { + "name": "flash/net/SecureSocket", + "defs": [ + "flash.net:SecureSocket" + ], + "offset": 170059, + "length": 566 + }, + { + "name": "flash/net/SharedObject", + "defs": [ + "flash.net:SharedObject" + ], + "offset": 170625, + "length": 1122 + }, + { + "name": "flash/net/SharedObjectFlushStatus", + "defs": [ + "flash.net:SharedObjectFlushStatus" + ], + "offset": 171747, + "length": 257 + }, + { + "name": "flash/net/URLLoader", + "defs": [ + "flash.net:URLLoader" + ], + "offset": 172004, + "length": 1501 + }, + { + "name": "flash/net/Socket", + "defs": [ + "flash.net:Socket" + ], + "offset": 173505, + "length": 1282 + }, + { + "name": "flash/net/URLLoaderDataFormat", + "defs": [ + "flash.net:URLLoaderDataFormat" + ], + "offset": 174787, + "length": 276 + }, + { + "name": "flash/net/URLRequest", + "defs": [ + "flash.net:URLRequest" + ], + "offset": 175063, + "length": 610 + }, + { + "name": "flash/net/URLRequestHeader", + "defs": [ + "flash.net:URLRequestHeader" + ], + "offset": 175673, + "length": 223 + }, + { + "name": "flash/net/URLStream", + "defs": [ + "flash.net:URLStream" + ], + "offset": 175896, + "length": 908 + }, + { + "name": "flash/net/URLRequestMethod", + "defs": [ + "flash.net:URLRequestMethod" + ], + "offset": 176804, + "length": 304 + }, + { + "name": "flash/net/URLVariables", + "defs": [ + "flash.net:URLVariables" + ], + "offset": 177108, + "length": 937 + }, + { + "name": "flash/net/XMLSocket", + "defs": [ + "flash.net:XMLSocket" + ], + "offset": 178045, + "length": 480 + }, + { + "name": "flash/text/AntiAliasType", + "defs": [ + "flash.text:AntiAliasType" + ], + "offset": 178525, + "length": 239 + }, + { + "name": "flash/text/CSMSettings", + "defs": [ + "flash.text:CSMSettings" + ], + "offset": 178764, + "length": 248 + }, + { + "name": "flash/text/Font", + "defs": [ + "flash.text:Font" + ], + "offset": 179012, + "length": 361 + }, + { + "name": "flash/text/FontStyle", + "defs": [ + "flash.text:FontStyle" + ], + "offset": 179373, + "length": 292 + }, + { + "name": "flash/text/FontType", + "defs": [ + "flash.text:FontType" + ], + "offset": 179665, + "length": 269 + }, + { + "name": "flash/text/GridFitType", + "defs": [ + "flash.text:GridFitType" + ], + "offset": 179934, + "length": 258 + }, + { + "name": "flash/text/StaticText", + "defs": [ + "flash.text:StaticText" + ], + "offset": 180192, + "length": 299 + }, + { + "name": "flash/text/StyleSheet", + "defs": [ + "flash.text:StyleSheet" + ], + "offset": 180491, + "length": 523 + }, + { + "name": "flash/text/TextColorType", + "defs": [ + "flash.text:TextColorType" + ], + "offset": 181014, + "length": 241 + }, + { + "name": "flash/text/TextDisplayMode", + "defs": [ + "flash.text:TextDisplayMode" + ], + "offset": 181255, + "length": 258 + }, + { + "name": "flash/text/TextField", + "defs": [ + "flash.text:TextField" + ], + "offset": 181513, + "length": 2507 + }, + { + "name": "flash/text/TextFieldAutoSize", + "defs": [ + "flash.text:TextFieldAutoSize" + ], + "offset": 184020, + "length": 291 + }, + { + "name": "flash/text/TextFieldType", + "defs": [ + "flash.text:TextFieldType" + ], + "offset": 184311, + "length": 235 + }, + { + "name": "flash/text/TextFormat", + "defs": [ + "flash.text:TextFormat" + ], + "offset": 184546, + "length": 943 + }, + { + "name": "flash/text/TextFormatAlign", + "defs": [ + "flash.text:TextFormatAlign" + ], + "offset": 185489, + "length": 343 + }, + { + "name": "flash/text/TextFormatDisplay", + "defs": [ + "flash.text:TextFormatDisplay" + ], + "offset": 185832, + "length": 241 + }, + { + "name": "flash/text/TextInteractionMode", + "defs": [ + "flash.text:TextInteractionMode" + ], + "offset": 186073, + "length": 253 + }, + { + "name": "flash/text/TextLineMetrics", + "defs": [ + "flash.text:TextLineMetrics" + ], + "offset": 186326, + "length": 300 + }, + { + "name": "flash/text/TextRenderer", + "defs": [ + "flash.text:TextRenderer" + ], + "offset": 186626, + "length": 373 + }, + { + "name": "flash/text/TextRun", + "defs": [ + "flash.text:TextRun" + ], + "offset": 186999, + "length": 246 + }, + { + "name": "flash/text/TextSnapshot", + "defs": [ + "flash.text:TextSnapshot" + ], + "offset": 187245, + "length": 513 + }, + { + "name": "flash/text/engine/BreakOpportunity", + "defs": [ + "flash.text.engine:BreakOpportunity" + ], + "offset": 187758, + "length": 293 + }, + { + "name": "flash/text/engine/CFFHinting", + "defs": [ + "flash.text.engine:CFFHinting" + ], + "offset": 188051, + "length": 256 + }, + { + "name": "flash/text/engine/ContentElement", + "defs": [ + "flash.text.engine:ContentElement" + ], + "offset": 188307, + "length": 624 + }, + { + "name": "flash/text/engine/DigitCase", + "defs": [ + "flash.text.engine:DigitCase" + ], + "offset": 188931, + "length": 277 + }, + { + "name": "flash/text/engine/DigitWidth", + "defs": [ + "flash.text.engine:DigitWidth" + ], + "offset": 189208, + "length": 288 + }, + { + "name": "flash/text/engine/EastAsianJustifier", + "defs": [ + "flash.text.engine:EastAsianJustifier" + ], + "offset": 189496, + "length": 495 + }, + { + "name": "flash/text/engine/ElementFormat", + "defs": [ + "flash.text.engine:ElementFormat" + ], + "offset": 189991, + "length": 1204 + }, + { + "name": "flash/text/engine/FontDescription", + "defs": [ + "flash.text.engine:FontDescription" + ], + "offset": 191195, + "length": 672 + }, + { + "name": "flash/text/engine/FontLookup", + "defs": [ + "flash.text.engine:FontLookup" + ], + "offset": 191867, + "length": 254 + }, + { + "name": "flash/text/engine/FontMetrics", + "defs": [ + "flash.text.engine:FontMetrics" + ], + "offset": 192121, + "length": 512 + }, + { + "name": "flash/text/engine/FontPosture", + "defs": [ + "flash.text.engine:FontPosture" + ], + "offset": 192633, + "length": 245 + }, + { + "name": "flash/text/engine/FontWeight", + "defs": [ + "flash.text.engine:FontWeight" + ], + "offset": 192878, + "length": 239 + }, + { + "name": "flash/text/engine/GraphicElement", + "defs": [ + "flash.text.engine:GraphicElement" + ], + "offset": 193117, + "length": 497 + }, + { + "name": "flash/text/engine/GroupElement", + "defs": [ + "flash.text.engine:GroupElement" + ], + "offset": 193614, + "length": 714 + }, + { + "name": "flash/text/engine/JustificationStyle", + "defs": [ + "flash.text.engine:JustificationStyle" + ], + "offset": 194328, + "length": 356 + }, + { + "name": "flash/text/engine/Kerning", + "defs": [ + "flash.text.engine:Kerning" + ], + "offset": 194684, + "length": 248 + }, + { + "name": "flash/text/engine/LigatureLevel", + "defs": [ + "flash.text.engine:LigatureLevel" + ], + "offset": 194932, + "length": 338 + }, + { + "name": "flash/text/engine/LineJustification", + "defs": [ + "flash.text.engine:LineJustification" + ], + "offset": 195270, + "length": 388 + }, + { + "name": "flash/text/engine/RenderingMode", + "defs": [ + "flash.text.engine:RenderingMode" + ], + "offset": 195658, + "length": 243 + }, + { + "name": "flash/text/engine/SpaceJustifier", + "defs": [ + "flash.text.engine:SpaceJustifier" + ], + "offset": 195901, + "length": 527 + }, + { + "name": "flash/text/engine/TabAlignment", + "defs": [ + "flash.text.engine:TabAlignment" + ], + "offset": 196428, + "length": 299 + }, + { + "name": "flash/text/engine/TabStop", + "defs": [ + "flash.text.engine:TabStop" + ], + "offset": 196727, + "length": 357 + }, + { + "name": "flash/text/engine/TextBaseline", + "defs": [ + "flash.text.engine:TextBaseline" + ], + "offset": 197084, + "length": 483 + }, + { + "name": "flash/text/engine/TextBlock", + "defs": [ + "flash.text.engine:TextBlock" + ], + "offset": 197567, + "length": 2184 + }, + { + "name": "flash/text/engine/TextElement", + "defs": [ + "flash.text.engine:TextElement" + ], + "offset": 199751, + "length": 383 + }, + { + "name": "flash/text/engine/TextJustifier", + "defs": [ + "flash.text.engine:TextJustifier" + ], + "offset": 200134, + "length": 774 + }, + { + "name": "flash/text/engine/TextLine", + "defs": [ + "flash.text.engine:TextLine" + ], + "offset": 200908, + "length": 2027 + }, + { + "name": "flash/text/engine/TextLineCreationResult", + "defs": [ + "flash.text.engine:TextLineCreationResult" + ], + "offset": 202935, + "length": 360 + }, + { + "name": "flash/text/engine/TextLineMirrorRegion", + "defs": [ + "flash.text.engine:TextLineMirrorRegion" + ], + "offset": 203295, + "length": 451 + }, + { + "name": "flash/text/engine/TextLineValidity", + "defs": [ + "flash.text.engine:TextLineValidity" + ], + "offset": 203746, + "length": 332 + }, + { + "name": "flash/text/engine/TextRotation", + "defs": [ + "flash.text.engine:TextRotation" + ], + "offset": 204078, + "length": 352 + }, + { + "name": "flash/text/engine/TypographicCase", + "defs": [ + "flash.text.engine:TypographicCase" + ], + "offset": 204430, + "length": 436 + }, + { + "name": "flash/text/ime/CompositionAttributeRange", + "defs": [ + "flash.text.ime:CompositionAttributeRange" + ], + "offset": 204866, + "length": 315 + }, + { + "name": "flash/text/ime/IIMEClient", + "defs": [ + "flash.text.ime:IIMEClient" + ], + "offset": 205181, + "length": 525 + }, + { + "name": "flash/net/FlashNetScript", + "defs": [ + "flash.net:navigateToURL", + "flash.net:sendToURL", + "flash.net:registerClassAlias", + "flash.net:getClassByAlias" + ], + "offset": 205706, + "length": 343 + }, + { + "name": "flash/utils/FlashUtilScript", + "defs": [ + "flash.utils:describeType", + "flash.utils:getAliasName", + "flash.utils:getQualifiedClassName", + "flash.utils:getDefinitionByName", + "flash.utils:getQualifiedSuperclassName", + "flash.utils:getTimer", + "flash.utils:escapeMultiByte", + "flash.utils:unescapeMultiByte" + ], + "offset": 206049, + "length": 606 + }, + { + "name": "flash/utils/Endian", + "defs": [ + "flash.utils:Endian" + ], + "offset": 206655, + "length": 243 + }, + { + "name": "flash/utils/IExternalizable", + "defs": [ + "flash.utils:IExternalizable" + ], + "offset": 206898, + "length": 223 + }, + { + "name": "flash/utils/ObjectInput", + "defs": [ + "flash.utils:ObjectInput" + ], + "offset": 207121, + "length": 706 + }, + { + "name": "flash/utils/ObjectOutput", + "defs": [ + "flash.utils:ObjectOutput" + ], + "offset": 207827, + "length": 648 + }, + { + "name": "flash/utils/Timer", + "defs": [ + "flash.utils:Timer" + ], + "offset": 208475, + "length": 973 + }, + { + "name": "flash/utils/SetIntervalTimer", + "defs": [ + "flash.utils:SetIntervalTimer", + "flash.utils:setInterval", + "flash.utils:setTimeout", + "flash.utils:clearInterval", + "flash.utils:clearTimeout" + ], + "offset": 209448, + "length": 995 + } +] \ No newline at end of file diff --git a/browser/extensions/shumway/content/shumway-worker.js b/browser/extensions/shumway/content/shumway-worker.js index 6032e7e6b24..0943e06b8fb 100644 --- a/browser/extensions/shumway/content/shumway-worker.js +++ b/browser/extensions/shumway/content/shumway-worker.js @@ -4010,7 +4010,7 @@ for (var i = 0; i < 288; ++i) bitLengths[i] = i < 144 || i > 279 ? 8 : i < 256 ? 9 : 7; var fixedLiteralTable = makeHuffmanTable(bitLengths); function makeHuffmanTable(bitLengths) { - var maxBits = max.apply(null, bitLengths); + var maxBits = Math.max.apply(null, bitLengths); var numLengths = bitLengths.length; var size = 1 << maxBits; var codes = new Uint32Array(size); @@ -4042,7 +4042,14 @@ function createInflatedStream(bytes, outputLength) { available: 0, completed: false }; - var state = {}; + var state = { + header: null, + distanceTable: null, + literalTable: null, + sym: null, + len: null, + sym2: null + }; do { inflateBlock(stream, output, state); } while (!output.completed && stream.pos < stream.end); @@ -4050,7 +4057,7 @@ function createInflatedStream(bytes, outputLength) { } var InflateNoDataError = {}; function inflateBlock(stream, output, state) { - var header = state.header !== undefined ? state.header : state.header = readBits(stream.bytes, stream, 3); + var header = state.header !== null ? state.header : state.header = readBits(stream.bytes, stream, 3); switch (header >> 1) { case 0: stream.align(); @@ -4066,10 +4073,7 @@ function inflateBlock(stream, output, state) { var begin = pos + 4; var end = stream.pos = begin + len; var sbytes = stream.bytes, dbytes = output.data; - splice.apply(dbytes, [ - output.available, - len - ].concat(slice.call(sbytes, begin, end))); + dbytes.set(sbytes.subarray(begin, end), output.available); output.available += len; break; case 1: @@ -4077,7 +4081,7 @@ function inflateBlock(stream, output, state) { break; case 2: var distanceTable, literalTable; - if (state.distanceTable !== undefined) { + if (state.distanceTable !== null) { distanceTable = state.distanceTable; literalTable = state.literalTable; } else { @@ -4130,13 +4134,13 @@ function inflateBlock(stream, output, state) { literalTable = state.literalTable = makeHuffmanTable(bitLengths); } inflate(stream, output, literalTable, distanceTable, state); - delete state.distanceTable; - delete state.literalTable; + state.distanceTable = null; + state.literalTable = null; break; default: fail('unknown block type', 'inflate'); } - delete state.header; + state.header = null; output.completed = !(!(header & 1)); } function readBits(bytes, stream, size) { @@ -4165,22 +4169,22 @@ function inflate(stream, output, literalTable, distanceTable, state) { var pos = output.available; var dbytes = output.data; var sbytes = stream.bytes; - var sym = state.sym !== undefined ? state.sym : readCode(sbytes, stream, literalTable); + var sym = state.sym !== null ? state.sym : readCode(sbytes, stream, literalTable); while (sym !== 256) { if (sym < 256) { dbytes[pos++] = sym; } else { state.sym = sym; sym -= 257; - var len = state.len !== undefined ? state.len : state.len = lengthCodes[sym] + readBits(sbytes, stream, lengthExtraBits[sym]); - var sym2 = state.sym2 !== undefined ? state.sym2 : state.sym2 = readCode(sbytes, stream, distanceTable); + var len = state.len !== null ? state.len : state.len = lengthCodes[sym] + readBits(sbytes, stream, lengthExtraBits[sym]); + var sym2 = state.sym2 !== null ? state.sym2 : state.sym2 = readCode(sbytes, stream, distanceTable); var distance = distanceCodes[sym2] + readBits(sbytes, stream, distanceExtraBits[sym2]); var i = pos - distance; while (len--) dbytes[pos++] = dbytes[i++]; - delete state.sym2; - delete state.len; - delete state.sym; + state.sym2 = null; + state.len = null; + state.sym = null; } output.available = pos; sym = readCode(sbytes, stream, literalTable); @@ -5827,7 +5831,7 @@ function readTags(context, stream, swfVersion, final, onprogress, onexception) { var tag = null; if (context._readTag) { tag = context._readTag; - delete context._readTag; + context._readTag = null; } try { while (stream.pos < stream.end) { @@ -5951,7 +5955,14 @@ function CompressedPipe(target, length) { this.state = { bitBuffer: 0, bitLength: 0, - compression: {} + compression: { + header: null, + distanceTable: null, + literalTable: null, + sym: null, + len: null, + sym2: null + } }; this.output = { data: new Uint8Array(length), diff --git a/browser/extensions/shumway/content/shumway.js b/browser/extensions/shumway/content/shumway.js index 6aff5e47b90..bd06e66cc92 100644 --- a/browser/extensions/shumway/content/shumway.js +++ b/browser/extensions/shumway/content/shumway.js @@ -454,7 +454,7 @@ var ByteArray = ByteArray || function (undefined) { var numCodes = numLiteralCodes + numDistanceCodes; var numLengthCodes = readBits(input, 4) + 4; for (var i = 0; i < 19; ++i) { - bitLengths[codeLengthOrder[i]] = i < numLengthCodes ? readBits(sbytes, sstream, 3) : 0; + bitLengths[codeLengthOrder[i]] = i < numLengthCodes ? readBits(input, 3) : 0; } var codeLengthTable = makeHuffmanTable(bitLengths); bitLengths = []; @@ -603,158 +603,169 @@ var ByteArray = ByteArray || function (undefined) { }; return ByteArrayClass; }(); -(function (exports) { - var ArgumentParser = function () { - var Argument = function () { - function argument(shortName, longName, type, options) { - this.shortName = shortName; - this.longName = longName; - this.type = type; - options = options || {}; - this.positional = options.positional; - this.parseFn = options.parse; - this.value = options.defaultValue; - } - argument.prototype.parse = function parse(value) { - if (this.type === 'boolean') { - true; - this.value = value; - } else if (this.type === 'number') { - true; - this.value = parseInt(value, 10); - } else { - this.value = value; - } - if (this.parseFn) { - this.parseFn(this.value); - } - }; - return argument; - }(); - function argumentParser() { - this.args = []; - } - argumentParser.prototype.addArgument = function addArgument(shortName, longName, type, options) { - var argument = new Argument(shortName, longName, type, options); - this.args.push(argument); - return argument; - }; - argumentParser.prototype.addBoundOption = function addBoundOption(option) { - var options = { - parse: function (x) { - option.value = x; - } - }; - this.args.push(new Argument(option.shortName, option.longName, option.type, options)); - }; - argumentParser.prototype.addBoundOptionSet = function addBoundOptionSet(optionSet) { - var self = this; - optionSet.options.forEach(function (x) { - if (x instanceof OptionSet) { - self.addBoundOptionSet(x); - } else { - true; - self.addBoundOption(x); - } - }); - }; - argumentParser.prototype.getUsage = function getUsage() { - var str = ''; - this.args.forEach(function (x) { - if (!x.positional) { - str += '[-' + x.shortName + '|--' + x.longName + (x.type === 'boolean' ? '' : ' ' + x.type[0].toUpperCase()) + ']'; - } else { - str += x.longName; - } - str += ' '; - }); - return str; - }; - argumentParser.prototype.parse = function parse(args) { - var nonPositionalArgumentMap = {}; - var positionalArgumentList = []; - this.args.forEach(function (x) { - if (x.positional) { - positionalArgumentList.push(x); - } else { - nonPositionalArgumentMap['-' + x.shortName] = x; - nonPositionalArgumentMap['--' + x.longName] = x; - } - }); - var leftoverArguments = []; - while (args.length) { - var argString = args.shift(); - var argument = null, value = argString; - if (argString == '--') { - leftoverArguments = leftoverArguments.concat(args); - break; - } else if (argString.slice(0, 1) == '-' || argString.slice(0, 2) == '--') { - argument = nonPositionalArgumentMap[argString]; - true; - if (!argument) { - continue; - } - if (argument.type !== 'boolean') { - value = args.shift(); - true; - } else { - value = true; - } - } else if (positionalArgumentList.length) { - argument = positionalArgumentList.shift(); - } else { - leftoverArguments.push(value); - } - if (argument) { - argument.parse(value); - } +var Shumway; +(function (Shumway) { + (function (Options) { + var Argument = function () { + function Argument(shortName, longName, type, options) { + this.shortName = shortName; + this.longName = longName; + this.type = type; + options = options || {}; + this.positional = options.positional; + this.parseFn = options.parse; + this.value = options.defaultValue; } - true; - return leftoverArguments; - }; - return argumentParser; - }(); - var OptionSet = function () { - function optionSet(name) { - this.name = name; - this.options = []; - } - optionSet.prototype.register = function register(option) { - this.options.push(option); - return option; - }; - optionSet.prototype.trace = function trace(writer) { - writer.enter(this.name + ' {'); - this.options.forEach(function (option) { - option.trace(writer); - }); - writer.leave('}'); - }; - return optionSet; - }(); - var Option = function () { - function option(shortName, longName, type, defaultValue, description) { - this.longName = longName; - this.shortName = shortName; - this.type = type; - this.defaultValue = defaultValue; - this.value = defaultValue; - this.description = description; - } - option.prototype.parse = function parse(value) { - this.value = value; - }; - option.prototype.trace = function trace(writer) { - writer.writeLn(('-' + this.shortName + '|--' + this.longName).padRight(' ', 30) + ' = ' + this.type + ' ' + this.value + ' [' + this.defaultValue + ']' + ' (' + this.description + ')'); - }; - return option; - }(); - exports.Option = Option; - exports.OptionSet = OptionSet; - exports.ArgumentParser = ArgumentParser; -}(typeof exports === 'undefined' ? options = {} : exports)); -var Option = options.Option; -var OptionSet = options.OptionSet; + Argument.prototype.parse = function (value) { + if (this.type === 'boolean') { + true; + this.value = value; + } else if (this.type === 'number') { + true; + this.value = parseInt(value, 10); + } else { + this.value = value; + } + if (this.parseFn) { + this.parseFn(this.value); + } + }; + return Argument; + }(); + Options.Argument = Argument; + var ArgumentParser = function () { + function ArgumentParser() { + this.args = []; + } + ArgumentParser.prototype.addArgument = function (shortName, longName, type, options) { + var argument = new Argument(shortName, longName, type, options); + this.args.push(argument); + return argument; + }; + ArgumentParser.prototype.addBoundOption = function (option) { + var options = { + parse: function (x) { + option.value = x; + } + }; + this.args.push(new Argument(option.shortName, option.longName, option.type, options)); + }; + ArgumentParser.prototype.addBoundOptionSet = function (optionSet) { + var self = this; + optionSet.options.forEach(function (x) { + if (x instanceof OptionSet) { + self.addBoundOptionSet(x); + } else { + true; + self.addBoundOption(x); + } + }); + }; + ArgumentParser.prototype.getUsage = function () { + var str = ''; + this.args.forEach(function (x) { + if (!x.positional) { + str += '[-' + x.shortName + '|--' + x.longName + (x.type === 'boolean' ? '' : ' ' + x.type[0].toUpperCase()) + ']'; + } else { + str += x.longName; + } + str += ' '; + }); + return str; + }; + ArgumentParser.prototype.parse = function (args) { + var nonPositionalArgumentMap = {}; + var positionalArgumentList = []; + this.args.forEach(function (x) { + if (x.positional) { + positionalArgumentList.push(x); + } else { + nonPositionalArgumentMap['-' + x.shortName] = x; + nonPositionalArgumentMap['--' + x.longName] = x; + } + }); + var leftoverArguments = []; + while (args.length) { + var argString = args.shift(); + var argument = null, value = argString; + if (argString == '--') { + leftoverArguments = leftoverArguments.concat(args); + break; + } else if (argString.slice(0, 1) == '-' || argString.slice(0, 2) == '--') { + argument = nonPositionalArgumentMap[argString]; + true; + if (!argument) { + continue; + } + if (argument.type !== 'boolean') { + value = args.shift(); + true; + } else { + value = true; + } + } else if (positionalArgumentList.length) { + argument = positionalArgumentList.shift(); + } else { + leftoverArguments.push(value); + } + if (argument) { + argument.parse(value); + } + } + true; + return leftoverArguments; + }; + return ArgumentParser; + }(); + Options.ArgumentParser = ArgumentParser; + var OptionSet = function () { + function OptionSet(name) { + this.name = name; + this.options = []; + } + OptionSet.prototype.register = function (option) { + this.options.push(option); + return option; + }; + OptionSet.prototype.trace = function (writer) { + writer.enter(this.name + ' {'); + this.options.forEach(function (option) { + option.trace(writer); + }); + writer.leave('}'); + }; + return OptionSet; + }(); + Options.OptionSet = OptionSet; + var Option = function () { + function Option(shortName, longName, type, defaultValue, description) { + this.longName = longName; + this.shortName = shortName; + this.type = type; + this.defaultValue = defaultValue; + this.value = defaultValue; + this.description = description; + } + Option.prototype.parse = function (value) { + this.value = value; + }; + Option.prototype.trace = function (writer) { + writer.writeLn(('-' + this.shortName + '|--' + this.longName).padRight(' ', 30) + ' = ' + this.type + ' ' + this.value + ' [' + this.defaultValue + ']' + ' (' + this.description + ')'); + }; + return Option; + }(); + Options.Option = Option; + }(Shumway.Options || (Shumway.Options = {}))); + var Options = Shumway.Options; +}(Shumway || (Shumway = {}))); +if (typeof exports !== 'undefined') { + exports['Shumway'] = Shumway; +} +var ArgumentParser = Shumway.Options.ArgumentParser; +var Option = Shumway.Options.Option; +var OptionSet = Shumway.Options.OptionSet; +var Option = Shumway.Options.Option; +var OptionSet = Shumway.Options.OptionSet; var coreOptions = new OptionSet('Core Options'); var Timeline = function () { var barColor = 'rgba(255,255,255, 0.075)'; @@ -766,8 +777,8 @@ var Timeline = function () { this.depth = 0; this.start = 0; this.index = 0; - this.marks = new CircularBuffer(Int32Array); - this.times = new CircularBuffer(Float64Array); + this.marks = new Shumway.CircularBuffer(Int32Array); + this.times = new Shumway.CircularBuffer(Float64Array); this.frameRate = 12; this.maxFrameTime = 1000 * 2 / this.frameRate; this.refreshFrequency = 10; @@ -1757,7 +1768,7 @@ for (var i = 0; i < 288; ++i) bitLengths[i] = i < 144 || i > 279 ? 8 : i < 256 ? 9 : 7; var fixedLiteralTable = makeHuffmanTable(bitLengths); function makeHuffmanTable(bitLengths) { - var maxBits = max.apply(null, bitLengths); + var maxBits = Math.max.apply(null, bitLengths); var numLengths = bitLengths.length; var size = 1 << maxBits; var codes = new Uint32Array(size); @@ -1789,7 +1800,14 @@ function createInflatedStream(bytes, outputLength) { available: 0, completed: false }; - var state = {}; + var state = { + header: null, + distanceTable: null, + literalTable: null, + sym: null, + len: null, + sym2: null + }; do { inflateBlock(stream, output, state); } while (!output.completed && stream.pos < stream.end); @@ -1797,7 +1815,7 @@ function createInflatedStream(bytes, outputLength) { } var InflateNoDataError = {}; function inflateBlock(stream, output, state) { - var header = state.header !== undefined ? state.header : state.header = readBits(stream.bytes, stream, 3); + var header = state.header !== null ? state.header : state.header = readBits(stream.bytes, stream, 3); switch (header >> 1) { case 0: stream.align(); @@ -1813,10 +1831,7 @@ function inflateBlock(stream, output, state) { var begin = pos + 4; var end = stream.pos = begin + len; var sbytes = stream.bytes, dbytes = output.data; - splice.apply(dbytes, [ - output.available, - len - ].concat(slice.call(sbytes, begin, end))); + dbytes.set(sbytes.subarray(begin, end), output.available); output.available += len; break; case 1: @@ -1824,7 +1839,7 @@ function inflateBlock(stream, output, state) { break; case 2: var distanceTable, literalTable; - if (state.distanceTable !== undefined) { + if (state.distanceTable !== null) { distanceTable = state.distanceTable; literalTable = state.literalTable; } else { @@ -1877,13 +1892,13 @@ function inflateBlock(stream, output, state) { literalTable = state.literalTable = makeHuffmanTable(bitLengths); } inflate(stream, output, literalTable, distanceTable, state); - delete state.distanceTable; - delete state.literalTable; + state.distanceTable = null; + state.literalTable = null; break; default: fail('unknown block type', 'inflate'); } - delete state.header; + state.header = null; output.completed = !(!(header & 1)); } function readBits(bytes, stream, size) { @@ -1912,22 +1927,22 @@ function inflate(stream, output, literalTable, distanceTable, state) { var pos = output.available; var dbytes = output.data; var sbytes = stream.bytes; - var sym = state.sym !== undefined ? state.sym : readCode(sbytes, stream, literalTable); + var sym = state.sym !== null ? state.sym : readCode(sbytes, stream, literalTable); while (sym !== 256) { if (sym < 256) { dbytes[pos++] = sym; } else { state.sym = sym; sym -= 257; - var len = state.len !== undefined ? state.len : state.len = lengthCodes[sym] + readBits(sbytes, stream, lengthExtraBits[sym]); - var sym2 = state.sym2 !== undefined ? state.sym2 : state.sym2 = readCode(sbytes, stream, distanceTable); + var len = state.len !== null ? state.len : state.len = lengthCodes[sym] + readBits(sbytes, stream, lengthExtraBits[sym]); + var sym2 = state.sym2 !== null ? state.sym2 : state.sym2 = readCode(sbytes, stream, distanceTable); var distance = distanceCodes[sym2] + readBits(sbytes, stream, distanceExtraBits[sym2]); var i = pos - distance; while (len--) dbytes[pos++] = dbytes[i++]; - delete state.sym2; - delete state.len; - delete state.sym; + state.sym2 = null; + state.len = null; + state.sym = null; } output.available = pos; sym = readCode(sbytes, stream, literalTable); @@ -4680,7 +4695,7 @@ if (isWorker) { var session = sessions[sessionId]; if (session) { session.close(); - delete sessions[sessionId]; + sessions[sessionId] = null; } break; case 'decode': @@ -5000,8 +5015,16 @@ SWF.embed = function (file, doc, container, options) { if (options.onStageInitialized) { options.onStageInitialized(stage); } - renderStage(stage, ctx, options); + var startPromise = options.startPromise || Promise.resolve(); + startPromise.then(function () { + renderStage(stage, ctx, options); + }); }); + if (options.onParsed) { + loaderInfo._addEventListener('parsed', function () { + options.onParsed(); + }); + } if (options.onComplete) { loaderInfo._addEventListener('complete', function () { options.onComplete(); @@ -5019,7 +5042,7 @@ var renderAsWireframe = rendererOptions.register(new Option('raw', 'renderAsWire var showQuadTree = rendererOptions.register(new Option('qt', 'showQuadTree', 'boolean', false, 'show quad tree')); var turboMode = rendererOptions.register(new Option('', 'turbo', 'boolean', false, 'turbo mode')); var forceHidpi = rendererOptions.register(new Option('', 'forceHidpi', 'boolean', false, 'force hidpi')); -var skipFrameDraw = rendererOptions.register(new Option('', 'skipFrameDraw', 'boolean', true, 'skip frame when not on time')); +var skipFrameDraw = rendererOptions.register(new Option('', 'skipFrameDraw', 'boolean', false, 'skip frame when not on time')); var hud = rendererOptions.register(new Option('', 'hud', 'boolean', false, 'show hud mode')); var dummyAnimation = rendererOptions.register(new Option('', 'dummy', 'boolean', false, 'show test balls animation')); var enableConstructChildren = rendererOptions.register(new Option('', 'constructChildren', 'boolean', true, 'Construct Children')); @@ -5643,7 +5666,7 @@ function renderStage(stage, ctx, events) { console.timeEnd('Total'); var firstRun = true; var frameCount = 0; - var frameFPSAverage = new metrics.Average(120); + var frameFPSAverage = new Shumway.Metrics.Average(120); var frameRequested = true; function drawFrame(renderFrame, repaint) { sampleStart(); @@ -7316,7 +7339,7 @@ function readTags(context, stream, swfVersion, final, onprogress, onexception) { var tag = null; if (context._readTag) { tag = context._readTag; - delete context._readTag; + context._readTag = null; } try { while (stream.pos < stream.end) { @@ -7440,7 +7463,14 @@ function CompressedPipe(target, length) { this.state = { bitBuffer: 0, bitLength: 0, - compression: {} + compression: { + header: null, + distanceTable: null, + literalTable: null, + sym: null, + len: null, + sym2: null + } }; this.output = { data: new Uint8Array(length), @@ -8190,7 +8220,7 @@ if (typeof GLOBAL !== 'undefined') { } var AVM1_TRACE_ENABLED = false; var AVM1_ERRORS_IGNORED = true; -var MAX_AVM1_INSTRUCTIONS_LIMIT = 100000; +var MAX_AVM1_HANG_TIMEOUT = 1000; var MAX_AVM1_ERRORS_LIMIT = 1000; var MAX_AVM1_STACK_LIMIT = 256; function AS2ScopeListItem(scope, next) { @@ -8207,7 +8237,9 @@ function AS2Context(swfVersion) { this.globals = new avm1lib.AS2Globals(this); this.initialScope = new AS2ScopeListItem(this.globals, null); this.assets = {}; - this.instructionsExecuted = 0; + this.isActive = false; + this.executionProhibited = false; + this.abortExecutionAt = 0; this.stackDepth = 0; this.isTryCatchListening = false; this.errorsIgnored = 0; @@ -8382,7 +8414,7 @@ function as2ResolveProperty(obj, name) { var lowerCaseName = avm2PublicName.toLowerCase(); for (var i in obj) { if (i.toLowerCase() === lowerCaseName) { - return i.substr(Multiname.PUBLIC_QUALIFIED_NAME_PREFIX.length); + notImplemented('FIX THIS'); } } return null; @@ -8443,19 +8475,30 @@ function as2CreatePrototypeProxy(obj) { }); } function executeActions(actionsData, context, scope) { + if (context.executionProhibited) { + return; + } var actionTracer = ActionTracerFactory.get(); var scopeContainer = context.initialScope.create(scope); var savedContext = AS2Context.instance; try { AS2Context.instance = context; + context.isActive = true; + context.abortExecutionAt = Date.now() + MAX_AVM1_HANG_TIMEOUT; + context.errorsIgnored = 0; context.defaultTarget = scope; context.globals.asSetPublicProperty('this', scope); actionTracer.message('ActionScript Execution Starts'); actionTracer.indent(); interpretActions(actionsData, scopeContainer, null, []); + } catch (e) { + if (e instanceof AS2CriticalError) { + console.error('Disabling AVM1 execution'); + context.executionProhibited = true; + } + throw e; } finally { - context.instructionsExecuted = 0; - context.errorsIgnored = 0; + context.isActive = false; actionTracer.unindent(); actionTracer.message('ActionScript Execution Stops'); AS2Context.instance = savedContext; @@ -8569,10 +8612,14 @@ function interpretActions(actionsData, scopeContainer, constantPool, registers) } } var savedContext = AS2Context.instance; - var resetCounters; + var savedIsActive = currentContext.isActive; try { AS2Context.instance = currentContext; - resetCounters = currentContext.instructionsExecuted === 0; + if (!savedIsActive) { + currentContext.abortExecutionAt = Date.now() + MAX_AVM1_HANG_TIMEOUT; + currentContext.errorsIgnored = 0; + currentContext.isActive = true; + } currentContext.defaultTarget = scope; actionTracer.indent(); currentContext.stackDepth++; @@ -8581,10 +8628,7 @@ function interpretActions(actionsData, scopeContainer, constantPool, registers) } return interpretActions(actionsData, newScopeContainer, constantPool, registers); } finally { - if (resetCounters) { - currentContext.instructionsExecuted = 0; - currentContext.errorsIgnored = 0; - } + currentContext.isActive = savedIsActive; currentContext.stackDepth--; actionTracer.unindent(); currentContext.defaultTarget = defaultTarget; @@ -8784,9 +8828,11 @@ function interpretActions(actionsData, scopeContainer, constantPool, registers) var stackItemsExpected; while (stream.position < stream.end) { try { + var instructionsExecuted = 0; + var abortExecutionAt = currentContext.abortExecutionAt; while (stream.position < stream.end) { - if (currentContext.instructionsExecuted++ >= MAX_AVM1_INSTRUCTIONS_LIMIT) { - throw new AS2CriticalError('long running script -- AVM1 instruction limit is reached'); + if (instructionsExecuted++ % 100 === 0 && Date.now() >= abortExecutionAt) { + throw new AS2CriticalError('long running script -- AVM1 instruction hang timeout'); } var actionCode = stream.readUI8(); var length = actionCode >= 128 ? stream.readUI16() : 0; @@ -9012,19 +9058,25 @@ function interpretActions(actionsData, scopeContainer, constantPool, registers) break; case 154: flags = stream.readUI8(); - var httpMethod; - switch (flags >> 6 & 3) { - case 1: - httpMethod = 'GET'; - break; - case 2: - httpMethod = 'POST'; - break; - } - var loadMethod = !(!(flags & 2)) ? !(!(flags & 1)) ? _global.loadVariables : _global.loadMovie : !(!(flags & 1)) ? _global.loadVariablesNum : _global.loadMovieNum; target = stack.pop(); var url = stack.pop(); - loadMethod.call(_global, url, target, httpMethod); + var sendVarsMethod; + if (flags & 1) { + sendVarsMethod = 'GET'; + } else if (flags & 2) { + sendVarsMethod = 'POST'; + } + var loadTargetFlag = flags & 1 << 6; + if (!loadTargetFlag) { + _global.getURL(url, target, sendVarsMethod); + break; + } + var loadVariablesFlag = flags & 1 << 7; + if (loadVariablesFlag) { + _global.loadVariables(url, target, sendVarsMethod); + } else { + _global.loadMovie(url, target, sendVarsMethod); + } break; case 159: flags = stream.readUI8(); @@ -9693,199 +9745,1093 @@ if (typeof GLOBAL !== 'undefined') { GLOBAL.executeActions = executeActions; GLOBAL.AS2Context = AS2Context; } +var jsGlobal = function () { + return this || (1, eval)('this'); + }(); +var inBrowser = typeof console != 'undefined'; +var release = true; +var debug = !true; +if (!jsGlobal.performance) { + jsGlobal.performance = {}; +} +if (!jsGlobal.performance.now) { + jsGlobal.performance.now = dateNow; +} +function log(message) { + var optionalParams = []; + for (var _i = 0; _i < arguments.length - 1; _i++) { + optionalParams[_i] = arguments[_i + 1]; + } + jsGlobal.print(message); +} +function warn(message) { + var optionalParams = []; + for (var _i = 0; _i < arguments.length - 1; _i++) { + optionalParams[_i] = arguments[_i + 1]; + } + if (inBrowser) { + console.warn(message); + } else { + jsGlobal.print(message); + } +} +var Shumway; +(function (Shumway) { + (function (CharacterCodes) { + CharacterCodes[CharacterCodes['_0'] = 48] = '_0'; + CharacterCodes[CharacterCodes['_1'] = 49] = '_1'; + CharacterCodes[CharacterCodes['_2'] = 50] = '_2'; + CharacterCodes[CharacterCodes['_3'] = 51] = '_3'; + CharacterCodes[CharacterCodes['_4'] = 52] = '_4'; + CharacterCodes[CharacterCodes['_5'] = 53] = '_5'; + CharacterCodes[CharacterCodes['_6'] = 54] = '_6'; + CharacterCodes[CharacterCodes['_7'] = 55] = '_7'; + CharacterCodes[CharacterCodes['_8'] = 56] = '_8'; + CharacterCodes[CharacterCodes['_9'] = 57] = '_9'; + }(Shumway.CharacterCodes || (Shumway.CharacterCodes = {}))); + var CharacterCodes = Shumway.CharacterCodes; + Shumway.UINT32_CHAR_BUFFER_LENGTH = 10; + Shumway.UINT32_MAX = 4294967295; + Shumway.UINT32_MAX_DIV_10 = 429496729; + Shumway.UINT32_MAX_MOD_10 = 5; + function isString(value) { + return typeof value === 'string'; + } + Shumway.isString = isString; + function isFunction(value) { + return typeof value === 'function'; + } + Shumway.isFunction = isFunction; + function isNumber(value) { + return typeof value === 'number'; + } + Shumway.isNumber = isNumber; + function isNumberOrString(value) { + return typeof value === 'number' || typeof value === 'string'; + } + Shumway.isNumberOrString = isNumberOrString; + function isObject(value) { + return typeof value === 'object' || typeof value === 'function'; + } + Shumway.isObject = isObject; + function toNumber(x) { + return +x; + } + Shumway.toNumber = toNumber; + function isNumericString(value) { + return String(Number(value)) === value; + } + Shumway.isNumericString = isNumericString; + function isNumeric(value) { + if (typeof value === 'number') { + return true; + } else if (typeof value === 'string') { + return isIndex(value) || isNumericString(value); + } else { + Debug.notImplemented(typeof value); + } + } + Shumway.isNumeric = isNumeric; + function isIndex(value) { + var index = 0; + if (typeof value === 'number') { + index = value | 0; + if (value === index && index >= 0) { + return true; + } + return value >>> 0 === value; + } + if (typeof value !== 'string') { + return false; + } + var length = value.length; + if (length === 0) { + return false; + } + if (value === '0') { + return true; + } + if (length > Shumway.UINT32_CHAR_BUFFER_LENGTH) { + return false; + } + var i = 0; + index = value.charCodeAt(i++) - 48; + if (index < 1 || index > 9) { + return false; + } + var oldIndex = 0; + var c = 0; + while (i < length) { + c = value.charCodeAt(i++) - 48; + if (c < 0 || c > 9) { + return false; + } + oldIndex = index; + index = 10 * index + c; + } + if (oldIndex < Shumway.UINT32_MAX_DIV_10 || oldIndex === Shumway.UINT32_MAX_DIV_10 && c <= Shumway.UINT32_MAX_MOD_10) { + return true; + } + return false; + } + Shumway.isIndex = isIndex; + function isNullOrUndefined(value) { + return value == undefined; + } + Shumway.isNullOrUndefined = isNullOrUndefined; + (function (Debug) { + function backtrace() { + try { + throw new Error(); + } catch (e) { + return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; + } + } + Debug.backtrace = backtrace; + function error(message) { + if (!inBrowser) { + warn(Debug.backtrace()); + } + throw new Error(message); + } + Debug.error = error; + function assert(condition) { + var args = []; + for (var _i = 0; _i < arguments.length - 1; _i++) { + args[_i] = arguments[_i + 1]; + } + if (condition === '') { + condition = true; + } + if (!condition) { + var message = Array.prototype.slice.call(arguments); + message.shift(); + Debug.error(message.join('')); + } + } + Debug.assert = assert; + function assertNotImplemented(condition, message) { + if (!condition) { + Debug.error('NotImplemented: ' + message); + } + } + Debug.assertNotImplemented = assertNotImplemented; + function warning(message) { + true; + } + Debug.warning = warning; + function notUsed(message) { + true; + } + Debug.notUsed = notUsed; + function notImplemented(message) { + true; + } + Debug.notImplemented = notImplemented; + function somewhatImplemented(message) { + Debug.warning('somewhatImplemented: ' + message); + } + Debug.somewhatImplemented = somewhatImplemented; + function unexpected(message) { + Debug.assert(false, 'Unexpected: ' + message); + } + Debug.unexpected = unexpected; + }(Shumway.Debug || (Shumway.Debug = {}))); + var Debug = Shumway.Debug; + function getTicks() { + return performance.now(); + } + Shumway.getTicks = getTicks; + (function (ArrayUtilities) { + function popManyInto(src, count, dst) { + true; + for (var i = count - 1; i >= 0; i--) { + dst[i] = src.pop(); + } + dst.length = count; + } + ArrayUtilities.popManyInto = popManyInto; + }(Shumway.ArrayUtilities || (Shumway.ArrayUtilities = {}))); + var ArrayUtilities = Shumway.ArrayUtilities; + (function (ObjectUtilities) { + function boxValue(value) { + if (Shumway.isNullOrUndefined(value) || Shumway.isObject(value)) { + return value; + } + return Object(value); + } + ObjectUtilities.boxValue = boxValue; + function toKeyValueArray(object) { + var hasOwnProperty = Object.prototype.hasOwnProperty; + var array = []; + for (var k in object) { + if (hasOwnProperty.call(object, k)) { + array.push([ + k, + object[k] + ]); + } + } + return array; + } + ObjectUtilities.toKeyValueArray = toKeyValueArray; + function hasOwnProperty(object, name) { + return Object.prototype.hasOwnProperty.call(object, name); + } + ObjectUtilities.hasOwnProperty = hasOwnProperty; + function createEmptyObject() { + return Object.create(null); + } + ObjectUtilities.createEmptyObject = createEmptyObject; + function createMap() { + return Object.create(null); + } + ObjectUtilities.createMap = createMap; + function createArrayMap() { + return []; + } + ObjectUtilities.createArrayMap = createArrayMap; + function defineReadOnlyProperty(object, name, value) { + Object.defineProperty(object, name, { + value: value, + writable: false, + configurable: true, + enumerable: false + }); + } + ObjectUtilities.defineReadOnlyProperty = defineReadOnlyProperty; + function getOwnPropertyDescriptors(object) { + var o = ObjectUtilities.createMap(); + var properties = Object.getOwnPropertyNames(object); + for (var i = 0; i < properties.length; i++) { + o[properties[i]] = Object.getOwnPropertyDescriptor(object, properties[i]); + } + return o; + } + ObjectUtilities.getOwnPropertyDescriptors = getOwnPropertyDescriptors; + function cloneObject(object) { + var clone = ObjectUtilities.createEmptyObject(); + for (var property in object) { + clone[property] = object[property]; + } + return clone; + } + ObjectUtilities.cloneObject = cloneObject; + function copyProperties(object, template) { + for (var property in template) { + object[property] = template[property]; + } + } + ObjectUtilities.copyProperties = copyProperties; + function getLatestGetterOrSetterPropertyDescriptor(object, name) { + var descriptor = {}; + while (object) { + var tmp = Object.getOwnPropertyDescriptor(object, name); + if (tmp) { + descriptor.get = descriptor.get || tmp.get; + descriptor.set = descriptor.set || tmp.set; + } + if (descriptor.get && descriptor.set) { + break; + } + object = Object.getPrototypeOf(object); + } + return descriptor; + } + ObjectUtilities.getLatestGetterOrSetterPropertyDescriptor = getLatestGetterOrSetterPropertyDescriptor; + function defineNonEnumerableGetterOrSetter(obj, name, value, isGetter) { + var descriptor = ObjectUtilities.getLatestGetterOrSetterPropertyDescriptor(obj, name); + descriptor.configurable = true; + descriptor.enumerable = false; + if (isGetter) { + descriptor.get = value; + } else { + descriptor.set = value; + } + Object.defineProperty(obj, name, descriptor); + } + ObjectUtilities.defineNonEnumerableGetterOrSetter = defineNonEnumerableGetterOrSetter; + function defineNonEnumerableGetter(obj, name, getter) { + Object.defineProperty(obj, name, { + get: getter, + configurable: true, + enumerable: false + }); + } + ObjectUtilities.defineNonEnumerableGetter = defineNonEnumerableGetter; + function defineNonEnumerableSetter(obj, name, setter) { + Object.defineProperty(obj, name, { + set: setter, + configurable: true, + enumerable: false + }); + } + ObjectUtilities.defineNonEnumerableSetter = defineNonEnumerableSetter; + function defineNonEnumerableProperty(obj, name, value) { + Object.defineProperty(obj, name, { + value: value, + writable: true, + configurable: true, + enumerable: false + }); + } + ObjectUtilities.defineNonEnumerableProperty = defineNonEnumerableProperty; + function defineNonEnumerableForwardingProperty(obj, name, otherName) { + Object.defineProperty(obj, name, { + get: FunctionUtilities.makeForwardingGetter(otherName), + set: FunctionUtilities.makeForwardingSetter(otherName), + writable: true, + configurable: true, + enumerable: false + }); + } + ObjectUtilities.defineNonEnumerableForwardingProperty = defineNonEnumerableForwardingProperty; + function defineNewNonEnumerableProperty(obj, name, value) { + true; + ObjectUtilities.defineNonEnumerableProperty(obj, name, value); + } + ObjectUtilities.defineNewNonEnumerableProperty = defineNewNonEnumerableProperty; + }(Shumway.ObjectUtilities || (Shumway.ObjectUtilities = {}))); + var ObjectUtilities = Shumway.ObjectUtilities; + (function (FunctionUtilities) { + function makeForwardingGetter(target) { + return new Function('return this["' + target + '"]'); + } + FunctionUtilities.makeForwardingGetter = makeForwardingGetter; + function makeForwardingSetter(target) { + return new Function('value', 'this["' + target + '"] = value;'); + } + FunctionUtilities.makeForwardingSetter = makeForwardingSetter; + function bindSafely(fn, object) { + true; + var f = fn.bind(object); + f.boundTo = object; + return f; + } + FunctionUtilities.bindSafely = bindSafely; + }(Shumway.FunctionUtilities || (Shumway.FunctionUtilities = {}))); + var FunctionUtilities = Shumway.FunctionUtilities; + (function (StringUtilities) { + function toSafeString(value) { + if (typeof value === 'string') { + return '"' + value + '"'; + } + if (typeof value === 'number' || typeof value === 'boolean') { + return String(value); + } + return typeof value; + } + StringUtilities.toSafeString = toSafeString; + function toSafeArrayString(array) { + var str = []; + for (var i = 0; i < array.length; i++) { + str.push(toSafeString(array[i])); + } + return str.join(', '); + } + StringUtilities.toSafeArrayString = toSafeArrayString; + function utf8decode(str) { + var bytes = new Uint8Array(str.length * 4); + var b = 0; + for (var i = 0, j = str.length; i < j; i++) { + var code = str.charCodeAt(i); + if (code <= 127) { + bytes[b++] = code; + continue; + } + if (55296 <= code && code <= 56319) { + var codeLow = str.charCodeAt(i + 1); + if (56320 <= codeLow && codeLow <= 57343) { + code = ((code & 1023) << 10) + (codeLow & 1023) + 65536; + ++i; + } + } + if ((code & 4292870144) !== 0) { + bytes[b++] = 248 | code >>> 24 & 3; + bytes[b++] = 128 | code >>> 18 & 63; + bytes[b++] = 128 | code >>> 12 & 63; + bytes[b++] = 128 | code >>> 6 & 63; + bytes[b++] = 128 | code & 63; + } else if ((code & 4294901760) !== 0) { + bytes[b++] = 240 | code >>> 18 & 7; + bytes[b++] = 128 | code >>> 12 & 63; + bytes[b++] = 128 | code >>> 6 & 63; + bytes[b++] = 128 | code & 63; + } else if ((code & 4294965248) !== 0) { + bytes[b++] = 224 | code >>> 12 & 15; + bytes[b++] = 128 | code >>> 6 & 63; + bytes[b++] = 128 | code & 63; + } else { + bytes[b++] = 192 | code >>> 6 & 31; + bytes[b++] = 128 | code & 63; + } + } + return bytes.subarray(0, b); + } + StringUtilities.utf8decode = utf8decode; + function utf8encode(bytes) { + var j = 0, str = ''; + while (j < bytes.length) { + var b1 = bytes[j++] & 255; + if (b1 <= 127) { + str += String.fromCharCode(b1); + } else { + var currentPrefix = 192; + var validBits = 5; + do { + var mask = currentPrefix >> 1 | 128; + if ((b1 & mask) === currentPrefix) + break; + currentPrefix = currentPrefix >> 1 | 128; + --validBits; + } while (validBits >= 0); + if (validBits <= 0) { + str += String.fromCharCode(b1); + continue; + } + var code = b1 & (1 << validBits) - 1; + var invalid = false; + for (var i = 5; i >= validBits; --i) { + var bi = bytes[j++]; + if ((bi & 192) != 128) { + invalid = true; + break; + } + code = code << 6 | bi & 63; + } + if (invalid) { + for (var k = j - (7 - i); k < j; ++k) { + str += String.fromCharCode(bytes[k] & 255); + } + continue; + } + if (code >= 65536) { + str += String.fromCharCode(code - 65536 >> 10 & 1023 | 55296, code & 1023 | 56320); + } else { + str += String.fromCharCode(code); + } + } + } + return str; + } + StringUtilities.utf8encode = utf8encode; + function base64ArrayBuffer(arrayBuffer) { + var base64 = ''; + var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + var bytes = new Uint8Array(arrayBuffer); + var byteLength = bytes.byteLength; + var byteRemainder = byteLength % 3; + var mainLength = byteLength - byteRemainder; + var a, b, c, d; + var chunk; + for (var i = 0; i < mainLength; i = i + 3) { + chunk = bytes[i] << 16 | bytes[i + 1] << 8 | bytes[i + 2]; + a = (chunk & 16515072) >> 18; + b = (chunk & 258048) >> 12; + c = (chunk & 4032) >> 6; + d = chunk & 63; + base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]; + } + if (byteRemainder == 1) { + chunk = bytes[mainLength]; + a = (chunk & 252) >> 2; + b = (chunk & 3) << 4; + base64 += encodings[a] + encodings[b] + '=='; + } else if (byteRemainder == 2) { + chunk = bytes[mainLength] << 8 | bytes[mainLength + 1]; + a = (chunk & 64512) >> 10; + b = (chunk & 1008) >> 4; + c = (chunk & 15) << 2; + base64 += encodings[a] + encodings[b] + encodings[c] + '='; + } + return base64; + } + StringUtilities.base64ArrayBuffer = base64ArrayBuffer; + function escapeString(str) { + if (str !== undefined) { + str = str.replace(/[^\w$]/gi, '$'); + if (/^\d/.test(str)) { + str = '$' + str; + } + } + return str; + } + StringUtilities.escapeString = escapeString; + function fromCharCodeArray(buffer) { + var str = '', SLICE = 1024 * 16; + for (var i = 0; i < buffer.length; i += SLICE) { + var chunk = Math.min(buffer.length - i, SLICE); + str += String.fromCharCode.apply(null, buffer.subarray(i, i + chunk)); + } + return str; + } + StringUtilities.fromCharCodeArray = fromCharCodeArray; + var _encoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_'; + function variableLengthEncodeInt32(n) { + var e = _encoding; + var bitCount = 32 - IntegerUtilities.leadingZeros(n); + var l = Math.ceil(bitCount / 6); + var s = e[l]; + for (var i = l - 1; i >= 0; i--) { + var offset = i * 6; + s += e[n >> offset & 63]; + } + true; + return s; + } + StringUtilities.variableLengthEncodeInt32 = variableLengthEncodeInt32; + function toEncoding(n) { + return _encoding[n]; + } + StringUtilities.toEncoding = toEncoding; + function fromEncoding(s) { + var c = s.charCodeAt(0); + var e = 0; + if (c >= 65 && c <= 90) { + return c - 65; + } else if (c >= 97 && c <= 122) { + return c - 71; + } else if (c >= 48 && c <= 57) { + return c + 4; + } else if (c === 36) { + return 62; + } else if (c === 95) { + return 63; + } + } + StringUtilities.fromEncoding = fromEncoding; + function variableLengthDecodeInt32(s) { + var l = StringUtilities.fromEncoding(s[0]); + var n = 0; + for (var i = 0; i < l; i++) { + var offset = (l - i - 1) * 6; + n |= StringUtilities.fromEncoding(s[1 + i]) << offset; + } + return n; + } + StringUtilities.variableLengthDecodeInt32 = variableLengthDecodeInt32; + }(Shumway.StringUtilities || (Shumway.StringUtilities = {}))); + var StringUtilities = Shumway.StringUtilities; + (function (HashUtilities) { + var _md5R = new Uint8Array([ + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 7, + 12, + 17, + 22, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 5, + 9, + 14, + 20, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 4, + 11, + 16, + 23, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21, + 6, + 10, + 15, + 21 + ]); + var _md5K = new Int32Array([ + -680876936, + -389564586, + 606105819, + -1044525330, + -176418897, + 1200080426, + -1473231341, + -45705983, + 1770035416, + -1958414417, + -42063, + -1990404162, + 1804603682, + -40341101, + -1502002290, + 1236535329, + -165796510, + -1069501632, + 643717713, + -373897302, + -701558691, + 38016083, + -660478335, + -405537848, + 568446438, + -1019803690, + -187363961, + 1163531501, + -1444681467, + -51403784, + 1735328473, + -1926607734, + -378558, + -2022574463, + 1839030562, + -35309556, + -1530992060, + 1272893353, + -155497632, + -1094730640, + 681279174, + -358537222, + -722521979, + 76029189, + -640364487, + -421815835, + 530742520, + -995338651, + -198630844, + 1126891415, + -1416354905, + -57434055, + 1700485571, + -1894986606, + -1051523, + -2054922799, + 1873313359, + -30611744, + -1560198380, + 1309151649, + -145523070, + -1120210379, + 718787259, + -343485551 + ]); + function hashBytesTo32BitsMD5(data, offset, length) { + var r = _md5R; + var k = _md5K; + var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878; + var paddedLength = length + 72 & ~63; + var padded = new Uint8Array(paddedLength); + var i, j, n; + for (i = 0; i < length; ++i) { + padded[i] = data[offset++]; + } + padded[i++] = 128; + n = paddedLength - 8; + while (i < n) { + padded[i++] = 0; + } + padded[i++] = length << 3 & 255; + padded[i++] = length >> 5 & 255; + padded[i++] = length >> 13 & 255; + padded[i++] = length >> 21 & 255; + padded[i++] = length >>> 29 & 255; + padded[i++] = 0; + padded[i++] = 0; + padded[i++] = 0; + var w = new Int32Array(16); + for (i = 0; i < paddedLength;) { + for (j = 0; j < 16; ++j, i += 4) { + w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24; + } + var a = h0, b = h1, c = h2, d = h3, f, g; + for (j = 0; j < 64; ++j) { + if (j < 16) { + f = b & c | ~b & d; + g = j; + } else if (j < 32) { + f = d & b | ~d & c; + g = 5 * j + 1 & 15; + } else if (j < 48) { + f = b ^ c ^ d; + g = 3 * j + 5 & 15; + } else { + f = c ^ (b | ~d); + g = 7 * j & 15; + } + var tmp = d, rotateArg = a + f + k[j] + w[g] | 0, rotate = r[j]; + d = c; + c = b; + b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0; + a = tmp; + } + h0 = h0 + a | 0; + h1 = h1 + b | 0; + h2 = h2 + c | 0; + h3 = h3 + d | 0; + } + return h0; + } + HashUtilities.hashBytesTo32BitsMD5 = hashBytesTo32BitsMD5; + function hashBytesTo32BitsAdler(data, offset, length) { + var a = 1; + var b = 0; + var end = offset + length; + for (var i = offset; i < end; ++i) { + a = (a + (data[i] & 255)) % 65521; + b = (b + a) % 65521; + } + return b << 16 | a; + } + HashUtilities.hashBytesTo32BitsAdler = hashBytesTo32BitsAdler; + }(Shumway.HashUtilities || (Shumway.HashUtilities = {}))); + var HashUtilities = Shumway.HashUtilities; + (function (IntegerUtilities) { + function bitCount(i) { + i = i - (i >> 1 & 1431655765); + i = (i & 858993459) + (i >> 2 & 858993459); + return (i + (i >> 4) & 252645135) * 16843009 >> 24; + } + IntegerUtilities.bitCount = bitCount; + function ones(i) { + i = i - (i >> 1 & 1431655765); + i = (i & 858993459) + (i >> 2 & 858993459); + return (i + (i >> 4) & 252645135) * 16843009 >> 24; + } + IntegerUtilities.ones = ones; + function leadingZeros(i) { + i |= i >> 1; + i |= i >> 2; + i |= i >> 4; + i |= i >> 8; + i |= i >> 16; + return 32 - IntegerUtilities.ones(i); + } + IntegerUtilities.leadingZeros = leadingZeros; + function trailingZeros(i) { + return IntegerUtilities.ones((i & -i) - 1); + } + IntegerUtilities.trailingZeros = trailingZeros; + function getFlags(i, flags) { + var str = ''; + for (var i = 0; i < flags.length; i++) { + if (i & 1 << i) { + str += flags[i] + ' '; + } + } + if (str.length === 0) { + return ''; + } + return str.trim(); + } + IntegerUtilities.getFlags = getFlags; + function isPowerOfTwo(x) { + return x && (x & x - 1) === 0; + } + IntegerUtilities.isPowerOfTwo = isPowerOfTwo; + }(Shumway.IntegerUtilities || (Shumway.IntegerUtilities = {}))); + var IntegerUtilities = Shumway.IntegerUtilities; + var IndentingWriter = function () { + function IndentingWriter(suppressOutput, outFn) { + if (typeof suppressOutput === 'undefined') { + suppressOutput = false; + } + this._tab = ' '; + this._padding = ''; + this._suppressOutput = suppressOutput; + this._out = outFn || IndentingWriter._consoleOutFn; + } + IndentingWriter.prototype.writeLn = function (str) { + if (!this._suppressOutput) { + this._out(this._padding + str); + } + }; + IndentingWriter.prototype.writeLns = function (str) { + var lines = str.split('\n'); + for (var i = 0; i < lines.length; i++) { + this.writeLn(lines[i]); + } + }; + IndentingWriter.prototype.debugLn = function (str) { + this.colorLn(IndentingWriter.PURPLE, str); + }; + IndentingWriter.prototype.yellowLn = function (str) { + this.colorLn(IndentingWriter.YELLOW, str); + }; + IndentingWriter.prototype.greenLn = function (str) { + this.colorLn(IndentingWriter.GREEN, str); + }; + IndentingWriter.prototype.redLn = function (str) { + this.colorLn(IndentingWriter.RED, str); + }; + IndentingWriter.prototype.colorLn = function (color, str) { + if (!this._suppressOutput) { + if (!inBrowser) { + this._out(this._padding + color + str + IndentingWriter.ENDC); + } else { + this._out(this._padding + str); + } + } + }; + IndentingWriter.prototype.enter = function (str) { + if (!this._suppressOutput) { + this._out(this._padding + str); + } + this.indent(); + }; + IndentingWriter.prototype.leaveAndEnter = function (str) { + this.leave(str); + this.indent(); + }; + IndentingWriter.prototype.leave = function (str) { + this.outdent(); + if (!this._suppressOutput) { + this._out(this._padding + str); + } + }; + IndentingWriter.prototype.indent = function () { + this._padding += this._tab; + }; + IndentingWriter.prototype.outdent = function () { + if (this._padding.length > 0) { + this._padding = this._padding.substring(0, this._padding.length - this._tab.length); + } + }; + IndentingWriter.prototype.writeArray = function (arr, detailed, noNumbers) { + if (typeof detailed === 'undefined') { + detailed = false; + } + if (typeof noNumbers === 'undefined') { + noNumbers = false; + } + detailed = detailed || false; + for (var i = 0, j = arr.length; i < j; i++) { + var prefix = ''; + if (detailed) { + if (arr[i] === null) { + prefix = 'null'; + } else if (arr[i] === undefined) { + prefix = 'undefined'; + } else { + prefix = arr[i].constructor.name; + } + prefix += ' '; + } + var number = noNumbers ? '' : ('' + i).padRight(' ', 4); + this.writeLn(number + prefix + arr[i]); + } + }; + IndentingWriter.PURPLE = '\x1b[94m'; + IndentingWriter.YELLOW = '\x1b[93m'; + IndentingWriter.GREEN = '\x1b[92m'; + IndentingWriter.RED = '\x1b[91m'; + IndentingWriter.ENDC = '\x1b[0m'; + IndentingWriter._consoleOutFn = inBrowser ? console.info.bind(console) : print; + return IndentingWriter; + }(); + Shumway.IndentingWriter = IndentingWriter; + var SortedListNode = function () { + function SortedListNode(value, next) { + this.value = value; + this.next = next; + } + return SortedListNode; + }(); + var SortedList = function () { + function SortedList(compare) { + true; + this._compare = compare; + this._head = null; + this._length = 0; + } + SortedList.prototype.push = function (value) { + true; + this._length++; + if (!this._head) { + this._head = new SortedListNode(value, null); + return; + } + var curr = this._head; + var prev = null; + var node = new SortedListNode(value, null); + var compare = this._compare; + while (curr) { + if (compare(curr.value, node.value) > 0) { + if (prev) { + node.next = curr; + prev.next = node; + } else { + node.next = this._head; + this._head = node; + } + return; + } + prev = curr; + curr = curr.next; + } + prev.next = node; + }; + SortedList.prototype.forEach = function (visitor) { + var curr = this._head; + var last = null; + while (curr) { + var result = visitor(curr.value); + if (result === SortedList.RETURN) { + return; + } else if (result === SortedList.DELETE) { + if (!last) { + curr = this._head = this._head.next; + } else { + curr = last.next = curr.next; + } + } else { + last = curr; + curr = curr.next; + } + } + }; + SortedList.prototype.isEmpty = function () { + return !this._head; + }; + SortedList.prototype.pop = function () { + if (!this._head) { + return undefined; + } + this._length--; + var ret = this._head; + this._head = this._head.next; + return ret.value; + }; + SortedList.prototype.contains = function (value) { + var curr = this._head; + while (curr) { + if (curr.value === value) { + return true; + } + curr = curr.next; + } + return false; + }; + SortedList.prototype.toString = function () { + var str = '['; + var curr = this._head; + while (curr) { + str += curr.value.toString(); + curr = curr.next; + if (curr) { + str += ','; + } + } + str += ']'; + return str; + }; + SortedList.RETURN = 1; + SortedList.DELETE = 2; + return SortedList; + }(); + Shumway.SortedList = SortedList; + var CIRCULAR_BUFFER_MASK = 4095; + var CIRCULAR_BUFFER_SIZE = 4096; + var CircularBuffer = function () { + function CircularBuffer(Type) { + this.index = 0; + this.start = 0; + this.array = new Type(CIRCULAR_BUFFER_SIZE); + } + CircularBuffer.prototype.get = function (i) { + return this.array[i]; + }; + CircularBuffer.prototype.forEachInReverse = function (visitor) { + if (this.isEmpty()) { + return; + } + var i = this.index === 0 ? CIRCULAR_BUFFER_SIZE - 1 : this.index - 1; + while (i !== this.start) { + if (visitor(this.array[i], i)) { + break; + } + i = i === 0 ? CIRCULAR_BUFFER_SIZE - 1 : i - 1; + } + }; + CircularBuffer.prototype.write = function (value) { + this.array[this.index] = value; + this.index = this.index + 1 & CIRCULAR_BUFFER_MASK; + if (this.index === this.start) { + this.start = this.start + 1 & CIRCULAR_BUFFER_MASK; + } + }; + CircularBuffer.prototype.isFull = function () { + return (this.index + 1 & CIRCULAR_BUFFER_MASK) === this.start; + }; + CircularBuffer.prototype.isEmpty = function () { + return this.index === this.start; + }; + return CircularBuffer; + }(); + Shumway.CircularBuffer = CircularBuffer; +}(Shumway || (Shumway = {}))); +var assert = Shumway.Debug.assert; +var IndentingWriter = Shumway.IndentingWriter; +var assert = Shumway.Debug.assert; var $DEBUG; var release = true; -var checkArguments = true; -var useSurrogates = true; -var useAsAdd = true; -var sealConstTraits = false; var c4CoerceNonPrimitiveParameters = false; var c4CoerceNonPrimitive = false; var c4AsTypeLate = true; -var inBrowser = typeof console != 'undefined'; -if (!this.performance) { - this.performance = {}; -} -if (!this.performance.now) { - this.performance.now = dateNow; -} -function backtrace() { - try { - throw new Error(); - } catch (e) { - return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; - } -} -function error(message) { - if (!inBrowser) { - console.warn(backtrace()); - } - throw new Error(message); -} -function assert(condition) { - if (condition === '') { - condition = true; - } - if (!condition) { - var message = Array.prototype.slice.call(arguments); - message.shift(); - error(message.join('')); - } -} -function assertNotImplemented(condition, message) { - if (!condition) { - error('NotImplemented: ' + message); - } -} -function warning(message) { - true; -} -function notUsed(message) { - true; -} -function notImplemented(message) { - true; -} -function somewhatImplemented(message) { - warning('somewhatImplemented: ' + message); -} -function unexpected(message) { -} -function makeForwardingGetter(target) { - return new Function('return this["' + target + '"]'); -} -function makeForwardingSetter(target) { - return new Function('value', 'this["' + target + '"] = value;'); -} -function defineReadOnlyProperty(obj, name, value) { - Object.defineProperty(obj, name, { - value: value, - writable: false, - configurable: true, - enumerable: false - }); -} -function bindSafely(fn, obj) { - true; - var f = fn.bind(obj); - f.boundTo = obj; - return f; -} -function createEmptyObject() { - return Object.create(null); -} -function getOwnPropertyDescriptors(object) { - var o = createEmptyObject(); - var properties = Object.getOwnPropertyNames(object); - for (var i = 0; i < properties.length; i++) { - o[properties[i]] = Object.getOwnPropertyDescriptor(object, properties[i]); - } - return o; -} -function cloneObject(object) { - var clone = Object.create(null); - for (var property in object) { - clone[property] = object[property]; - } - return clone; -} -function extendObject(object, properties) { - var extended = Object.create(object); - if (properties) { - for (var key in properties) { - extended[key] = properties[key]; - } - } - return extended; -} -function copyProperties(object, template) { - for (var property in template) { - object[property] = template[property]; - } -} -function toSafeString(value) { - if (typeof value === 'string') { - return '"' + value + '"'; - } - if (typeof value === 'number' || typeof value === 'boolean') { - return String(value); - } - return typeof value; -} -function toSafeArrayString(array) { - var str = []; - for (var i = 0; i < array.length; i++) { - str.push(toSafeString(array[i])); - } - return str.join(', '); -} -function getLatestGetterOrSetterPropertyDescriptor(obj, name) { - var descriptor = {}; - while (obj) { - var tmp = Object.getOwnPropertyDescriptor(obj, name); - if (tmp) { - descriptor.get = descriptor.get || tmp.get; - descriptor.set = descriptor.set || tmp.set; - } - if (descriptor.get && descriptor.set) { - break; - } - obj = Object.getPrototypeOf(obj); - } - return descriptor; -} -function defineNonEnumerableGetterOrSetter(obj, name, value, isGetter) { - var descriptor = getLatestGetterOrSetterPropertyDescriptor(obj, name); - descriptor.configurable = true; - descriptor.enumerable = false; - if (isGetter) { - descriptor.get = value; - } else { - descriptor.set = value; - } - Object.defineProperty(obj, name, descriptor); -} -function defineNonEnumerableGetter(obj, name, getter) { - Object.defineProperty(obj, name, { - get: getter, - configurable: true, - enumerable: false - }); -} -function defineNonEnumerableSetter(obj, name, setter) { - Object.defineProperty(obj, name, { - set: setter, - configurable: true, - enumerable: false - }); -} -function defineNonEnumerableProperty(obj, name, value) { - Object.defineProperty(obj, name, { - value: value, - writable: true, - configurable: true, - enumerable: false - }); -} -function defineNonEnumerableForwardingProperty(obj, name, otherName) { - Object.defineProperty(obj, name, { - get: makeForwardingGetter(otherName), - set: makeForwardingSetter(otherName), - writable: true, - configurable: true, - enumerable: false - }); -} -function defineNewNonEnumerableProperty(obj, name, value) { - true; - defineNonEnumerableProperty(obj, name, value); -} -function isNullOrUndefined(value) { - return value == undefined; -} -function isPowerOfTwo(x) { - return x && (x & x - 1) === 0; -} +var error = Shumway.Debug.error; +var assertNotImplemented = Shumway.Debug.assertNotImplemented; +var warning = Shumway.Debug.warning; +var notImplemented = Shumway.Debug.notImplemented; +var somewhatImplemented = Shumway.Debug.somewhatImplemented; +var unexpected = Shumway.Debug.unexpected; +var defineReadOnlyProperty = Shumway.ObjectUtilities.defineReadOnlyProperty; +var createEmptyObject = Shumway.ObjectUtilities.createEmptyObject; +var makeForwardingGetter = Shumway.FunctionUtilities.makeForwardingGetter; +var makeForwardingSetter = Shumway.FunctionUtilities.makeForwardingSetter; +var bindSafely = Shumway.FunctionUtilities.bindSafely; +var cloneObject = Shumway.ObjectUtilities.cloneObject; +var copyProperties = Shumway.ObjectUtilities.copyProperties; +var toSafeString = Shumway.StringUtilities.toSafeString; +var toSafeArrayString = Shumway.StringUtilities.toSafeArrayString; +var getLatestGetterOrSetterPropertyDescriptor = Shumway.ObjectUtilities.getLatestGetterOrSetterPropertyDescriptor; +var defineNonEnumerableGetterOrSetter = Shumway.ObjectUtilities.defineNonEnumerableGetterOrSetter; +var defineNonEnumerableGetter = Shumway.ObjectUtilities.defineNonEnumerableGetter; +var defineNonEnumerableSetter = Shumway.ObjectUtilities.defineNonEnumerableSetter; +var defineNonEnumerableProperty = Shumway.ObjectUtilities.defineNonEnumerableProperty; +var defineNonEnumerableForwardingProperty = Shumway.ObjectUtilities.defineNonEnumerableForwardingProperty; +var defineNewNonEnumerableProperty = Shumway.ObjectUtilities.defineNewNonEnumerableProperty; +var isNumeric = Shumway.isNumeric; +var isNullOrUndefined = Shumway.isNullOrUndefined; +var isPowerOfTwo = Shumway.IntegerUtilities.isPowerOfTwo; function time(fn, count) { var start = performance.now(); for (var i = 0; i < count; i++) { @@ -9903,58 +10849,12 @@ function clamp(x, min, max) { } return x; } -function fromCharCodeArray(buffer) { - var str = '', SLICE = 1024 * 16; - for (var i = 0; i < buffer.length; i += SLICE) { - var chunk = Math.min(buffer.length - i, SLICE); - str += String.fromCharCode.apply(null, buffer.subarray(i, i + chunk)); - } - return str; -} +var fromCharCodeArray = Shumway.StringUtilities.fromCharCodeArray; function hasOwnProperty(object, name) { return Object.prototype.hasOwnProperty.call(object, name); } -function toKeyValueArray(o) { - var hasOwnProperty = Object.prototype.hasOwnProperty; - var a = []; - for (var k in o) { - if (hasOwnProperty.call(o, k)) { - a.push([ - k, - o[k] - ]); - } - } - return a; -} -function isNumeric(x) { - if (typeof x === 'number') { - return x === (x | 0); - } - if (typeof x !== 'string' || x.length === 0) { - return false; - } - if (x === '0') { - return true; - } - var c = x.charCodeAt(0); - if (c >= 49 && c <= 57) { - for (var i = 1, j = x.length; i < j; i++) { - c = x.charCodeAt(i); - if (!(c >= 48 && c <= 57)) { - return false; - } - } - return true; - } - return false; -} -function boxValue(value) { - if (isNullOrUndefined(value) || isObject(value)) { - return value; - } - return Object(value); -} +var toKeyValueArray = Shumway.ObjectUtilities.toKeyValueArray; +var boxValue = Shumway.ObjectUtilities.boxValue; function isObject(value) { return typeof value === 'object' || typeof value === 'function'; } @@ -9976,13 +10876,6 @@ function setBitFlags(flags, flag, value) { function getBitFlags(flags, flag) { return !(!(flags & flag)); } -function popManyInto(src, count, dst) { - true; - for (var i = count - 1; i >= 0; i--) { - dst[i] = src.pop(); - } - dst.length = count; -} (function () { function extendBuiltin(proto, prop, f) { if (!proto[prop]) { @@ -10129,115 +11022,14 @@ function popManyInto(src, count, dst) { return arr; }); }()); -function utf8decode(str) { - var bytes = new Uint8Array(str.length * 4); - var b = 0; - for (var i = 0, j = str.length; i < j; i++) { - var code = str.charCodeAt(i); - if (code <= 127) { - bytes[b++] = code; - continue; - } - if (55296 <= code && code <= 56319) { - var codeLow = str.charCodeAt(i + 1); - if (56320 <= codeLow && codeLow <= 57343) { - code = ((code & 1023) << 10) + (codeLow & 1023) + 65536; - ++i; - } - } - if ((code & 4292870144) !== 0) { - bytes[b++] = 248 | code >>> 24 & 3; - bytes[b++] = 128 | code >>> 18 & 63; - bytes[b++] = 128 | code >>> 12 & 63; - bytes[b++] = 128 | code >>> 6 & 63; - bytes[b++] = 128 | code & 63; - } else if ((code & 4294901760) !== 0) { - bytes[b++] = 240 | code >>> 18 & 7; - bytes[b++] = 128 | code >>> 12 & 63; - bytes[b++] = 128 | code >>> 6 & 63; - bytes[b++] = 128 | code & 63; - } else if ((code & 4294965248) !== 0) { - bytes[b++] = 224 | code >>> 12 & 15; - bytes[b++] = 128 | code >>> 6 & 63; - bytes[b++] = 128 | code & 63; - } else { - bytes[b++] = 192 | code >>> 6 & 31; - bytes[b++] = 128 | code & 63; - } - } - return bytes.subarray(0, b); -} -function utf8encode(bytes) { - var j = 0, str = ''; - while (j < bytes.length) { - var b1 = bytes[j++] & 255; - if (b1 <= 127) { - str += String.fromCharCode(b1); - } else { - var currentPrefix = 192; - var validBits = 5; - do { - var mask = currentPrefix >> 1 | 128; - if ((b1 & mask) === currentPrefix) - break; - currentPrefix = currentPrefix >> 1 | 128; - --validBits; - } while (validBits >= 0); - if (validBits <= 0) { - str += String.fromCharCode(b1); - continue; - } - var code = b1 & (1 << validBits) - 1; - var invalid = false; - for (var i = 5; i >= validBits; --i) { - var bi = bytes[j++]; - if ((bi & 192) != 128) { - invalid = true; - break; - } - code = code << 6 | bi & 63; - } - if (invalid) { - for (var k = j - (7 - i); k < j; ++k) { - str += String.fromCharCode(bytes[k] & 255); - } - continue; - } - if (code >= 65536) { - str += String.fromCharCode(code - 65536 >> 10 & 1023 | 55296, code & 1023 | 56320); - } else { - str += String.fromCharCode(code); - } - } - } - return str; -} -function getFlags(value, flags) { - var str = ''; - for (var i = 0; i < flags.length; i++) { - if (value & 1 << i) { - str += flags[i] + ' '; - } - } - if (str.length === 0) { - return ''; - } - return str.trim(); -} -function bitCount(i) { - i = i - (i >> 1 & 1431655765); - i = (i & 858993459) + (i >> 2 & 858993459); - return (i + (i >> 4) & 252645135) * 16843009 >> 24; -} -function escapeString(str) { - if (str !== undefined) { - str = str.replace(/[^\w$]/gi, '$'); - if (/^\d/.test(str)) { - str = '$' + str; - } - } - return str; -} +var utf8decode = Shumway.StringUtilities.utf8decode; +var utf8encode = Shumway.StringUtilities.utf8encode; +var escapeString = Shumway.StringUtilities.escapeString; +var bitCount = Shumway.IntegerUtilities.bitCount; +var ones = Shumway.IntegerUtilities.ones; +var leadingZeros = Shumway.IntegerUtilities.leadingZeros; +var trailingZeros = Shumway.IntegerUtilities.trailingZeros; +var getFlags = Shumway.IntegerUtilities.getFlags; function BitSetFunctor(length) { var ADDRESS_BITS_PER_WORD = 5; var BITS_PER_WORD = 1 << ADDRESS_BITS_PER_WORD; @@ -10261,22 +11053,6 @@ function BitSetFunctor(length) { Ctor.BITS_PER_WORD = BITS_PER_WORD; Ctor.BIT_INDEX_MASK = BIT_INDEX_MASK; Ctor.singleword = singleword; - function ones(v) { - v = v - (v >> 1 & 1431655765); - v = (v & 858993459) + (v >> 2 & 858993459); - return (v + (v >> 4) & 252645135) * 16843009 >> 24; - } - function leadingZeros(v) { - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - return 32 - ones(v); - } - function trailingZeros(v) { - return ones((v & -v) - 1); - } BitSet.prototype = { recount: function recount() { if (!this.dirty) { @@ -10579,126 +11355,6 @@ function BitSetFunctor(length) { }; return Ctor; } -function base64ArrayBuffer(arrayBuffer) { - var base64 = ''; - var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - var bytes = new Uint8Array(arrayBuffer); - var byteLength = bytes.byteLength; - var byteRemainder = byteLength % 3; - var mainLength = byteLength - byteRemainder; - var a, b, c, d; - var chunk; - for (var i = 0; i < mainLength; i = i + 3) { - chunk = bytes[i] << 16 | bytes[i + 1] << 8 | bytes[i + 2]; - a = (chunk & 16515072) >> 18; - b = (chunk & 258048) >> 12; - c = (chunk & 4032) >> 6; - d = chunk & 63; - base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]; - } - if (byteRemainder == 1) { - chunk = bytes[mainLength]; - a = (chunk & 252) >> 2; - b = (chunk & 3) << 4; - base64 += encodings[a] + encodings[b] + '=='; - } else if (byteRemainder == 2) { - chunk = bytes[mainLength] << 8 | bytes[mainLength + 1]; - a = (chunk & 64512) >> 10; - b = (chunk & 1008) >> 4; - c = (chunk & 15) << 2; - base64 += encodings[a] + encodings[b] + encodings[c] + '='; - } - return base64; -} -var PURPLE = '\x1b[94m'; -var YELLOW = '\x1b[93m'; -var GREEN = '\x1b[92m'; -var RED = '\x1b[91m'; -var ENDC = '\x1b[0m'; -var IndentingWriter = function () { - var consoleOutFn = inBrowser ? console.info.bind(console) : print; - function indentingWriter(suppressOutput, outFn) { - this.tab = ' '; - this.padding = ''; - this.suppressOutput = suppressOutput; - this.out = outFn || consoleOutFn; - } - indentingWriter.prototype.writeLn = function writeLn(str) { - if (!this.suppressOutput) { - this.out(this.padding + str); - } - }; - indentingWriter.prototype.writeLns = function writeLns(str) { - var lines = str.split('\n'); - for (var i = 0; i < lines.length; i++) { - this.writeLn(lines[i]); - } - }; - indentingWriter.prototype.debugLn = function debugLn(str) { - this.colorLn(PURPLE, str); - }; - indentingWriter.prototype.yellowLn = function yellowLn(str) { - this.colorLn(YELLOW, str); - }; - indentingWriter.prototype.greenLn = function greenLn(str) { - this.colorLn(GREEN, str); - }; - indentingWriter.prototype.redLn = function redLn(str) { - this.colorLn(RED, str); - }; - indentingWriter.prototype.colorLn = function writeLn(color, str) { - if (!this.suppressOutput) { - if (!inBrowser) { - this.out(this.padding + color + str + ENDC); - } else { - this.out(this.padding + str); - } - } - }; - indentingWriter.prototype.enter = function enter(str) { - if (!this.suppressOutput) { - this.out(this.padding + str); - } - this.indent(); - }; - indentingWriter.prototype.leaveAndEnter = function leaveAndEnter(str) { - this.leave(str); - this.indent(); - }; - indentingWriter.prototype.leave = function leave(str) { - this.outdent(); - if (!this.suppressOutput) { - this.out(this.padding + str); - } - }; - indentingWriter.prototype.indent = function indent() { - this.padding += this.tab; - }; - indentingWriter.prototype.outdent = function outdent() { - if (this.padding.length > 0) { - this.padding = this.padding.substring(0, this.padding.length - this.tab.length); - } - }; - indentingWriter.prototype.writeArray = function writeArray(arr, detailed, noNumbers) { - detailed = detailed || false; - for (var i = 0, j = arr.length; i < j; i++) { - var prefix = ''; - if (detailed) { - if (arr[i] === null) { - prefix = 'null'; - } else if (arr[i] === undefined) { - prefix = 'undefined'; - } else { - prefix = arr[i].constructor.name; - } - prefix += ' '; - } - var number = noNumbers ? '' : ('' + i).padRight(' ', 4); - this.writeLn(number + prefix + arr[i]); - } - }; - return indentingWriter; - }(); var Map = function () { function map() { this.elements = {}; @@ -10722,104 +11378,6 @@ var Map = function () { }; return map; }(); -var SortedList = function () { - function sortedList(compare) { - true; - this.compare = compare; - this.head = null; - this.length = 0; - } - sortedList.RETURN = 1; - sortedList.DELETE = 2; - sortedList.prototype.push = function push(value) { - true; - this.length++; - if (!this.head) { - this.head = { - value: value, - next: null - }; - return; - } - var curr = this.head; - var prev = null; - var node = { - value: value, - next: null - }; - var compare = this.compare; - while (curr) { - if (compare(curr.value, node.value) > 0) { - if (prev) { - node.next = curr; - prev.next = node; - } else { - node.next = this.head; - this.head = node; - } - return; - } - prev = curr; - curr = curr.next; - } - prev.next = node; - }; - sortedList.prototype.forEach = function forEach(visitor) { - var curr = this.head; - var last = null; - while (curr) { - var result = visitor(curr.value); - if (result === sortedList.RETURN) { - return; - } else if (result === sortedList.DELETE) { - if (!last) { - curr = this.head = this.head.next; - } else { - curr = last.next = curr.next; - } - } else { - last = curr; - curr = curr.next; - } - } - }; - sortedList.prototype.pop = function pop() { - if (!this.head) { - return undefined; - } - this.length--; - var ret = this.head; - this.head = this.head.next; - return ret.value; - }; - sortedList.prototype.peek = function peek() { - return this.head; - }; - sortedList.prototype.contains = function contains(value) { - var curr = this.head; - while (curr) { - if (curr.value === value) { - return true; - } - curr = curr.next; - } - return false; - }; - sortedList.prototype.toString = function () { - var str = '['; - var curr = this.head; - while (curr) { - str += curr.value.toString(); - curr = curr.next; - if (curr) { - str += ','; - } - } - str += ']'; - return str; - }; - return sortedList; - }(); (function checkWeakMap() { if (typeof this.WeakMap === 'function') return; @@ -10904,43 +11462,6 @@ var Callback = function () { }; return callback; }(); -var CircularBuffer = function () { - var mask = 4095, size = 4096; - function circularBuffer(Type) { - this.index = 0; - this.start = 0; - this.array = new Type(size); - } - circularBuffer.prototype.get = function (i) { - return this.array[i]; - }; - circularBuffer.prototype.forEachInReverse = function (visitor) { - if (this.isEmpty()) { - return; - } - var i = this.index === 0 ? size - 1 : this.index - 1; - while (i !== this.start) { - if (visitor(this.array[i], i)) { - break; - } - i = i === 0 ? size - 1 : i - 1; - } - }; - circularBuffer.prototype.write = function (value) { - this.array[this.index] = value; - this.index = this.index + 1 & mask; - if (this.index === this.start) { - this.start = this.start + 1 & mask; - } - }; - circularBuffer.prototype.isFull = function () { - return this.index + 1 & mask === this.start; - }; - circularBuffer.prototype.isEmpty = function () { - return this.index === this.start; - }; - return circularBuffer; - }(); function lazyClass(holder, name, initialize) { Object.defineProperty(holder, name, { get: function () { @@ -10956,164 +11477,326 @@ function lazyClass(holder, name, initialize) { configurable: true }); } -function createNewCompartment() { - return newGlobal('new-compartment'); +var hashBytesTo32BitsAdler = Shumway.HashUtilities.hashBytesTo32BitsAdler; +var hashBytesTo32BitsMD5 = Shumway.HashUtilities.hashBytesTo32BitsMD5; +var variableLengthEncodeInt32 = Shumway.StringUtilities.variableLengthEncodeInt32; +var fromEncoding = Shumway.StringUtilities.fromEncoding; +var variableLengthDecodeIdentifier = Shumway.StringUtilities.variableLengthDecodeInt32; +var toEncoding = Shumway.StringUtilities.toEncoding; +var Shumway; +(function (Shumway) { + (function (Options) { + var Argument = function () { + function Argument(shortName, longName, type, options) { + this.shortName = shortName; + this.longName = longName; + this.type = type; + options = options || {}; + this.positional = options.positional; + this.parseFn = options.parse; + this.value = options.defaultValue; + } + Argument.prototype.parse = function (value) { + if (this.type === 'boolean') { + true; + this.value = value; + } else if (this.type === 'number') { + true; + this.value = parseInt(value, 10); + } else { + this.value = value; + } + if (this.parseFn) { + this.parseFn(this.value); + } + }; + return Argument; + }(); + Options.Argument = Argument; + var ArgumentParser = function () { + function ArgumentParser() { + this.args = []; + } + ArgumentParser.prototype.addArgument = function (shortName, longName, type, options) { + var argument = new Argument(shortName, longName, type, options); + this.args.push(argument); + return argument; + }; + ArgumentParser.prototype.addBoundOption = function (option) { + var options = { + parse: function (x) { + option.value = x; + } + }; + this.args.push(new Argument(option.shortName, option.longName, option.type, options)); + }; + ArgumentParser.prototype.addBoundOptionSet = function (optionSet) { + var self = this; + optionSet.options.forEach(function (x) { + if (x instanceof OptionSet) { + self.addBoundOptionSet(x); + } else { + true; + self.addBoundOption(x); + } + }); + }; + ArgumentParser.prototype.getUsage = function () { + var str = ''; + this.args.forEach(function (x) { + if (!x.positional) { + str += '[-' + x.shortName + '|--' + x.longName + (x.type === 'boolean' ? '' : ' ' + x.type[0].toUpperCase()) + ']'; + } else { + str += x.longName; + } + str += ' '; + }); + return str; + }; + ArgumentParser.prototype.parse = function (args) { + var nonPositionalArgumentMap = {}; + var positionalArgumentList = []; + this.args.forEach(function (x) { + if (x.positional) { + positionalArgumentList.push(x); + } else { + nonPositionalArgumentMap['-' + x.shortName] = x; + nonPositionalArgumentMap['--' + x.longName] = x; + } + }); + var leftoverArguments = []; + while (args.length) { + var argString = args.shift(); + var argument = null, value = argString; + if (argString == '--') { + leftoverArguments = leftoverArguments.concat(args); + break; + } else if (argString.slice(0, 1) == '-' || argString.slice(0, 2) == '--') { + argument = nonPositionalArgumentMap[argString]; + true; + if (!argument) { + continue; + } + if (argument.type !== 'boolean') { + value = args.shift(); + true; + } else { + value = true; + } + } else if (positionalArgumentList.length) { + argument = positionalArgumentList.shift(); + } else { + leftoverArguments.push(value); + } + if (argument) { + argument.parse(value); + } + } + true; + return leftoverArguments; + }; + return ArgumentParser; + }(); + Options.ArgumentParser = ArgumentParser; + var OptionSet = function () { + function OptionSet(name) { + this.name = name; + this.options = []; + } + OptionSet.prototype.register = function (option) { + this.options.push(option); + return option; + }; + OptionSet.prototype.trace = function (writer) { + writer.enter(this.name + ' {'); + this.options.forEach(function (option) { + option.trace(writer); + }); + writer.leave('}'); + }; + return OptionSet; + }(); + Options.OptionSet = OptionSet; + var Option = function () { + function Option(shortName, longName, type, defaultValue, description) { + this.longName = longName; + this.shortName = shortName; + this.type = type; + this.defaultValue = defaultValue; + this.value = defaultValue; + this.description = description; + } + Option.prototype.parse = function (value) { + this.value = value; + }; + Option.prototype.trace = function (writer) { + writer.writeLn(('-' + this.shortName + '|--' + this.longName).padRight(' ', 30) + ' = ' + this.type + ' ' + this.value + ' [' + this.defaultValue + ']' + ' (' + this.description + ')'); + }; + return Option; + }(); + Options.Option = Option; + }(Shumway.Options || (Shumway.Options = {}))); + var Options = Shumway.Options; +}(Shumway || (Shumway = {}))); +if (typeof exports !== 'undefined') { + exports['Shumway'] = Shumway; } -(function (exports) { - var Timer = function () { - var base = new timer(null, 'Total'), top = base; - var flat = new timer(null, 'Flat'), flatStack = []; - function timer(parent, name) { - this.parent = parent; - this.timers = {}; - this.name = name; - this.begin = 0; - this.last = 0; - this.total = 0; - this.count = 0; - } - timer.flat = flat; - function getTicks() { - return performance.now(); - } - timer.prototype.start = function () { - this.begin = getTicks(); - }; - timer.prototype.stop = function () { - this.last = getTicks() - this.begin; - this.total += this.last; - this.count += 1; - }; - timer.time = function (name, fn) { - timer.start(name); - fn(); - timer.stop(); - }; - timer.start = function (name) { - top = top.timers[name] || (top.timers[name] = new timer(top, name)); - top.start(); - var tmp = flat.timers[name] || (flat.timers[name] = new timer(flat, name)); - tmp.start(); - flatStack.push(tmp); - }; - timer.stop = function () { - top.stop(); - top = top.parent; - flatStack.pop().stop(); - }; - timer.stopStart = function (name) { - Timer.stop(); - Timer.start(name); - }, timer.prototype.toJSON = function () { - return { - name: this.name, - total: this.total, - timers: this.timers +var ArgumentParser = Shumway.Options.ArgumentParser; +var Option = Shumway.Options.Option; +var OptionSet = Shumway.Options.OptionSet; +var ArgumentParser = Shumway.Options.ArgumentParser; +var Option = Shumway.Options.Option; +var OptionSet = Shumway.Options.OptionSet; +var Shumway; +(function (Shumway) { + (function (Metrics) { + var Timer = function () { + function Timer(parent, name) { + this._parent = parent; + this._timers = Shumway.ObjectUtilities.createMap(); + this._name = name; + this._begin = 0; + this._last = 0; + this._total = 0; + this._count = 0; + } + Timer.time = function (name, fn) { + Timer.start(name); + fn(); + Timer.stop(); }; - }; - timer.prototype.trace = function (writer, json) { - if (json) { - writer.writeLn('SHUMWAY$JSON ' + JSON.stringify({ - timer: this - })); - return; - } - writer.enter(this.name + ': ' + this.total.toFixed(2) + ' ms' + ', count: ' + this.count + ', average: ' + (this.total / this.count).toFixed(2) + ' ms'); - for (var name in this.timers) { - this.timers[name].trace(writer); - } - writer.outdent(); - }; - timer.trace = function (writer, json) { - base.trace(writer, json); - flat.trace(writer, json); - }; - return timer; - }(); - var Counter = function () { - function counter(enabled) { - this.enabled = !(!enabled); - this.counts = createEmptyObject(); - } - counter.prototype.setEnabled = function (enabled) { - this.enabled = enabled; - }; - counter.prototype.clear = function () { - this.counts = {}; - }; - counter.prototype.toJSON = function () { - return { - counts: this.counts + Timer.start = function (name) { + Timer._top = Timer._top._timers[name] || (Timer._top._timers[name] = new Timer(Timer._top, name)); + Timer._top.start(); + var tmp = Timer._flat._timers[name] || (Timer._flat._timers[name] = new Timer(Timer._flat, name)); + tmp.start(); + Timer._flatStack.push(tmp); }; - }; - counter.prototype.count = function (name, increment) { - if (!this.enabled) { - return; + Timer.stop = function () { + Timer._top.stop(); + Timer._top = Timer._top._parent; + Timer._flatStack.pop().stop(); + }; + Timer.stopStart = function (name) { + Timer.stop(); + Timer.start(name); + }; + Timer.prototype.start = function () { + this._begin = Shumway.getTicks(); + }; + Timer.prototype.stop = function () { + this._last = Shumway.getTicks() - this._begin; + this._total += this._last; + this._count += 1; + }; + Timer.prototype.toJSON = function () { + return { + name: this._name, + total: this._total, + timers: this._timers + }; + }; + Timer.prototype.trace = function (writer) { + writer.enter(this._name + ': ' + this._total.toFixed(2) + ' ms' + ', count: ' + this._count + ', average: ' + (this._total / this._count).toFixed(2) + ' ms'); + for (var name in this._timers) { + this._timers[name].trace(writer); + } + writer.outdent(); + }; + Timer.trace = function (writer) { + Timer._base.trace(writer); + Timer._flat.trace(writer); + }; + Timer._base = new Timer(null, 'Total'); + Timer._top = Timer._base; + Timer._flat = new Timer(null, 'Flat'); + Timer._flatStack = []; + return Timer; + }(); + Metrics.Timer = Timer; + var Counter = function () { + function Counter(enabled) { + this._enabled = enabled; + this.clear(); } - increment = increment !== undefined ? increment : 1; - if (this.counts[name] === undefined) { - this.counts[name] = 0; + Counter.prototype.setEnabled = function (enabled) { + this._enabled = enabled; + }; + Counter.prototype.clear = function () { + this._counts = Shumway.ObjectUtilities.createMap(); + }; + Counter.prototype.toJSON = function () { + return { + counts: this._counts + }; + }; + Counter.prototype.count = function (name, increment) { + if (typeof increment === 'undefined') { + increment = 1; + } + if (!this._enabled) { + return; + } + if (this._counts[name] === undefined) { + this._counts[name] = 0; + } + this._counts[name] += increment; + return this._counts[name]; + }; + Counter.prototype.trace = function (writer) { + for (var name in this._counts) { + writer.writeLn(name + ': ' + this._counts[name]); + } + }; + Counter.prototype.traceSorted = function (writer) { + var pairs = []; + for (var name in this._counts) { + pairs.push([ + name, + this._counts[name] + ]); + } + pairs.sort(function (a, b) { + return b[1] - a[1]; + }); + pairs.forEach(function (pair) { + writer.writeLn(pair[0] + ': ' + pair[1]); + }); + }; + return Counter; + }(); + Metrics.Counter = Counter; + var Average = function () { + function Average(max) { + this._samples = new Float64Array(max); + this._count = 0; + this._index = 0; } - this.counts[name] += increment; - return this.counts[name]; - }; - counter.prototype.trace = function (writer, json) { - if (json) { - writer.writeLn('SHUMWAY$JSON ' + JSON.stringify({ - counter: this - })); - return; - } - for (var name in this.counts) { - writer.writeLn(name + ': ' + this.counts[name]); - } - }; - counter.prototype.traceSorted = function (writer) { - var pairs = []; - for (var name in this.counts) { - pairs.push([ - name, - this.counts[name] - ]); - } - pairs.sort(function (a, b) { - return b[1] - a[1]; - }); - pairs.forEach(function (pair) { - writer.writeLn(pair[0] + ': ' + pair[1]); - }); - }; - return counter; - }(); - var Average = function () { - function average(max) { - this.samples = new Float64Array(max); - this.count = 0; - this.index = 0; - } - average.prototype.push = function push(sample) { - if (this.count < this.samples.length) { - this.count++; - } - this.index++; - this.samples[this.index % this.samples.length] = sample; - }; - average.prototype.average = function average() { - var sum = 0; - for (var i = 0; i < this.count; i++) { - sum += this.samples[i]; - } - return sum / this.count; - }; - return average; - }(); - exports.Timer = Timer; - exports.Counter = Counter; - exports.Average = Average; -}(typeof exports === 'undefined' ? metrics = {} : exports)); -var Counter = new metrics.Counter(true); -var FrameCounter = new metrics.Counter(true); -var Timer = metrics.Timer; + Average.prototype.push = function (sample) { + if (this._count < this._samples.length) { + this._count++; + } + this._index++; + this._samples[this._index % this._samples.length] = sample; + }; + Average.prototype.average = function () { + var sum = 0; + for (var i = 0; i < this._count; i++) { + sum += this._samples[i]; + } + return sum / this._count; + }; + return Average; + }(); + Metrics.Average = Average; + }(Shumway.Metrics || (Shumway.Metrics = {}))); + var Metrics = Shumway.Metrics; +}(Shumway || (Shumway = {}))); +var Timer = Shumway.Metrics.Timer; +var Counter = new Shumway.Metrics.Counter(true); +var Timer = Shumway.Metrics.Timer; +var Counter = new Shumway.Metrics.Counter(true); +var FrameCounter = new Shumway.Metrics.Counter(true); var systemOptions = new OptionSet('System Options'); var disassemble = systemOptions.register(new Option('d', 'disassemble', 'boolean', false, 'disassemble')); var traceLevel = systemOptions.register(new Option('t', 'traceLevel', 'number', 0, 'trace level')); @@ -11366,2527 +12049,3174 @@ var SORT_DESCENDING = 2; var SORT_UNIQUESORT = 4; var SORT_RETURNINDEXEDARRAY = 8; var SORT_NUMERIC = 16; -var Errors = { - CallOfNonFunctionError: { - code: 1006, - message: '%1 is not a function.' - }, - ConvertNullToObjectError: { - code: 1009, - message: 'Cannot access a property or method of a null object reference.' - }, - ConvertUndefinedToObjectError: { - code: 1010, - message: 'A term is undefined and has no properties.' - }, - ClassNotFoundError: { - code: 1014, - message: 'Class %1 could not be found.' - }, - CheckTypeFailedError: { - code: 1034, - message: 'Type Coercion failed: cannot convert %1 to %2.' - }, - WrongArgumentCountError: { - code: 1063, - message: 'Argument count mismatch on %1. Expected %2, got %3.' - }, - XMLMarkupMustBeWellFormed: { - code: 1088, - message: 'The markup in the document following the root element must be well-formed.' - }, - OutOfRangeError: { - code: 1125, - message: 'The index %1 is out of range %2.' - }, - VectorFixedError: { - code: 1126, - message: 'Cannot change the length of a fixed Vector.' - }, - InvalidParamError: { - code: 2004, - message: 'One of the parameters is invalid.' - }, - ParamRangeError: { - code: 2006, - message: 'The supplied index is out of bounds.' - }, - NullPointerError: { - code: 2007, - message: 'Parameter %1 must be non-null.' - }, - InvalidEnumError: { - code: 2008, - message: 'Parameter %1 must be one of the accepted values.' - }, - ArgumentError: { - code: 2015, - message: 'Invalid BitmapData.' - }, - CompressedDataError: { - code: 2058, - message: 'There was an error decompressing the data.' - }, - SocketConnectError: { - code: 2011, - message: 'Socket connection failed to %1:%2.' - }, - CantAddSelfError: { - code: 2024, - message: 'An object cannot be added as a child of itself.' - }, - NotAChildError: { - code: 2025, - message: 'The supplied DisplayObject must be a child of the caller.' - }, - ExternalInterfaceNotAvailableError: { - code: 2067, - message: 'The ExternalInterface is not available in this container. ExternalInterface requires Internet Explorer ActiveX, Firefox, Mozilla 1.7.5 and greater, or other browsers that support NPRuntime.' - } - }; -function getErrorMessage(index) { - if (!debuggerMode.value) { - return 'Error #' + index; - } - for (var k in Errors) { - if (Errors[k].code == index) { - return 'Error #' + index + ': ' + Errors[k].message; - } - } - return 'Error #' + index + ': (unknown)'; -} -function formatErrorMessage(error) { - var message = error.message; - Array.prototype.slice.call(arguments, 1).forEach(function (x, i) { - message = message.replace('%' + (i + 1), x); - }); - return 'Error #' + error.code + ': ' + message; -} -function translateErrorMessage(error) { - if (error.type) { - switch (error.type) { - case 'undefined_method': - return formatErrorMessage(Errors.CallOfNonFunctionError, 'value'); - default: - throw notImplemented(error.type); - } - } else { - if (error.message.indexOf('is not a function') >= 0) { - return formatErrorMessage(Errors.CallOfNonFunctionError, 'value'); - } - return error.message; - } -} -var opcodeTable = [ - null, - { - name: 'bkpt', - operands: '', - canThrow: false, - stackDelta: 0 - }, - { - name: 'nop', - operands: '', - canThrow: false, - stackDelta: 0 - }, - { - name: 'throw', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'getsuper', - operands: 'index:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'setsuper', - operands: 'index:u30', - canThrow: true, - stackDelta: -2 - }, - { - name: 'dxns', - operands: 'index:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'dxnslate', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'kill', - operands: 'index:u30', - canThrow: false, - stackDelta: 0 - }, - { - name: 'label', - operands: '', - canThrow: false, - stackDelta: 0 - }, - { - name: 'lf32x4', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'sf32x4', - operands: '', - canThrow: true, - stackDelta: -2 - }, - { - name: 'ifnlt', - operands: 'offset:s24', - canThrow: true, - stackDelta: -2 - }, - { - name: 'ifnle', - operands: 'offset:s24', - canThrow: true, - stackDelta: -2 - }, - { - name: 'ifngt', - operands: 'offset:s24', - canThrow: true, - stackDelta: -2 - }, - { - name: 'ifnge', - operands: 'offset:s24', - canThrow: true, - stackDelta: -2 - }, - { - name: 'jump', - operands: 'offset:s24', - canThrow: false, - stackDelta: 0 - }, - { - name: 'iftrue', - operands: 'offset:s24', - canThrow: false, - stackDelta: -1 - }, - { - name: 'iffalse', - operands: 'offset:s24', - canThrow: false, - stackDelta: -1 - }, - { - name: 'ifeq', - operands: 'offset:s24', - canThrow: true, - stackDelta: -2 - }, - { - name: 'ifne', - operands: 'offset:s24', - canThrow: true, - stackDelta: -2 - }, - { - name: 'iflt', - operands: 'offset:s24', - canThrow: true, - stackDelta: -2 - }, - { - name: 'ifle', - operands: 'offset:s24', - canThrow: true, - stackDelta: -2 - }, - { - name: 'ifgt', - operands: 'offset:s24', - canThrow: true, - stackDelta: -2 - }, - { - name: 'ifge', - operands: 'offset:s24', - canThrow: true, - stackDelta: -2 - }, - { - name: 'ifstricteq', - operands: 'offset:s24', - canThrow: false, - stackDelta: -2 - }, - { - name: 'ifstrictne', - operands: 'offset:s24', - canThrow: false, - stackDelta: -2 - }, - { - name: 'lookupswitch', - operands: null, - canThrow: false, - stackDelta: -1 - }, - { - name: 'pushwith', - operands: '', - canThrow: false, - stackDelta: -1 - }, - { - name: 'popscope', - operands: '', - canThrow: false, - stackDelta: 0 - }, - { - name: 'nextname', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'hasnext', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'pushnull', - operands: '', - canThrow: false, - stackDelta: 1 - }, - { - name: 'pushundefined', - operands: '', - canThrow: false, - stackDelta: 1 - }, - null, - { - name: 'nextvalue', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'pushbyte', - operands: 'value:s08', - canThrow: false, - stackDelta: 1 - }, - { - name: 'pushshort', - operands: 'value:s16', - canThrow: false, - stackDelta: 1 - }, - { - name: 'pushtrue', - operands: '', - canThrow: false, - stackDelta: 1 - }, - { - name: 'pushfalse', - operands: '', - canThrow: false, - stackDelta: 1 - }, - { - name: 'pushnan', - operands: '', - canThrow: false, - stackDelta: 1 - }, - { - name: 'pop', - operands: '', - canThrow: false, - stackDelta: -1 - }, - { - name: 'dup', - operands: '', - canThrow: false, - stackDelta: 1 - }, - { - name: 'swap', - operands: '', - canThrow: false, - stackDelta: 0 - }, - { - name: 'pushstring', - operands: 'index:u30S', - canThrow: false, - stackDelta: 1 - }, - { - name: 'pushint', - operands: 'index:u30I', - canThrow: false, - stackDelta: 1 - }, - { - name: 'pushuint', - operands: 'index:u30U', - canThrow: false, - stackDelta: 1 - }, - { - name: 'pushdouble', - operands: 'index:u30D', - canThrow: false, - stackDelta: 1 - }, - { - name: 'pushscope', - operands: '', - canThrow: false, - stackDelta: -1 - }, - { - name: 'pushnamespace', - operands: 'index:u30N', - canThrow: false, - stackDelta: 1 - }, - { - name: 'hasnext2', - operands: 'object:u30,index:u30', - canThrow: true, - stackDelta: 1 - }, - { - name: 'lix8', - operands: null, - canThrow: true, - stackDelta: 0, - internal: true - }, - { - name: 'lix16', - operands: null, - canThrow: true, - stackDelta: 0, - internal: true - }, - { - name: 'li8', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'li16', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'li32', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'lf32', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'lf64', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'si8', - operands: '', - canThrow: true, - stackDelta: -2 - }, - { - name: 'si16', - operands: '', - canThrow: true, - stackDelta: -2 - }, - { - name: 'si32', - operands: '', - canThrow: true, - stackDelta: -2 - }, - { - name: 'sf32', - operands: '', - canThrow: true, - stackDelta: -2 - }, - { - name: 'sf64', - operands: '', - canThrow: true, - stackDelta: -2 - }, - null, - { - name: 'newfunction', - operands: 'index:u30MI', - canThrow: true, - stackDelta: 1 - }, - { - name: 'call', - operands: 'argCount:u30', - canThrow: true, - stackDelta: -1 - }, - { - name: 'construct', - operands: 'argCount:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'callmethod', - operands: 'index:u30,argCount:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'callstatic', - operands: 'index:u30MI,argCount:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'callsuper', - operands: 'index:u30M,argCount:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'callproperty', - operands: 'index:u30M,argCount:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'returnvoid', - operands: '', - canThrow: false, - stackDelta: 0 - }, - { - name: 'returnvalue', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'constructsuper', - operands: 'argCount:u30', - canThrow: true, - stackDelta: -1 - }, - { - name: 'constructprop', - operands: 'index:u30M,argCount:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'callsuperid', - operands: null, - canThrow: true, - stackDelta: 0, - internal: true - }, - { - name: 'callproplex', - operands: 'index:u30M,argCount:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'callinterface', - operands: null, - canThrow: true, - stackDelta: 0, - internal: true - }, - { - name: 'callsupervoid', - operands: 'index:u30M,argCount:u30', - canThrow: true, - stackDelta: -1 - }, - { - name: 'callpropvoid', - operands: 'index:u30M,argCount:u30', - canThrow: true, - stackDelta: -1 - }, - { - name: 'sxi1', - operands: '', - canThrow: false, - stackDelta: 0 - }, - { - name: 'sxi8', - operands: '', - canThrow: false, - stackDelta: 0 - }, - { - name: 'sxi16', - operands: '', - canThrow: false, - stackDelta: 0 - }, - { - name: 'applytype', - operands: 'argCount:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'pushfloat4', - operands: null, - canThrow: false, - stackDelta: 1 - }, - { - name: 'newobject', - operands: 'argCount:u30', - canThrow: true, - stackDelta: 1 - }, - { - name: 'newarray', - operands: 'argCount:u30', - canThrow: true, - stackDelta: 1 - }, - { - name: 'newactivation', - operands: '', - canThrow: true, - stackDelta: 1 - }, - { - name: 'newclass', - operands: 'index:u30CI', - canThrow: true, - stackDelta: 0 - }, - { - name: 'getdescendants', - operands: 'index:u30M', - canThrow: true, - stackDelta: 0 - }, - { - name: 'newcatch', - operands: 'index:u30EI', - canThrow: true, - stackDelta: 1 - }, - { - name: 'findpropglobalstrict', - operands: null, - canThrow: true, - stackDelta: 0, - internal: true - }, - { - name: 'findpropglobal', - operands: null, - canThrow: true, - stackDelta: 0, - internal: true - }, - { - name: 'findpropstrict', - operands: 'index:u30M', - canThrow: true, - stackDelta: 1 - }, - { - name: 'findproperty', - operands: 'index:u30M', - canThrow: true, - stackDelta: 1 - }, - { - name: 'finddef', - operands: null, - canThrow: true, - stackDelta: 1 - }, - { - name: 'getlex', - operands: 'index:u30M', - canThrow: true, - stackDelta: 1 - }, - { - name: 'setproperty', - operands: 'index:u30M', - canThrow: true, - stackDelta: -2 - }, - { - name: 'getlocal', - operands: 'index:u30', - canThrow: false, - stackDelta: 1 - }, - { - name: 'setlocal', - operands: 'index:u30', - canThrow: false, - stackDelta: -1 - }, - { - name: 'getglobalscope', - operands: '', - canThrow: false, - stackDelta: 1 - }, - { - name: 'getscopeobject', - operands: 'index:u30', - canThrow: false, - stackDelta: 1 - }, - { - name: 'getproperty', - operands: 'index:u30M', - canThrow: true, - stackDelta: 0 - }, - { - name: 'getouterscope', - operands: null, - canThrow: false, - stackDelta: 1 - }, - { - name: 'initproperty', - operands: 'index:u30M', - canThrow: true, - stackDelta: -2 - }, - null, - { - name: 'deleteproperty', - operands: 'index:u30M', - canThrow: true, - stackDelta: 0 - }, - null, - { - name: 'getslot', - operands: 'index:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'setslot', - operands: 'index:u30', - canThrow: true, - stackDelta: -2 - }, - { - name: 'getglobalslot', - operands: 'index:u30', - canThrow: false, - stackDelta: 1 - }, - { - name: 'setglobalslot', - operands: 'index:u30', - canThrow: false, - stackDelta: -1 - }, - { - name: 'convert_s', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'esc_xelem', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'esc_xattr', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'convert_i', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'convert_u', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'convert_d', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'convert_b', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'convert_o', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'checkfilter', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'convert_f', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'unplus', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'convert_f4', - operands: '', - canThrow: true, - stackDelta: 0 - }, - null, - null, - null, - null, - { - name: 'coerce', - operands: 'index:u30M', - canThrow: true, - stackDelta: 0 - }, - { - name: 'coerce_b', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'coerce_a', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'coerce_i', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'coerce_d', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'coerce_s', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'astype', - operands: 'index:u30M', - canThrow: true, - stackDelta: 0 - }, - { - name: 'astypelate', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'coerce_u', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'coerce_o', - operands: '', - canThrow: true, - stackDelta: 0 - }, - null, - null, - null, - null, - null, - null, - { - name: 'negate', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'increment', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'inclocal', - operands: 'index:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'decrement', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'declocal', - operands: 'index:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'typeof', - operands: '', - canThrow: false, - stackDelta: 0 - }, - { - name: 'not', - operands: '', - canThrow: false, - stackDelta: 0 - }, - { - name: 'bitnot', - operands: '', - canThrow: true, - stackDelta: 0 - }, - null, - null, - null, - null, - null, - null, - null, - null, - { - name: 'add', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'subtract', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'multiply', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'divide', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'modulo', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'lshift', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'rshift', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'urshift', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'bitand', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'bitor', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'bitxor', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'equals', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'strictequals', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'lessthan', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'lessequals', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'greaterthan', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'greaterequals', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'instanceof', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'istype', - operands: 'index:u30M', - canThrow: true, - stackDelta: 0 - }, - { - name: 'istypelate', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'in', - operands: '', - canThrow: true, - stackDelta: -1 - }, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - { - name: 'increment_i', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'decrement_i', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'inclocal_i', - operands: 'index:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'declocal_i', - operands: 'index:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'negate_i', - operands: '', - canThrow: true, - stackDelta: 0 - }, - { - name: 'add_i', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'subtract_i', - operands: '', - canThrow: true, - stackDelta: -1 - }, - { - name: 'multiply_i', - operands: '', - canThrow: true, - stackDelta: -1 - }, - null, - null, - null, - null, - null, - null, - null, - null, - { - name: 'getlocal0', - operands: '', - canThrow: false, - stackDelta: 1 - }, - { - name: 'getlocal1', - operands: '', - canThrow: false, - stackDelta: 1 - }, - { - name: 'getlocal2', - operands: '', - canThrow: false, - stackDelta: 1 - }, - { - name: 'getlocal3', - operands: '', - canThrow: false, - stackDelta: 1 - }, - { - name: 'setlocal0', - operands: '', - canThrow: false, - stackDelta: -1 - }, - { - name: 'setlocal1', - operands: '', - canThrow: false, - stackDelta: -1 - }, - { - name: 'setlocal2', - operands: '', - canThrow: false, - stackDelta: -1 - }, - { - name: 'setlocal3', - operands: '', - canThrow: false, - stackDelta: -1 - }, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - { - name: 'invalid', - operands: '', - canThrow: false, - stackDelta: 0 - }, - null, - { - name: 'debug', - operands: 'debugType:u08,index:u30S,reg:u08,extra:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'debugline', - operands: 'lineNumber:u30', - canThrow: true, - stackDelta: 0 - }, - { - name: 'debugfile', - operands: 'index:u30S', - canThrow: true, - stackDelta: 0 - }, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null - ]; -(function processOpcodeTable() { - for (var i = 0; i < opcodeTable.length; i++) { - var entry = opcodeTable[i]; - if (entry && entry.operands !== null) { - var result = []; - if (entry.operands !== '') { - var operands = entry.operands.split(','); - for (var j = 0; j < operands.length; j++) { - var list = operands[j].split(':'); - result.push({ - name: list[0], - size: list[1].substring(0, 3), - type: list[1].substring(3) - }); +var Shumway; +(function (Shumway) { + (function (AVM2) { + AVM2.Errors = { + CallOfNonFunctionError: { + code: 1006, + message: '%1 is not a function.' + }, + ConvertNullToObjectError: { + code: 1009, + message: 'Cannot access a property or method of a null object reference.' + }, + ConvertUndefinedToObjectError: { + code: 1010, + message: 'A term is undefined and has no properties.' + }, + ClassNotFoundError: { + code: 1014, + message: 'Class %1 could not be found.' + }, + CheckTypeFailedError: { + code: 1034, + message: 'Type Coercion failed: cannot convert %1 to %2.' + }, + WrongArgumentCountError: { + code: 1063, + message: 'Argument count mismatch on %1. Expected %2, got %3.' + }, + XMLMarkupMustBeWellFormed: { + code: 1088, + message: 'The markup in the document following the root element must be well-formed.' + }, + OutOfRangeError: { + code: 1125, + message: 'The index %1 is out of range %2.' + }, + VectorFixedError: { + code: 1126, + message: 'Cannot change the length of a fixed Vector.' + }, + InvalidParamError: { + code: 2004, + message: 'One of the parameters is invalid.' + }, + ParamRangeError: { + code: 2006, + message: 'The supplied index is out of bounds.' + }, + NullPointerError: { + code: 2007, + message: 'Parameter %1 must be non-null.' + }, + InvalidEnumError: { + code: 2008, + message: 'Parameter %1 must be one of the accepted values.' + }, + ArgumentError: { + code: 2015, + message: 'Invalid BitmapData.' + }, + CompressedDataError: { + code: 2058, + message: 'There was an error decompressing the data.' + }, + SocketConnectError: { + code: 2011, + message: 'Socket connection failed to %1:%2.' + }, + CantAddSelfError: { + code: 2024, + message: 'An object cannot be added as a child of itself.' + }, + NotAChildError: { + code: 2025, + message: 'The supplied DisplayObject must be a child of the caller.' + }, + ExternalInterfaceNotAvailableError: { + code: 2067, + message: 'The ExternalInterface is not available in this container. ExternalInterface requires Internet Explorer ActiveX, Firefox, Mozilla 1.7.5 and greater, or other browsers that support NPRuntime.' + } + }; + function getErrorMessage(index) { + if (!Shumway.AVM2.Runtime.debuggerMode.value) { + return 'Error #' + index; + } + for (var k in AVM2.Errors) { + if (AVM2.Errors[k].code == index) { + return 'Error #' + index + ': ' + AVM2.Errors[k].message; } } - entry.operands = result; + return 'Error #' + index + ': (unknown)'; } - } -}()); -function opcodeName(op) { - return opcodeTable[op].name; -} -var AbcStream = function () { - function abcStream(bytes) { - this.bytes = bytes; - this.view = new DataView(bytes.buffer, bytes.byteOffset); - this.pos = 0; + AVM2.getErrorMessage = getErrorMessage; + function formatErrorMessage(error) { + var args = []; + for (var _i = 0; _i < arguments.length - 1; _i++) { + args[_i] = arguments[_i + 1]; + } + var message = error.message; + Array.prototype.slice.call(arguments, 1).forEach(function (x, i) { + message = message.replace('%' + (i + 1), x); + }); + return 'Error #' + error.code + ': ' + message; } - var resultBuffer = new Int32Array(256); - abcStream.prototype = { - get position() { - return this.pos; - }, - remaining: function () { - return this.bytes.length - this.pos; - }, - seek: function (pos) { - this.pos = pos; - }, - readU8: function () { - return this.bytes[this.pos++]; - }, - readU8s: function (count) { - var b = new Uint8Array(count); - b.set(this.bytes.subarray(this.pos, this.pos + count), 0); - this.pos += count; - return b; - }, - readS8: function () { - return this.bytes[this.pos++] << 24 >> 24; - }, - readU32: function () { - return this.readS32() >>> 0; - }, - readU30: function () { - var result = this.readU32(); - if (result & 3221225472) { - return result; + AVM2.formatErrorMessage = formatErrorMessage; + function translateErrorMessage(error) { + if (error.type) { + switch (error.type) { + case 'undefined_method': + return formatErrorMessage(AVM2.Errors.CallOfNonFunctionError, 'value'); + default: + throw Shumway.Debug.notImplemented(error.type); } - return result; + } else { + if (error.message.indexOf('is not a function') >= 0) { + return formatErrorMessage(AVM2.Errors.CallOfNonFunctionError, 'value'); + } + return error.message; + } + } + AVM2.translateErrorMessage = translateErrorMessage; + }(Shumway.AVM2 || (Shumway.AVM2 = {}))); + var AVM2 = Shumway.AVM2; +}(Shumway || (Shumway = {}))); +var Errors = Shumway.AVM2.Errors; +var getErrorMessage = Shumway.AVM2.getErrorMessage; +var formatErrorMessage = Shumway.AVM2.formatErrorMessage; +var translateErrorMessage = Shumway.AVM2.translateErrorMessage; +var Errors = Shumway.AVM2.Errors; +var getErrorMessage = Shumway.AVM2.getErrorMessage; +var formatErrorMessage = Shumway.AVM2.formatErrorMessage; +var translateErrorMessage = Shumway.AVM2.translateErrorMessage; +var Shumway; +(function (Shumway) { + (function (AVM2) { + AVM2.opcodeTable = [ + null, + { + name: 'bkpt', + canThrow: false, + operands: [] }, - readU30Unsafe: function () { - return this.readU32(); + { + name: 'nop', + canThrow: false, + operands: [] }, - readS16: function () { - return this.readU30Unsafe() << 16 >> 16; + { + name: 'throw', + canThrow: true, + operands: [] }, - readS32: function () { - var result = this.readU8(); - if (result & 128) { - result = result & 127 | this.readU8() << 7; - if (result & 16384) { - result = result & 16383 | this.readU8() << 14; - if (result & 2097152) { - result = result & 2097151 | this.readU8() << 21; - if (result & 268435456) { - result = result & 268435455 | this.readU8() << 28; - result = result & 4294967295; + { + name: 'getsuper', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'setsuper', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'dxns', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'dxnslate', + canThrow: true, + operands: [] + }, + { + name: 'kill', + canThrow: false, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'label', + canThrow: false, + operands: [] + }, + { + name: 'lf32x4', + canThrow: true, + operands: [] + }, + { + name: 'sf32x4', + canThrow: true, + operands: [] + }, + { + name: 'ifnlt', + canThrow: true, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'ifnle', + canThrow: true, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'ifngt', + canThrow: true, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'ifnge', + canThrow: true, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'jump', + canThrow: false, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'iftrue', + canThrow: false, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'iffalse', + canThrow: false, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'ifeq', + canThrow: true, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'ifne', + canThrow: true, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'iflt', + canThrow: true, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'ifle', + canThrow: true, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'ifgt', + canThrow: true, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'ifge', + canThrow: true, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'ifstricteq', + canThrow: false, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'ifstrictne', + canThrow: false, + operands: [ + { + name: 'offset', + size: 's24', + type: '' + } + ] + }, + { + name: 'lookupswitch', + canThrow: false, + operands: null + }, + { + name: 'pushwith', + canThrow: false, + operands: [] + }, + { + name: 'popscope', + canThrow: false, + operands: [] + }, + { + name: 'nextname', + canThrow: true, + operands: [] + }, + { + name: 'hasnext', + canThrow: true, + operands: [] + }, + { + name: 'pushnull', + canThrow: false, + operands: [] + }, + { + name: 'pushundefined', + canThrow: false, + operands: [] + }, + null, + { + name: 'nextvalue', + canThrow: true, + operands: [] + }, + { + name: 'pushbyte', + canThrow: false, + operands: [ + { + name: 'value', + size: 's08', + type: '' + } + ] + }, + { + name: 'pushshort', + canThrow: false, + operands: [ + { + name: 'value', + size: 's16', + type: '' + } + ] + }, + { + name: 'pushtrue', + canThrow: false, + operands: [] + }, + { + name: 'pushfalse', + canThrow: false, + operands: [] + }, + { + name: 'pushnan', + canThrow: false, + operands: [] + }, + { + name: 'pop', + canThrow: false, + operands: [] + }, + { + name: 'dup', + canThrow: false, + operands: [] + }, + { + name: 'swap', + canThrow: false, + operands: [] + }, + { + name: 'pushstring', + canThrow: false, + operands: [ + { + name: 'index', + size: 'u30', + type: 'S' + } + ] + }, + { + name: 'pushint', + canThrow: false, + operands: [ + { + name: 'index', + size: 'u30', + type: 'I' + } + ] + }, + { + name: 'pushuint', + canThrow: false, + operands: [ + { + name: 'index', + size: 'u30', + type: 'U' + } + ] + }, + { + name: 'pushdouble', + canThrow: false, + operands: [ + { + name: 'index', + size: 'u30', + type: 'D' + } + ] + }, + { + name: 'pushscope', + canThrow: false, + operands: [] + }, + { + name: 'pushnamespace', + canThrow: false, + operands: [ + { + name: 'index', + size: 'u30', + type: 'N' + } + ] + }, + { + name: 'hasnext2', + canThrow: true, + operands: [ + { + name: 'object', + size: 'u30', + type: '' + }, + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'lix8', + canThrow: true, + operands: null + }, + { + name: 'lix16', + canThrow: true, + operands: null + }, + { + name: 'li8', + canThrow: true, + operands: [] + }, + { + name: 'li16', + canThrow: true, + operands: [] + }, + { + name: 'li32', + canThrow: true, + operands: [] + }, + { + name: 'lf32', + canThrow: true, + operands: [] + }, + { + name: 'lf64', + canThrow: true, + operands: [] + }, + { + name: 'si8', + canThrow: true, + operands: [] + }, + { + name: 'si16', + canThrow: true, + operands: [] + }, + { + name: 'si32', + canThrow: true, + operands: [] + }, + { + name: 'sf32', + canThrow: true, + operands: [] + }, + { + name: 'sf64', + canThrow: true, + operands: [] + }, + null, + { + name: 'newfunction', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'MI' + } + ] + }, + { + name: 'call', + canThrow: true, + operands: [ + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'construct', + canThrow: true, + operands: [ + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'callmethod', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + }, + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'callstatic', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'MI' + }, + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'callsuper', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + }, + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'callproperty', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + }, + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'returnvoid', + canThrow: false, + operands: [] + }, + { + name: 'returnvalue', + canThrow: true, + operands: [] + }, + { + name: 'constructsuper', + canThrow: true, + operands: [ + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'constructprop', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + }, + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'callsuperid', + canThrow: true, + operands: null + }, + { + name: 'callproplex', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + }, + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'callinterface', + canThrow: true, + operands: null + }, + { + name: 'callsupervoid', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + }, + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'callpropvoid', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + }, + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'sxi1', + canThrow: false, + operands: [] + }, + { + name: 'sxi8', + canThrow: false, + operands: [] + }, + { + name: 'sxi16', + canThrow: false, + operands: [] + }, + { + name: 'applytype', + canThrow: true, + operands: [ + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'pushfloat4', + canThrow: false, + operands: null + }, + { + name: 'newobject', + canThrow: true, + operands: [ + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'newarray', + canThrow: true, + operands: [ + { + name: 'argCount', + size: 'u30', + type: '' + } + ] + }, + { + name: 'newactivation', + canThrow: true, + operands: [] + }, + { + name: 'newclass', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'CI' + } + ] + }, + { + name: 'getdescendants', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + } + ] + }, + { + name: 'newcatch', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'EI' + } + ] + }, + { + name: 'findpropglobalstrict', + canThrow: true, + operands: null + }, + { + name: 'findpropglobal', + canThrow: true, + operands: null + }, + { + name: 'findpropstrict', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + } + ] + }, + { + name: 'findproperty', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + } + ] + }, + { + name: 'finddef', + canThrow: true, + operands: null + }, + { + name: 'getlex', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + } + ] + }, + { + name: 'setproperty', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + } + ] + }, + { + name: 'getlocal', + canThrow: false, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'setlocal', + canThrow: false, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'getglobalscope', + canThrow: false, + operands: [] + }, + { + name: 'getscopeobject', + canThrow: false, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'getproperty', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + } + ] + }, + { + name: 'getouterscope', + canThrow: false, + operands: null + }, + { + name: 'initproperty', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + } + ] + }, + null, + { + name: 'deleteproperty', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + } + ] + }, + null, + { + name: 'getslot', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'setslot', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'getglobalslot', + canThrow: false, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'setglobalslot', + canThrow: false, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'convert_s', + canThrow: true, + operands: [] + }, + { + name: 'esc_xelem', + canThrow: true, + operands: [] + }, + { + name: 'esc_xattr', + canThrow: true, + operands: [] + }, + { + name: 'convert_i', + canThrow: true, + operands: [] + }, + { + name: 'convert_u', + canThrow: true, + operands: [] + }, + { + name: 'convert_d', + canThrow: true, + operands: [] + }, + { + name: 'convert_b', + canThrow: true, + operands: [] + }, + { + name: 'convert_o', + canThrow: true, + operands: [] + }, + { + name: 'checkfilter', + canThrow: true, + operands: [] + }, + { + name: 'convert_f', + canThrow: true, + operands: [] + }, + { + name: 'unplus', + canThrow: true, + operands: [] + }, + { + name: 'convert_f4', + canThrow: true, + operands: [] + }, + null, + null, + null, + null, + { + name: 'coerce', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + } + ] + }, + { + name: 'coerce_b', + canThrow: true, + operands: [] + }, + { + name: 'coerce_a', + canThrow: true, + operands: [] + }, + { + name: 'coerce_i', + canThrow: true, + operands: [] + }, + { + name: 'coerce_d', + canThrow: true, + operands: [] + }, + { + name: 'coerce_s', + canThrow: true, + operands: [] + }, + { + name: 'astype', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + } + ] + }, + { + name: 'astypelate', + canThrow: true, + operands: [] + }, + { + name: 'coerce_u', + canThrow: true, + operands: [] + }, + { + name: 'coerce_o', + canThrow: true, + operands: [] + }, + null, + null, + null, + null, + null, + null, + { + name: 'negate', + canThrow: true, + operands: [] + }, + { + name: 'increment', + canThrow: true, + operands: [] + }, + { + name: 'inclocal', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'decrement', + canThrow: true, + operands: [] + }, + { + name: 'declocal', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'typeof', + canThrow: false, + operands: [] + }, + { + name: 'not', + canThrow: false, + operands: [] + }, + { + name: 'bitnot', + canThrow: true, + operands: [] + }, + null, + null, + null, + null, + null, + null, + null, + null, + { + name: 'add', + canThrow: true, + operands: [] + }, + { + name: 'subtract', + canThrow: true, + operands: [] + }, + { + name: 'multiply', + canThrow: true, + operands: [] + }, + { + name: 'divide', + canThrow: true, + operands: [] + }, + { + name: 'modulo', + canThrow: true, + operands: [] + }, + { + name: 'lshift', + canThrow: true, + operands: [] + }, + { + name: 'rshift', + canThrow: true, + operands: [] + }, + { + name: 'urshift', + canThrow: true, + operands: [] + }, + { + name: 'bitand', + canThrow: true, + operands: [] + }, + { + name: 'bitor', + canThrow: true, + operands: [] + }, + { + name: 'bitxor', + canThrow: true, + operands: [] + }, + { + name: 'equals', + canThrow: true, + operands: [] + }, + { + name: 'strictequals', + canThrow: true, + operands: [] + }, + { + name: 'lessthan', + canThrow: true, + operands: [] + }, + { + name: 'lessequals', + canThrow: true, + operands: [] + }, + { + name: 'greaterthan', + canThrow: true, + operands: [] + }, + { + name: 'greaterequals', + canThrow: true, + operands: [] + }, + { + name: 'instanceof', + canThrow: true, + operands: [] + }, + { + name: 'istype', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'M' + } + ] + }, + { + name: 'istypelate', + canThrow: true, + operands: [] + }, + { + name: 'in', + canThrow: true, + operands: [] + }, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + { + name: 'increment_i', + canThrow: true, + operands: [] + }, + { + name: 'decrement_i', + canThrow: true, + operands: [] + }, + { + name: 'inclocal_i', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'declocal_i', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: '' + } + ] + }, + { + name: 'negate_i', + canThrow: true, + operands: [] + }, + { + name: 'add_i', + canThrow: true, + operands: [] + }, + { + name: 'subtract_i', + canThrow: true, + operands: [] + }, + { + name: 'multiply_i', + canThrow: true, + operands: [] + }, + null, + null, + null, + null, + null, + null, + null, + null, + { + name: 'getlocal0', + canThrow: false, + operands: [] + }, + { + name: 'getlocal1', + canThrow: false, + operands: [] + }, + { + name: 'getlocal2', + canThrow: false, + operands: [] + }, + { + name: 'getlocal3', + canThrow: false, + operands: [] + }, + { + name: 'setlocal0', + canThrow: false, + operands: [] + }, + { + name: 'setlocal1', + canThrow: false, + operands: [] + }, + { + name: 'setlocal2', + canThrow: false, + operands: [] + }, + { + name: 'setlocal3', + canThrow: false, + operands: [] + }, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + { + name: 'invalid', + canThrow: false, + operands: [] + }, + null, + { + name: 'debug', + canThrow: true, + operands: [ + { + name: 'debugType', + size: 'u08', + type: '' + }, + { + name: 'index', + size: 'u30', + type: 'S' + }, + { + name: 'reg', + size: 'u08', + type: '' + }, + { + name: 'extra', + size: 'u30', + type: '' + } + ] + }, + { + name: 'debugline', + canThrow: true, + operands: [ + { + name: 'lineNumber', + size: 'u30', + type: '' + } + ] + }, + { + name: 'debugfile', + canThrow: true, + operands: [ + { + name: 'index', + size: 'u30', + type: 'S' + } + ] + }, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ]; + function opcodeName(op) { + return AVM2.opcodeTable[op].name; + } + AVM2.opcodeName = opcodeName; + }(Shumway.AVM2 || (Shumway.AVM2 = {}))); + var AVM2 = Shumway.AVM2; +}(Shumway || (Shumway = {}))); +var opcodeTable = Shumway.AVM2.opcodeTable; +var opcodeName = Shumway.AVM2.opcodeName; +var opcodeTable = Shumway.AVM2.opcodeTable; +var opcodeName = Shumway.AVM2.opcodeName; +var __extends = this.__extends || function (d, b) { + for (var p in b) + if (b.hasOwnProperty(p)) + d[p] = b[p]; + function __() { + this.constructor = d; + } + __.prototype = b.prototype; + d.prototype = new __(); + }; +var Shumway; +(function (Shumway) { + (function (AVM2) { + (function (ABC) { + var Timer = Shumway.Metrics.Timer; + var isString = Shumway.isString; + var isNumber = Shumway.isNumber; + var isNumeric = Shumway.isNumeric; + var isObject = Shumway.isObject; + var textDecoder = null; + if (typeof TextDecoder !== 'undefined') { + textDecoder = new TextDecoder(); + } + var AbcStream = function () { + function AbcStream(bytes) { + this._bytes = bytes; + this._view = new DataView(bytes.buffer, bytes.byteOffset); + this._position = 0; + } + AbcStream._getResultBuffer = function (length) { + if (!AbcStream._resultBuffer || AbcStream._resultBuffer.length < length) { + AbcStream._resultBuffer = new Int32Array(length * 2); + } + return AbcStream._resultBuffer; + }; + Object.defineProperty(AbcStream.prototype, 'position', { + get: function () { + return this._position; + }, + enumerable: true, + configurable: true + }); + AbcStream.prototype.remaining = function () { + return this._bytes.length - this._position; + }; + AbcStream.prototype.seek = function (position) { + this._position = position; + }; + AbcStream.prototype.readU8 = function () { + return this._bytes[this._position++]; + }; + AbcStream.prototype.readU8s = function (count) { + var b = new Uint8Array(count); + b.set(this._bytes.subarray(this._position, this._position + count), 0); + this._position += count; + return b; + }; + AbcStream.prototype.readS8 = function () { + return this._bytes[this._position++] << 24 >> 24; + }; + AbcStream.prototype.readU32 = function () { + return this.readS32() >>> 0; + }; + AbcStream.prototype.readU30 = function () { + var result = this.readU32(); + if (result & 3221225472) { + return result; + } + return result; + }; + AbcStream.prototype.readU30Unsafe = function () { + return this.readU32(); + }; + AbcStream.prototype.readS16 = function () { + return this.readU30Unsafe() << 16 >> 16; + }; + AbcStream.prototype.readS32 = function () { + var result = this.readU8(); + if (result & 128) { + result = result & 127 | this.readU8() << 7; + if (result & 16384) { + result = result & 16383 | this.readU8() << 14; + if (result & 2097152) { + result = result & 2097151 | this.readU8() << 21; + if (result & 268435456) { + result = result & 268435455 | this.readU8() << 28; + result = result & 4294967295; + } + } + } + } + return result; + }; + AbcStream.prototype.readWord = function () { + var result = this._view.getUint32(this._position, true); + this._position += 4; + return result; + }; + AbcStream.prototype.readS24 = function () { + var u = this.readU8() | this.readU8() << 8 | this.readU8() << 16; + return u << 8 >> 8; + }; + AbcStream.prototype.readDouble = function () { + var result = this._view.getFloat64(this._position, true); + this._position += 8; + return result; + }; + AbcStream.prototype.readUTFString = function (length) { + if (textDecoder) { + var position = this._position; + this._position += length; + return textDecoder.decode(this._bytes.subarray(position, position + length)); + } + var pos = this._position; + var end = pos + length; + var bytes = this._bytes; + var i = 0; + var result = AbcStream._getResultBuffer(length * 2); + while (pos < end) { + var c = bytes[pos++]; + if (c <= 127) { + result[i++] = c; + } else if (c >= 192) { + var code = 0; + if (c < 224) { + code = (c & 31) << 6 | bytes[pos++] & 63; + } else if (c < 240) { + code = (c & 15) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63; + } else { + code = ((c & 7) << 18 | (bytes[pos++] & 63) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63) - 65536; + result[i++] = ((code & 1047552) >>> 10) + 55296; + code = (code & 1023) + 56320; + } + result[i++] = code; + } + } + this._position = pos; + return Shumway.StringUtilities.fromCharCodeArray(result.subarray(0, i)); + }; + AbcStream._resultBuffer = new Int32Array(256); + return AbcStream; + }(); + ABC.AbcStream = AbcStream; + var Parameter = function () { + function Parameter(name, type, value) { + this.name = name; + this.type = type; + this.value = value; + } + return Parameter; + }(); + ABC.Parameter = Parameter; + var Trait = function () { + function Trait(abc, stream, holder) { + var constantPool = abc.constantPool; + var methods = abc.methods; + var classes = abc.classes; + var metadata = abc.metadata; + this.holder = holder; + this.name = constantPool.multinames[stream.readU30()]; + var tag = stream.readU8(); + this.kind = tag & 15; + this.attributes = tag >> 4 & 15; + true; + switch (this.kind) { + case 0: + case 6: + this.slotId = stream.readU30(); + this.typeName = constantPool.multinames[stream.readU30()]; + var valueIndex = stream.readU30(); + this.value = undefined; + if (valueIndex !== 0) { + this.hasDefaultValue = true; + this.value = constantPool.getValue(stream.readU8(), valueIndex); + } + break; + case 1: + case 3: + case 2: + this.dispId = stream.readU30(); + this.methodInfo = methods[stream.readU30()]; + this.methodInfo.name = this.name; + AbcFile.attachHolder(this.methodInfo, this.holder); + this.methodInfo.abc = abc; + break; + case 4: + this.slotId = stream.readU30(); + true; + this.classInfo = classes[stream.readU30()]; + break; + case 5: + true; + break; + } + if (this.attributes & 4) { + var traitMetadata; + for (var i = 0, j = stream.readU30(); i < j; i++) { + var md = metadata[stream.readU30()]; + if (md.name === '__go_to_definition_help' || md.name === '__go_to_ctor_definition_help') { + continue; + } + if (!traitMetadata) { + traitMetadata = {}; + } + traitMetadata[md.name] = md; + } + if (traitMetadata) { + if (this.isClass()) { + this.classInfo.metadata = traitMetadata; + } + this.metadata = traitMetadata; } } } - } - return result; - }, - readWord: function () { - var result = this.view.getUint32(this.pos, true); - this.pos += 4; - return result; - }, - readS24: function () { - var u = this.readU8() | this.readU8() << 8 | this.readU8() << 16; - return u << 8 >> 8; - }, - readDouble: function () { - var result = this.view.getFloat64(this.pos, true); - this.pos += 8; - return result; - }, - readUTFString: function (length) { - var pos = this.pos; - var end = pos + length; - var bytes = this.bytes; - var i = 0; - if (!resultBuffer || resultBuffer.length < length) { - resultBuffer = new Int32Array(length * 2); - } - var result = resultBuffer; - while (pos < end) { - var c = bytes[pos++]; - if (c <= 127) { - result[i++] = c; - } else if (c >= 192) { - var code = 0; - if (c < 224) { - code = (c & 31) << 6 | bytes[pos++] & 63; - } else if (c < 240) { - code = (c & 15) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63; - } else { - code = ((c & 7) << 18 | (bytes[pos++] & 63) << 12 | (bytes[pos++] & 63) << 6 | bytes[pos++] & 63) - 65536; - result[i++] = ((code & 1047552) >>> 10) + 55296; - code = (code & 1023) + 56320; + Trait.prototype.isSlot = function () { + return this.kind === 0; + }; + Trait.prototype.isConst = function () { + return this.kind === 6; + }; + Trait.prototype.isMethod = function () { + return this.kind === 1; + }; + Trait.prototype.isClass = function () { + return this.kind === 4; + }; + Trait.prototype.isGetter = function () { + return this.kind === 2; + }; + Trait.prototype.isSetter = function () { + return this.kind === 3; + }; + Trait.prototype.isProtected = function () { + true; + return this.name.namespaces[0].isProtected(); + }; + Trait.prototype.kindName = function () { + switch (this.kind) { + case 0: + return 'Slot'; + case 6: + return 'Const'; + case 1: + return 'Method'; + case 3: + return 'Setter'; + case 2: + return 'Getter'; + case 4: + return 'Class'; + case 5: + return 'Function'; } - result[i++] = code; + Shumway.Debug.unexpected(); + }; + Trait.prototype.isOverride = function () { + return this.attributes & 2; + }; + Trait.prototype.isFinal = function () { + return this.attributes & 1; + }; + Trait.prototype.toString = function () { + var str = Shumway.IntegerUtilities.getFlags(this.attributes, 'final|override|metadata'.split('|')); + if (str) { + str += ' '; + } + str += Multiname.getQualifiedName(this.name); + switch (this.kind) { + case 0: + case 6: + return str + ', typeName: ' + this.typeName + ', slotId: ' + this.slotId + ', value: ' + this.value; + case 1: + case 3: + case 2: + return str + ', ' + this.kindName() + ': ' + this.methodInfo.name; + case 4: + return str + ', slotId: ' + this.slotId + ', class: ' + this.classInfo; + case 5: + break; + } + }; + Trait.parseTraits = function (abc, stream, holder) { + var count = stream.readU30(); + var traits = []; + for (var i = 0; i < count; i++) { + traits.push(new Trait(abc, stream, holder)); + } + return traits; + }; + return Trait; + }(); + ABC.Trait = Trait; + var Info = function () { + function Info(abc, index) { + this.abc = abc; + this.index = index; } - } - this.pos = pos; - return fromCharCodeArray(result.subarray(0, i)); - } - }; - if (typeof TextDecoder !== 'undefined') { - var decoder = new TextDecoder(); - abcStream.prototype.readUTFString = function (length) { - var pos = this.pos; - this.pos += length; - return decoder.decode(this.bytes.subarray(pos, pos + length)); - }; - } - return abcStream; - }(); -function parseTraits(abc, stream, holder) { - var count = stream.readU30(); - var traits = []; - for (var i = 0; i < count; i++) { - traits.push(new Trait(abc, stream, holder)); - } - return traits; -} -var Trait = function () { - function trait(abc, stream, holder) { - var constantPool = abc.constantPool; - var methods = abc.methods; - var classes = abc.classes; - var metadata = abc.metadata; - this.holder = holder; - this.name = constantPool.multinames[stream.readU30()]; - var tag = stream.readU8(); - this.kind = tag & 15; - this.attributes = tag >> 4 & 15; - true; - switch (this.kind) { - case TRAIT_Slot: - case TRAIT_Const: - this.slotId = stream.readU30(); - this.typeName = constantPool.multinames[stream.readU30()]; - var valueIndex = stream.readU30(); - this.value = undefined; - if (valueIndex !== 0) { - this.hasDefaultValue = true; - this.value = constantPool.getValue(stream.readU8(), valueIndex); - } - break; - case TRAIT_Method: - case TRAIT_Setter: - case TRAIT_Getter: - this.dispId = stream.readU30(); - this.methodInfo = methods[stream.readU30()]; - this.methodInfo.name = this.name; - attachHolder(this.methodInfo, this.holder); - this.methodInfo.abc = abc; - break; - case TRAIT_Class: - this.slotId = stream.readU30(); - true; - this.classInfo = classes[stream.readU30()]; - break; - case TRAIT_Function: - true; - break; - } - if (this.attributes & ATTR_Metadata) { - var traitMetadata; - for (var i = 0, j = stream.readU30(); i < j; i++) { - var md = metadata[stream.readU30()]; - if (md.name === '__go_to_definition_help' || md.name === '__go_to_ctor_definition_help') { - continue; + return Info; + }(); + ABC.Info = Info; + var MethodInfo = function (_super) { + __extends(MethodInfo, _super); + function MethodInfo(abc, index, stream) { + _super.call(this, abc, index); + var constantPool = abc.constantPool; + var parameterCount = stream.readU30(); + this.returnType = constantPool.multinames[stream.readU30()]; + this.parameters = []; + for (var i = 0; i < parameterCount; i++) { + this.parameters.push(new Parameter(undefined, constantPool.multinames[stream.readU30()], undefined)); + } + this.debugName = constantPool.strings[stream.readU30()]; + this.flags = stream.readU8(); + var optionalCount = 0; + if (this.flags & 8) { + optionalCount = stream.readU30(); + true; + for (var i = parameterCount - optionalCount; i < parameterCount; i++) { + var valueIndex = stream.readU30(); + this.parameters[i].value = constantPool.getValue(stream.readU8(), valueIndex); + } + } + if (this.flags & 128) { + for (var i = 0; i < parameterCount; i++) { + if (false) { + this.parameters[i].name = constantPool.strings[stream.readU30()]; + } else { + stream.readU30(); + this.parameters[i].name = MethodInfo._getParameterName(i); + } + } + } else { + for (var i = 0; i < parameterCount; i++) { + this.parameters[i].name = MethodInfo._getParameterName(i); + } + } } - if (!traitMetadata) { - traitMetadata = {}; + MethodInfo._getParameterName = function (i) { + true; + return String.fromCharCode('A'.charCodeAt(0) + i); + }; + MethodInfo.prototype.toString = function () { + var flags = Shumway.IntegerUtilities.getFlags(this.flags, 'NEED_ARGUMENTS|NEED_ACTIVATION|NEED_REST|HAS_OPTIONAL|||SET_DXN|HAS_PARAM_NAMES'.split('|')); + return (flags ? flags + ' ' : '') + this.name; + }; + MethodInfo.prototype.hasOptional = function () { + return !(!(this.flags & 8)); + }; + MethodInfo.prototype.needsActivation = function () { + return !(!(this.flags & 2)); + }; + MethodInfo.prototype.needsRest = function () { + return !(!(this.flags & 4)); + }; + MethodInfo.prototype.needsArguments = function () { + return !(!(this.flags & 1)); + }; + MethodInfo.prototype.isNative = function () { + return !(!(this.flags & 32)); + }; + MethodInfo.prototype.isClassMember = function () { + return this.holder instanceof ClassInfo; + }; + MethodInfo.prototype.isInstanceMember = function () { + return this.holder instanceof InstanceInfo; + }; + MethodInfo.prototype.isScriptMember = function () { + return this.holder instanceof ScriptInfo; + }; + MethodInfo.parseException = function (abc, stream) { + var multinames = abc.constantPool.multinames; + var ex = { + start: stream.readU30(), + end: stream.readU30(), + target: stream.readU30(), + typeName: multinames[stream.readU30()], + varName: multinames[stream.readU30()] + }; + true; + true; + return ex; + }; + MethodInfo.parseBody = function (abc, stream) { + var constantPool = abc.constantPool; + var methods = abc.methods; + var index = stream.readU30(); + var mi = methods[index]; + mi.index = index; + mi.hasBody = true; + mi.hash = abc.hash + 196608 + index; + true; + mi.maxStack = stream.readU30(); + mi.localCount = stream.readU30(); + mi.initScopeDepth = stream.readU30(); + mi.maxScopeDepth = stream.readU30(); + mi.code = stream.readU8s(stream.readU30()); + var exceptions = []; + var exceptionCount = stream.readU30(); + for (var i = 0; i < exceptionCount; ++i) { + exceptions.push(MethodInfo.parseException(abc, stream)); + } + mi.exceptions = exceptions; + mi.traits = Trait.parseTraits(abc, stream, mi); + }; + MethodInfo.prototype.hasExceptions = function () { + return this.exceptions.length > 0; + }; + return MethodInfo; + }(Info); + ABC.MethodInfo = MethodInfo; + var InstanceInfo = function (_super) { + __extends(InstanceInfo, _super); + function InstanceInfo(abc, index, stream) { + _super.call(this, abc, index); + this.runtimeId = InstanceInfo.nextID++; + var constantPool = abc.constantPool; + var methods = abc.methods; + this.name = constantPool.multinames[stream.readU30()]; + true; + this.superName = constantPool.multinames[stream.readU30()]; + this.flags = stream.readU8(); + this.protectedNs = undefined; + if (this.flags & 8) { + this.protectedNs = constantPool.namespaces[stream.readU30()]; + } + var interfaceCount = stream.readU30(); + this.interfaces = []; + for (var i = 0; i < interfaceCount; i++) { + this.interfaces[i] = constantPool.multinames[stream.readU30()]; + } + this.init = methods[stream.readU30()]; + this.init.isInstanceInitializer = true; + this.init.name = this.name; + AbcFile.attachHolder(this.init, this); + this.traits = Trait.parseTraits(abc, stream, this); } - traitMetadata[md.name] = md; - } - if (traitMetadata) { - if (this.isClass()) { - this.classInfo.metadata = traitMetadata; + InstanceInfo.prototype.toString = function () { + var flags = Shumway.IntegerUtilities.getFlags(this.flags & 8, 'sealed|final|interface|protected'.split('|')); + var str = (flags ? flags + ' ' : '') + this.name; + if (this.superName) { + str += ' extends ' + this.superName; + } + return str; + }; + InstanceInfo.prototype.isFinal = function () { + return !(!(this.flags & 2)); + }; + InstanceInfo.prototype.isSealed = function () { + return !(!(this.flags & 1)); + }; + InstanceInfo.prototype.isInterface = function () { + return !(!(this.flags & 4)); + }; + InstanceInfo.nextID = 1; + return InstanceInfo; + }(Info); + ABC.InstanceInfo = InstanceInfo; + var ClassInfo = function (_super) { + __extends(ClassInfo, _super); + function ClassInfo(abc, index, stream) { + _super.call(this, abc, index); + this.runtimeId = ClassInfo.nextID++; + this.abc = abc; + this.hash = abc.hash + 65536 + index; + this.index = index; + this.init = abc.methods[stream.readU30()]; + this.init.isClassInitializer = true; + AbcFile.attachHolder(this.init, this); + this.traits = Trait.parseTraits(abc, stream, this); + this.instanceInfo = abc.instances[index]; + this.instanceInfo.classInfo = this; + this.defaultValue = ClassInfo._getDefaultValue(this.instanceInfo.name); } - this.metadata = traitMetadata; - } - } - } - trait.prototype.isSlot = function isSlot() { - return this.kind === TRAIT_Slot; - }; - trait.prototype.isConst = function isConst() { - return this.kind === TRAIT_Const; - }; - trait.prototype.isMethod = function isMethod() { - return this.kind === TRAIT_Method; - }; - trait.prototype.isClass = function isClass() { - return this.kind === TRAIT_Class; - }; - trait.prototype.isGetter = function isGetter() { - return this.kind === TRAIT_Getter; - }; - trait.prototype.isSetter = function isSetter() { - return this.kind === TRAIT_Setter; - }; - trait.prototype.isProtected = function isProtected() { - true; - return this.name.namespaces[0].isProtected(); - }; - trait.prototype.kindName = function kindName() { - switch (this.kind) { - case TRAIT_Slot: - return 'Slot'; - case TRAIT_Const: - return 'Const'; - case TRAIT_Method: - return 'Method'; - case TRAIT_Setter: - return 'Setter'; - case TRAIT_Getter: - return 'Getter'; - case TRAIT_Class: - return 'Class'; - case TRAIT_Function: - return 'Function'; - } - unexpected(); - }; - trait.prototype.isOverride = function isOverride() { - return this.attributes & ATTR_Override; - }; - trait.prototype.isFinal = function isFinal() { - return this.attributes & ATTR_Final; - }; - trait.prototype.toString = function toString() { - var str = getFlags(this.attributes, 'final|override|metadata'.split('|')); - if (str) { - str += ' '; - } - str += Multiname.getQualifiedName(this.name); - switch (this.kind) { - case TRAIT_Slot: - case TRAIT_Const: - return str + ', typeName: ' + this.typeName + ', slotId: ' + this.slotId + ', value: ' + this.value; - case TRAIT_Method: - case TRAIT_Setter: - case TRAIT_Getter: - return str + ', ' + this.kindName() + ': ' + this.methodInfo.name; - case TRAIT_Class: - return str + ', slotId: ' + this.slotId + ', class: ' + this.classInfo; - case TRAIT_Function: - break; - } - }; - return trait; - }(); -var ShumwayNamespace = function () { - var kinds = {}; - kinds[CONSTANT_Namespace] = 'public'; - kinds[CONSTANT_PackageNamespace] = 'public'; - kinds[CONSTANT_PackageInternalNs] = 'packageInternal'; - kinds[CONSTANT_PrivateNs] = 'private'; - kinds[CONSTANT_ProtectedNamespace] = 'protected'; - kinds[CONSTANT_ExplicitNamespace] = 'explicit'; - kinds[CONSTANT_StaticProtectedNs] = 'staticProtected'; - var prefixes = {}; - for (var k in kinds) { - prefixes[kinds[k]] = true; - } - var MIN_API_MARK = 58004; - var MAX_API_MARK = 63743; - function namespace(kind, uri, prefix, dontMangle) { - if (kind !== undefined) { - if (uri === undefined) { - uri = ''; - } - if (prefix !== undefined) { - this.prefix = prefix; - } - this.kind = kind; - this.originalURI = this.uri = uri; - buildNamespace.call(this, dontMangle); - } - } - namespace.PREFIXES = prefixes; - var uniqueNamespaceCounter = 0; - function buildNamespace(dontMangle) { - if (this.isPublic() && this.uri) { - var n = this.uri.length - 1; - var mark = this.uri.charCodeAt(n); - if (mark > MIN_API_MARK) { - this.uri = this.uri.substring(0, n - 1); - } - } else if (this.isUnique()) { - this.uri = String(this.uri + uniqueNamespaceCounter++); - } - this.uri = dontMangle ? this.uri : mangleNamespaceURI(this.uri); - true; - this.qualifiedName = kinds[this.kind] + '$' + this.uri; - } - function escapeUri(uri) { - if (uri !== undefined) { - uri = uri.replace(/[^\w]/g, '_'); - } - return uri; - } - var uriToMangledNameMap = createEmptyObject(); - var mangledNameToURIMap = createEmptyObject(); - var mangledNameList = []; - var MANGLE_NAMESPACES = true; - function mangleNamespaceURI(uri) { - if (uri === '') { - return ''; - } - var name = uriToMangledNameMap[uri]; - if (name) { - return name; - } - if (!MANGLE_NAMESPACES) { - name = escapeUri(uri); - mangledNameToURIMap[name] = uri; - } else { - name = String(mangledNameList.length); - mangledNameList.push(name); - } - uriToMangledNameMap[uri] = name; - return name; - } - namespace.fromQualifiedName = function fromQualifiedName(qn) { - var a = qn.indexOf('$'); - var b = qn.indexOf('$', a + 1); - var str = qn.substring(0, a); - var kind = namespace.kindFromString(str); - str = qn.substring(a + 1, b); - var uri = str === '' ? str : MANGLE_NAMESPACES ? mangledNameList[Number(str)] : mangledNameToURIMap[str]; - true; - true; - return new namespace(kind, uri, undefined, true); - }; - namespace.kindFromString = function kindFromString(str) { - for (var kind in kinds) { - if (kinds[kind] === str) { - return kind; - } - } - return true; - }; - namespace.createNamespace = function createNamespace(uri, prefix) { - return new namespace(CONSTANT_Namespace, uri, prefix); - }; - namespace.prototype = Object.create({ - parse: function parse(constantPool, stream) { - this.kind = stream.readU8(); - this.originalURI = this.uri = constantPool.strings[stream.readU30()]; - buildNamespace.call(this); - }, - isPublic: function isPublic() { - return this.kind === CONSTANT_Namespace || this.kind === CONSTANT_PackageNamespace; - }, - isProtected: function isProtected() { - return this.kind === CONSTANT_ProtectedNamespace; - }, - isUnique: function isUnique() { - return this.kind === CONSTANT_PrivateNs && !this.originalURI; - }, - isDynamic: function isDynamic() { - return this.isPublic() && !this.uri; - }, - getURI: function getURI() { - return this.uri; - }, - toString: function toString() { - return kinds[this.kind] + (this.originalURI ? ' ' + this.originalURI : ''); - }, - clone: function clone() { - var c = new namespace(); - c.kind = this.kind; - c.uri = this.uri; - c.originalURI = this.originalURI; - c.qualifiedName = this.qualifiedName; - return c; - }, - isEqualTo: function isEqualTo(o) { - return this.qualifiedName === o.qualifiedName; - }, - inNamespaceSet: function inNamespaceSet(set) { - for (var i = 0; i < set.length; i++) { - if (set[i].qualifiedName === this.qualifiedName) { - return true; + ClassInfo._getDefaultValue = function (qn) { + if (Multiname.getQualifiedName(qn) === Multiname.Int || Multiname.getQualifiedName(qn) === Multiname.Uint) { + return 0; + } else if (Multiname.getQualifiedName(qn) === Multiname.Number) { + return NaN; + } else if (Multiname.getQualifiedName(qn) === Multiname.Boolean) { + return false; + } else { + return null; + } + }; + ClassInfo.prototype.toString = function () { + return this.instanceInfo.name.toString(); + }; + ClassInfo.nextID = 1; + return ClassInfo; + }(Info); + ABC.ClassInfo = ClassInfo; + var ScriptInfo = function (_super) { + __extends(ScriptInfo, _super); + function ScriptInfo(abc, index, stream) { + _super.call(this, abc, index); + this.runtimeId = ClassInfo.nextID++; + this.hash = abc.hash + 131072 + index; + this.name = abc.name + '$script' + index; + this.init = abc.methods[stream.readU30()]; + this.init.isScriptInitializer = true; + AbcFile.attachHolder(this.init, this); + this.traits = Trait.parseTraits(abc, stream, this); } - } - return false; - }, - getAccessModifier: function getAccessModifier() { - return kinds[this.kind]; - }, - getQualifiedName: function getQualifiedName() { - return this.qualifiedName; - } - }); - namespace.PUBLIC = new namespace(CONSTANT_Namespace); - namespace.PROTECTED = new namespace(CONSTANT_ProtectedNamespace); - namespace.PROXY = new namespace(CONSTANT_Namespace, 'http://www.adobe.com/2006/actionscript/flash/proxy'); - var simpleNameCache = {}; - namespace.fromSimpleName = function fromSimpleName(simpleName) { - if (simpleName in simpleNameCache) { - return simpleNameCache[simpleName]; - } - var namespaceNames; - if (simpleName.indexOf('[') === 0) { - true; - namespaceNames = simpleName.substring(1, simpleName.length - 1).split(','); - } else { - namespaceNames = [ - simpleName - ]; - } - return simpleNameCache[simpleName] = namespaceNames.map(function (name) { - name = name.trim(); - var kindName, uri; - if (name.indexOf(' ') > 0) { - kindName = name.substring(0, name.indexOf(' ')).trim(); - uri = name.substring(name.indexOf(' ') + 1).trim(); - } else { - if (name === kinds[CONSTANT_Namespace] || name === kinds[CONSTANT_PackageInternalNs] || name === kinds[CONSTANT_PrivateNs] || name === kinds[CONSTANT_ProtectedNamespace] || name === kinds[CONSTANT_ExplicitNamespace] || name === kinds[CONSTANT_StaticProtectedNs]) { - kindName = name; - uri = ''; - } else { - kindName = 'public'; - uri = name; - } - } - return new namespace(namespace.kindFromString(kindName), uri); - }); - }; - return namespace; - }(); -var Multiname = function () { - var ATTRIBUTE = 1; - var RUNTIME_NAMESPACE = 2; - var RUNTIME_NAME = 4; - var nextID = 0; - var PUBLIC_QUALIFIED_NAME_PREFIX = 'public$$'; - function multiname(namespaces, name, flags) { - if (name !== undefined) { - true; - } - this.id = nextID++; - this.namespaces = namespaces; - this.name = name; - this.flags = flags || 0; - } - multiname.TEMPORARY = new multiname(); - true; - multiname.RUNTIME_NAME = RUNTIME_NAME; - multiname.ATTRIBUTE = ATTRIBUTE; - multiname.parse = function parse(constantPool, stream, multinames, patchFactoryTypes) { - var index = 0; - var kind = stream.readU8(); - var name, namespaces = [], flags = 0; - switch (kind) { - case CONSTANT_QName: - case CONSTANT_QNameA: - index = stream.readU30(); - if (index) { - namespaces = [ - constantPool.namespaces[index] - ]; - } else { - flags &= ~RUNTIME_NAME; - } - index = stream.readU30(); - if (index) { - name = constantPool.strings[index]; - } - break; - case CONSTANT_RTQName: - case CONSTANT_RTQNameA: - index = stream.readU30(); - if (index) { - name = constantPool.strings[index]; - } else { - flags &= ~RUNTIME_NAME; - } - flags |= RUNTIME_NAMESPACE; - break; - case CONSTANT_RTQNameL: - case CONSTANT_RTQNameLA: - flags |= RUNTIME_NAMESPACE; - flags |= RUNTIME_NAME; - break; - case CONSTANT_Multiname: - case CONSTANT_MultinameA: - index = stream.readU30(); - if (index) { - name = constantPool.strings[index]; - } else { - flags &= ~RUNTIME_NAME; - } - index = stream.readU30(); - true; - namespaces = constantPool.namespaceSets[index]; - break; - case CONSTANT_MultinameL: - case CONSTANT_MultinameLA: - flags |= RUNTIME_NAME; - index = stream.readU30(); - true; - namespaces = constantPool.namespaceSets[index]; - break; - case CONSTANT_TypeName: - var factoryTypeIndex = stream.readU32(); - if (multinames[factoryTypeIndex]) { - namespaces = multinames[factoryTypeIndex].namespaces; - name = multinames[factoryTypeIndex].name; - } - var typeParameterCount = stream.readU32(); - true; - var typeParameterIndex = stream.readU32(); - var mn = new Multiname(namespaces, name, flags); - mn.typeParameter = multinames[typeParameterIndex]; - if (!multinames[factoryTypeIndex]) { - patchFactoryTypes.push({ - multiname: mn, - index: factoryTypeIndex + Object.defineProperty(ScriptInfo.prototype, 'entryPoint', { + get: function () { + return this.init; + }, + enumerable: true, + configurable: true }); - } - return mn; - default: - unexpected(); - break; - } - switch (kind) { - case CONSTANT_QNameA: - case CONSTANT_RTQNameA: - case CONSTANT_RTQNameLA: - case CONSTANT_MultinameA: - case CONSTANT_MultinameLA: - flags |= ATTRIBUTE; - break; - } - return new Multiname(namespaces, name, flags); - }; - multiname.isMultiname = function (mn) { - return typeof mn === 'number' || typeof mn === 'string' || mn instanceof Multiname || mn instanceof Number; - }; - multiname.needsResolution = function (mn) { - return mn instanceof multiname && mn.namespaces.length > 1; - }; - multiname.isQName = function (mn) { - if (mn instanceof multiname) { - return mn.namespaces && mn.namespaces.length === 1; - } - return true; - }; - multiname.isRuntimeName = function isRuntimeName(mn) { - return mn instanceof Multiname && mn.isRuntimeName(); - }; - multiname.isRuntimeNamespace = function isRuntimeNamespace(mn) { - return mn instanceof Multiname && mn.isRuntimeNamespace(); - }; - multiname.isRuntime = function (mn) { - return mn instanceof Multiname && mn.isRuntimeName() || mn.isRuntimeNamespace(); - }; - function qualifyNameInternal(qualifier, name) { - true; - return qualifier ? qualifier + '$' + name : name; - } - multiname.getQualifiedName = function getQualifiedName(mn) { - true; - if (mn instanceof Multiname) { - if (mn.qualifiedName !== undefined) { - return mn.qualifiedName; - } - var name = String(mn.name); - if (isNumeric(name)) { - true; - return mn.qualifiedName = name; - } - mn = mn.qualifiedName = qualifyNameInternal(mn.namespaces[0].qualifiedName, name); - } - return mn; - }; - multiname.qualifyName = function qualifyName(namespace, name) { - return qualifyNameInternal(namespace.qualifiedName, name); - }; - multiname.stripPublicQualifier = function stripPublicQualifier(qn) { - var index = qn.indexOf(PUBLIC_QUALIFIED_NAME_PREFIX); - if (index !== 0) { - return undefined; - } - return qn.substring(PUBLIC_QUALIFIED_NAME_PREFIX.length); - }; - multiname.fromQualifiedName = function fromQualifiedName(qn) { - if (qn instanceof Multiname) { - return qn; - } - true; - var a = qn.indexOf('$'); - if (a < 0 || !ShumwayNamespace.PREFIXES[qn.substring(0, a)]) { - return undefined; - } - var ns = ShumwayNamespace.fromQualifiedName(qn); - var b = qn.indexOf('$', a + 1); - return new Multiname([ - ns - ], qn.substring(b + 1)); - }; - multiname.getFullQualifiedName = function getFullQualifiedName(mn) { - var qn = multiname.getQualifiedName(mn); - if (mn instanceof Multiname && mn.typeParameter) { - qn += '$' + multiname.getFullQualifiedName(mn.typeParameter); - } - return qn; - }; - multiname.PUBLIC_QUALIFIED_NAME_PREFIX = PUBLIC_QUALIFIED_NAME_PREFIX; - multiname.getPublicQualifiedName = function getPublicQualifiedName(name) { - if (isNumeric(name)) { - return toNumber(name); - } else if (name !== null && isObject(name)) { - return name; - } - return PUBLIC_QUALIFIED_NAME_PREFIX + name; - }; - multiname.isPublicQualifiedName = function isPublicQualifiedName(qn) { - return typeof qn === 'number' || isNumeric(qn) || qn.indexOf(PUBLIC_QUALIFIED_NAME_PREFIX) === 0; - }; - multiname.getAccessModifier = function getAccessModifier(mn) { - true; - if (typeof mn === 'number' || typeof mn === 'string' || mn instanceof Number) { - return 'public'; - } - true; - return mn.namespaces[0].getAccessModifier(); - }; - multiname.isNumeric = function (mn) { - if (typeof mn === 'number') { - return true; - } else if (typeof mn === 'string') { - return isNumeric(mn); - } - true; - return !isNaN(parseInt(multiname.getName(mn), 10)); - }; - multiname.getName = function getName(mn) { - true; - true; - return mn.getName(); - }; - multiname.isAnyName = function isAnyName(mn) { - return typeof mn === 'object' && !mn.isRuntimeName() && !mn.name; - }; - var simpleNameCache = {}; - multiname.fromSimpleName = function fromSimpleName(simpleName) { - true; - if (simpleName in simpleNameCache) { - return simpleNameCache[simpleName]; - } - var nameIndex, namespaceIndex, name, namespace; - nameIndex = simpleName.lastIndexOf('.'); - if (nameIndex <= 0) { - nameIndex = simpleName.lastIndexOf(' '); - } - if (nameIndex > 0 && nameIndex < simpleName.length - 1) { - name = simpleName.substring(nameIndex + 1).trim(); - namespace = simpleName.substring(0, nameIndex).trim(); - } else { - name = simpleName; - namespace = ''; - } - return simpleNameCache[simpleName] = new Multiname(ShumwayNamespace.fromSimpleName(namespace), name); - }; - multiname.prototype.getQName = function getQName(index) { - true; - true; - if (!this.cache) { - this.cache = []; - } - var name = this.cache[index]; - if (!name) { - name = this.cache[index] = new Multiname([ - this.namespaces[index] - ], this.name, this.flags); - } - return name; - }; - multiname.prototype.hasQName = function hasQName(qn) { - true; - if (this.name !== qn.name) { - return false; - } - for (var i = 0; i < this.namespaces.length; i++) { - if (this.namespaces[i].isEqualTo(qn.namespaces[0])) { - return true; - } - } - return false; - }; - multiname.prototype.isAttribute = function isAttribute() { - return this.flags & ATTRIBUTE; - }; - multiname.prototype.isAnyName = function isAnyName() { - return Multiname.isAnyName(this); - }; - multiname.prototype.isAnyNamespace = function isAnyNamespace() { - return !this.isRuntimeNamespace() && (this.namespaces.length === 0 || this.isAnyName() && this.namespaces.length !== 1); - }; - multiname.prototype.isRuntimeName = function isRuntimeName() { - return this.flags & RUNTIME_NAME; - }; - multiname.prototype.isRuntimeNamespace = function isRuntimeNamespace() { - return this.flags & RUNTIME_NAMESPACE; - }; - multiname.prototype.isRuntime = function isRuntime() { - return this.flags & (RUNTIME_NAME | RUNTIME_NAMESPACE); - }; - multiname.prototype.isQName = function isQName() { - return this.namespaces.length === 1 && !this.isAnyName(); - }; - multiname.prototype.hasTypeParameter = function hasTypeParameter() { - return !(!this.typeParameter); - }; - multiname.prototype.getName = function getName() { - return this.name; - }; - multiname.prototype.getOriginalName = function getOriginalName() { - true; - var name = this.namespaces[0].originalURI; - if (name) { - name += '.'; - } - return name + this.name; - }; - multiname.prototype.getNamespace = function getNamespace() { - true; - true; - return this.namespaces[0]; - }; - multiname.prototype.nameToString = function nameToString() { - if (this.isAnyName()) { - return '*'; - } else { - var name = this.getName(); - return this.isRuntimeName() ? '[]' : name; - } - }; - multiname.prototype.hasObjectName = function hasObjectName() { - return typeof this.name === 'object'; - }; - multiname.prototype.toString = function toString() { - var str = this.isAttribute() ? '@' : ''; - if (this.isAnyNamespace()) { - str += '*::' + this.nameToString(); - } else if (this.isRuntimeNamespace()) { - str += '[]::' + this.nameToString(); - } else if (this.namespaces.length === 1 && this.isQName()) { - str += this.namespaces[0].toString() + '::'; - str += this.nameToString(); - } else { - str += '{'; - for (var i = 0, count = this.namespaces.length; i < count; i++) { - str += this.namespaces[i].toString(); - if (i + 1 < count) { - str += ','; + ScriptInfo.prototype.toString = function () { + return this.name; + }; + ScriptInfo.nextID = 1; + return ScriptInfo; + }(Info); + ABC.ScriptInfo = ScriptInfo; + var AbcFile = function () { + function AbcFile(bytes, name, hash) { + if (typeof hash === 'undefined') { + hash = 0; + } + Timer.start('Parse ABC'); + this.name = name; + this.env = {}; + var computedHash; + if (!hash || !true) { + Timer.start('Adler'); + computedHash = Shumway.HashUtilities.hashBytesTo32BitsAdler(bytes, 0, bytes.length); + Timer.stop(); + } + if (hash) { + this.hash = hash; + true; + } else { + this.hash = computedHash; + } + var n, i; + var stream = new AbcStream(bytes); + AbcFile._checkMagic(stream); + Timer.start('Parse constantPool'); + this.constantPool = new ConstantPool(stream, this); + Timer.stop(); + Timer.start('Parse Method Infos'); + this.methods = []; + n = stream.readU30(); + for (i = 0; i < n; ++i) { + this.methods.push(new MethodInfo(this, i, stream)); + } + Timer.stop(); + Timer.start('Parse MetaData Infos'); + this.metadata = []; + n = stream.readU30(); + for (i = 0; i < n; ++i) { + this.metadata.push(new MetaDataInfo(this, stream)); + } + Timer.stop(); + Timer.start('Parse Instance Infos'); + this.instances = []; + n = stream.readU30(); + for (i = 0; i < n; ++i) { + this.instances.push(new InstanceInfo(this, i, stream)); + } + Timer.stop(); + Timer.start('Parse Class Infos'); + this.classes = []; + for (i = 0; i < n; ++i) { + this.classes.push(new ClassInfo(this, i, stream)); + } + Timer.stop(); + Timer.start('Parse Script Infos'); + this.scripts = []; + n = stream.readU30(); + for (i = 0; i < n; ++i) { + this.scripts.push(new ScriptInfo(this, i, stream)); + } + Timer.stop(); + Timer.start('Parse Method Body Info'); + n = stream.readU30(); + for (i = 0; i < n; ++i) { + MethodInfo.parseBody(this, stream); + } + Timer.stop(); + Timer.stop(); } - } - str += '}::' + this.nameToString(); - } - if (this.hasTypeParameter()) { - str += '<' + this.typeParameter.toString() + '>'; - } - return str; - }; - multiname.Int = multiname.getPublicQualifiedName('int'); - multiname.Uint = multiname.getPublicQualifiedName('uint'); - multiname.Class = multiname.getPublicQualifiedName('Class'); - multiname.Array = multiname.getPublicQualifiedName('Array'); - multiname.Object = multiname.getPublicQualifiedName('Object'); - multiname.String = multiname.getPublicQualifiedName('String'); - multiname.Number = multiname.getPublicQualifiedName('Number'); - multiname.Boolean = multiname.getPublicQualifiedName('Boolean'); - multiname.Function = multiname.getPublicQualifiedName('Function'); - multiname.XML = multiname.getPublicQualifiedName('XML'); - multiname.XMLList = multiname.getPublicQualifiedName('XMLList'); - return multiname; - }(); -var ConstantPool = function constantPool() { - var nextNamespaceSetID = 1; - function constantPool(stream, name) { - var i, n; - var ints = [ - 0 - ]; - n = stream.readU30(); - for (i = 1; i < n; ++i) { - ints.push(stream.readS32()); - } - var uints = [ - 0 - ]; - n = stream.readU30(); - for (i = 1; i < n; ++i) { - uints.push(stream.readU32()); - } - var doubles = [ - NaN - ]; - n = stream.readU30(); - for (i = 1; i < n; ++i) { - doubles.push(stream.readDouble()); - } - Timer.start('Parse Strings'); - var strings = [ - '' - ]; - n = stream.readU30(); - for (i = 1; i < n; ++i) { - strings.push(stream.readUTFString(stream.readU30())); - } - this.positionAfterUTFStrings = stream.pos; - Timer.stop(); - this.ints = ints; - this.uints = uints; - this.doubles = doubles; - this.strings = strings; - Timer.start('Parse Namespaces'); - var namespaces = [ - undefined - ]; - n = stream.readU30(); - for (i = 1; i < n; ++i) { - var namespace = new ShumwayNamespace(); - namespace.parse(this, stream); - namespaces.push(namespace); - } - Timer.stop(); - Timer.start('Parse Namespace Sets'); - var namespaceSets = [ - undefined - ]; - n = stream.readU30(); - for (i = 1; i < n; ++i) { - var count = stream.readU30(); - var set = []; - set.id = nextNamespaceSetID++; - for (var j = 0; j < count; ++j) { - set.push(namespaces[stream.readU30()]); - } - namespaceSets.push(set); - } - Timer.stop(); - this.namespaces = namespaces; - this.namespaceSets = namespaceSets; - Timer.start('Parse Multinames'); - var multinames = [ - undefined - ]; - var patchFactoryTypes = []; - n = stream.readU30(); - for (i = 1; i < n; ++i) { - multinames.push(Multiname.parse(this, stream, multinames, patchFactoryTypes)); - } - Timer.stop(); - this.multinames = multinames; - } - constantPool.prototype.getValue = function getValue(kind, index) { - switch (kind) { - case CONSTANT_Int: - return this.ints[index]; - case CONSTANT_UInt: - return this.uints[index]; - case CONSTANT_Double: - return this.doubles[index]; - case CONSTANT_Utf8: - return this.strings[index]; - case CONSTANT_True: - return true; - case CONSTANT_False: - return false; - case CONSTANT_Null: - return null; - case CONSTANT_Undefined: - return undefined; - case CONSTANT_Namespace: - case CONSTANT_PackageInternalNs: - return this.namespaces[index]; - case CONSTANT_QName: - case CONSTANT_MultinameA: - case CONSTANT_RTQName: - case CONSTANT_RTQNameA: - case CONSTANT_RTQNameL: - case CONSTANT_RTQNameLA: - case CONSTANT_NameL: - case CONSTANT_NameLA: - return this.multinames[index]; - case CONSTANT_Float: - warning('TODO: CONSTANT_Float may be deprecated?'); - break; - default: - true; - } - }; - return constantPool; - }(); -var MethodInfo = function () { - function getParameterName(i) { - true; - return 'p' + String.fromCharCode('A'.charCodeAt(0) + i); - } - function methodInfo(abc, stream) { - var constantPool = abc.constantPool; - var parameterCount = stream.readU30(); - var returnType = constantPool.multinames[stream.readU30()]; - var parameters = []; - for (var i = 0; i < parameterCount; i++) { - parameters.push({ - type: constantPool.multinames[stream.readU30()] - }); - } - var debugName = constantPool.strings[stream.readU30()]; - var flags = stream.readU8(); - var optionalCount = 0; - var optionals = null; - if (flags & METHOD_HasOptional) { - optionalCount = stream.readU30(); - true; - for (var i = parameterCount - optionalCount; i < parameterCount; i++) { - var valueIndex = stream.readU30(); - parameters[i].value = constantPool.getValue(stream.readU8(), valueIndex); - } - } - var paramnames = null; - if (flags & METHOD_HasParamNames) { - for (var i = 0; i < parameterCount; i++) { - if (false) { - parameters[i].name = constantPool.strings[stream.readU30()]; - } else { - stream.readU30(); - parameters[i].name = getParameterName(i); + AbcFile._checkMagic = function (stream) { + var magic = stream.readWord(); + var flashPlayerBrannan = 46 << 16 | 15; + if (magic < flashPlayerBrannan) { + throw new Error('Invalid ABC File (magic = ' + Number(magic).toString(16) + ')'); + } + }; + Object.defineProperty(AbcFile.prototype, 'lastScript', { + get: function () { + true; + return this.scripts[this.scripts.length - 1]; + }, + enumerable: true, + configurable: true + }); + AbcFile.attachHolder = function (mi, holder) { + true; + mi.holder = holder; + }; + AbcFile.prototype.toString = function () { + return this.name; + }; + return AbcFile; + }(); + ABC.AbcFile = AbcFile; + var Namespace = function () { + function Namespace(kind, uri, prefix, uniqueURIHash) { + if (typeof uri === 'undefined') { + uri = ''; + } + if (uri === undefined) { + uri = ''; + } + if (prefix !== undefined) { + this.prefix = prefix; + } + this.kind = kind; + this.uri = uri; + this._buildNamespace(uniqueURIHash); } - } - } else { - for (var i = 0; i < parameterCount; i++) { - parameters[i].name = getParameterName(i); - } - } - this.abc = abc; - this.flags = flags; - this.optionals = optionals; - this.debugName = debugName; - this.parameters = parameters; - this.returnType = returnType; - } - methodInfo.prototype = { - toString: function toString() { - var flags = getFlags(this.flags, 'NEED_ARGUMENTS|NEED_ACTIVATION|NEED_REST|HAS_OPTIONAL|||SET_DXN|HAS_PARAM_NAMES'.split('|')); - return (flags ? flags + ' ' : '') + this.name; - }, - hasOptional: function hasOptional() { - return !(!(this.flags & METHOD_HasOptional)); - }, - needsActivation: function needsActivation() { - return !(!(this.flags & METHOD_Activation)); - }, - needsRest: function needsRest() { - return !(!(this.flags & METHOD_Needrest)); - }, - needsArguments: function needsArguments() { - return !(!(this.flags & METHOD_Arguments)); - }, - isNative: function isNative() { - return !(!(this.flags & METHOD_Native)); - }, - isClassMember: function isClassMember() { - return this.holder instanceof ClassInfo; - }, - isInstanceMember: function isInstanceMember() { - return this.holder instanceof InstanceInfo; - }, - isScriptMember: function isScriptMember() { - return this.holder instanceof ScriptInfo; - } - }; - function parseException(abc, stream) { - var multinames = abc.constantPool.multinames; - var ex = { - start: stream.readU30(), - end: stream.readU30(), - target: stream.readU30(), - typeName: multinames[stream.readU30()], - varName: multinames[stream.readU30()] - }; - true; - true; - return ex; - } - methodInfo.parseBody = function parseBody(abc, stream) { - var constantPool = abc.constantPool; - var methods = abc.methods; - var info = methods[stream.readU30()]; - info.hasBody = true; - true; - info.maxStack = stream.readU30(); - info.localCount = stream.readU30(); - info.initScopeDepth = stream.readU30(); - info.maxScopeDepth = stream.readU30(); - info.code = stream.readU8s(stream.readU30()); - var exceptions = []; - var exceptionCount = stream.readU30(); - for (var i = 0; i < exceptionCount; ++i) { - exceptions.push(parseException(abc, stream)); - } - info.exceptions = exceptions; - info.traits = parseTraits(abc, stream, info); - }; - methodInfo.prototype.hasExceptions = function hasExceptions() { - return this.exceptions.length > 0; - }; - return methodInfo; - }(); -var MetaDataInfo = function () { - function metaDataInfo(abc, stream) { - var strings = abc.constantPool.strings; - var name = this.name = strings[stream.readU30()]; - var itemCount = stream.readU30(); - var keys = []; - var items = []; - for (var i = 0; i < itemCount; i++) { - keys[i] = strings[stream.readU30()]; - } - for (var i = 0; i < itemCount; i++) { - var key = keys[i]; - items[i] = { - key: key, - value: strings[stream.readU30()] - }; - if (key && name === 'native') { - true; - this[key] = items[i].value; - } - } - this.value = items; - } - metaDataInfo.prototype = { - toString: function toString() { - return '[' + this.name + ']'; - } - }; - return metaDataInfo; - }(); -function attachHolder(mi, holder) { - true; - mi.holder = holder; -} -var InstanceInfo = function () { - var nextID = 1; - function instanceInfo(abc, stream) { - this.id = nextID++; - this.abc = abc; - var constantPool = abc.constantPool; - var methods = abc.methods; - this.name = constantPool.multinames[stream.readU30()]; - true; - this.superName = constantPool.multinames[stream.readU30()]; - this.flags = stream.readU8(); - this.protectedNs = undefined; - if (this.flags & 8) { - this.protectedNs = constantPool.namespaces[stream.readU30()]; - } - var interfaceCount = stream.readU30(); - this.interfaces = []; - for (var i = 0; i < interfaceCount; i++) { - this.interfaces[i] = constantPool.multinames[stream.readU30()]; - } - this.init = methods[stream.readU30()]; - this.init.isInstanceInitializer = true; - this.init.name = this.name; - attachHolder(this.init, this); - this.traits = parseTraits(abc, stream, this); - } - instanceInfo.prototype = { - toString: function toString() { - var flags = getFlags(this.flags & 8, 'sealed|final|interface|protected'.split('|')); - var str = (flags ? flags + ' ' : '') + this.name; - if (this.superName) { - str += ' extends ' + this.superName; - } - return str; - }, - isFinal: function isFinal() { - return this.flags & CONSTANT_ClassFinal; - }, - isSealed: function isSealed() { - return this.flags & CONSTANT_ClassSealed; - }, - isInterface: function isInterface() { - return this.flags & CONSTANT_ClassInterface; - } - }; - return instanceInfo; - }(); -var ClassInfo = function () { - var nextID = 1; - function classInfo(abc, instanceInfo, stream) { - this.id = nextID++; - this.abc = abc; - this.init = abc.methods[stream.readU30()]; - this.init.isClassInitializer = true; - attachHolder(this.init, this); - this.traits = parseTraits(abc, stream, this); - this.instanceInfo = instanceInfo; - this.instanceInfo.classInfo = this; - this.defaultValue = getDefaultValue(this.instanceInfo.name); - } - function getDefaultValue(qn) { - if (Multiname.getQualifiedName(qn) === Multiname.Int || Multiname.getQualifiedName(qn) === Multiname.Uint) { - return 0; - } else if (Multiname.getQualifiedName(qn) === Multiname.Number) { - return NaN; - } else if (Multiname.getQualifiedName(qn) === Multiname.Boolean) { - return false; - } else { - return null; - } - } - classInfo.prototype.toString = function () { - return this.instanceInfo.name.toString(); - }; - return classInfo; - }(); -function isClassOrInstanceInfo(x) { - return x instanceof ClassInfo || x instanceof InstanceInfo; -} -var ScriptInfo = function scriptInfo() { - var nextID = 1; - function scriptInfo(abc, index, stream) { - this.id = nextID++; - this.abc = abc; - this.name = abc.name + '$script' + index; - this.init = abc.methods[stream.readU30()]; - this.init.isScriptInitializer = true; - this.index = index; - attachHolder(this.init, this); - this.traits = parseTraits(abc, stream, this); - this.traits.verified = true; - } - scriptInfo.prototype = { - get entryPoint() { - return this.init; - }, - toString: function () { - return this.name; - } - }; - return scriptInfo; - }(); -var AbcFile = function () { - function abcFile(bytes, name) { - Timer.start('Parse ABC'); - this.name = name; - this.env = {}; - var n, i; - var stream = new AbcStream(bytes); - checkMagic(stream); - Timer.start('Parse constantPool'); - this.constantPool = new ConstantPool(stream, name); - Timer.stop(); - Timer.start('Parse Method Infos'); - this.methods = []; - n = stream.readU30(); - for (i = 0; i < n; ++i) { - this.methods.push(new MethodInfo(this, stream)); - } - Timer.stop(); - Timer.start('Parse MetaData Infos'); - this.metadata = []; - n = stream.readU30(); - for (i = 0; i < n; ++i) { - this.metadata.push(new MetaDataInfo(this, stream)); - } - Timer.stop(); - Timer.start('Parse Instance Infos'); - this.instances = []; - n = stream.readU30(); - for (i = 0; i < n; ++i) { - this.instances.push(new InstanceInfo(this, stream)); - } - Timer.stop(); - Timer.start('Parse Class Infos'); - this.classes = []; - for (i = 0; i < n; ++i) { - this.classes.push(new ClassInfo(this, this.instances[i], stream)); - } - Timer.stop(); - Timer.start('Parse Script Infos'); - this.scripts = []; - n = stream.readU30(); - for (i = 0; i < n; ++i) { - this.scripts.push(new ScriptInfo(this, i, stream)); - } - Timer.stop(); - Timer.start('Parse Method Body Info'); - n = stream.readU30(); - for (i = 0; i < n; ++i) { - MethodInfo.parseBody(this, stream); - } - Timer.stop(); - Timer.stop(); - } - function checkMagic(stream) { - var magic = stream.readWord(); - var flashPlayerBrannan = 46 << 16 | 15; - if (magic < flashPlayerBrannan) { - throw new Error('Invalid ABC File (magic = ' + Number(magic).toString(16) + ')'); - } - } - abcFile.prototype = { - get lastScript() { - true; - return this.scripts[this.scripts.length - 1]; - }, - toString: function () { - return this.name; - } - }; - return abcFile; - }(); + Namespace.prototype._buildNamespace = function (uniqueURIHash) { + if (this.kind === 22) { + this.kind = 8; + } + if (this.isPublic() && this.uri) { + var n = this.uri.length - 1; + var mark = this.uri.charCodeAt(n); + if (mark > Namespace._MIN_API_MARK) { + this.uri = this.uri.substring(0, n - 1); + } + } else if (this.isUnique()) { + this.uri = 'private ' + uniqueURIHash; + } + this.qualifiedName = Namespace._qualifyNamespace(this.kind, this.uri, this.prefix ? this.prefix : ''); + }; + Namespace._hashNamespace = function (kind, uri, prefix) { + var data = new Int32Array(1 + uri.length + prefix.length); + var j = 0; + data[j++] = kind; + var index = Namespace._knownURIs.indexOf(uri); + if (index >= 0) { + return kind << 2 | index; + } else { + for (var i = 0; i < uri.length; i++) { + data[j++] = uri.charCodeAt(i); + } + } + for (var i = 0; i < prefix.length; i++) { + data[j++] = prefix.charCodeAt(i); + } + return Shumway.HashUtilities.hashBytesTo32BitsMD5(data, 0, j); + }; + Namespace._qualifyNamespace = function (kind, uri, prefix) { + var key = kind + uri; + var mangledNamespace = Namespace._mangledNamespaceCache[key]; + if (mangledNamespace) { + return mangledNamespace; + } + mangledNamespace = Shumway.StringUtilities.variableLengthEncodeInt32(Namespace._hashNamespace(kind, uri, prefix)); + Namespace._mangledNamespaceMap[mangledNamespace] = { + kind: kind, + uri: uri, + prefix: prefix + }; + Namespace._mangledNamespaceCache[key] = mangledNamespace; + return mangledNamespace; + }; + Namespace.fromQualifiedName = function (qn) { + var length = Shumway.StringUtilities.fromEncoding(qn[0]); + var mangledNamespace = qn.substring(0, length + 1); + var ns = Namespace._mangledNamespaceMap[mangledNamespace]; + return new Namespace(ns.kind, ns.uri, ns.prefix); + }; + Namespace.kindFromString = function (str) { + for (var kind in Namespace._kinds) { + if (Namespace._kinds[kind] === str) { + return kind; + } + } + return true; + }; + Namespace.createNamespace = function (uri, prefix) { + return new Namespace(8, uri, prefix); + }; + Namespace.parse = function (constantPool, stream, hash) { + var kind = stream.readU8(); + var uri = constantPool.strings[stream.readU30()]; + return new Namespace(kind, uri, undefined, hash); + }; + Namespace.prototype.isPublic = function () { + return this.kind === 8 || this.kind === 22; + }; + Namespace.prototype.isProtected = function () { + return this.kind === 24; + }; + Namespace.prototype.isUnique = function () { + return this.kind === 5 && !this.uri; + }; + Namespace.prototype.isDynamic = function () { + return this.isPublic() && !this.uri; + }; + Namespace.prototype.getURI = function () { + return this.uri; + }; + Namespace.prototype.toString = function () { + return Namespace._kinds[this.kind] + (this.uri ? ' ' + this.uri : ''); + }; + Namespace.prototype.clone = function () { + var ns = Object.create(Namespace.prototype); + ns.kind = this.kind; + ns.uri = this.uri; + ns.prefix = this.prefix; + ns.qualifiedName = this.qualifiedName; + return ns; + }; + Namespace.prototype.isEqualTo = function (other) { + return this.qualifiedName === other.qualifiedName; + }; + Namespace.prototype.inNamespaceSet = function (set) { + for (var i = 0; i < set.length; i++) { + if (set[i].qualifiedName === this.qualifiedName) { + return true; + } + } + return false; + }; + Namespace.prototype.getAccessModifier = function () { + return Namespace._kinds[this.kind]; + }; + Namespace.prototype.getQualifiedName = function () { + return this.qualifiedName; + }; + Namespace.fromSimpleName = function (simpleName) { + if (simpleName in Namespace._simpleNameCache) { + return Namespace._simpleNameCache[simpleName]; + } + var namespaceNames; + if (simpleName.indexOf('[') === 0) { + true; + namespaceNames = simpleName.substring(1, simpleName.length - 1).split(','); + } else { + namespaceNames = [ + simpleName + ]; + } + return Namespace._simpleNameCache[simpleName] = namespaceNames.map(function (name) { + name = name.trim(); + var kindName, uri; + if (name.indexOf(' ') > 0) { + kindName = name.substring(0, name.indexOf(' ')).trim(); + uri = name.substring(name.indexOf(' ') + 1).trim(); + } else { + var kinds = Namespace._kinds; + if (name === kinds[8] || name === kinds[23] || name === kinds[5] || name === kinds[24] || name === kinds[25] || name === kinds[26]) { + kindName = name; + uri = ''; + } else { + kindName = Namespace._publicPrefix; + uri = name; + } + } + return new Namespace(Namespace.kindFromString(kindName), uri); + }); + }; + Namespace._publicPrefix = 'public'; + Namespace._kinds = function () { + var map = Shumway.ObjectUtilities.createMap(); + map[8] = Namespace._publicPrefix; + map[23] = 'packageInternal'; + map[5] = 'private'; + map[24] = 'protected'; + map[25] = 'explicit'; + map[26] = 'staticProtected'; + return map; + }(); + Namespace._MIN_API_MARK = 58004; + Namespace._MAX_API_MARK = 63743; + Namespace._knownURIs = [ + '' + ]; + Namespace._mangledNamespaceCache = Shumway.ObjectUtilities.createMap(); + Namespace._mangledNamespaceMap = Shumway.ObjectUtilities.createMap(); + Namespace.PUBLIC = new Namespace(8); + Namespace.PROTECTED = new Namespace(24); + Namespace.PROXY = new Namespace(8, 'http://www.adobe.com/2006/actionscript/flash/proxy'); + Namespace._simpleNameCache = Shumway.ObjectUtilities.createMap(); + return Namespace; + }(); + ABC.Namespace = Namespace; + var Multiname = function () { + function Multiname(namespaces, name, flags) { + if (typeof flags === 'undefined') { + flags = 0; + } + if (name !== undefined) { + true; + } + this.runtimeId = Multiname._nextID++; + this.namespaces = namespaces; + this.name = name; + this.flags = flags; + } + Multiname.parse = function (constantPool, stream, multinames, patchFactoryTypes) { + var index = 0; + var kind = stream.readU8(); + var name, namespaces = [], flags = 0; + switch (kind) { + case 7: + case 13: + index = stream.readU30(); + if (index) { + namespaces = [ + constantPool.namespaces[index] + ]; + } else { + flags &= ~Multiname.RUNTIME_NAME; + } + index = stream.readU30(); + if (index) { + name = constantPool.strings[index]; + } + break; + case 15: + case 16: + index = stream.readU30(); + if (index) { + name = constantPool.strings[index]; + } else { + flags &= ~Multiname.RUNTIME_NAME; + } + flags |= Multiname.RUNTIME_NAMESPACE; + break; + case 17: + case 18: + flags |= Multiname.RUNTIME_NAMESPACE; + flags |= Multiname.RUNTIME_NAME; + break; + case 9: + case 14: + index = stream.readU30(); + if (index) { + name = constantPool.strings[index]; + } else { + flags &= ~Multiname.RUNTIME_NAME; + } + index = stream.readU30(); + true; + namespaces = constantPool.namespaceSets[index]; + break; + case 27: + case 28: + flags |= Multiname.RUNTIME_NAME; + index = stream.readU30(); + true; + namespaces = constantPool.namespaceSets[index]; + break; + case 29: + var factoryTypeIndex = stream.readU32(); + if (multinames[factoryTypeIndex]) { + namespaces = multinames[factoryTypeIndex].namespaces; + name = multinames[factoryTypeIndex].name; + } + var typeParameterCount = stream.readU32(); + true; + var typeParameterIndex = stream.readU32(); + true; + var mn = new Multiname(namespaces, name, flags); + mn.typeParameter = multinames[typeParameterIndex]; + if (!multinames[factoryTypeIndex]) { + patchFactoryTypes.push({ + multiname: mn, + index: factoryTypeIndex + }); + } + return mn; + default: + Shumway.Debug.unexpected(); + break; + } + switch (kind) { + case 13: + case 16: + case 18: + case 14: + case 28: + flags |= Multiname.ATTRIBUTE; + break; + } + return new Multiname(namespaces, name, flags); + }; + Multiname.isMultiname = function (mn) { + return typeof mn === 'number' || typeof mn === 'string' || mn instanceof Multiname || mn instanceof Number; + }; + Multiname.needsResolution = function (mn) { + return mn instanceof Multiname && mn.namespaces.length > 1; + }; + Multiname.isQName = function (mn) { + if (mn instanceof Multiname) { + return mn.namespaces && mn.namespaces.length === 1; + } + return true; + }; + Multiname.isRuntimeName = function (mn) { + return mn instanceof Multiname && mn.isRuntimeName(); + }; + Multiname.isRuntimeNamespace = function (mn) { + return mn instanceof Multiname && mn.isRuntimeNamespace(); + }; + Multiname.isRuntime = function (mn) { + return mn instanceof Multiname && mn.isRuntimeName() || mn.isRuntimeNamespace(); + }; + Multiname.getQualifiedName = function (mn) { + true; + if (mn instanceof Multiname) { + if (mn.qualifiedName !== undefined) { + return mn.qualifiedName; + } + var name = String(mn.name); + if (isNumeric(name) && mn.namespaces[0].isPublic()) { + return mn.qualifiedName = name; + } + mn = mn.qualifiedName = Multiname.qualifyName(mn.namespaces[0], name); + } + return mn; + }; + Multiname.qualifyName = function (namespace, name) { + return '$' + namespace.qualifiedName + name; + }; + Multiname.stripPublicQualifier = function (qn) { + var publicQualifier = '$' + Namespace.PUBLIC.qualifiedName; + var index = qn.indexOf(publicQualifier); + if (index !== 0) { + return undefined; + } + return qn.substring(publicQualifier.length); + }; + Multiname.fromQualifiedName = function (qn) { + if (qn instanceof Multiname) { + return qn; + } + if (isNumeric(qn)) { + return new Multiname([ + Namespace.PUBLIC + ], qn); + } + if (qn[0] !== '$') { + return; + } + var ns = Namespace.fromQualifiedName(qn.substring(1)); + return new Multiname([ + ns + ], qn.substring(1 + ns.qualifiedName.length)); + }; + Multiname.getNameFromPublicQualifiedName = function (qn) { + var mn = Multiname.fromQualifiedName(qn); + true; + return mn.name; + }; + Multiname.getFullQualifiedName = function (mn) { + var qn = Multiname.getQualifiedName(mn); + if (mn instanceof Multiname && mn.typeParameter) { + qn += '$' + Multiname.getFullQualifiedName(mn.typeParameter); + } + return qn; + }; + Multiname.getPublicQualifiedName = function (name) { + if (isNumeric(name)) { + return Shumway.toNumber(name); + } else if (name !== null && isObject(name)) { + return name; + } + return Multiname.qualifyName(Namespace.PUBLIC, name); + }; + Multiname.isPublicQualifiedName = function (qn) { + return typeof qn === 'number' || isNumeric(qn) || qn.indexOf(Namespace.PUBLIC.qualifiedName) === 1; + }; + Multiname.getAccessModifier = function (mn) { + true; + if (typeof mn === 'number' || typeof mn === 'string' || mn instanceof Number) { + return 'public'; + } + true; + return mn.namespaces[0].getAccessModifier(); + }; + Multiname.isNumeric = function (mn) { + if (typeof mn === 'number') { + return true; + } else if (typeof mn === 'string') { + return isNumeric(mn); + } + return !isNaN(parseInt(Multiname.getName(mn), 10)); + }; + Multiname.getName = function (mn) { + true; + true; + return mn.getName(); + }; + Multiname.isAnyName = function (mn) { + return typeof mn === 'object' && !mn.isRuntimeName() && !mn.name; + }; + Multiname.fromSimpleName = function (simpleName) { + true; + if (simpleName in Multiname._simpleNameCache) { + return Multiname._simpleNameCache[simpleName]; + } + var nameIndex, namespaceIndex, name, namespace; + nameIndex = simpleName.lastIndexOf('.'); + if (nameIndex <= 0) { + nameIndex = simpleName.lastIndexOf(' '); + } + if (nameIndex > 0 && nameIndex < simpleName.length - 1) { + name = simpleName.substring(nameIndex + 1).trim(); + namespace = simpleName.substring(0, nameIndex).trim(); + } else { + name = simpleName; + namespace = ''; + } + return Multiname._simpleNameCache[simpleName] = new Multiname(Namespace.fromSimpleName(namespace), name); + }; + Multiname.prototype.getQName = function (index) { + true; + if (!this._qualifiedNameCache) { + this._qualifiedNameCache = Shumway.ObjectUtilities.createArrayMap(); + } + var name = this._qualifiedNameCache[index]; + if (!name) { + name = this._qualifiedNameCache[index] = new Multiname([ + this.namespaces[index] + ], this.name, this.flags); + } + return name; + }; + Multiname.prototype.hasQName = function (qn) { + true; + if (this.name !== qn.name) { + return false; + } + for (var i = 0; i < this.namespaces.length; i++) { + if (this.namespaces[i].isEqualTo(qn.namespaces[0])) { + return true; + } + } + return false; + }; + Multiname.prototype.isAttribute = function () { + return this.flags & Multiname.ATTRIBUTE; + }; + Multiname.prototype.isAnyName = function () { + return Multiname.isAnyName(this); + }; + Multiname.prototype.isAnyNamespace = function () { + return !this.isRuntimeNamespace() && (this.namespaces.length === 0 || this.isAnyName() && this.namespaces.length !== 1); + }; + Multiname.prototype.isRuntimeName = function () { + return !(!(this.flags & Multiname.RUNTIME_NAME)); + }; + Multiname.prototype.isRuntimeNamespace = function () { + return !(!(this.flags & Multiname.RUNTIME_NAMESPACE)); + }; + Multiname.prototype.isRuntime = function () { + return !(!(this.flags & (Multiname.RUNTIME_NAME | Multiname.RUNTIME_NAMESPACE))); + }; + Multiname.prototype.isQName = function () { + return this.namespaces.length === 1 && !this.isAnyName(); + }; + Multiname.prototype.hasTypeParameter = function () { + return !(!this.typeParameter); + }; + Multiname.prototype.getName = function () { + return this.name; + }; + Multiname.prototype.getOriginalName = function () { + true; + var name = this.namespaces[0].uri; + if (name) { + name += '.'; + } + return name + this.name; + }; + Multiname.prototype.getNamespace = function () { + true; + true; + return this.namespaces[0]; + }; + Multiname.prototype.nameToString = function () { + if (this.isAnyName()) { + return '*'; + } else { + var name = this.getName(); + return this.isRuntimeName() ? '[]' : name; + } + }; + Multiname.prototype.hasObjectName = function () { + return typeof this.name === 'object'; + }; + Multiname.prototype.toString = function () { + var str = this.isAttribute() ? '@' : ''; + if (this.isAnyNamespace()) { + str += '*::' + this.nameToString(); + } else if (this.isRuntimeNamespace()) { + str += '[]::' + this.nameToString(); + } else if (this.namespaces.length === 1 && this.isQName()) { + str += this.namespaces[0].toString() + '::'; + str += this.nameToString(); + } else { + str += '{'; + for (var i = 0, count = this.namespaces.length; i < count; i++) { + str += this.namespaces[i].toString(); + if (i + 1 < count) { + str += ','; + } + } + str += '}::' + this.nameToString(); + } + if (this.hasTypeParameter()) { + str += '<' + this.typeParameter.toString() + '>'; + } + return str; + }; + Multiname.ATTRIBUTE = 1; + Multiname.RUNTIME_NAMESPACE = 2; + Multiname.RUNTIME_NAME = 4; + Multiname._nextID = 0; + Multiname._simpleNameCache = Shumway.ObjectUtilities.createMap(); + Multiname.Int = Multiname.getPublicQualifiedName('int'); + Multiname.Uint = Multiname.getPublicQualifiedName('uint'); + Multiname.Class = Multiname.getPublicQualifiedName('Class'); + Multiname.Array = Multiname.getPublicQualifiedName('Array'); + Multiname.Object = Multiname.getPublicQualifiedName('Object'); + Multiname.String = Multiname.getPublicQualifiedName('String'); + Multiname.Number = Multiname.getPublicQualifiedName('Number'); + Multiname.Boolean = Multiname.getPublicQualifiedName('Boolean'); + Multiname.Function = Multiname.getPublicQualifiedName('Function'); + Multiname.XML = Multiname.getPublicQualifiedName('XML'); + Multiname.XMLList = Multiname.getPublicQualifiedName('XMLList'); + Multiname.TEMPORARY = new Multiname([], ''); + return Multiname; + }(); + ABC.Multiname = Multiname; + var MetaDataInfo = function () { + function MetaDataInfo(abc, stream) { + var strings = abc.constantPool.strings; + var name = this.name = strings[stream.readU30()]; + var itemCount = stream.readU30(); + var keys = []; + var items = []; + for (var i = 0; i < itemCount; i++) { + keys[i] = strings[stream.readU30()]; + } + for (var i = 0; i < itemCount; i++) { + var key = keys[i]; + items[i] = { + key: key, + value: strings[stream.readU30()] + }; + if (key && name === 'native') { + true; + this[key] = items[i].value; + } + } + this.value = items; + } + MetaDataInfo.prototype.toString = function () { + return '[' + this.name + ']'; + }; + return MetaDataInfo; + }(); + ABC.MetaDataInfo = MetaDataInfo; + (function (CONSTANT) { + CONSTANT[CONSTANT['Undefined'] = 0] = 'Undefined'; + CONSTANT[CONSTANT['Utf8'] = 1] = 'Utf8'; + CONSTANT[CONSTANT['Float'] = 2] = 'Float'; + CONSTANT[CONSTANT['Int'] = 3] = 'Int'; + CONSTANT[CONSTANT['UInt'] = 4] = 'UInt'; + CONSTANT[CONSTANT['PrivateNs'] = 5] = 'PrivateNs'; + CONSTANT[CONSTANT['Double'] = 6] = 'Double'; + CONSTANT[CONSTANT['QName'] = 7] = 'QName'; + CONSTANT[CONSTANT['Namespace'] = 8] = 'Namespace'; + CONSTANT[CONSTANT['Multiname'] = 9] = 'Multiname'; + CONSTANT[CONSTANT['False'] = 10] = 'False'; + CONSTANT[CONSTANT['True'] = 11] = 'True'; + CONSTANT[CONSTANT['Null'] = 12] = 'Null'; + CONSTANT[CONSTANT['QNameA'] = 13] = 'QNameA'; + CONSTANT[CONSTANT['MultinameA'] = 14] = 'MultinameA'; + CONSTANT[CONSTANT['RTQName'] = 15] = 'RTQName'; + CONSTANT[CONSTANT['RTQNameA'] = 16] = 'RTQNameA'; + CONSTANT[CONSTANT['RTQNameL'] = 17] = 'RTQNameL'; + CONSTANT[CONSTANT['RTQNameLA'] = 18] = 'RTQNameLA'; + CONSTANT[CONSTANT['NameL'] = 19] = 'NameL'; + CONSTANT[CONSTANT['NameLA'] = 20] = 'NameLA'; + CONSTANT[CONSTANT['NamespaceSet'] = 21] = 'NamespaceSet'; + CONSTANT[CONSTANT['PackageNamespace'] = 22] = 'PackageNamespace'; + CONSTANT[CONSTANT['PackageInternalNs'] = 23] = 'PackageInternalNs'; + CONSTANT[CONSTANT['ProtectedNamespace'] = 24] = 'ProtectedNamespace'; + CONSTANT[CONSTANT['ExplicitNamespace'] = 25] = 'ExplicitNamespace'; + CONSTANT[CONSTANT['StaticProtectedNs'] = 26] = 'StaticProtectedNs'; + CONSTANT[CONSTANT['MultinameL'] = 27] = 'MultinameL'; + CONSTANT[CONSTANT['MultinameLA'] = 28] = 'MultinameLA'; + CONSTANT[CONSTANT['TypeName'] = 29] = 'TypeName'; + CONSTANT[CONSTANT['ClassSealed'] = 1] = 'ClassSealed'; + CONSTANT[CONSTANT['ClassFinal'] = 2] = 'ClassFinal'; + CONSTANT[CONSTANT['ClassInterface'] = 4] = 'ClassInterface'; + CONSTANT[CONSTANT['ClassProtectedNs'] = 8] = 'ClassProtectedNs'; + }(ABC.CONSTANT || (ABC.CONSTANT = {}))); + var CONSTANT = ABC.CONSTANT; + (function (METHOD) { + METHOD[METHOD['Arguments'] = 1] = 'Arguments'; + METHOD[METHOD['Activation'] = 2] = 'Activation'; + METHOD[METHOD['Needrest'] = 4] = 'Needrest'; + METHOD[METHOD['HasOptional'] = 8] = 'HasOptional'; + METHOD[METHOD['IgnoreRest'] = 16] = 'IgnoreRest'; + METHOD[METHOD['Native'] = 32] = 'Native'; + METHOD[METHOD['Setsdxns'] = 64] = 'Setsdxns'; + METHOD[METHOD['HasParamNames'] = 128] = 'HasParamNames'; + }(ABC.METHOD || (ABC.METHOD = {}))); + var METHOD = ABC.METHOD; + (function (TRAIT) { + TRAIT[TRAIT['Slot'] = 0] = 'Slot'; + TRAIT[TRAIT['Method'] = 1] = 'Method'; + TRAIT[TRAIT['Getter'] = 2] = 'Getter'; + TRAIT[TRAIT['Setter'] = 3] = 'Setter'; + TRAIT[TRAIT['Class'] = 4] = 'Class'; + TRAIT[TRAIT['Function'] = 5] = 'Function'; + TRAIT[TRAIT['Const'] = 6] = 'Const'; + }(ABC.TRAIT || (ABC.TRAIT = {}))); + var TRAIT = ABC.TRAIT; + (function (ATTR) { + ATTR[ATTR['Final'] = 1] = 'Final'; + ATTR[ATTR['Override'] = 2] = 'Override'; + ATTR[ATTR['Metadata'] = 4] = 'Metadata'; + }(ABC.ATTR || (ABC.ATTR = {}))); + var ATTR = ABC.ATTR; + (function (SORT) { + SORT[SORT['CASEINSENSITIVE'] = 1] = 'CASEINSENSITIVE'; + SORT[SORT['DESCENDING'] = 2] = 'DESCENDING'; + SORT[SORT['UNIQUESORT'] = 4] = 'UNIQUESORT'; + SORT[SORT['RETURNINDEXEDARRAY'] = 8] = 'RETURNINDEXEDARRAY'; + SORT[SORT['NUMERIC'] = 16] = 'NUMERIC'; + }(ABC.SORT || (ABC.SORT = {}))); + var SORT = ABC.SORT; + (function (OP) { + OP[OP['bkpt'] = 1] = 'bkpt'; + OP[OP['nop'] = 2] = 'nop'; + OP[OP['throw'] = 3] = 'throw'; + OP[OP['getsuper'] = 4] = 'getsuper'; + OP[OP['setsuper'] = 5] = 'setsuper'; + OP[OP['dxns'] = 6] = 'dxns'; + OP[OP['dxnslate'] = 7] = 'dxnslate'; + OP[OP['kill'] = 8] = 'kill'; + OP[OP['label'] = 9] = 'label'; + OP[OP['lf32x4'] = 10] = 'lf32x4'; + OP[OP['sf32x4'] = 11] = 'sf32x4'; + OP[OP['ifnlt'] = 12] = 'ifnlt'; + OP[OP['ifnle'] = 13] = 'ifnle'; + OP[OP['ifngt'] = 14] = 'ifngt'; + OP[OP['ifnge'] = 15] = 'ifnge'; + OP[OP['jump'] = 16] = 'jump'; + OP[OP['iftrue'] = 17] = 'iftrue'; + OP[OP['iffalse'] = 18] = 'iffalse'; + OP[OP['ifeq'] = 19] = 'ifeq'; + OP[OP['ifne'] = 20] = 'ifne'; + OP[OP['iflt'] = 21] = 'iflt'; + OP[OP['ifle'] = 22] = 'ifle'; + OP[OP['ifgt'] = 23] = 'ifgt'; + OP[OP['ifge'] = 24] = 'ifge'; + OP[OP['ifstricteq'] = 25] = 'ifstricteq'; + OP[OP['ifstrictne'] = 26] = 'ifstrictne'; + OP[OP['lookupswitch'] = 27] = 'lookupswitch'; + OP[OP['pushwith'] = 28] = 'pushwith'; + OP[OP['popscope'] = 29] = 'popscope'; + OP[OP['nextname'] = 30] = 'nextname'; + OP[OP['hasnext'] = 31] = 'hasnext'; + OP[OP['pushnull'] = 32] = 'pushnull'; + OP[OP['c'] = 33] = 'c'; + OP[OP['pushundefined'] = 33] = 'pushundefined'; + OP[OP['pushfloat'] = 34] = 'pushfloat'; + OP[OP['nextvalue'] = 35] = 'nextvalue'; + OP[OP['pushbyte'] = 36] = 'pushbyte'; + OP[OP['pushshort'] = 37] = 'pushshort'; + OP[OP['pushtrue'] = 38] = 'pushtrue'; + OP[OP['pushfalse'] = 39] = 'pushfalse'; + OP[OP['pushnan'] = 40] = 'pushnan'; + OP[OP['pop'] = 41] = 'pop'; + OP[OP['dup'] = 42] = 'dup'; + OP[OP['swap'] = 43] = 'swap'; + OP[OP['pushstring'] = 44] = 'pushstring'; + OP[OP['pushint'] = 45] = 'pushint'; + OP[OP['pushuint'] = 46] = 'pushuint'; + OP[OP['pushdouble'] = 47] = 'pushdouble'; + OP[OP['pushscope'] = 48] = 'pushscope'; + OP[OP['pushnamespace'] = 49] = 'pushnamespace'; + OP[OP['hasnext2'] = 50] = 'hasnext2'; + OP[OP['li8'] = 53] = 'li8'; + OP[OP['li16'] = 54] = 'li16'; + OP[OP['li32'] = 55] = 'li32'; + OP[OP['lf32'] = 56] = 'lf32'; + OP[OP['lf64'] = 57] = 'lf64'; + OP[OP['si8'] = 58] = 'si8'; + OP[OP['si16'] = 59] = 'si16'; + OP[OP['si32'] = 60] = 'si32'; + OP[OP['sf32'] = 61] = 'sf32'; + OP[OP['sf64'] = 62] = 'sf64'; + OP[OP['newfunction'] = 64] = 'newfunction'; + OP[OP['call'] = 65] = 'call'; + OP[OP['construct'] = 66] = 'construct'; + OP[OP['callmethod'] = 67] = 'callmethod'; + OP[OP['callstatic'] = 68] = 'callstatic'; + OP[OP['callsuper'] = 69] = 'callsuper'; + OP[OP['callproperty'] = 70] = 'callproperty'; + OP[OP['returnvoid'] = 71] = 'returnvoid'; + OP[OP['returnvalue'] = 72] = 'returnvalue'; + OP[OP['constructsuper'] = 73] = 'constructsuper'; + OP[OP['constructprop'] = 74] = 'constructprop'; + OP[OP['callsuperid'] = 75] = 'callsuperid'; + OP[OP['callproplex'] = 76] = 'callproplex'; + OP[OP['callinterface'] = 77] = 'callinterface'; + OP[OP['callsupervoid'] = 78] = 'callsupervoid'; + OP[OP['callpropvoid'] = 79] = 'callpropvoid'; + OP[OP['sxi1'] = 80] = 'sxi1'; + OP[OP['sxi8'] = 81] = 'sxi8'; + OP[OP['sxi16'] = 82] = 'sxi16'; + OP[OP['applytype'] = 83] = 'applytype'; + OP[OP['pushfloat4'] = 84] = 'pushfloat4'; + OP[OP['newobject'] = 85] = 'newobject'; + OP[OP['newarray'] = 86] = 'newarray'; + OP[OP['newactivation'] = 87] = 'newactivation'; + OP[OP['newclass'] = 88] = 'newclass'; + OP[OP['getdescendants'] = 89] = 'getdescendants'; + OP[OP['newcatch'] = 90] = 'newcatch'; + OP[OP['findpropstrict'] = 93] = 'findpropstrict'; + OP[OP['findproperty'] = 94] = 'findproperty'; + OP[OP['finddef'] = 95] = 'finddef'; + OP[OP['getlex'] = 96] = 'getlex'; + OP[OP['setproperty'] = 97] = 'setproperty'; + OP[OP['getlocal'] = 98] = 'getlocal'; + OP[OP['setlocal'] = 99] = 'setlocal'; + OP[OP['getglobalscope'] = 100] = 'getglobalscope'; + OP[OP['getscopeobject'] = 101] = 'getscopeobject'; + OP[OP['getproperty'] = 102] = 'getproperty'; + OP[OP['getouterscope'] = 103] = 'getouterscope'; + OP[OP['initproperty'] = 104] = 'initproperty'; + OP[OP['setpropertylate'] = 105] = 'setpropertylate'; + OP[OP['deleteproperty'] = 106] = 'deleteproperty'; + OP[OP['deletepropertylate'] = 107] = 'deletepropertylate'; + OP[OP['getslot'] = 108] = 'getslot'; + OP[OP['setslot'] = 109] = 'setslot'; + OP[OP['getglobalslot'] = 110] = 'getglobalslot'; + OP[OP['setglobalslot'] = 111] = 'setglobalslot'; + OP[OP['convert_s'] = 112] = 'convert_s'; + OP[OP['esc_xelem'] = 113] = 'esc_xelem'; + OP[OP['esc_xattr'] = 114] = 'esc_xattr'; + OP[OP['convert_i'] = 115] = 'convert_i'; + OP[OP['convert_u'] = 116] = 'convert_u'; + OP[OP['convert_d'] = 117] = 'convert_d'; + OP[OP['convert_b'] = 118] = 'convert_b'; + OP[OP['convert_o'] = 119] = 'convert_o'; + OP[OP['checkfilter'] = 120] = 'checkfilter'; + OP[OP['convert_f'] = 121] = 'convert_f'; + OP[OP['unplus'] = 122] = 'unplus'; + OP[OP['convert_f4'] = 123] = 'convert_f4'; + OP[OP['coerce'] = 128] = 'coerce'; + OP[OP['coerce_b'] = 129] = 'coerce_b'; + OP[OP['coerce_a'] = 130] = 'coerce_a'; + OP[OP['coerce_i'] = 131] = 'coerce_i'; + OP[OP['coerce_d'] = 132] = 'coerce_d'; + OP[OP['coerce_s'] = 133] = 'coerce_s'; + OP[OP['astype'] = 134] = 'astype'; + OP[OP['astypelate'] = 135] = 'astypelate'; + OP[OP['coerce_u'] = 136] = 'coerce_u'; + OP[OP['coerce_o'] = 137] = 'coerce_o'; + OP[OP['negate'] = 144] = 'negate'; + OP[OP['increment'] = 145] = 'increment'; + OP[OP['inclocal'] = 146] = 'inclocal'; + OP[OP['decrement'] = 147] = 'decrement'; + OP[OP['declocal'] = 148] = 'declocal'; + OP[OP['typeof'] = 149] = 'typeof'; + OP[OP['not'] = 150] = 'not'; + OP[OP['bitnot'] = 151] = 'bitnot'; + OP[OP['add'] = 160] = 'add'; + OP[OP['subtract'] = 161] = 'subtract'; + OP[OP['multiply'] = 162] = 'multiply'; + OP[OP['divide'] = 163] = 'divide'; + OP[OP['modulo'] = 164] = 'modulo'; + OP[OP['lshift'] = 165] = 'lshift'; + OP[OP['rshift'] = 166] = 'rshift'; + OP[OP['urshift'] = 167] = 'urshift'; + OP[OP['bitand'] = 168] = 'bitand'; + OP[OP['bitor'] = 169] = 'bitor'; + OP[OP['bitxor'] = 170] = 'bitxor'; + OP[OP['equals'] = 171] = 'equals'; + OP[OP['strictequals'] = 172] = 'strictequals'; + OP[OP['lessthan'] = 173] = 'lessthan'; + OP[OP['lessequals'] = 174] = 'lessequals'; + OP[OP['greaterthan'] = 175] = 'greaterthan'; + OP[OP['greaterequals'] = 176] = 'greaterequals'; + OP[OP['instanceof'] = 177] = 'instanceof'; + OP[OP['istype'] = 178] = 'istype'; + OP[OP['istypelate'] = 179] = 'istypelate'; + OP[OP['in'] = 180] = 'in'; + OP[OP['increment_i'] = 192] = 'increment_i'; + OP[OP['decrement_i'] = 193] = 'decrement_i'; + OP[OP['inclocal_i'] = 194] = 'inclocal_i'; + OP[OP['declocal_i'] = 195] = 'declocal_i'; + OP[OP['negate_i'] = 196] = 'negate_i'; + OP[OP['add_i'] = 197] = 'add_i'; + OP[OP['subtract_i'] = 198] = 'subtract_i'; + OP[OP['multiply_i'] = 199] = 'multiply_i'; + OP[OP['getlocal0'] = 208] = 'getlocal0'; + OP[OP['getlocal1'] = 209] = 'getlocal1'; + OP[OP['getlocal2'] = 210] = 'getlocal2'; + OP[OP['getlocal3'] = 211] = 'getlocal3'; + OP[OP['setlocal0'] = 212] = 'setlocal0'; + OP[OP['setlocal1'] = 213] = 'setlocal1'; + OP[OP['setlocal2'] = 214] = 'setlocal2'; + OP[OP['setlocal3'] = 215] = 'setlocal3'; + OP[OP['invalid'] = 237] = 'invalid'; + OP[OP['debug'] = 239] = 'debug'; + OP[OP['debugline'] = 240] = 'debugline'; + OP[OP['debugfile'] = 241] = 'debugfile'; + OP[OP['bkptline'] = 242] = 'bkptline'; + OP[OP['timestamp'] = 243] = 'timestamp'; + }(ABC.OP || (ABC.OP = {}))); + var OP = ABC.OP; + var ConstantPool = function () { + function ConstantPool(stream, abc) { + var n; + var ints = [ + 0 + ]; + n = stream.readU30(); + for (var i = 1; i < n; ++i) { + ints.push(stream.readS32()); + } + var uints = [ + 0 + ]; + n = stream.readU30(); + for (var i = 1; i < n; ++i) { + uints.push(stream.readU32()); + } + var doubles = [ + NaN + ]; + n = stream.readU30(); + for (var i = 1; i < n; ++i) { + doubles.push(stream.readDouble()); + } + Timer.start('Parse Strings'); + var strings = [ + '' + ]; + n = stream.readU30(); + for (var i = 1; i < n; ++i) { + strings.push(stream.readUTFString(stream.readU30())); + } + this.positionAfterUTFStrings = stream.position; + Timer.stop(); + this.ints = ints; + this.uints = uints; + this.doubles = doubles; + this.strings = strings; + Timer.start('Parse Namespaces'); + var namespaces = [ + undefined + ]; + n = stream.readU30(); + for (var i = 1; i < n; ++i) { + namespaces.push(Namespace.parse(this, stream, abc.hash + i)); + } + Timer.stop(); + Timer.start('Parse Namespace Sets'); + var namespaceSets = [ + undefined + ]; + n = stream.readU30(); + for (var i = 1; i < n; ++i) { + var count = stream.readU30(); + var set = []; + set.runtimeId = ConstantPool._nextNamespaceSetID++; + for (var j = 0; j < count; ++j) { + set.push(namespaces[stream.readU30()]); + } + namespaceSets.push(set); + } + Timer.stop(); + this.namespaces = namespaces; + this.namespaceSets = namespaceSets; + Timer.start('Parse Multinames'); + var multinames = [ + undefined + ]; + var patchFactoryTypes = []; + n = stream.readU30(); + for (var i = 1; i < n; ++i) { + multinames.push(Multiname.parse(this, stream, multinames, patchFactoryTypes)); + } + Timer.stop(); + this.multinames = multinames; + } + ConstantPool.prototype.getValue = function (kind, index) { + switch (kind) { + case 3: + return this.ints[index]; + case 4: + return this.uints[index]; + case 6: + return this.doubles[index]; + case 1: + return this.strings[index]; + case 11: + return true; + case 10: + return false; + case 12: + return null; + case 0: + return undefined; + case 8: + case 23: + return this.namespaces[index]; + case 7: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 20: + return this.multinames[index]; + case 2: + Shumway.Debug.warning('TODO: CONSTANT.Float may be deprecated?'); + break; + default: + true; + } + }; + ConstantPool._nextNamespaceSetID = 1; + return ConstantPool; + }(); + ABC.ConstantPool = ConstantPool; + }(AVM2.ABC || (AVM2.ABC = {}))); + var ABC = AVM2.ABC; + }(Shumway.AVM2 || (Shumway.AVM2 = {}))); + var AVM2 = Shumway.AVM2; +}(Shumway || (Shumway = {}))); +var AbcFile = Shumway.AVM2.ABC.AbcFile; +var AbcStream = Shumway.AVM2.ABC.AbcStream; +var ConstantPool = Shumway.AVM2.ABC.ConstantPool; +var ClassInfo = Shumway.AVM2.ABC.ClassInfo; +var MetaDataInfo = Shumway.AVM2.ABC.MetaDataInfo; +var InstanceInfo = Shumway.AVM2.ABC.InstanceInfo; +var ScriptInfo = Shumway.AVM2.ABC.ScriptInfo; +var Trait = Shumway.AVM2.ABC.Trait; +var MethodInfo = Shumway.AVM2.ABC.MethodInfo; +var Multiname = Shumway.AVM2.ABC.Multiname; +var ASNamespace = Shumway.AVM2.ABC.Namespace; +var AbcFile = Shumway.AVM2.ABC.AbcFile; +var AbcStream = Shumway.AVM2.ABC.AbcStream; +var ConstantPool = Shumway.AVM2.ABC.ConstantPool; +var ClassInfo = Shumway.AVM2.ABC.ClassInfo; +var MetaDataInfo = Shumway.AVM2.ABC.MetaDataInfo; +var InstanceInfo = Shumway.AVM2.ABC.InstanceInfo; +var ScriptInfo = Shumway.AVM2.ABC.ScriptInfo; +var Trait = Shumway.AVM2.ABC.Trait; +var MethodInfo = Shumway.AVM2.ABC.MethodInfo; +var Multiname = Shumway.AVM2.ABC.Multiname; +var ASNamespace = Shumway.AVM2.ABC.Namespace; var Bytecode = function () { function Bytecode(code) { var op = code.readU8(); this.op = op; this.originalPosition = code.position; - var opdesc = opcodeTable[op]; + var opdesc = Shumway.AVM2.opcodeTable[op]; if (!opdesc) { unexpected('Unknown Op ' + op); } @@ -13948,7 +15278,7 @@ var Bytecode = function () { writer.writeLn('#' + this.bid); }, toString: function toString(abc) { - var opDescription = opcodeTable[this.op]; + var opDescription = Shumway.AVM2.opcodeTable[this.op]; var str = opDescription.name.padRight(' ', 20); var i, j; if (this.op === OP_lookupswitch) { @@ -16933,9 +18263,9 @@ var Type = function () { traitsTypeCache = type.cache.scriptInfo; } if (traitsTypeCache) { - return traitsTypeCache[x.id] || (traitsTypeCache[x.id] = new TraitsType(x, domain)); + return traitsTypeCache[x.runtimeId] || (traitsTypeCache[x.runtimeId] = new TraitsType(x, domain)); } - if (x instanceof Activation) { + if (x instanceof ActivationInfo) { return new TraitsType(x.methodInfo); } else if (x instanceof Global) { return new TraitsType(x.scriptInfo); @@ -17108,7 +18438,7 @@ var TraitsType = function () { return 'II:' + x.name.name; } else if (x instanceof MethodInfo) { return 'MI'; - } else if (x instanceof Activation) { + } else if (x instanceof ActivationInfo) { return 'AC'; } true; @@ -17222,6 +18552,9 @@ var TraitsType = function () { } return null; }; + traitsType.prototype.isScriptInfo = function () { + return this.object instanceof ScriptInfo; + }; traitsType.prototype.isClassInfo = function () { return this.object instanceof ClassInfo; }; @@ -17388,10 +18721,10 @@ var Verifier = function () { return state; }(); var Verification = function () { - function verification(methodInfo, scope) { - this.scope = scope; + function verification(methodInfo, domain, savedScope) { + this.savedScope = savedScope; this.methodInfo = methodInfo; - this.domain = methodInfo.abc.applicationDomain; + this.domain = domain; this.writer = new IndentingWriter(); this.returnType = Type.Undefined; } @@ -17427,12 +18760,12 @@ var Verifier = function () { for (var bi = 0, len = blocks.length; bi < len; bi++) { blocks[bi].bdo = bi; } - var worklist = new SortedList(function compare(blockA, blockB) { + var worklist = new Shumway.SortedList(function compare(blockA, blockB) { return blockA.bdo - blockB.bdo; }); blocks[0].entryState = entryState; worklist.push(blocks[0]); - while (worklist.peek()) { + while (!worklist.isEmpty()) { var block = worklist.pop(); var exitState = block.exitState = block.entryState.clone(); this.verifyBlock(block, exitState); @@ -17473,13 +18806,14 @@ var Verifier = function () { this.methodInfo.inferredReturnType = this.returnType; }; verification.prototype.verifyBlock = function verifyBlock(block, state) { - var savedScope = this.scope; + var savedScope = this.savedScope; + var globalScope = savedScope[0]; var local = state.local; var stack = state.stack; var scope = state.scope; var writer = verifierTraceLevel.value ? this.writer : null; var bytecodes = this.methodInfo.analysis.bytecodes; - var domain = this.methodInfo.abc.applicationDomain; + var domain = this.domain; var multinames = this.methodInfo.abc.constantPool.multinames; var mi = this.methodInfo; var bc, obj, fn, mn, l, r, val, type, returnType; @@ -17509,41 +18843,27 @@ var Verifier = function () { } function findProperty(mn, strict) { if (mn instanceof MultinameType) { + if (mn.name === 'Array') { + debugger; + } return Type.Any; } - for (var i = scope.length - 1; i >= 0; i--) { - if (scope[i] instanceof TraitsType) { - var trait = scope[i].getTrait(mn, false, true); + for (var i = scope.length - 1; i >= -savedScope.length; i--) { + var s = i >= 0 ? scope[i] : savedScope[savedScope.length + i]; + if (s instanceof TraitsType) { + var trait = s.getTrait(mn, false, true); if (trait) { ti().scopeDepth = scope.length - i - 1; - return scope[i]; + if (s.isClassInfo() || s.isScriptInfo()) { + ti().object = LazyInitializer.create(s.object); + } + return s; } } else { - return Type.Any; - } - } - if (isClassOrInstanceInfo(mi.holder)) { - var classType; - if (mi.holder instanceof ClassInfo) { - classType = Type.from(mi.holder, domain); - } else if (mi.holder instanceof InstanceInfo) { - classType = Type.from(mi.holder, domain).classType(); - } - var trait = classType.getTrait(mn, false, true); - if (trait) { - if (!mi.isInstanceInitializer) { - ti().object = LazyInitializer.create(classType.object); + if (mn.name === 'Array') { + debugger; } - return classType; - } - } - if (savedScope && savedScope.object && mn instanceof Multiname) { - var obj = savedScope.findScopeProperty(mn.namespaces, mn.name, mn.flags, domain, strict, true); - if (obj) { - var savedScopeDepth = savedScope.findDepth(obj); - true; - ti().scopeDepth = savedScopeDepth + scope.length; - return Type.from(obj, domain); + return Type.Any; } } var resolved = domain.findDefiningScript(mn, false); @@ -17551,6 +18871,9 @@ var Verifier = function () { ti().object = LazyInitializer.create(resolved.script); return Type.from(resolved.script, domain); } + if (mn.name === 'Array') { + debugger; + } return Type.Any; } function popMultiname() { @@ -17586,7 +18909,7 @@ var Verifier = function () { return Type.Any; } function isNumericMultiname(mn) { - return mn instanceof Multiname && isNumeric(mn.name) || mn instanceof MultinameType && (mn.name instanceof TraitsType && mn.name.isNumeric() || isNumeric(mn.name)); + return mn instanceof Multiname && Multiname.isNumeric(mn) || mn instanceof MultinameType && (mn.name instanceof TraitsType && mn.name.isNumeric()); } function getProperty(obj, mn) { if (obj instanceof TraitsType || obj instanceof ParameterizedType) { @@ -17641,7 +18964,7 @@ var Verifier = function () { bc = bytecodes[bci]; var op = bc.op; if (writer && verifierTraceLevel.value > 1) { - writer.writeLn(('stateBefore: ' + state.toString()).padRight(' ', 100) + ' : ' + bci + ', ' + bc.toString(mi.abc)); + writer.writeLn(('stateBefore: ' + state.toString() + ' $$[' + savedScope.join(', ') + ']').padRight(' ', 100) + ' : ' + bci + ', ' + bc.toString(mi.abc)); } switch (op) { case 1: @@ -17852,6 +19175,8 @@ var Verifier = function () { stack.pop(); if (this.thisType.isInstanceInfo() && this.thisType.super() === Type.Object) { ti().noCallSuperNeeded = true; + } else { + ti().baseClass = LazyInitializer.create(this.thisType.super().classType().object); } break; case 66: @@ -17877,7 +19202,11 @@ var Verifier = function () { true; val = pop(); obj = pop(); - push(obj.applyType(val)); + if (obj === Type.Any) { + push(Type.Any); + } else { + push(obj.applyType(val)); + } break; case 84: notImplemented(bc); @@ -17891,7 +19220,7 @@ var Verifier = function () { push(Type.Array); break; case 87: - push(Type.from(new Activation(this.methodInfo))); + push(Type.from(new ActivationInfo(this.methodInfo))); break; case 88: push(Type.Any); @@ -17931,7 +19260,8 @@ var Verifier = function () { local[bc.index] = pop(); break; case 100: - push(Type.from(savedScope.global.object)); + push(globalScope); + ti().object = LazyInitializer.create(globalScope.object); break; case 101: push(scope[bc.index]); @@ -18177,7 +19507,22 @@ var Verifier = function () { } verifier.prototype.verifyMethod = function (methodInfo, scope) { try { - new Verification(methodInfo, scope).verify(); + var domain = methodInfo.abc.applicationDomain; + var scopeObjects = scope.getScopeObjects(); + if (!scopeObjects[scopeObjects.length - 1]) { + if (methodInfo.holder instanceof InstanceInfo) { + scopeObjects[scopeObjects.length - 1] = methodInfo.holder.classInfo; + } else if (methodInfo.holder instanceof ClassInfo) { + scopeObjects[scopeObjects.length - 1] = methodInfo.holder; + } + } + var savedScope = scopeObjects.map(function (object) { + if (object instanceof MethodInfo) { + return Type.from(new ActivationInfo(object)); + } + return Type.from(object, domain); + }); + new Verification(methodInfo, methodInfo.abc.applicationDomain, savedScope).verify(); methodInfo.verified = true; Counter.count('Verifier: Methods'); } catch (e) { @@ -19794,6 +21139,9 @@ var Verifier = function () { operator.NEG = new operator('-', function (a) { return -a; }, false); + operator.TYPE_OF = new operator('typeof', function (a) { + return typeof a; + }, false); operator.TRUE = new operator('!!', function (a) { return !(!a); }, false); @@ -20609,7 +21957,7 @@ var Verifier = function () { return; } if (node instanceof Value) { - node.variable = new Variable('l' + node.id); + node.variable = new Variable('v' + node.id); debug && writer.writeLn('Allocated: ' + node.variable + ' to ' + node); } } @@ -20998,6 +22346,7 @@ var createName = function createName(namespaces, name) { var CFG = IR.CFG; var writer = new IndentingWriter(); var peepholeOptimizer = new IR.PeepholeOptimizer(); + var USE_TYPE_OF_DEFAULT_ARGUMENT_CHECKING = false; var State = function () { var nextID = 0; function constructor(index) { @@ -21141,8 +22490,7 @@ var createName = function createName(namespaces, name) { node.mustFloat = true; return node; } - function info(message) { - console.info(message); + function warn(message) { } function unary(operator, argument) { var node = new Unary(operator, argument); @@ -21209,7 +22557,14 @@ var createName = function createName(namespaces, name) { value ]); } - var coerceString = callGlobalProperty.bind(null, 'asCoerceString'); + function coerceString(value) { + if (isStringConstant(value)) { + return value; + } + return callPure(globalProperty('asCoerceString'), null, [ + value + ]); + } var coerceObject = callGlobalProperty.bind(null, 'asCoerceObject'); var coercers = createEmptyObject(); coercers[Multiname.Int] = coerceInt; @@ -21248,7 +22603,7 @@ var createName = function createName(namespaces, name) { var parameterIndexOffset = this.hasDynamicScope ? 1 : 0; var parameterCount = mi.parameters.length; for (var i = 0; i < parameterCount; i++) { - state.local.push(new Parameter(start, parameterIndexOffset + i, PARAMETER_PREFIX + mi.parameters[i].name)); + state.local.push(new Parameter(start, parameterIndexOffset + i, mi.parameters[i].name)); } for (var i = parameterCount; i < mi.localCount; i++) { state.local.push(Undefined); @@ -21275,7 +22630,12 @@ var createName = function createName(namespaces, name) { var index = i + 1; var local = state.local[index]; if (parameter.value !== undefined) { - var condition = new IR.Binary(Operator.LT, argumentsLength, constant(parameterIndexOffset + i + 1)); + var condition; + if (USE_TYPE_OF_DEFAULT_ARGUMENT_CHECKING) { + condition = new IR.Binary(Operator.SEQ, new IR.Unary(Operator.TYPE_OF, local), constant('undefined')); + } else { + condition = new IR.Binary(Operator.LT, argumentsLength, constant(parameterIndexOffset + i + 1)); + } local = new IR.Latch(null, condition, constant(parameter.value), local); } if (parameter.type && !parameter.type.isAnyName()) { @@ -21312,7 +22672,7 @@ var createName = function createName(namespaces, name) { for (var i = 0; i < blocks.length; i++) { blocks[i].blockDominatorOrder = i; } - var worklist = new SortedList(function compare(a, b) { + var worklist = new Shumway.SortedList(function compare(a, b) { return a.block.blockDominatorOrder - b.block.blockDominatorOrder; }); var start = new Start(null); @@ -21442,12 +22802,18 @@ var createName = function createName(namespaces, name) { } return name; } + function getGlobalScope(ti) { + if (ti && ti.object) { + return constant(ti.object); + } + return new IR.ASGlobal(null, savedScope()); + } function findProperty(multiname, strict, ti) { var slowPath = new IR.ASFindProperty(region, state.store, topScope(), multiname, domain, strict); if (ti) { if (ti.object) { if (ti.object instanceof Global && !ti.object.isExecuting()) { - info('Can\'t optimize findProperty ' + multiname + ', global object is not yet executed or executing.'); + warn('Can\'t optimize findProperty ' + multiname + ', global object is not yet executed or executing.'); return slowPath; } return constant(ti.object); @@ -21455,7 +22821,7 @@ var createName = function createName(namespaces, name) { return getScopeObject(topScope(ti.scopeDepth)); } } - info('Can\'t optimize findProperty ' + multiname); + warn('Can\'t optimize findProperty ' + multiname); return slowPath; } function getJSProperty(object, path) { @@ -21498,7 +22864,7 @@ var createName = function createName(namespaces, name) { function resolveMultinameGlobally(multiname) { var namespaces = multiname.namespaces; var name = multiname.name; - if (!globalMultinameAnalysis.value) { + if (!Shumway.AVM2.Runtime.globalMultinameAnalysis.value) { return; } if (!isConstant(namespaces) || !isConstant(name) || multiname.isAttribute()) { @@ -21537,6 +22903,20 @@ var createName = function createName(namespaces, name) { } return store(new IR.ASSetSuper(region, state.store, object, multiname, value, scope)); } + function constructSuper(scope, object, args, ti) { + if (ti) { + if (ti.noCallSuperNeeded) { + return; + } else if (ti.baseClass) { + var callee = getJSProperty(constant(ti.baseClass), 'instanceConstructorNoInitialize'); + call(callee, object, args); + return; + } + } + callee = getJSProperty(scope, 'object.baseClass.instanceConstructorNoInitialize'); + call(callee, object, args); + return; + } function callProperty(object, multiname, args, isLex, ti) { if (ti && ti.trait) { if (ti.trait.isMethod()) { @@ -21565,7 +22945,7 @@ var createName = function createName(namespaces, name) { } return store(new IR.ASCallProperty(region, state.store, object, multiname, args, IR.Flags.PRISTINE, isLex)); } - function getProperty(object, multiname, ti, getOpenMethod, ic) { + function getProperty(object, multiname, ti, getOpenMethod) { true; getOpenMethod = !(!getOpenMethod); if (ti) { @@ -21584,7 +22964,7 @@ var createName = function createName(namespaces, name) { return store(new IR.ASGetProperty(region, state.store, object, multiname, IR.Flags.INDEXED | (getOpenMethod ? IR.Flagas.IS_METHOD : 0))); } } - info('Can\'t optimize getProperty ' + multiname); + warn('Can\'t optimize getProperty ' + multiname); var qn = resolveMultinameGlobally(multiname); if (qn) { return store(new IR.ASGetProperty(region, state.store, object, constant(Multiname.getQualifiedName(qn)), IR.Flags.RESOLVED | (getOpenMethod ? IR.Flagas.IS_METHOD : 0))); @@ -21592,7 +22972,7 @@ var createName = function createName(namespaces, name) { Counter.count('Compiler: Slow ASGetProperty'); return store(new IR.ASGetProperty(region, state.store, object, multiname, getOpenMethod ? IR.Flagas.IS_METHOD : 0)); } - function setProperty(object, multiname, value, ti, ic) { + function setProperty(object, multiname, value, ti) { true; if (ti) { if (ti.trait) { @@ -21611,7 +22991,7 @@ var createName = function createName(namespaces, name) { return store(new IR.ASSetProperty(region, state.store, object, multiname, value, IR.Flags.INDEXED)); } } - info('Can\'t optimize setProperty ' + multiname); + warn('Can\'t optimize setProperty ' + multiname); var qn = resolveMultinameGlobally(multiname); if (qn) { } @@ -21632,7 +23012,7 @@ var createName = function createName(namespaces, name) { return store(new IR.GetProperty(region, state.store, object, constant(slotQn))); } } - info('Can\'t optimize getSlot ' + index); + warn('Can\'t optimize getSlot ' + index); return store(new IR.ASGetSlot(null, state.store, object, index)); } function setSlot(object, index, value, ti) { @@ -21644,7 +23024,7 @@ var createName = function createName(namespaces, name) { return; } } - info('Can\'t optimize setSlot ' + index); + warn('Can\'t optimize setSlot ' + index); store(new IR.ASSetSlot(region, state.store, object, index, value)); } function call(callee, object, args) { @@ -21808,7 +23188,7 @@ var createName = function createName(namespaces, name) { scope.pop(); break; case 100: - push(new IR.ASGlobal(null, savedScope())); + push(getGlobalScope(bc.ti)); break; case 101: push(getScopeObject(state.scope[bc.index])); @@ -21822,7 +23202,7 @@ var createName = function createName(namespaces, name) { case 102: multiname = buildMultiname(bc.index); object = pop(); - push(getProperty(object, multiname, bc.ti, false, ic(bc))); + push(getProperty(object, multiname, bc.ti, false)); break; case 89: multiname = buildMultiname(bc.index); @@ -21831,14 +23211,14 @@ var createName = function createName(namespaces, name) { break; case 96: multiname = buildMultiname(bc.index); - push(getProperty(findProperty(multiname, true, bc.ti), multiname, bc.ti, false, ic(bc))); + push(getProperty(findProperty(multiname, true, bc.ti), multiname, bc.ti, false)); break; case 104: case 97: value = pop(); multiname = buildMultiname(bc.index); object = pop(); - setProperty(object, multiname, value, bc.ti, ic(bc)); + setProperty(object, multiname, value, bc.ti); break; case 106: multiname = buildMultiname(bc.index); @@ -21910,16 +23290,13 @@ var createName = function createName(namespaces, name) { case 73: args = popMany(bc.argCount); object = pop(); - if (!(bc.ti && bc.ti.noCallSuperNeeded)) { - callee = getJSProperty(savedScope(), 'object.baseClass.instanceConstructorNoInitialize'); - call(callee, object, args); - } + constructSuper(savedScope(), object, args, bc.ti); break; case 74: args = popMany(bc.argCount); multiname = buildMultiname(bc.index); object = pop(); - callee = getProperty(object, multiname, bc.ti, false, ic(bc)); + callee = getProperty(object, multiname, bc.ti, false); push(store(new IR.ASNew(region, state.store, callee, args))); break; case 128: @@ -22115,7 +23492,7 @@ var createName = function createName(namespaces, name) { left = pop(); if (typesAreEqual(left, right)) { operator = Operator.ADD; - } else if (useAsAdd) { + } else if (Shumway.AVM2.Runtime.useAsAdd) { operator = Operator.AS_ADD; } else { operator = Operator.ADD; @@ -22345,7 +23722,7 @@ var createName = function createName(namespaces, name) { Timer.start('Mark Loops'); methodInfo.analysis.markLoops(); Timer.stop(); - if (enableVerifier.value) { + if (Shumway.AVM2.Runtime.enableVerifier.value) { Timer.start('Verify'); verifier.verifyMethod(methodInfo, scope); Timer.stop(); @@ -24270,7 +25647,7 @@ var Compiler = new (function () { }; IR.ASNewActivation.prototype.compile = function (cx) { var methodInfo = compileValue(this.methodInfo, cx); - return call(id('createActivation'), [ + return call(id('asCreateActivation'), [ methodInfo ]); }; @@ -24303,7 +25680,7 @@ var Compiler = new (function () { Timer.stop(); var parameters = []; for (var i = 0; i < cx.parameters.length; i++) { - var name = cx.parameters[i] ? cx.parameters[i].name : '_'; + var name = cx.parameters[i] ? cx.parameters[i].name : '_' + i; parameters.push(id(name)); } if (cx.variables.length) { @@ -24346,1164 +25723,1521 @@ var Compiler = new (function () { } Backend.generate = generate; }(typeof exports === 'undefined' ? Backend = {} : exports)); -var domainOptions = systemOptions.register(new OptionSet('ApplicationDomain Options')); -var traceClasses = domainOptions.register(new Option('tc', 'traceClasses', 'boolean', false, 'trace class creation')); -var traceDomain = domainOptions.register(new Option('td', 'traceDomain', 'boolean', false, 'trace domain property access')); -var EXECUTION_MODE = { - INTERPRET: 1, - COMPILE: 2 - }; -function executeScript(script) { - var abc = script.abc; - true; - var global = new Global(script); - if (abc.applicationDomain.allowNatives) { - global[Multiname.getPublicQualifiedName('unsafeJSNative')] = getNative; - } - script.executing = true; - var scope = new Scope(null, script.global); - createFunction(script.init, scope).call(script.global, false); - script.executed = true; -} -function ensureScriptIsExecuted(script, reason) { - if (!script.executed && !script.executing) { - if (traceExecution.value >= 2) { - print('Executing Script For: ' + reason); - } - executeScript(script); - } -} -var Glue = createEmptyObject(); -Glue.PUBLIC_PROPERTIES = 1; -Glue.PUBLIC_METHODS = 2; -Glue.ALL = Glue.PUBLIC_PROPERTIES | Glue.PUBLIC_METHODS; -var ApplicationDomain = function () { - function applicationDomain(vm, base, mode, allowNatives) { - true; - true; - this.vm = vm; - this.abcs = []; - this.loadedAbcs = {}; - this.loadedClasses = []; - this.classCache = createEmptyObject(); - this.scriptCache = createEmptyObject(); - this.classInfoCache = createEmptyObject(); - this.base = base; - this.allowNatives = allowNatives; - this.mode = mode; - this.onMessage = new Callback(); - if (base) { - this.system = base.system; - } else { - this.system = this; +var Shumway; +(function (Shumway) { + (function (AVM2) { + (function (Runtime) { + var Multiname = Shumway.AVM2.ABC.Multiname; + var Namespace = Shumway.AVM2.ABC.Namespace; + var ClassInfo = Shumway.AVM2.ABC.ClassInfo; + var InstanceInfo = Shumway.AVM2.ABC.InstanceInfo; + var Trait = Shumway.AVM2.ABC.Trait; + var IndentingWriter = Shumway.IndentingWriter; + var createMap = Shumway.ObjectUtilities.createMap; + var defineNonEnumerableGetterOrSetter = Shumway.ObjectUtilities.defineNonEnumerableGetterOrSetter; + var defineNonEnumerableProperty = Shumway.ObjectUtilities.defineNonEnumerableProperty; + var defineReadOnlyProperty = Shumway.ObjectUtilities.defineReadOnlyProperty; + var bindSafely = Shumway.FunctionUtilities.bindSafely; + var vmNextTrampolineId = 1; + var vmNextMemoizerId = 1; + function getMethodOverrideKey(methodInfo) { + var key; + if (methodInfo.holder instanceof ClassInfo) { + key = 'static ' + methodInfo.holder.instanceInfo.name.getOriginalName() + '::' + methodInfo.name.getOriginalName(); + } else if (methodInfo.holder instanceof InstanceInfo) { + key = methodInfo.holder.name.getOriginalName() + '::' + methodInfo.name.getOriginalName(); + } else { + key = methodInfo.name.getOriginalName(); + } + return key; } - } - applicationDomain.passthroughCallable = function passthroughCallable(f) { - return { - call: function ($this) { - Array.prototype.shift.call(arguments); - return f.apply($this, arguments); - }, - apply: function ($this, args) { - return f.apply($this, args); - } - }; - }; - applicationDomain.coerceCallable = function coerceCallable(type) { - return { - call: function ($this, value) { - return asCoerce(type, value); - }, - apply: function ($this, args) { - return asCoerce(type, args[0]); - } - }; - }; - applicationDomain.constructingCallable = function constructingCallable(instanceConstructor) { - return { - call: function ($this) { - return new Function.bind.apply(instanceConstructor, arguments); - }, - apply: function ($this, args) { - return new Function.bind.apply(instanceConstructor, [ - $this - ].concat(args)); - } - }; - }; - applicationDomain.prototype = { - getType: function getType(multiname) { - return this.getProperty(multiname, true, true); - }, - getProperty: function getProperty(multiname, strict, execute) { - var resolved = this.findDefiningScript(multiname, execute); - if (resolved) { - if (!resolved.script.executing) { - return undefined; + Runtime.getMethodOverrideKey = getMethodOverrideKey; + function checkMethodOverrides(methodInfo) { + if (methodInfo.name) { + var key = getMethodOverrideKey(methodInfo); + if (key in Shumway.AVM2.Runtime.VM_METHOD_OVERRIDES) { + Shumway.Debug.warning('Overriding Method: ' + key); + return Shumway.AVM2.Runtime.VM_METHOD_OVERRIDES[key]; } - return resolved.script.global[Multiname.getQualifiedName(resolved.trait.name)]; } - if (strict) { - return unexpected('Cannot find property ' + multiname); + } + Runtime.checkMethodOverrides = checkMethodOverrides; + function makeTrampoline(forward, parameterLength, description) { + true; + return function trampolineContext() { + var target = null; + var trampoline = function execute() { + if (Shumway.AVM2.Runtime.traceExecution.value >= 3) { + log('Trampolining'); + } + Counter.count('Executing Trampoline'); + Shumway.AVM2.Runtime.traceCallExecution.value > 1 && callWriter.writeLn('Trampoline: ' + description); + if (!target) { + target = forward(trampoline); + true; + } + return target.apply(this, arguments); + }; + trampoline.trigger = function trigger() { + Counter.count('Triggering Trampoline'); + if (!target) { + target = forward(trampoline); + true; + } + }; + trampoline.isTrampoline = true; + trampoline.debugName = 'Trampoline #' + vmNextTrampolineId++; + defineReadOnlyProperty(trampoline, Shumway.AVM2.Runtime.VM_LENGTH, parameterLength); + return trampoline; + }(); + } + Runtime.makeTrampoline = makeTrampoline; + function makeMemoizer(qn, target) { + function memoizer() { + Counter.count('Runtime: Memoizing'); + if (Shumway.AVM2.Runtime.traceExecution.value >= 3) { + log('Memoizing: ' + qn); + } + Shumway.AVM2.Runtime.traceCallExecution.value > 1 && callWriter.writeLn('Memoizing: ' + qn); + if (Shumway.AVM2.Runtime.isNativePrototype(this)) { + Counter.count('Runtime: Method Closures'); + return bindSafely(target.value, this); + } + if (isTrampoline(target.value)) { + target.value.trigger(); + } + true; + var mc = null; + if (Shumway.AVM2.Runtime.isClass(this)) { + Counter.count('Runtime: Static Method Closures'); + mc = bindSafely(target.value, this); + defineReadOnlyProperty(this, qn, mc); + return mc; + } + if (Object.prototype.hasOwnProperty.call(this, qn)) { + var pd = Object.getOwnPropertyDescriptor(this, qn); + if (pd.get) { + Counter.count('Runtime: Method Closures'); + return bindSafely(target.value, this); + } + Counter.count('Runtime: Unpatched Memoizer'); + return this[qn]; + } + mc = bindSafely(target.value, this); + mc.methodInfo = target.value.methodInfo; + defineReadOnlyProperty(mc, Multiname.getPublicQualifiedName('prototype'), null); + defineReadOnlyProperty(this, qn, mc); + return mc; } - return undefined; - }, - getClass: function getClass(simpleName) { - var cache = this.classCache; - var c = cache[simpleName]; - if (!c) { - c = cache[simpleName] = this.getProperty(Multiname.fromSimpleName(simpleName), true, true); + var m = memoizer; + Counter.count('Runtime: Memoizers'); + m.isMemoizer = true; + m.debugName = 'Memoizer #' + vmNextMemoizerId++; + return m; + } + Runtime.makeMemoizer = makeMemoizer; + function isTrampoline(fn) { + true; + return fn.isTrampoline; + } + Runtime.isTrampoline = isTrampoline; + function isMemoizer(fn) { + true; + return fn.isMemoizer; + } + Runtime.isMemoizer = isMemoizer; + }(AVM2.Runtime || (AVM2.Runtime = {}))); + var Runtime = AVM2.Runtime; + }(Shumway.AVM2 || (Shumway.AVM2 = {}))); + var AVM2 = Shumway.AVM2; +}(Shumway || (Shumway = {}))); +var __extends = this.__extends || function (d, b) { + for (var p in b) + if (b.hasOwnProperty(p)) + d[p] = b[p]; + function __() { + this.constructor = d; + } + __.prototype = b.prototype; + d.prototype = new __(); + }; +var Shumway; +(function (Shumway) { + (function (AVM2) { + (function (Runtime) { + var Multiname = Shumway.AVM2.ABC.Multiname; + var Namespace = Shumway.AVM2.ABC.Namespace; + var MethodInfo = Shumway.AVM2.ABC.MethodInfo; + var ClassInfo = Shumway.AVM2.ABC.ClassInfo; + var InstanceInfo = Shumway.AVM2.ABC.InstanceInfo; + var ScriptInfo = Shumway.AVM2.ABC.ScriptInfo; + var Trait = Shumway.AVM2.ABC.Trait; + var IndentingWriter = Shumway.IndentingWriter; + var hasOwnProperty = Shumway.ObjectUtilities.hasOwnProperty; + var createMap = Shumway.ObjectUtilities.createMap; + var cloneObject = Shumway.ObjectUtilities.cloneObject; + var copyProperties = Shumway.ObjectUtilities.copyProperties; + var createEmptyObject = Shumway.ObjectUtilities.createEmptyObject; + var bindSafely = Shumway.FunctionUtilities.bindSafely; + var defineNonEnumerableGetterOrSetter = Shumway.ObjectUtilities.defineNonEnumerableGetterOrSetter; + var defineNonEnumerableProperty = Shumway.ObjectUtilities.defineNonEnumerableProperty; + var defineReadOnlyProperty = Shumway.ObjectUtilities.defineReadOnlyProperty; + var defineNonEnumerableGetter = Shumway.ObjectUtilities.defineNonEnumerableGetter; + var makeForwardingGetter = Shumway.FunctionUtilities.makeForwardingGetter; + var makeForwardingSetter = Shumway.FunctionUtilities.makeForwardingSetter; + var Binding = function () { + function Binding(trait) { + this.trait = trait; + } + Binding.getKey = function (qn, trait) { + var key = qn; + if (trait.isGetter()) { + key = Binding.GET_PREFIX + qn; + } else if (trait.isSetter()) { + key = Binding.SET_PREFIX + qn; + } + return key; + }; + Binding.prototype.toString = function () { + return String(this.trait); + }; + Binding.SET_PREFIX = 'set '; + Binding.GET_PREFIX = 'get '; + Binding.KEY_PREFIX_LENGTH = 4; + return Binding; + }(); + Runtime.Binding = Binding; + var SlotInfo = function () { + function SlotInfo(name, isConst, type, trait) { + this.name = name; + this.isConst = isConst; + this.type = type; + this.trait = trait; + } + return SlotInfo; + }(); + Runtime.SlotInfo = SlotInfo; + var SlotInfoMap = function () { + function SlotInfoMap() { + this.byID = createMap(); + this.byQN = createMap(); + } + return SlotInfoMap; + }(); + Runtime.SlotInfoMap = SlotInfoMap; + var Bindings = function () { + function Bindings() { + this.map = createMap(); + this.slots = []; + this.nextSlotId = 1; + } + Bindings.prototype.assignNextSlot = function (trait) { + true; + true; + if (!trait.slotId) { + trait.slotId = this.nextSlotId++; + } else { + this.nextSlotId = trait.slotId + 1; + } + true; + this.slots[trait.slotId] = trait; + }; + Bindings.prototype.trace = function (writer) { + writer.enter('Bindings'); + for (var key in this.map) { + var binding = this.map[key]; + writer.writeLn(binding.trait.kindName() + ': ' + key + ' -> ' + binding); + } + writer.leaveAndEnter('Slots'); + writer.writeArray(this.slots); + writer.outdent(); + }; + Bindings.prototype.applyTo = function (domain, object) { + true; + true; + true; + defineNonEnumerableProperty(object, Shumway.AVM2.Runtime.VM_SLOTS, new SlotInfoMap()); + defineNonEnumerableProperty(object, Shumway.AVM2.Runtime.VM_BINDINGS, []); + defineNonEnumerableProperty(object, Shumway.AVM2.Runtime.VM_OPEN_METHODS, createMap()); + defineNonEnumerableProperty(object, 'bindings', this); + defineNonEnumerableProperty(object, 'resolutionMap', []); + traitsWriter && traitsWriter.greenLn('Applying Traits'); + for (var key in this.map) { + var binding = this.map[key]; + var trait = binding.trait; + var qn = Multiname.getQualifiedName(trait.name); + if (trait.isSlot() || trait.isConst() || trait.isClass()) { + var defaultValue = undefined; + if (trait.isSlot() || trait.isConst()) { + if (trait.hasDefaultValue) { + defaultValue = trait.value; + } else if (trait.typeName) { + defaultValue = domain.findClassInfo(trait.typeName).defaultValue; + } + } + if (key !== qn) { + traitsWriter && traitsWriter.yellowLn('Binding Trait: ' + key + ' -> ' + qn); + defineNonEnumerableGetter(object, key, makeForwardingGetter(qn)); + object.asBindings.pushUnique(key); + } else { + traitsWriter && traitsWriter.greenLn('Applying Trait ' + trait.kindName() + ': ' + trait); + defineNonEnumerableProperty(object, qn, defaultValue); + object.asBindings.pushUnique(qn); + var slotInfo = new SlotInfo(qn, trait.isConst(), trait.typeName ? domain.getProperty(trait.typeName, false, false) : null, trait); + object.asSlots.byID[trait.slotId] = slotInfo; + object.asSlots.byQN[qn] = slotInfo; + } + } else if (trait.isMethod() || trait.isGetter() || trait.isSetter()) { + if (trait.isGetter() || trait.isSetter()) { + key = key.substring(Binding.KEY_PREFIX_LENGTH); + } + if (key !== qn) { + traitsWriter && traitsWriter.yellowLn('Binding Trait: ' + key + ' -> ' + qn); + } else { + traitsWriter && traitsWriter.greenLn('Applying Trait ' + trait.kindName() + ': ' + trait); + } + object.asBindings.pushUnique(key); + if (this instanceof ScriptBindings) { + Shumway.AVM2.Runtime.applyNonMemoizedMethodTrait(key, trait, object, binding.scope, binding.natives); + } else { + Shumway.AVM2.Runtime.applyMemoizedMethodTrait(key, trait, object, binding.scope, binding.natives); + } + } + } + }; + return Bindings; + }(); + Runtime.Bindings = Bindings; + var ActivationBindings = function (_super) { + __extends(ActivationBindings, _super); + function ActivationBindings(methodInfo) { + _super.call(this); + true; + this.methodInfo = methodInfo; + var traits = methodInfo.traits; + for (var i = 0; i < traits.length; i++) { + var trait = traits[i]; + true; + var key = Multiname.getQualifiedName(trait.name); + this.map[key] = new Binding(trait); + this.assignNextSlot(trait); + } + } + return ActivationBindings; + }(Bindings); + Runtime.ActivationBindings = ActivationBindings; + var CatchBindings = function (_super) { + __extends(CatchBindings, _super); + function CatchBindings(scope, trait) { + _super.call(this); + var key = Multiname.getQualifiedName(trait.name); + this.map[key] = new Binding(trait); + true; + this.assignNextSlot(trait); + } + return CatchBindings; + }(Bindings); + Runtime.CatchBindings = CatchBindings; + var ScriptBindings = function (_super) { + __extends(ScriptBindings, _super); + function ScriptBindings(scriptInfo, scope) { + _super.call(this); + this.scope = scope; + this.scriptInfo = scriptInfo; + var traits = scriptInfo.traits; + for (var i = 0; i < traits.length; i++) { + var trait = traits[i]; + var name = Multiname.getQualifiedName(trait.name); + var key = Binding.getKey(name, trait); + var binding = this.map[key] = new Binding(trait); + if (trait.isSlot() || trait.isConst() || trait.isClass()) { + this.assignNextSlot(trait); + } + if (trait.isClass()) { + if (trait.metadata && trait.metadata.native) { + trait.classInfo.native = trait.metadata.native; + } + } + if (trait.isMethod() || trait.isGetter() || trait.isSetter()) { + binding.scope = this.scope; + } + } + } + return ScriptBindings; + }(Bindings); + Runtime.ScriptBindings = ScriptBindings; + var ClassBindings = function (_super) { + __extends(ClassBindings, _super); + function ClassBindings(classInfo, scope, natives) { + _super.call(this); + this.scope = scope; + this.natives = natives; + this.classInfo = classInfo; + var traits = classInfo.traits; + for (var i = 0; i < traits.length; i++) { + var trait = traits[i]; + var name = Multiname.getQualifiedName(trait.name); + var key = Binding.getKey(name, trait); + var binding = this.map[key] = new Binding(trait); + if (trait.isSlot() || trait.isConst()) { + this.assignNextSlot(trait); + } + if (trait.isMethod() || trait.isGetter() || trait.isSetter()) { + binding.scope = this.scope; + binding.natives = this.natives; + } + } + } + return ClassBindings; + }(Bindings); + Runtime.ClassBindings = ClassBindings; + var InstanceBindings = function (_super) { + __extends(InstanceBindings, _super); + function InstanceBindings(parent, instanceInfo, scope, natives) { + _super.call(this); + this.scope = scope; + this.natives = natives; + this.parent = parent; + this.instanceInfo = instanceInfo; + this.implementedInterfaces = parent ? cloneObject(parent.implementedInterfaces) : createEmptyObject(); + if (parent) { + this.slots = parent.slots.slice(); + this.nextSlotId = parent.nextSlotId; + } + this.extend(parent); + } + InstanceBindings.prototype.extend = function (parent) { + var ii = this.instanceInfo, ib; + var map = this.map; + var name, key, trait, binding, protectedName, protectedKey; + if (parent) { + for (key in parent.map) { + binding = parent.map[key]; + trait = binding.trait; + map[key] = binding; + if (trait.isProtected()) { + protectedName = Multiname.getQualifiedName(new Multiname([ + ii.protectedNs + ], trait.name.getName())); + protectedKey = Binding.getKey(protectedName, trait); + map[protectedKey] = binding; + } + } + } + function writeOrOverwriteBinding(object, key, binding) { + var trait = binding.trait; + var oldBinding = object[key]; + if (oldBinding) { + var oldTrait = oldBinding.trait; + true; + true; + } else { + true; + } + object[key] = binding; + } + function overwriteProtectedBinding(object, key, binding) { + if (key in object) { + object[key] = binding; + } + } + var traits = ii.traits; + for (var i = 0; i < traits.length; i++) { + trait = traits[i]; + name = Multiname.getQualifiedName(trait.name); + key = Binding.getKey(name, trait); + binding = new Binding(trait); + writeOrOverwriteBinding(map, key, binding); + if (trait.isProtected()) { + ib = this.parent; + while (ib) { + protectedName = Multiname.getQualifiedName(new Multiname([ + ib.instanceInfo.protectedNs + ], trait.name.getName())); + protectedKey = Binding.getKey(protectedName, trait); + overwriteProtectedBinding(map, protectedKey, binding); + ib = ib.parent; + } + } + if (trait.isSlot() || trait.isConst()) { + this.assignNextSlot(trait); + } + if (trait.isMethod() || trait.isGetter() || trait.isSetter()) { + binding.scope = this.scope; + binding.natives = this.natives; + } + } + var domain = ii.abc.applicationDomain; + var interfaces = ii.interfaces; + for (var i = 0; i < interfaces.length; i++) { + var interface = domain.getProperty(interfaces[i], true, true); + true; + copyProperties(this.implementedInterfaces, interface.interfaceBindings.implementedInterfaces); + this.implementedInterfaces[Multiname.getQualifiedName(interface.name)] = interface; + } + for (var interfaceName in this.implementedInterfaces) { + var interface = this.implementedInterfaces[interfaceName]; + ib = interface.interfaceBindings; + for (var interfaceKey in ib.map) { + var interfaceBinding = ib.map[interfaceKey]; + if (ii.isInterface()) { + map[interfaceKey] = interfaceBinding; + } else { + name = Multiname.getPublicQualifiedName(interfaceBinding.trait.name.getName()); + key = Binding.getKey(name, interfaceBinding.trait); + map[interfaceKey] = map[key]; + } + } + } + }; + InstanceBindings.prototype.toString = function () { + return this.instanceInfo.toString(); + }; + return InstanceBindings; + }(Bindings); + Runtime.InstanceBindings = InstanceBindings; + var traitsWriter = null; + }(AVM2.Runtime || (AVM2.Runtime = {}))); + var Runtime = AVM2.Runtime; + }(Shumway.AVM2 || (Shumway.AVM2 = {}))); + var AVM2 = Shumway.AVM2; +}(Shumway || (Shumway = {}))); +var Binding = Shumway.AVM2.Runtime.Binding; +var Bindings = Shumway.AVM2.Runtime.Bindings; +var ActivationBindings = Shumway.AVM2.Runtime.ActivationBindings; +var CatchBindings = Shumway.AVM2.Runtime.CatchBindings; +var ScriptBindings = Shumway.AVM2.Runtime.ScriptBindings; +var ClassBindings = Shumway.AVM2.Runtime.ClassBindings; +var InstanceBindings = Shumway.AVM2.Runtime.InstanceBindings; +var Shumway; +(function (Shumway) { + (function (AVM2) { + (function (Runtime) { + var Multiname = Shumway.AVM2.ABC.Multiname; + var Namespace = Shumway.AVM2.ABC.Namespace; + var MethodInfo = Shumway.AVM2.ABC.MethodInfo; + var ClassInfo = Shumway.AVM2.ABC.ClassInfo; + var InstanceInfo = Shumway.AVM2.ABC.InstanceInfo; + var InstanceBindings = Shumway.AVM2.Runtime.InstanceBindings; + var ClassBindings = Shumway.AVM2.Runtime.ClassBindings; + var defineNonEnumerableGetterOrSetter = Shumway.ObjectUtilities.defineNonEnumerableGetterOrSetter; + var defineNonEnumerableProperty = Shumway.ObjectUtilities.defineNonEnumerableProperty; + var defineReadOnlyProperty = Shumway.ObjectUtilities.defineReadOnlyProperty; + var defineNonEnumerableGetter = Shumway.ObjectUtilities.defineNonEnumerableGetter; + var createEmptyObject = Shumway.ObjectUtilities.createEmptyObject; + var toKeyValueArray = Shumway.ObjectUtilities.toKeyValueArray; + var boxValue = Shumway.ObjectUtilities.boxValue; + function makeCacheKey(namespaces, name, flags) { + if (!namespaces) { + return name; + } else if (namespaces.length > 1) { + return namespaces.runtimeId + '$' + name; + } else { + return namespaces[0].qualifiedName + '$' + name; + } + } + var Scope = function () { + function Scope(parent, object, isWith) { + if (typeof isWith === 'undefined') { + isWith = false; + } + this.parent = parent; + this.object = boxValue(object); + true; + this.global = parent ? parent.global : this; + this.isWith = isWith; + this.cache = createEmptyObject(); + } + Scope.prototype.findDepth = function (object) { + var current = this; + var depth = 0; + while (current) { + if (current.object === object) { + return depth; + } + depth++; + current = current.parent; + } + return -1; + }; + Scope.prototype.getScopeObjects = function () { + var objects = []; + var current = this; + while (current) { + objects.unshift(current.object); + current = current.parent; + } + return objects; + }; + Scope.prototype.findScopeProperty = function (namespaces, name, flags, domain, strict, scopeOnly) { + Counter.count('findScopeProperty'); + var object; + var key = makeCacheKey(namespaces, name, flags); + if (!scopeOnly && (object = this.cache[key])) { + return object; + } + if (this.object.asHasProperty(namespaces, name, flags, true)) { + return this.isWith ? this.object : this.cache[key] = this.object; + } + if (this.parent) { + return this.cache[key] = this.parent.findScopeProperty(namespaces, name, flags, domain, strict, scopeOnly); + } + if (scopeOnly) + return null; + if (object = domain.findDomainProperty(new Multiname(namespaces, name, flags), strict, true)) { + return object; + } + if (strict) { + Shumway.Debug.unexpected('Cannot find property ' + name); + } + return this.global.object; + }; + return Scope; + }(); + Runtime.Scope = Scope; + function bindFreeMethodScope(methodInfo, scope) { + var fn = methodInfo.freeMethod; + if (methodInfo.lastBoundMethod && methodInfo.lastBoundMethod.scope === scope) { + return methodInfo.lastBoundMethod.boundMethod; } true; - return c; - }, - findClass: function findClass(simpleName) { - if (simpleName in this.classCache) { - return true; - } - return this.findDomainProperty(Multiname.fromSimpleName(simpleName), false, true); - }, - findDomainProperty: function findDomainProperty(multiname, strict, execute) { - if (traceDomain.value) { - print('ApplicationDomain.findDomainProperty: ' + multiname); - } - var resolved = this.findDefiningScript(multiname, execute); - if (resolved) { - return resolved.script.global; - } - if (strict) { - return unexpected('Cannot find property ' + multiname); - } else { - return undefined; - } - return undefined; - }, - findClassInfo: function findClassInfo(mn) { - var originalQn; - if (Multiname.isQName(mn)) { - originalQn = Multiname.getQualifiedName(mn); - var ci = this.classInfoCache[originalQn]; - if (ci) { - return ci; - } - } else { - var ci = this.classInfoCache[mn.id]; - if (ci) { - return ci; + var boundMethod; + var asGlobal = scope.global.object; + if (!methodInfo.hasOptional() && !methodInfo.needsArguments() && !methodInfo.needsRest()) { + switch (methodInfo.parameters.length) { + case 0: + boundMethod = function () { + return fn.call(this === jsGlobal ? asGlobal : this, scope); + }; + break; + case 1: + boundMethod = function (x) { + return fn.call(this === jsGlobal ? asGlobal : this, scope, x); + }; + break; + case 2: + boundMethod = function (x, y) { + return fn.call(this === jsGlobal ? asGlobal : this, scope, x, y); + }; + break; + case 3: + boundMethod = function (x, y, z) { + return fn.call(this === jsGlobal ? asGlobal : this, scope, x, y, z); + }; + break; + default: + break; } } - if (this.base) { - ci = this.base.findClassInfo(mn); - if (ci) { - return ci; + if (!boundMethod) { + Counter.count('Bind Scope - Slow Path'); + boundMethod = function () { + Array.prototype.unshift.call(arguments, scope); + var global = this === jsGlobal ? scope.global.object : this; + return fn.apply(global, arguments); + }; + } + boundMethod.methodInfo = methodInfo; + boundMethod.instanceConstructor = boundMethod; + methodInfo.lastBoundMethod = { + scope: scope, + boundMethod: boundMethod + }; + return boundMethod; + } + Runtime.bindFreeMethodScope = bindFreeMethodScope; + }(AVM2.Runtime || (AVM2.Runtime = {}))); + var Runtime = AVM2.Runtime; + }(Shumway.AVM2 || (Shumway.AVM2 = {}))); + var AVM2 = Shumway.AVM2; +}(Shumway || (Shumway = {}))); +var playerglobalLoadedPromise; +var playerglobal; +var Shumway; +(function (Shumway) { + (function (AVM2) { + (function (Runtime) { + var AbcFile = Shumway.AVM2.ABC.AbcFile; + var Multiname = Shumway.AVM2.ABC.Multiname; + var Namespace = Shumway.AVM2.ABC.Namespace; + var MethodInfo = Shumway.AVM2.ABC.MethodInfo; + var ClassInfo = Shumway.AVM2.ABC.ClassInfo; + var InstanceInfo = Shumway.AVM2.ABC.InstanceInfo; + var ScriptInfo = Shumway.AVM2.ABC.ScriptInfo; + var createEmptyObject = Shumway.ObjectUtilities.createEmptyObject; + var IndentingWriter = Shumway.IndentingWriter; + (function (EXECUTION_MODE) { + EXECUTION_MODE[EXECUTION_MODE['INTERPRET'] = 1] = 'INTERPRET'; + EXECUTION_MODE[EXECUTION_MODE['COMPILE'] = 2] = 'COMPILE'; + }(Runtime.EXECUTION_MODE || (Runtime.EXECUTION_MODE = {}))); + var EXECUTION_MODE = Runtime.EXECUTION_MODE; + function createNewCompartment() { + return newGlobal('new-compartment'); + } + function executeScript(script) { + var abc = script.abc; + true; + var global = new Shumway.AVM2.Runtime.Global(script); + if (abc.applicationDomain.allowNatives) { + global[Multiname.getPublicQualifiedName('unsafeJSNative')] = getNative; + } + script.executing = true; + var scope = new Shumway.AVM2.Runtime.Scope(null, script.global); + createFunction(script.init, scope).call(script.global, false); + script.executed = true; + } + Runtime.executeScript = executeScript; + function ensureScriptIsExecuted(script, reason) { + if (typeof reason === 'undefined') { + reason = ''; + } + if (!script.executed && !script.executing) { + if (Shumway.AVM2.Runtime.traceExecution.value >= 2) { + log('Executing Script For: ' + reason); + } + executeScript(script); + } + } + Runtime.ensureScriptIsExecuted = ensureScriptIsExecuted; + (function (Glue) { + Glue[Glue['PUBLIC_PROPERTIES'] = 1] = 'PUBLIC_PROPERTIES'; + Glue[Glue['PUBLIC_METHODS'] = 2] = 'PUBLIC_METHODS'; + Glue[Glue['ALL'] = 1 | 2] = 'ALL'; + }(Runtime.Glue || (Runtime.Glue = {}))); + var Glue = Runtime.Glue; + function grabAbc(abcName) { + var entry = playerglobal.scripts[abcName]; + if (!entry) { + return null; + } + var offset = entry.offset; + var length = entry.length; + return new AbcFile(new Uint8Array(playerglobal.abcs, offset, length), abcName); + } + function findDefiningAbc(mn) { + if (!playerglobal) { + return null; + } + for (var i = 0; i < mn.namespaces.length; i++) { + var name = mn.namespaces[i].uri + ':' + mn.name; + var abcName = playerglobal.map[name]; + if (abcName) { + break; } } - var abcs = this.abcs; - for (var i = 0; i < abcs.length; i++) { - var abc = abcs[i]; - var scripts = abc.scripts; - for (var j = 0; j < scripts.length; j++) { - var script = scripts[j]; - var traits = script.traits; - for (var k = 0; k < traits.length; k++) { - var trait = traits[k]; - if (trait.isClass()) { - var traitName = Multiname.getQualifiedName(trait.name); - if (originalQn) { - if (traitName === originalQn) { - return this.classInfoCache[originalQn] = trait.classInfo; - } + if (abcName) { + return grabAbc(abcName); + } + return null; + } + function promiseFile(path, responseType) { + return new Promise(function (resolve, reject) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', path); + xhr.responseType = responseType; + xhr.onload = function () { + if (xhr.response) { + resolve(xhr.response); + } else { + reject('Unable to load ' + path + ': ' + xhr.statusText); + } + }; + xhr.send(); + }); + } + var AVM2 = function () { + function AVM2(sysMode, appMode, loadAVM1) { + this.systemDomain = new ApplicationDomain(this, null, sysMode, true); + this.applicationDomain = new ApplicationDomain(this, this.systemDomain, appMode, false); + this.findDefiningAbc = findDefiningAbc; + this.loadAVM1 = loadAVM1; + this.isAVM1Loaded = false; + this.exception = { + value: undefined + }; + this.exceptions = []; + } + AVM2.initialize = function (sysMode, appMode, loadAVM1) { + AVM2.instance = new AVM2(sysMode, appMode, loadAVM1); + }; + AVM2.currentAbc = function () { + var caller = arguments.callee; + var maxDepth = 20; + var abc = null; + for (var i = 0; i < maxDepth && caller; i++) { + var mi = caller.methodInfo; + if (mi) { + abc = mi.abc; + break; + } + caller = caller.caller; + } + return abc; + }; + AVM2.currentDomain = function () { + var abc = AVM2.currentAbc(); + return abc.applicationDomain; + }; + AVM2.isPlayerglobalLoaded = function () { + return !(!playerglobal); + }; + AVM2.loadPlayerglobal = function (abcsPath, catalogPath) { + if (playerglobalLoadedPromise) { + return Promise.reject('Playerglobal is already loaded'); + } + playerglobalLoadedPromise = Promise.all([ + promiseFile(abcsPath, 'arraybuffer'), + promiseFile(catalogPath, 'json') + ]).then(function (result) { + playerglobal = { + abcs: result[0], + map: Object.create(null), + scripts: Object.create(null) + }; + var catalog = result[1]; + for (var i = 0; i < catalog.length; i++) { + var abc = catalog[i]; + playerglobal.scripts[abc.name] = abc; + if (typeof abc.defs === 'string') { + playerglobal.map[abc.defs] = abc.name; } else { - for (var m = 0, n = mn.namespaces.length; m < n; m++) { - var qn = mn.getQName(m); - if (traitName === Multiname.getQualifiedName(qn)) { - return this.classInfoCache[qn] = trait.classInfo; + for (var j = 0; j < abc.defs.length; j++) { + var def = abc.defs[j]; + playerglobal.map[def] = abc.name; + } + } + } + }, function (e) { + console.error(e); + }); + return playerglobalLoadedPromise; + }; + AVM2.prototype.notifyConstruct = function (instanceConstructor, args) { + }; + AVM2.getStackTrace = function () { + Shumway.Debug.notImplemented('getStackTrace'); + }; + return AVM2; + }(); + Runtime.AVM2 = AVM2; + var ApplicationDomain = function () { + function ApplicationDomain(vm, base, mode, allowNatives) { + true; + true; + this.vm = vm; + this.abcs = []; + this.loadedAbcs = {}; + this.loadedClasses = []; + this.classCache = createEmptyObject(); + this.scriptCache = createEmptyObject(); + this.classInfoCache = createEmptyObject(); + this.base = base; + this.allowNatives = allowNatives; + this.mode = mode; + this.onMessage = new Callback(); + if (base) { + this.system = base.system; + } else { + this.system = this; + } + } + ApplicationDomain.passthroughCallable = function (f) { + return { + call: function ($this) { + Array.prototype.shift.call(arguments); + return f.apply($this, arguments); + }, + apply: function ($this, args) { + return f.apply($this, args); + } + }; + }; + ApplicationDomain.coerceCallable = function (type) { + return { + call: function ($this, value) { + return Shumway.AVM2.Runtime.asCoerce(type, value); + }, + apply: function ($this, args) { + return Shumway.AVM2.Runtime.asCoerce(type, args[0]); + } + }; + }; + ApplicationDomain.constructingCallable = function (instanceConstructor) { + return { + call: function (self) { + return new (Function.bind.apply(instanceConstructor, arguments))(); + }, + apply: function (self, args) { + return new (Function.bind.apply(instanceConstructor, [ + self + ].concat(args)))(); + } + }; + }; + ApplicationDomain.prototype.getType = function (multiname) { + return this.getProperty(multiname, true, true); + }; + ApplicationDomain.prototype.getProperty = function (multiname, strict, execute) { + var resolved = this.findDefiningScript(multiname, execute); + if (resolved) { + if (!resolved.script.executing) { + return undefined; + } + return resolved.script.global[Multiname.getQualifiedName(resolved.trait.name)]; + } + if (strict) { + return Shumway.Debug.unexpected('Cannot find property ' + multiname); + } + return undefined; + }; + ApplicationDomain.prototype.getClass = function (simpleName) { + var cache = this.classCache; + var c = cache[simpleName]; + if (!c) { + c = cache[simpleName] = this.getProperty(Multiname.fromSimpleName(simpleName), true, true); + } + true; + return c; + }; + ApplicationDomain.prototype.findClass = function (simpleName) { + if (simpleName in this.classCache) { + return true; + } + return this.findDomainProperty(Multiname.fromSimpleName(simpleName), false, true); + }; + ApplicationDomain.prototype.findDomainProperty = function (multiname, strict, execute) { + if (Shumway.AVM2.Runtime.traceDomain.value) { + log('ApplicationDomain.findDomainProperty: ' + multiname); + } + var resolved = this.findDefiningScript(multiname, execute); + if (resolved) { + return resolved.script.global; + } + if (strict) { + return Shumway.Debug.unexpected('Cannot find property ' + multiname); + } else { + return undefined; + } + return undefined; + }; + ApplicationDomain.prototype.findClassInfo = function (mn) { + var originalQn; + if (Multiname.isQName(mn)) { + originalQn = Multiname.getQualifiedName(mn); + var ci = this.classInfoCache[originalQn]; + if (ci) { + return ci; + } + } else { + var ci = this.classInfoCache[mn.runtimeId]; + if (ci) { + return ci; + } + } + if (this.base) { + ci = this.base.findClassInfo(mn); + if (ci) { + return ci; + } + } + var abcs = this.abcs; + for (var i = 0; i < abcs.length; i++) { + var abc = abcs[i]; + var scripts = abc.scripts; + for (var j = 0; j < scripts.length; j++) { + var script = scripts[j]; + var traits = script.traits; + for (var k = 0; k < traits.length; k++) { + var trait = traits[k]; + if (trait.isClass()) { + var traitName = Multiname.getQualifiedName(trait.name); + if (originalQn) { + if (traitName === originalQn) { + return this.classInfoCache[originalQn] = trait.classInfo; + } + } else { + for (var m = 0, n = mn.namespaces.length; m < n; m++) { + var qn = mn.getQName(m); + if (traitName === Multiname.getQualifiedName(qn)) { + return this.classInfoCache[qn] = trait.classInfo; + } + } } } } } } - } - } - if (!this.base && this.vm.findDefiningAbc) { - var abc = this.vm.findDefiningAbc(mn); - if (abc !== null && !this.loadedAbcs[abc.name]) { - this.loadedAbcs[abc.name] = true; - this.loadAbc(abc); - return this.findClassInfo(mn); - } - } - return undefined; - }, - installNative: function (name, func) { - natives[name] = function () { - return func; - }; - }, - findDefiningScript: function findDefiningScript(mn, execute) { - var resolved = this.scriptCache[mn.id]; - if (resolved && (resolved.script.executed || !execute)) { - return resolved; - } - if (this.base) { - resolved = this.base.findDefiningScript(mn, execute); - if (resolved) { - return resolved; - } - } - Counter.count('ApplicationDomain: findDefiningScript'); - var abcs = this.abcs; - for (var i = 0; i < abcs.length; i++) { - var abc = abcs[i]; - var scripts = abc.scripts; - for (var j = 0; j < scripts.length; j++) { - var script = scripts[j]; - var traits = script.traits; - if (mn instanceof Multiname) { - for (var k = 0; k < traits.length; k++) { - var trait = traits[k]; - if (mn.hasQName(trait.name)) { - if (execute) { - ensureScriptIsExecuted(script, trait.name); + if (!this.base && this.vm.findDefiningAbc) { + var abc = this.vm.findDefiningAbc(mn); + if (abc !== null && !this.loadedAbcs[abc.name]) { + this.loadedAbcs[abc.name] = true; + this.loadAbc(abc); + return this.findClassInfo(mn); + } + } + return undefined; + }; + ApplicationDomain.prototype.installNative = function (name, func) { + natives[name] = function () { + return func; + }; + }; + ApplicationDomain.prototype.findDefiningScript = function (mn, execute) { + var resolved = this.scriptCache[mn.runtimeId]; + if (resolved && (resolved.script.executed || !execute)) { + return resolved; + } + if (this.base) { + resolved = this.base.findDefiningScript(mn, execute); + if (resolved) { + return resolved; + } + } + Counter.count('ApplicationDomain: findDefiningScript'); + var abcs = this.abcs; + for (var i = 0; i < abcs.length; i++) { + var abc = abcs[i]; + var scripts = abc.scripts; + for (var j = 0; j < scripts.length; j++) { + var script = scripts[j]; + var traits = script.traits; + if (mn instanceof Multiname) { + for (var k = 0; k < traits.length; k++) { + var trait = traits[k]; + if (mn.hasQName(trait.name)) { + if (execute) { + ensureScriptIsExecuted(script, String(trait.name)); + } + return this.scriptCache[mn.runtimeId] = { + script: script, + trait: trait + }; + } } - return this.scriptCache[mn.id] = { - script: script, - trait: trait - }; + } else { + Shumway.Debug.unexpected(); } } - } else { - unexpected(); } - } - } - if (!this.base && this.vm.findDefiningAbc) { - var abc = this.vm.findDefiningAbc(mn); - if (abc !== null && !this.loadedAbcs[abc.name]) { - this.loadedAbcs[abc.name] = true; + if (!this.base && this.vm.findDefiningAbc) { + var abc = this.vm.findDefiningAbc(mn); + if (abc !== null && !this.loadedAbcs[abc.name]) { + this.loadedAbcs[abc.name] = true; + this.loadAbc(abc); + return this.findDefiningScript(mn, execute); + } + } + return undefined; + }; + ApplicationDomain.prototype.compileAbc = function (abc, writer) { + compileAbc(abc, writer); + }; + ApplicationDomain.prototype.executeAbc = function (abc) { this.loadAbc(abc); - return this.findDefiningScript(mn, execute); - } - } - return undefined; - }, - compileAbc: function compileAbc(abc) { - this.loadAbc(abc); - var writer = new IndentingWriter(); - writer.enter('var classes = {'); - for (var i = 0; i < abc.scripts.length; i++) { - compileScript(abc.scripts[i], writer); - } - writer.leave('}'); - }, - executeAbc: function executeAbc(abc) { - this.loadAbc(abc); - executeScript(abc.lastScript); - }, - loadAbc: function loadAbc(abc) { - if (traceExecution.value) { - print('Loading: ' + abc.name); - } - abc.applicationDomain = this; - GlobalMultinameResolver.loadAbc(abc); - this.abcs.push(abc); - if (!this.base) { - Type.initializeTypes(this); - } - }, - broadcastMessage: function (type, message, origin) { - if (false) { - Timer.start('broadcast: ' + type); - } - try { - this.onMessage.notify1(type, { - data: message, - origin: origin, - source: this - }); - } catch (e) { - avm2.exceptions.push({ - source: type, - message: e.message, - stack: e.stack - }); - throw e; - } - if (false) { - Timer.stop(); - } - }, - traceLoadedClasses: function (lastOnly) { - var writer = new IndentingWriter(); - lastOnly || writer.enter('Loaded Classes And Interfaces'); - var classes = lastOnly ? [ - this.loadedClasses.last() - ] : this.loadedClasses; - classes.forEach(function (cls) { - if (cls !== Class) { - cls.trace(writer); - } - }); - lastOnly || writer.leave(''); - } - }; - return applicationDomain; - }(); -var SecurityDomain = function () { - function securityDomain() { - this.compartment = createNewCompartment(); - this.compartment.environment = environment; - this.compartment.homePath = homePath; - this.compartment.eval(snarf('compartment.js')); - this.compartment.release = true; - } - securityDomain.prototype.initializeShell = function (sysMode, appMode) { - var compartment = this.compartment; - compartment.avm2 = new compartment.AVM2(sysMode, appMode); - compartment.avm2.systemDomain.executeAbc(compartment.grabAbc(homePath + 'src/avm2/generated/builtin/builtin.abc')); - compartment.avm2.systemDomain.executeAbc(compartment.grabAbc(homePath + 'src/avm2/generated/shell/shell.abc')); - this.systemDomain = compartment.avm2.systemDomain; - this.applicationDomain = compartment.avm2.applicationDomain; - }; - return securityDomain; - }(); -var traitsWriter = null; -var Binding = function () { - function binding(trait) { - true; - this.trait = trait; - } - var SET_PREFIX = 'set '; - var GET_PREFIX = 'get '; - binding.KEY_PREFIX_LENGTH = SET_PREFIX.length; - binding.getKey = function getKey(qn, trait) { - var key = qn; - if (trait.isGetter()) { - key = GET_PREFIX + qn; - } else if (trait.isSetter()) { - key = SET_PREFIX + qn; - } - return key; - }; - binding.prototype.toString = function toString() { - return String(this.trait); - }; - return binding; - }(); -var Bindings = function () { - function bindings() { - this.map = createEmptyObject(); - this.slots = []; - this.nextSlotId = 1; - } - bindings.prototype.assignNextSlot = function assignNextSlot(trait) { - true; - true; - if (!trait.slotId) { - trait.slotId = this.nextSlotId++; - } else { - this.nextSlotId = trait.slotId + 1; - } - true; - this.slots[trait.slotId] = trait; - }; - bindings.prototype.trace = function trace(writer) { - writer.enter('Bindings'); - for (var key in this.map) { - var binding = this.map[key]; - writer.writeLn(binding.trait.kindName() + ': ' + key + ' -> ' + binding); - } - writer.leaveAndEnter('Slots'); - writer.writeArray(this.slots); - writer.outdent(); - }; - function SlotInfo(name, isConst, type, trait) { - this.name = name; - this.isConst = isConst; - this.type = type; - this.trait = trait; - } - function SlotInfoMap() { - this.byID = []; - this.byQN = createEmptyObject(); - } - function patch(patchTargets, value) { - true; - for (var i = 0; i < patchTargets.length; i++) { - var patchTarget = patchTargets[i]; - if (traceExecution.value >= 3) { - var str = 'Patching: '; - if (patchTarget.name) { - str += patchTarget.name; - } else if (patchTarget.get) { - str += 'get ' + patchTarget.get; - } else if (patchTarget.set) { - str += 'set ' + patchTarget.set; - } - traitsWriter && traitsWriter.redLn(str); - } - if (patchTarget.get) { - defineNonEnumerableGetterOrSetter(patchTarget.object, patchTarget.get, value, true); - } else if (patchTarget.set) { - defineNonEnumerableGetterOrSetter(patchTarget.object, patchTarget.set, value, false); - } else { - defineNonEnumerableProperty(patchTarget.object, patchTarget.name, value); - } - } - } - function applyNonMemoizedMethodTrait(qn, trait, object, scope, natives) { - true; - if (trait.isMethod()) { - var trampoline = makeTrampoline(function (self) { - var fn = getTraitFunction(trait, scope, natives); - patch(self.patchTargets, fn); - return fn; - }, trait.methodInfo.parameters.length); - trampoline.patchTargets = [ - { - object: object, - name: qn - }, - { - object: object, - name: VM_OPEN_METHOD_PREFIX + qn - } - ]; - var closure = bindSafely(trampoline, object); - defineReadOnlyProperty(closure, VM_LENGTH, trampoline[VM_LENGTH]); - defineReadOnlyProperty(closure, Multiname.getPublicQualifiedName('prototype'), null); - defineNonEnumerableProperty(object, qn, closure); - defineNonEnumerableProperty(object, VM_OPEN_METHOD_PREFIX + qn, closure); - } else if (trait.isGetter() || trait.isSetter()) { - var trampoline = makeTrampoline(function (self) { - var fn = getTraitFunction(trait, scope, natives); - patch(self.patchTargets, fn); - return fn; - }); - if (trait.isGetter()) { - trampoline.patchTargets = [ - { - object: object, - get: qn - } - ]; - } else { - trampoline.patchTargets = [ - { - object: object, - set: qn - } - ]; - } - defineNonEnumerableGetterOrSetter(object, qn, trampoline, trait.isGetter()); - } else { - unexpected(trait); - } - } - function applyMemoizedMethodTrait(qn, trait, object, scope, natives) { - true; - if (trait.isMethod()) { - var memoizerTarget = { - value: null + executeScript(abc.lastScript); }; - var trampoline = makeTrampoline(function (self) { - var fn = getTraitFunction(trait, scope, natives); - patch(self.patchTargets, fn); - return fn; - }, trait.methodInfo.parameters.length, String(trait.name)); - memoizerTarget.value = trampoline; - var openMethods = object[VM_OPEN_METHODS]; - openMethods[qn] = trampoline; - defineNonEnumerableProperty(object, VM_OPEN_METHOD_PREFIX + qn, trampoline); - defineNonEnumerableGetter(object, qn, makeMemoizer(qn, memoizerTarget)); - trampoline.patchTargets = [ - { - object: memoizerTarget, - name: 'value' - }, - { - object: openMethods, - name: qn - }, - { - object: object, - name: VM_OPEN_METHOD_PREFIX + qn - } - ]; - } else if (trait.isGetter() || trait.isSetter()) { - var trampoline = makeTrampoline(function (self) { - var fn = getTraitFunction(trait, scope, natives); - patch(self.patchTargets, fn); - return fn; - }, 0, String(trait.name)); - if (trait.isGetter()) { - defineNonEnumerableProperty(object, VM_OPEN_GET_METHOD_PREFIX + qn, trampoline); - trampoline.patchTargets = [ - { - object: object, - get: qn - }, - { - object: object, - name: VM_OPEN_GET_METHOD_PREFIX + qn + ApplicationDomain.prototype.loadAbc = function (abc) { + if (Shumway.AVM2.Runtime.traceExecution.value) { + log('Loading: ' + abc.name); } - ]; - } else { - defineNonEnumerableProperty(object, VM_OPEN_SET_METHOD_PREFIX + qn, trampoline); - trampoline.patchTargets = [ - { - object: object, - set: qn - }, - { - object: object, - name: VM_OPEN_SET_METHOD_PREFIX + qn + abc.applicationDomain = this; + GlobalMultinameResolver.loadAbc(abc); + this.abcs.push(abc); + if (!this.base) { + Type.initializeTypes(this); } - ]; - } - defineNonEnumerableGetterOrSetter(object, qn, trampoline, trait.isGetter()); - } - } - bindings.prototype.applyTo = function applyTo(domain, object) { - true; - true; - true; - defineNonEnumerableProperty(object, VM_SLOTS, new SlotInfoMap()); - defineNonEnumerableProperty(object, VM_BINDINGS, []); - defineNonEnumerableProperty(object, VM_OPEN_METHODS, createEmptyObject()); - defineNonEnumerableProperty(object, 'bindings', this); - defineNonEnumerableProperty(object, 'resolutionMap', []); - traitsWriter && traitsWriter.greenLn('Applying Traits'); - for (var key in this.map) { - var binding = this.map[key]; - var trait = binding.trait; - var qn = Multiname.getQualifiedName(trait.name); - if (trait.isSlot() || trait.isConst() || trait.isClass()) { - var defaultValue = undefined; - if (trait.isSlot() || trait.isConst()) { - if (trait.hasDefaultValue) { - defaultValue = trait.value; - } else if (trait.typeName) { - defaultValue = domain.findClassInfo(trait.typeName).defaultValue; - } - } - if (key !== qn) { - traitsWriter && traitsWriter.yellowLn('Binding Trait: ' + key + ' -> ' + qn); - defineNonEnumerableGetter(object, key, makeForwardingGetter(qn)); - object[VM_BINDINGS].pushUnique(key); - } else { - traitsWriter && traitsWriter.greenLn('Applying Trait ' + trait.kindName() + ': ' + trait); - defineNonEnumerableProperty(object, qn, defaultValue); - object[VM_BINDINGS].pushUnique(qn); - var slotInfo = new SlotInfo(qn, trait.isConst(), trait.typeName ? domain.getProperty(trait.typeName, false, false) : null, trait); - object[VM_SLOTS].byID[trait.slotId] = slotInfo; - object[VM_SLOTS].byQN[qn] = slotInfo; - } - } else if (trait.isMethod() || trait.isGetter() || trait.isSetter()) { - if (trait.isGetter() || trait.isSetter()) { - key = key.substring(Binding.KEY_PREFIX_LENGTH); - } - if (key !== qn) { - traitsWriter && traitsWriter.yellowLn('Binding Trait: ' + key + ' -> ' + qn); - } else { - traitsWriter && traitsWriter.greenLn('Applying Trait ' + trait.kindName() + ': ' + trait); - } - object[VM_BINDINGS].pushUnique(key); - if (this instanceof ScriptBindings) { - applyNonMemoizedMethodTrait(key, trait, object, binding.scope, binding.natives); - } else { - applyMemoizedMethodTrait(key, trait, object, binding.scope, binding.natives); - } - } - } - }; - return bindings; - }(); -var ActivationBindings = function () { - function activationBindings(methodInfo) { - Bindings.call(this); - true; - this.methodInfo = methodInfo; - var traits = methodInfo.traits; - for (var i = 0; i < traits.length; i++) { - var trait = traits[i]; - true; - var key = Multiname.getQualifiedName(trait.name); - this.map[key] = new Binding(trait); - this.assignNextSlot(trait); - } - } - activationBindings.prototype = Object.create(Bindings.prototype); - return activationBindings; - }(); -var CatchBindings = function () { - function catchBindings(scope, trait) { - Bindings.call(this); - var key = Multiname.getQualifiedName(trait.name); - this.map[key] = new Binding(trait); - true; - this.assignNextSlot(trait); - } - catchBindings.prototype = Object.create(Bindings.prototype); - return catchBindings; - }(); -var ScriptBindings = function () { - function scriptBindings(scriptInfo, scope) { - Bindings.call(this); - this.scope = scope; - this.scriptInfo = scriptInfo; - var traits = scriptInfo.traits; - for (var i = 0; i < traits.length; i++) { - var trait = traits[i]; - var name = Multiname.getQualifiedName(trait.name); - var key = Binding.getKey(name, trait); - var binding = this.map[key] = new Binding(trait); - if (trait.isSlot() || trait.isConst() || trait.isClass()) { - this.assignNextSlot(trait); - } - if (trait.isClass()) { - if (trait.metadata && trait.metadata.native) { - trait.classInfo.native = trait.metadata.native; - } - } - if (trait.isMethod() || trait.isGetter() || trait.isSetter()) { - binding.scope = this.scope; - } - } - } - scriptBindings.prototype = Object.create(Bindings.prototype); - return scriptBindings; - }(); -var ClassBindings = function () { - function classBindings(classInfo, scope, natives) { - Bindings.call(this); - this.scope = scope; - this.natives = natives; - this.classInfo = classInfo; - var traits = classInfo.traits; - for (var i = 0; i < traits.length; i++) { - var trait = traits[i]; - var name = Multiname.getQualifiedName(trait.name); - var key = Binding.getKey(name, trait); - var binding = this.map[key] = new Binding(trait); - if (trait.isSlot() || trait.isConst()) { - this.assignNextSlot(trait); - } - if (trait.isMethod() || trait.isGetter() || trait.isSetter()) { - binding.scope = this.scope; - binding.natives = this.natives; - } - } - } - classBindings.prototype = Object.create(Bindings.prototype); - return classBindings; - }(); -var InstanceBindings = function () { - function instanceBindings(parent, instanceInfo, scope, natives) { - Bindings.call(this); - this.scope = scope; - this.natives = natives; - this.parent = parent; - this.instanceInfo = instanceInfo; - this.implementedInterfaces = parent ? cloneObject(parent.implementedInterfaces) : createEmptyObject(); - if (parent) { - this.slots = parent.slots.slice(); - this.nextSlotId = parent.nextSlotId; - } - extend.call(this, parent); - } - function extend(parent) { - var ii = this.instanceInfo, ib; - var map = this.map; - var name, key, trait, binding, protectedName, protectedKey; - if (parent) { - for (key in parent.map) { - binding = parent.map[key]; - trait = binding.trait; - map[key] = binding; - if (trait.isProtected()) { - protectedName = Multiname.getQualifiedName(new Multiname([ - ii.protectedNs - ], trait.name.getName())); - protectedKey = Binding.getKey(protectedName, trait); - map[protectedKey] = binding; - } - } - } - function writeOrOverwriteBinding(object, key, binding) { - var trait = binding.trait; - var oldBinding = object[key]; - if (oldBinding) { - var oldTrait = oldBinding.trait; - true; - true; - } else { - true; - } - object[key] = binding; - } - function overwriteProtectedBinding(object, key, binding) { - if (key in object) { - object[key] = binding; - } - } - var traits = ii.traits; - for (var i = 0; i < traits.length; i++) { - trait = traits[i]; - name = Multiname.getQualifiedName(trait.name); - key = Binding.getKey(name, trait); - binding = new Binding(trait); - writeOrOverwriteBinding(map, key, binding); - if (trait.isProtected()) { - ib = this.parent; - while (ib) { - protectedName = Multiname.getQualifiedName(new Multiname([ - ib.instanceInfo.protectedNs - ], trait.name.getName())); - protectedKey = Binding.getKey(protectedName, trait); - overwriteProtectedBinding(map, protectedKey, binding); - ib = ib.parent; - } - } - if (trait.isSlot() || trait.isConst()) { - this.assignNextSlot(trait); - } - if (trait.isMethod() || trait.isGetter() || trait.isSetter()) { - binding.scope = this.scope; - binding.natives = this.natives; - } - } - var domain = ii.abc.applicationDomain; - var interfaces = ii.interfaces; - for (var i = 0; i < interfaces.length; i++) { - var interface = domain.getProperty(interfaces[i], true, true); - true; - copyProperties(this.implementedInterfaces, interface.interfaceBindings.implementedInterfaces); - this.implementedInterfaces[Multiname.getQualifiedName(interface.name)] = interface; - } - for (var interfaceName in this.implementedInterfaces) { - var interface = this.implementedInterfaces[interfaceName]; - ib = interface.interfaceBindings; - for (var interfaceKey in ib.map) { - var interfaceBinding = ib.map[interfaceKey]; - if (ii.isInterface()) { - map[interfaceKey] = interfaceBinding; - } else { - name = Multiname.getPublicQualifiedName(interfaceBinding.trait.name.getName()); - key = Binding.getKey(name, interfaceBinding.trait); - map[interfaceKey] = map[key]; - } - } - } - } - instanceBindings.prototype = Object.create(Bindings.prototype); - instanceBindings.prototype.toString = function toString() { - return this.instanceInfo.toString(); - }; - return instanceBindings; - }(); -var Interface = function () { - function Interface(classInfo) { - var ii = classInfo.instanceInfo; - true; - this.name = ii.name; - this.classInfo = classInfo; - } - Interface.createInterface = function createInterface(classInfo) { - var ii = classInfo.instanceInfo; - true; - if (traceExecution.value) { - var str = 'Creating Interface ' + ii.name; - if (ii.interfaces.length) { - str += ' implements ' + ii.interfaces.map(function (name) { - return name.getName(); - }).join(', '); - } - print(str); - } - var cls = new Interface(classInfo); - cls.interfaceBindings = new InstanceBindings(null, ii); - return cls; - }; - Interface.prototype = { - toString: function () { - return '[interface ' + this.name + ']'; - }, - isInstance: function (value) { - if (value === null || typeof value !== 'object') { - return false; - } - true; - var qualifiedName = Multiname.getQualifiedName(this.name); - return value.class.implementedInterfaces[qualifiedName] !== undefined; - }, - trace: function trace(writer) { - writer.enter('interface ' + this.name.getName()); - writer.enter('interfaceBindings: '); - this.interfaceBindings.trace(writer); - writer.outdent(); - writer.outdent(); - writer.leave('}'); - }, - call: function ($this, x) { - return x; - }, - apply: function ($this, args) { - return args[0]; - } - }; - return Interface; - }(); -var Class = function () { - var OWN_INITIALIZE = 1; - var SUPER_INITIALIZE = 2; - function Class(name, instanceConstructor, callable) { - this.debugName = name; - if (instanceConstructor) { - true; - this.instanceConstructor = instanceConstructor; - this.instanceConstructorNoInitialize = instanceConstructor; - this.hasInitialize = 0; - this.instanceConstructor.class = this; - } - if (!callable) { - callable = ApplicationDomain.coerceCallable(this); - } else if (callable === ApplicationDomain.coerceCallable) { - callable = ApplicationDomain.coerceCallable(this); - } - defineNonEnumerableProperty(this, 'call', callable.call); - defineNonEnumerableProperty(this, 'apply', callable.apply); - } - Class.createClass = function createClass(classInfo, baseClass, scope) { - var ci = classInfo; - var ii = ci.instanceInfo; - var domain = ci.abc.applicationDomain; - var className = Multiname.getName(ii.name); - var isNativeClass = ci.native; - if (isNativeClass) { - var buildClass = getNative(ci.native.cls); - if (!buildClass) { - unexpected('No native for ' + ci.native.cls); - } - if (!baseClass) { - scope = new Scope(scope, Class); - } - } - var classScope = new Scope(scope, null); - var instanceConstructor = createFunction(ii.init, classScope, false); - var cls; - if (isNativeClass) { - cls = buildClass(domain, classScope, instanceConstructor, baseClass); - } else { - cls = new Class(className, instanceConstructor); - } - cls.className = className; - cls.classInfo = classInfo; - cls.scope = classScope; - classScope.object = cls; - var classNatives; - var instanceNatives; - if (isNativeClass) { - if (cls.native) { - classNatives = cls.native.static; - instanceNatives = cls.native.instance; - } - } else { - cls.extend(baseClass); - } - cls.classBindings = new ClassBindings(classInfo, classScope, classNatives); - cls.classBindings.applyTo(domain, cls); - defineReadOnlyProperty(cls, VM_IS_CLASS, true); - cls.instanceBindings = new InstanceBindings(baseClass ? baseClass.instanceBindings : null, ii, classScope, instanceNatives); - if (cls.instanceConstructor) { - cls.instanceBindings.applyTo(domain, cls.traitsPrototype); - } - cls.implementedInterfaces = cls.instanceBindings.implementedInterfaces; - return cls; - }; - function setDefaultProperties(cls) { - defineNonEnumerableProperty(cls.dynamicPrototype, Multiname.getPublicQualifiedName('constructor'), cls); - defineReadOnlyProperty(cls.traitsPrototype, 'class', cls); - defineReadOnlyProperty(cls.instanceConstructor, 'class', cls); - } - Class.prototype = { - setSymbol: function setSymbol(props) { - this.instanceConstructor.prototype.symbol = props; - }, - getSymbol: function getSymbol() { - return this.instanceConstructor.prototype.symbol; - }, - initializeInstance: function initializeInstance(obj) { - var c = this; - var initializes = []; - while (c) { - if (c.hasInitialize & OWN_INITIALIZE) { - initializes.push(c.instanceConstructor.prototype.initialize); - } - c = c.baseClass; - } - var s; - while (s = initializes.pop()) { - s.call(obj); - } - Counter.count('Initialize Instance ' + obj.class); - }, - createInstance: function createInstance(args) { - var o = Object.create(this.instanceConstructor.prototype); - this.instanceConstructor.apply(o, args); - return o; - }, - createAsSymbol: function createAsSymbol(props) { - var o = Object.create(this.instanceConstructor.prototype); - if (o.symbol) { - var symbol = Object.create(o.symbol); - for (var prop in props) { - symbol[prop] = props[prop]; - } - o.symbol = symbol; - } else { - o.symbol = props; - } - return o; - }, - extendNative: function (baseClass, native) { - this.baseClass = baseClass; - this.dynamicPrototype = Object.getPrototypeOf(native.prototype); - this.instanceConstructor.prototype = this.traitsPrototype = native.prototype; - setDefaultProperties(this); - }, - extendWrapper: function (baseClass, wrapper) { - true; - this.baseClass = baseClass; - this.dynamicPrototype = Object.create(baseClass.dynamicPrototype); - var traitsPrototype = Object.create(this.dynamicPrototype, getOwnPropertyDescriptors(wrapper.prototype)); - this.instanceConstructor.prototype = this.traitsPrototype = traitsPrototype; - setDefaultProperties(this); - }, - extendBuiltin: function (baseClass) { - true; - this.baseClass = baseClass; - this.dynamicPrototype = this.traitsPrototype = this.instanceConstructor.prototype; - setDefaultProperties(this); - }, - extend: function (baseClass) { - true; - this.baseClass = baseClass; - this.dynamicPrototype = Object.create(baseClass.dynamicPrototype); - if (baseClass.hasInitialize) { - var instanceConstructorNoInitialize = this.instanceConstructor; - var self = this; - this.instanceConstructor = function () { - self.initializeInstance(this); - instanceConstructorNoInitialize.apply(this, arguments); }; - defineReadOnlyProperty(this.instanceConstructor, 'class', instanceConstructorNoInitialize.class); - this.hasInitialize |= SUPER_INITIALIZE; - } - this.instanceConstructor.prototype = this.traitsPrototype = Object.create(this.dynamicPrototype); - setDefaultProperties(this); - }, - setDefaultProperties: function () { - setDefaultProperties(this); - }, - link: function (definition) { - true; - true; - if (definition.initialize) { - if (!this.hasInitialize) { - var instanceConstructorNoInitialize = this.instanceConstructor; - var self = this; - this.instanceConstructor = function () { - self.initializeInstance(this); - instanceConstructorNoInitialize.apply(this, arguments); - }; - defineReadOnlyProperty(this.instanceConstructor, 'class', instanceConstructorNoInitialize.class); - this.instanceConstructor.prototype = instanceConstructorNoInitialize.prototype; - } - this.hasInitialize |= OWN_INITIALIZE; - } - var dynamicPrototype = this.dynamicPrototype; - var keys = Object.keys(definition); - for (var i = 0; i < keys.length; i++) { - var propertyName = keys[i]; - Object.defineProperty(dynamicPrototype, propertyName, Object.getOwnPropertyDescriptor(definition, propertyName)); - } - function glueProperties(obj, properties) { - var keys = Object.keys(properties); - for (var i = 0; i < keys.length; i++) { - var propertyName = keys[i]; - var propertyGlue = properties[propertyName]; - var propertySimpleName; - var glueOpenMethod = false; - if (propertyGlue.indexOf('open ') >= 0) { - propertySimpleName = propertyGlue.substring(5); - glueOpenMethod = true; - } else { - propertySimpleName = propertyGlue; + ApplicationDomain.prototype.broadcastMessage = function (type, message, origin) { + if (debug) { + Timer.start('broadcast: ' + type); } - true; - var qn = Multiname.getQualifiedName(Multiname.fromSimpleName(propertySimpleName)); - if (glueOpenMethod) { - qn = VM_OPEN_METHOD_PREFIX + qn; - } - true; - var descriptor = Object.getOwnPropertyDescriptor(obj, qn); - if (descriptor && descriptor.get) { - Object.defineProperty(obj, propertyName, descriptor); - } else { - Object.defineProperty(obj, propertyName, { - get: new Function('', 'return this.' + qn), - set: new Function('v', 'this.' + qn + ' = v') + try { + this.onMessage.notify1(type, { + data: message, + origin: origin, + source: this }); + } catch (e) { + avm2.exceptions.push({ + source: type, + message: e.message, + stack: e.stack + }); + throw e; } + if (debug) { + Timer.stop(); + } + }; + ApplicationDomain.prototype.traceLoadedClasses = function (lastOnly) { + var writer = new IndentingWriter(); + lastOnly || writer.enter('Loaded Classes And Interfaces'); + var classes = lastOnly ? [ + this.loadedClasses.last() + ] : this.loadedClasses; + classes.forEach(function (cls) { + if (cls !== Shumway.AVM2.Runtime.Class) { + cls.trace(writer); + } + }); + lastOnly || writer.leave(''); + }; + return ApplicationDomain; + }(); + Runtime.ApplicationDomain = ApplicationDomain; + var SecurityDomain = function () { + function SecurityDomain() { + this.compartment = createNewCompartment(); + this.compartment.homePath = homePath; + this.compartment.release = true; + this.compartment.eval(snarf('compartment.js')); } - } - function generatePropertiesFromTraits(traits) { - var properties = createEmptyObject(); - traits.forEach(function (trait) { - var ns = trait.name.getNamespace(); - if (!ns.isPublic()) { + SecurityDomain.prototype.initializeShell = function (sysMode, appMode) { + var compartment = this.compartment; + compartment.AVM2.initialize(sysMode, appMode); + compartment.AVM2.instance.systemDomain.executeAbc(compartment.grabAbc(homePath + 'src/avm2/generated/builtin/builtin.abc')); + compartment.AVM2.instance.systemDomain.executeAbc(compartment.grabAbc(homePath + 'src/avm2/generated/shell/shell.abc')); + this.systemDomain = compartment.AVM2.instance.systemDomain; + this.applicationDomain = compartment.AVM2.instance.applicationDomain; + }; + return SecurityDomain; + }(); + Runtime.SecurityDomain = SecurityDomain; + }(AVM2.Runtime || (AVM2.Runtime = {}))); + var Runtime = AVM2.Runtime; + }(Shumway.AVM2 || (Shumway.AVM2 = {}))); + var AVM2 = Shumway.AVM2; +}(Shumway || (Shumway = {}))); +var Glue = Shumway.AVM2.Runtime.Glue; +var ApplicationDomain = Shumway.AVM2.Runtime.ApplicationDomain; +var AVM2 = Shumway.AVM2.Runtime.AVM2; +var EXECUTION_MODE = Shumway.AVM2.Runtime.EXECUTION_MODE; +var ApplicationDomain = Shumway.AVM2.Runtime.ApplicationDomain; +var AVM2 = Shumway.AVM2.Runtime.AVM2; +var EXECUTION_MODE = Shumway.AVM2.Runtime.EXECUTION_MODE; +var Shumway; +(function (Shumway) { + (function (AVM2) { + (function (Runtime) { + var Multiname = Shumway.AVM2.ABC.Multiname; + var Namespace = Shumway.AVM2.ABC.Namespace; + var ClassInfo = Shumway.AVM2.ABC.ClassInfo; + var InstanceInfo = Shumway.AVM2.ABC.InstanceInfo; + var InstanceBindings = Shumway.AVM2.Runtime.InstanceBindings; + var ClassBindings = Shumway.AVM2.Runtime.ClassBindings; + var defineNonEnumerableGetterOrSetter = Shumway.ObjectUtilities.defineNonEnumerableGetterOrSetter; + var defineNonEnumerableProperty = Shumway.ObjectUtilities.defineNonEnumerableProperty; + var defineReadOnlyProperty = Shumway.ObjectUtilities.defineReadOnlyProperty; + var defineNonEnumerableGetter = Shumway.ObjectUtilities.defineNonEnumerableGetter; + var createEmptyObject = Shumway.ObjectUtilities.createEmptyObject; + var toKeyValueArray = Shumway.ObjectUtilities.toKeyValueArray; + var Interface = function () { + function Interface(classInfo) { + var ii = classInfo.instanceInfo; + true; + this.name = ii.name; + this.classInfo = classInfo; + } + Interface.createInterface = function (classInfo) { + var ii = classInfo.instanceInfo; + true; + if (Shumway.AVM2.Runtime.traceExecution.value) { + var str = 'Creating Interface ' + ii.name; + if (ii.interfaces.length) { + str += ' implements ' + ii.interfaces.map(function (name) { + return name.getName(); + }).join(', '); + } + log(str); + } + var cls = new Interface(classInfo); + cls.interfaceBindings = new InstanceBindings(null, ii, null, null); + return cls; + }; + Interface.prototype.toString = function () { + return '[interface ' + this.name + ']'; + }; + Interface.prototype.isInstance = function (value) { + if (value === null || typeof value !== 'object') { + return false; + } + true; + var qualifiedName = Multiname.getQualifiedName(this.name); + return value.class.implementedInterfaces[qualifiedName] !== undefined; + }; + Interface.prototype.trace = function (writer) { + writer.enter('interface ' + this.name.getName()); + writer.enter('interfaceBindings: '); + this.interfaceBindings.trace(writer); + writer.outdent(); + writer.outdent(); + writer.leave('}'); + }; + Interface.prototype.call = function (self, x) { + return x; + }; + Interface.prototype.apply = function (self, args) { + return args[0]; + }; + return Interface; + }(); + Runtime.Interface = Interface; + function setDefaultProperties(cls) { + defineNonEnumerableProperty(cls.dynamicPrototype, Multiname.getPublicQualifiedName('constructor'), cls); + defineReadOnlyProperty(cls.traitsPrototype, 'class', cls); + defineReadOnlyProperty(cls.instanceConstructor, 'class', cls); + } + Runtime.setDefaultProperties = setDefaultProperties; + var Class = function () { + function Class(name, instanceConstructor, callable) { + this.debugName = name; + if (instanceConstructor) { + true; + this.instanceConstructor = instanceConstructor; + this.instanceConstructorNoInitialize = instanceConstructor; + this.hasInitialize = 0; + this.instanceConstructor.class = this; + } + if (!callable) { + callable = Shumway.AVM2.Runtime.ApplicationDomain.coerceCallable(this); + } else if (callable === Shumway.AVM2.Runtime.ApplicationDomain.coerceCallable) { + callable = Shumway.AVM2.Runtime.ApplicationDomain.coerceCallable(this); + } + defineNonEnumerableProperty(this, 'call', callable.call); + defineNonEnumerableProperty(this, 'apply', callable.apply); + } + Class.createClass = function (classInfo, baseClass, scope) { + var ci = classInfo; + var ii = ci.instanceInfo; + var domain = ci.abc.applicationDomain; + var className = Multiname.getName(ii.name); + var isNativeClass = ci.native; + if (isNativeClass) { + var buildClass = getNative(ci.native.cls); + if (!buildClass) { + Shumway.Debug.unexpected('No native for ' + ci.native.cls); + } + if (!baseClass) { + scope = new Scope(scope, Class); + } + } + var classScope = new Scope(scope, null); + var instanceConstructor = createFunction(ii.init, classScope, false); + var cls; + if (isNativeClass) { + cls = buildClass(domain, classScope, instanceConstructor, baseClass); + } else { + cls = new Class(className, instanceConstructor); + } + cls.className = className; + cls.classInfo = classInfo; + cls.scope = classScope; + classScope.object = cls; + var classNatives; + var instanceNatives; + if (isNativeClass) { + if (cls.native) { + classNatives = cls.native.static; + instanceNatives = cls.native.instance; + } + } else { + cls.extend(baseClass); + } + cls.classBindings = new ClassBindings(classInfo, classScope, classNatives); + cls.classBindings.applyTo(domain, cls); + defineReadOnlyProperty(cls, Shumway.AVM2.Runtime.VM_IS_CLASS, true); + cls.instanceBindings = new InstanceBindings(baseClass ? baseClass.instanceBindings : null, ii, classScope, instanceNatives); + if (cls.instanceConstructor) { + cls.instanceBindings.applyTo(domain, cls.traitsPrototype); + } + cls.implementedInterfaces = cls.instanceBindings.implementedInterfaces; + return cls; + }; + Class.prototype.setSymbol = function (props) { + this.instanceConstructor.prototype.symbol = props; + }; + Class.prototype.getSymbol = function () { + return this.instanceConstructor.prototype.symbol; + }; + Class.prototype.initializeInstance = function (obj) { + var c = this; + var initializes = []; + while (c) { + if (c.hasInitialize & Class.OWN_INITIALIZE) { + initializes.push(c.instanceConstructor.prototype.initialize); + } + c = c.baseClass; + } + var s; + while (s = initializes.pop()) { + s.call(obj); + } + Counter.count('Initialize Instance ' + obj.class); + }; + Class.prototype.createInstance = function (args) { + var o = Object.create(this.instanceConstructor.prototype); + this.instanceConstructor.apply(o, args); + return o; + }; + Class.prototype.createAsSymbol = function (props) { + var o = Object.create(this.instanceConstructor.prototype); + if (o.symbol) { + var symbol = Object.create(o.symbol); + for (var prop in props) { + symbol[prop] = props[prop]; + } + o.symbol = symbol; + } else { + o.symbol = props; + } + return o; + }; + Class.prototype.extendNative = function (baseClass, native) { + this.baseClass = baseClass; + this.dynamicPrototype = Object.getPrototypeOf(native.prototype); + this.instanceConstructor.prototype = this.traitsPrototype = native.prototype; + setDefaultProperties(this); + }; + Class.prototype.extendWrapper = function (baseClass, wrapper) { + true; + this.baseClass = baseClass; + this.dynamicPrototype = Object.create(baseClass.dynamicPrototype); + var traitsPrototype = Object.create(this.dynamicPrototype, Shumway.ObjectUtilities.getOwnPropertyDescriptors(wrapper.prototype)); + this.instanceConstructor.prototype = this.traitsPrototype = traitsPrototype; + setDefaultProperties(this); + }; + Class.prototype.extendBuiltin = function (baseClass) { + true; + this.baseClass = baseClass; + this.dynamicPrototype = this.traitsPrototype = this.instanceConstructor.prototype; + setDefaultProperties(this); + }; + Class.prototype.extend = function (baseClass) { + true; + this.baseClass = baseClass; + this.dynamicPrototype = Object.create(baseClass.dynamicPrototype); + if (baseClass.hasInitialize) { + var instanceConstructorNoInitialize = this.instanceConstructor; + var self = this; + this.instanceConstructor = function () { + self.initializeInstance(this); + instanceConstructorNoInitialize.apply(this, arguments); + }; + defineReadOnlyProperty(this.instanceConstructor, 'class', instanceConstructorNoInitialize.class); + this.hasInitialize |= Class.SUPER_INITIALIZE; + } + this.instanceConstructor.prototype = this.traitsPrototype = Object.create(this.dynamicPrototype); + setDefaultProperties(this); + }; + Class.prototype.setDefaultProperties = function () { + setDefaultProperties(this); + }; + Class.prototype.link = function (definition) { + true; + true; + if (definition.initialize) { + if (!this.hasInitialize) { + var instanceConstructorNoInitialize = this.instanceConstructor; + var self = this; + this.instanceConstructor = function () { + self.initializeInstance(this); + instanceConstructorNoInitialize.apply(this, arguments); + }; + defineReadOnlyProperty(this.instanceConstructor, 'class', instanceConstructorNoInitialize.class); + this.instanceConstructor.prototype = instanceConstructorNoInitialize.prototype; + } + this.hasInitialize |= Class.OWN_INITIALIZE; + } + var dynamicPrototype = this.dynamicPrototype; + var keys = Object.keys(definition); + for (var i = 0; i < keys.length; i++) { + var propertyName = keys[i]; + Object.defineProperty(dynamicPrototype, propertyName, Object.getOwnPropertyDescriptor(definition, propertyName)); + } + function glueProperties(obj, properties) { + var keys = Object.keys(properties); + for (var i = 0; i < keys.length; i++) { + var propertyName = keys[i]; + var propertyGlue = properties[propertyName]; + var propertySimpleName; + var glueOpenMethod = false; + if (propertyGlue.indexOf('open ') >= 0) { + propertySimpleName = propertyGlue.substring(5); + glueOpenMethod = true; + } else { + propertySimpleName = propertyGlue; + } + true; + var qn = Multiname.getQualifiedName(Multiname.fromSimpleName(propertySimpleName)); + if (glueOpenMethod) { + qn = Shumway.AVM2.Runtime.VM_OPEN_METHOD_PREFIX + qn; + } + true; + var descriptor = Object.getOwnPropertyDescriptor(obj, qn); + if (descriptor && descriptor.get) { + Object.defineProperty(obj, propertyName, descriptor); + } else { + Object.defineProperty(obj, propertyName, { + get: new Function('', 'return this.' + qn), + set: new Function('v', 'this.' + qn + ' = v') + }); + } + } + } + function generatePropertiesFromTraits(traits) { + var properties = createEmptyObject(); + traits.forEach(function (trait) { + var ns = trait.name.getNamespace(); + if (!ns.isPublic()) { + return; + } + properties[trait.name.getName()] = (trait.isMethod() ? 'open ' : '') + 'public ' + trait.name.getName(); + }); + return properties; + } + var glue = definition.__glue__; + if (!glue) { return; } - properties[trait.name.getName()] = (trait.isMethod() ? 'open ' : '') + 'public ' + trait.name.getName(); - }); - return properties; - } - var glue = definition.__glue__; - if (!glue) { - return; - } - if (glue.script) { - if (glue.script.instance) { - if (isNumber(glue.script.instance)) { - true; - glueProperties(dynamicPrototype, generatePropertiesFromTraits(this.classInfo.instanceInfo.traits)); - } else { - glueProperties(dynamicPrototype, glue.script.instance); - } - } - if (glue.script.static) { - if (isNumber(glue.script.static)) { - true; - glueProperties(this, generatePropertiesFromTraits(this.classInfo.traits)); - } else { - glueProperties(this, glue.script.static); - } - } - } - }, - linkNatives: function (definition) { - var glue = definition.__glue__; - this.native = glue.native; - }, - verify: function () { - var instanceConstructor = this.instanceConstructor; - var tP = this.traitsPrototype; - var dP = this.dynamicPrototype; - true; - true; - true; - true; - if (tP !== Object.prototype) { - } - true; - }, - coerce: function (value) { - return value; - }, - isInstanceOf: function (value) { - return this.isInstance(value); - }, - isInstance: function (value) { - if (value === null || typeof value !== 'object') { - return false; - } - return this.dynamicPrototype.isPrototypeOf(value); - }, - trace: function trace(writer) { - var description = this.debugName + (this.baseClass ? ' extends ' + this.baseClass.debugName : ''); - writer.enter('class ' + description + ' {'); - writer.writeLn('scope: ' + this.scope); - writer.writeLn('baseClass: ' + this.baseClass); - writer.writeLn('classInfo: ' + this.classInfo); - writer.writeLn('dynamicPrototype: ' + this.dynamicPrototype); - writer.writeLn('traitsPrototype: ' + this.traitsPrototype); - writer.writeLn('dynamicPrototype === traitsPrototype: ' + (this.dynamicPrototype === this.traitsPrototype)); - writer.writeLn('instanceConstructor: ' + this.instanceConstructor); - writer.writeLn('instanceConstructorNoInitialize: ' + this.instanceConstructorNoInitialize); - writer.writeLn('instanceConstructor === instanceConstructorNoInitialize: ' + (this.instanceConstructor === this.instanceConstructorNoInitialize)); - var traitsPrototype = this.traitsPrototype; - writer.enter('traitsPrototype: '); - if (traitsPrototype) { - writer.enter('VM_SLOTS: '); - writer.writeArray(traitsPrototype[VM_SLOTS].byID.map(function (slot) { - return slot.trait; - })); - writer.outdent(); - writer.enter('VM_BINDINGS: '); - writer.writeArray(traitsPrototype[VM_BINDINGS].map(function (binding) { - var pd = Object.getOwnPropertyDescriptor(traitsPrototype, binding); - var str = binding; - if (pd.get || pd.set) { - if (pd.get) { - str += ' getter: ' + debugName(pd.get); + if (glue.script) { + if (glue.script.instance) { + if (Shumway.isNumber(glue.script.instance)) { + true; + glueProperties(dynamicPrototype, generatePropertiesFromTraits(this.classInfo.instanceInfo.traits)); + } else { + glueProperties(dynamicPrototype, glue.script.instance); + } } - if (pd.set) { - str += ' setter: ' + debugName(pd.set); + if (glue.script.static) { + if (Shumway.isNumber(glue.script.static)) { + true; + glueProperties(this, generatePropertiesFromTraits(this.classInfo.traits)); + } else { + glueProperties(this, glue.script.static); + } } - } else { - str += ' value: ' + debugName(pd.value); } - return str; - })); - writer.outdent(); - writer.enter('VM_OPEN_METHODS: '); - writer.writeArray(toKeyValueArray(traitsPrototype[VM_OPEN_METHODS]).map(function (pair) { - return pair[0] + ': ' + debugName(pair[1]); - })); - writer.outdent(); - } - writer.enter('classBindings: '); - this.classBindings.trace(writer); - writer.outdent(); - writer.enter('instanceBindings: '); - this.instanceBindings.trace(writer); - writer.outdent(); - writer.outdent(); - writer.writeLn('call: ' + this.call); - writer.writeLn('apply: ' + this.apply); - writer.leave('}'); - }, - toString: function () { - return '[class ' + this.classInfo.instanceInfo.name.name + ']'; - } - }; - var callable = ApplicationDomain.coerceCallable(Class); - defineNonEnumerableProperty(Class, 'call', callable.call); - defineNonEnumerableProperty(Class, 'apply', callable.apply); - Class.instanceConstructor = Class; - Class.toString = Class.prototype.toString; - Class.native = { - instance: { - prototype: { - get: function () { - return this.dynamicPrototype; + }; + Class.prototype.linkNatives = function (definition) { + var glue = definition.__glue__; + this.native = glue.native; + }; + Class.prototype.verify = function () { + var instanceConstructor = this.instanceConstructor; + var tP = this.traitsPrototype; + var dP = this.dynamicPrototype; + true; + true; + true; + true; + if (tP !== Object.prototype) { + } + true; + }; + Class.prototype.coerce = function (value) { + return value; + }; + Class.prototype.isInstanceOf = function (value) { + return this.isInstance(value); + }; + Class.prototype.isInstance = function (value) { + if (value === null || typeof value !== 'object') { + return false; + } + return this.dynamicPrototype.isPrototypeOf(value); + }; + Class.prototype.trace = function (writer) { + var description = this.debugName + (this.baseClass ? ' extends ' + this.baseClass.debugName : ''); + writer.enter('class ' + description + ' {'); + writer.writeLn('scope: ' + this.scope); + writer.writeLn('baseClass: ' + this.baseClass); + writer.writeLn('classInfo: ' + this.classInfo); + writer.writeLn('dynamicPrototype: ' + this.dynamicPrototype); + writer.writeLn('traitsPrototype: ' + this.traitsPrototype); + writer.writeLn('dynamicPrototype === traitsPrototype: ' + (this.dynamicPrototype === this.traitsPrototype)); + writer.writeLn('instanceConstructor: ' + this.instanceConstructor); + writer.writeLn('instanceConstructorNoInitialize: ' + this.instanceConstructorNoInitialize); + writer.writeLn('instanceConstructor === instanceConstructorNoInitialize: ' + (this.instanceConstructor === this.instanceConstructorNoInitialize)); + var traitsPrototype = this.traitsPrototype; + writer.enter('traitsPrototype: '); + if (traitsPrototype) { + writer.enter('VM_SLOTS: '); + writer.writeArray(traitsPrototype.asSlots.byID.map(function (slot) { + return slot.trait; + })); + writer.outdent(); + writer.enter('VM_BINDINGS: '); + writer.writeArray(traitsPrototype.asBindings.map(function (binding) { + var pd = Object.getOwnPropertyDescriptor(traitsPrototype, binding); + var str = binding; + if (pd.get || pd.set) { + if (pd.get) { + str += ' getter: ' + debugName(pd.get); + } + if (pd.set) { + str += ' setter: ' + debugName(pd.set); + } + } else { + str += ' value: ' + debugName(pd.value); + } + return str; + })); + writer.outdent(); + writer.enter('VM_OPEN_METHODS: '); + writer.writeArray(toKeyValueArray(traitsPrototype.asOpenMethods).map(function (pair) { + return pair[0] + ': ' + debugName(pair[1]); + })); + writer.outdent(); + } + writer.enter('classBindings: '); + this.classBindings.trace(writer); + writer.outdent(); + writer.enter('instanceBindings: '); + this.instanceBindings.trace(writer); + writer.outdent(); + writer.outdent(); + writer.writeLn('call: ' + this.call); + writer.writeLn('apply: ' + this.apply); + writer.leave('}'); + }; + Class.prototype.toString = function () { + return '[class ' + this.classInfo.instanceInfo.name.name + ']'; + }; + Class.OWN_INITIALIZE = 1; + Class.SUPER_INITIALIZE = 2; + return Class; + }(); + Runtime.Class = Class; + var callable = Shumway.AVM2.Runtime.ApplicationDomain.coerceCallable(Class); + defineNonEnumerableProperty(Class, 'call', callable.call); + defineNonEnumerableProperty(Class, 'apply', callable.apply); + Class.instanceConstructor = Class; + Class.toString = Class.prototype.toString; + Class.native = { + instance: { + prototype: { + get: function () { + return this.dynamicPrototype; + } } } - } - }; - return Class; - }(); -function MethodClosure($this, fn) { - var bound = bindSafely(fn, $this); - defineNonEnumerableProperty(this, 'call', bound.call.bind(bound)); - defineNonEnumerableProperty(this, 'apply', bound.apply.bind(bound)); -} -MethodClosure.prototype = { - toString: function () { - return 'function Function() {}'; - } -}; + }; + }(AVM2.Runtime || (AVM2.Runtime = {}))); + var Runtime = AVM2.Runtime; + }(Shumway.AVM2 || (Shumway.AVM2 = {}))); + var AVM2 = Shumway.AVM2; +}(Shumway || (Shumway = {}))); +var Interface = Shumway.AVM2.Runtime.Interface; +var Class = Shumway.AVM2.Runtime.Class; +var Binding = Shumway.AVM2.Runtime.Binding; +var Bindings = Shumway.AVM2.Runtime.Bindings; +var ActivationBindings = Shumway.AVM2.Runtime.ActivationBindings; +var CatchBindings = Shumway.AVM2.Runtime.CatchBindings; +var ScriptBindings = Shumway.AVM2.Runtime.ScriptBindings; +var ClassBindings = Shumway.AVM2.Runtime.ClassBindings; +var InstanceBindings = Shumway.AVM2.Runtime.InstanceBindings; +var Interface = Shumway.AVM2.Runtime.Interface; +var Class = Shumway.AVM2.Runtime.Class; var XRegExp = function (undefined) { var REGEX_DATA = 'xregexp', self, features = { astral: false, @@ -26109,95 +27843,1532 @@ var XRegExp = function (undefined) { }); return self; }(); -var runtimeOptions = systemOptions.register(new OptionSet('Runtime Options')); -var traceScope = runtimeOptions.register(new Option('ts', 'traceScope', 'boolean', false, 'trace scope execution')); -var traceExecution = runtimeOptions.register(new Option('tx', 'traceExecution', 'number', 0, 'trace script execution')); -var traceCallExecution = runtimeOptions.register(new Option('txc', 'traceCallExecution', 'number', 0, 'trace call execution')); -var functionBreak = runtimeOptions.register(new Option('fb', 'functionBreak', 'number', -1, 'Inserts a debugBreak at function index #.')); -var compileOnly = runtimeOptions.register(new Option('co', 'compileOnly', 'number', -1, 'Compiles only function number.')); -var compileUntil = runtimeOptions.register(new Option('cu', 'compileUntil', 'number', -1, 'Compiles only until a function number.')); -var debuggerMode = runtimeOptions.register(new Option('dm', 'debuggerMode', 'boolean', false, 'matches avm2 debugger build semantics')); -var enableVerifier = runtimeOptions.register(new Option('verify', 'verify', 'boolean', false, 'Enable verifier.')); -var globalMultinameAnalysis = runtimeOptions.register(new Option('ga', 'globalMultinameAnalysis', 'boolean', false, 'Global multiname analysis.')); -var traceInlineCaching = runtimeOptions.register(new Option('tic', 'traceInlineCaching', 'boolean', false, 'Trace inline caching execution.')); -var compilerEnableExceptions = runtimeOptions.register(new Option('cex', 'exceptions', 'boolean', false, 'Compile functions with catch blocks.')); -var compilerMaximumMethodSize = runtimeOptions.register(new Option('cmms', 'maximumMethodSize', 'number', 4 * 1024, 'Compiler maximum method size.')); -var jsGlobal = function () { - return this || (1, eval)('this'); - }(); -var VM_SLOTS = 'vm slots'; -var VM_LENGTH = 'vm length'; -var VM_BINDINGS = 'vm bindings'; -var VM_NATIVE_PROTOTYPE_FLAG = 'vm native prototype'; -var VM_OPEN_METHODS = 'vm open methods'; -var VM_IS_CLASS = 'vm is class'; -var VM_OPEN_METHOD_PREFIX = 'method_'; -var VM_OPEN_SET_METHOD_PREFIX = 'set_'; -var VM_OPEN_GET_METHOD_PREFIX = 'get_'; -var VM_NATIVE_BUILTIN_SURROGATES = [ - { - object: Object, - methods: [ - 'toString', - 'valueOf' - ] - }, - { - object: Function, - methods: [ - 'toString', - 'valueOf' - ] - } - ]; -var VM_NATIVE_BUILTIN_ORIGINALS = 'vm originals'; +var Namespace = Shumway.AVM2.ABC.Namespace; +var Shumway; +(function (Shumway) { + (function (AVM2) { + (function (Runtime) { + var Option = Shumway.Options.Option; + var OptionSet = Shumway.Options.OptionSet; + var runtimeOptions = systemOptions.register(new OptionSet('Runtime Options')); + var traceScope = runtimeOptions.register(new Option('ts', 'traceScope', 'boolean', false, 'trace scope execution')); + Runtime.traceExecution = runtimeOptions.register(new Option('tx', 'traceExecution', 'number', 0, 'trace script execution')); + Runtime.traceCallExecution = runtimeOptions.register(new Option('txc', 'traceCallExecution', 'number', 0, 'trace call execution')); + var functionBreak = runtimeOptions.register(new Option('fb', 'functionBreak', 'number', -1, 'Inserts a debugBreak at function index #.')); + var compileOnly = runtimeOptions.register(new Option('co', 'compileOnly', 'number', -1, 'Compiles only function number.')); + var compileUntil = runtimeOptions.register(new Option('cu', 'compileUntil', 'number', -1, 'Compiles only until a function number.')); + Runtime.debuggerMode = runtimeOptions.register(new Option('dm', 'debuggerMode', 'boolean', false, 'matches avm2 debugger build semantics')); + Runtime.enableVerifier = runtimeOptions.register(new Option('verify', 'verify', 'boolean', false, 'Enable verifier.')); + Runtime.globalMultinameAnalysis = runtimeOptions.register(new Option('ga', 'globalMultinameAnalysis', 'boolean', false, 'Global multiname analysis.')); + var traceInlineCaching = runtimeOptions.register(new Option('tic', 'traceInlineCaching', 'boolean', false, 'Trace inline caching execution.')); + Runtime.codeCaching = runtimeOptions.register(new Option('cc', 'codeCaching', 'boolean', false, 'Enable code caching.')); + var compilerEnableExceptions = runtimeOptions.register(new Option('cex', 'exceptions', 'boolean', false, 'Compile functions with catch blocks.')); + var compilerMaximumMethodSize = runtimeOptions.register(new Option('cmms', 'maximumMethodSize', 'number', 4 * 1024, 'Compiler maximum method size.')); + Runtime.traceClasses = runtimeOptions.register(new Option('tc', 'traceClasses', 'boolean', false, 'trace class creation')); + Runtime.traceDomain = runtimeOptions.register(new Option('td', 'traceDomain', 'boolean', false, 'trace domain property access')); + Runtime.sealConstTraits = false; + Runtime.useAsAdd = true; + var useSurrogates = true; + var callCounter = new Shumway.Metrics.Counter(true); + var Multiname = Shumway.AVM2.ABC.Multiname; + var Namespace = Shumway.AVM2.ABC.Namespace; + var MethodInfo = Shumway.AVM2.ABC.MethodInfo; + var ClassInfo = Shumway.AVM2.ABC.ClassInfo; + var InstanceInfo = Shumway.AVM2.ABC.InstanceInfo; + var ScriptInfo = Shumway.AVM2.ABC.ScriptInfo; + var SORT = Shumway.AVM2.ABC.SORT; + var Trait = Shumway.AVM2.ABC.Trait; + var IndentingWriter = Shumway.IndentingWriter; + var hasOwnProperty = Shumway.ObjectUtilities.hasOwnProperty; + var createMap = Shumway.ObjectUtilities.createMap; + var cloneObject = Shumway.ObjectUtilities.cloneObject; + var copyProperties = Shumway.ObjectUtilities.copyProperties; + var createEmptyObject = Shumway.ObjectUtilities.createEmptyObject; + var boxValue = Shumway.ObjectUtilities.boxValue; + var bindSafely = Shumway.FunctionUtilities.bindSafely; + var defineNonEnumerableGetterOrSetter = Shumway.ObjectUtilities.defineNonEnumerableGetterOrSetter; + var defineNonEnumerableProperty = Shumway.ObjectUtilities.defineNonEnumerableProperty; + var defineReadOnlyProperty = Shumway.ObjectUtilities.defineReadOnlyProperty; + var defineNonEnumerableGetter = Shumway.ObjectUtilities.defineNonEnumerableGetter; + var makeForwardingGetter = Shumway.FunctionUtilities.makeForwardingGetter; + var makeForwardingSetter = Shumway.FunctionUtilities.makeForwardingSetter; + var toSafeString = Shumway.StringUtilities.toSafeString; + var toSafeArrayString = Shumway.StringUtilities.toSafeArrayString; + var TRAIT = Shumway.AVM2.ABC.TRAIT; + Runtime.VM_SLOTS = 'asSlots'; + Runtime.VM_LENGTH = 'asLength'; + Runtime.VM_BINDINGS = 'asBindings'; + Runtime.VM_NATIVE_PROTOTYPE_FLAG = 'asIsNative'; + Runtime.VM_OPEN_METHODS = 'asOpenMethods'; + Runtime.VM_IS_CLASS = 'asIsClass'; + Runtime.VM_IS_PROXY = 'asIsProxy'; + Runtime.VM_CALL_PROXY = 'asCallProxy'; + Runtime.VM_OPEN_METHOD_PREFIX = 'm'; + Runtime.VM_MEMOIZER_PREFIX = 'z'; + Runtime.VM_OPEN_SET_METHOD_PREFIX = 's'; + Runtime.VM_OPEN_GET_METHOD_PREFIX = 'g'; + Runtime.VM_NATIVE_BUILTIN_ORIGINALS = 'asOriginals'; + Runtime.VM_METHOD_OVERRIDES = createEmptyObject(); + var vmNextInterpreterFunctionId = 1; + var vmNextCompiledFunctionId = 1; + var totalFunctionCount = 0; + var compiledFunctionCount = 0; + var compilationCount = 0; + function isClass(object) { + true; + return Object.hasOwnProperty.call(object, Runtime.VM_IS_CLASS); + } + Runtime.isClass = isClass; + function isNativePrototype(object) { + return Object.prototype.hasOwnProperty.call(object, Runtime.VM_NATIVE_PROTOTYPE_FLAG); + } + Runtime.isNativePrototype = isNativePrototype; + var traitsWriter = null; + var callWriter = null; + function patch(patchTargets, value) { + true; + for (var i = 0; i < patchTargets.length; i++) { + var patchTarget = patchTargets[i]; + if (Runtime.traceExecution.value >= 3) { + var str = 'Patching: '; + if (patchTarget.name) { + str += patchTarget.name; + } else if (patchTarget.get) { + str += 'get ' + patchTarget.get; + } else if (patchTarget.set) { + str += 'set ' + patchTarget.set; + } + traitsWriter && traitsWriter.redLn(str); + } + if (patchTarget.get) { + defineNonEnumerableGetterOrSetter(patchTarget.object, patchTarget.get, value, true); + } else if (patchTarget.set) { + defineNonEnumerableGetterOrSetter(patchTarget.object, patchTarget.set, value, false); + } else { + defineNonEnumerableProperty(patchTarget.object, patchTarget.name, value); + } + } + } + Runtime.patch = patch; + function applyNonMemoizedMethodTrait(qn, trait, object, scope, natives) { + true; + if (trait.isMethod()) { + var trampoline = Shumway.AVM2.Runtime.makeTrampoline(function (self) { + var fn = getTraitFunction(trait, scope, natives); + patch(self.patchTargets, fn); + return fn; + }, trait.methodInfo.parameters.length); + trampoline.patchTargets = [ + { + object: object, + name: qn + }, + { + object: object, + name: Runtime.VM_OPEN_METHOD_PREFIX + qn + } + ]; + var closure = bindSafely(trampoline, object); + defineReadOnlyProperty(closure, Runtime.VM_LENGTH, trampoline.asLength); + defineReadOnlyProperty(closure, Multiname.getPublicQualifiedName('prototype'), null); + defineNonEnumerableProperty(object, qn, closure); + defineNonEnumerableProperty(object, Runtime.VM_OPEN_METHOD_PREFIX + qn, closure); + } else if (trait.isGetter() || trait.isSetter()) { + var trampoline = Shumway.AVM2.Runtime.makeTrampoline(function (self) { + var fn = getTraitFunction(trait, scope, natives); + patch(self.patchTargets, fn); + return fn; + }, trait.isSetter() ? 1 : 0); + if (trait.isGetter()) { + trampoline.patchTargets = [ + { + object: object, + get: qn + } + ]; + } else { + trampoline.patchTargets = [ + { + object: object, + set: qn + } + ]; + } + defineNonEnumerableGetterOrSetter(object, qn, trampoline, trait.isGetter()); + } else { + Shumway.Debug.unexpected(trait); + } + } + Runtime.applyNonMemoizedMethodTrait = applyNonMemoizedMethodTrait; + function applyMemoizedMethodTrait(qn, trait, object, scope, natives) { + true; + if (trait.isMethod()) { + var memoizerTarget = { + value: null + }; + var trampoline = Shumway.AVM2.Runtime.makeTrampoline(function (self) { + var fn = getTraitFunction(trait, scope, natives); + patch(self.patchTargets, fn); + return fn; + }, trait.methodInfo.parameters.length, String(trait.name)); + memoizerTarget.value = trampoline; + var openMethods = object.asOpenMethods; + openMethods[qn] = trampoline; + defineNonEnumerableProperty(object, Runtime.VM_OPEN_METHOD_PREFIX + qn, trampoline); + defineNonEnumerableGetter(object, qn, Shumway.AVM2.Runtime.makeMemoizer(qn, memoizerTarget)); + trampoline.patchTargets = [ + { + object: memoizerTarget, + name: 'value' + }, + { + object: openMethods, + name: qn + }, + { + object: object, + name: Runtime.VM_OPEN_METHOD_PREFIX + qn + } + ]; + } else if (trait.isGetter() || trait.isSetter()) { + var trampoline = Shumway.AVM2.Runtime.makeTrampoline(function (self) { + var fn = getTraitFunction(trait, scope, natives); + patch(self.patchTargets, fn); + return fn; + }, 0, String(trait.name)); + if (trait.isGetter()) { + defineNonEnumerableProperty(object, Runtime.VM_OPEN_GET_METHOD_PREFIX + qn, trampoline); + trampoline.patchTargets = [ + { + object: object, + get: qn + }, + { + object: object, + name: Runtime.VM_OPEN_GET_METHOD_PREFIX + qn + } + ]; + } else { + defineNonEnumerableProperty(object, Runtime.VM_OPEN_SET_METHOD_PREFIX + qn, trampoline); + trampoline.patchTargets = [ + { + object: object, + set: qn + }, + { + object: object, + name: Runtime.VM_OPEN_SET_METHOD_PREFIX + qn + } + ]; + } + defineNonEnumerableGetterOrSetter(object, qn, trampoline, trait.isGetter()); + } + } + Runtime.applyMemoizedMethodTrait = applyMemoizedMethodTrait; + function getNamespaceResolutionMap(namespaces) { + var self = this; + var map = self.resolutionMap[namespaces.runtimeId]; + if (map) + return map; + map = self.resolutionMap[namespaces.runtimeId] = Shumway.ObjectUtilities.createMap(); + var bindings = self.bindings; + for (var key in bindings.map) { + var multiname = key; + var trait = bindings.map[key].trait; + if (trait.isGetter() || trait.isSetter()) { + multiname = multiname.substring(Shumway.AVM2.Runtime.Binding.KEY_PREFIX_LENGTH); + } + multiname = Multiname.fromQualifiedName(multiname); + if (multiname.getNamespace().inNamespaceSet(namespaces)) { + map[multiname.getName()] = Multiname.getQualifiedName(trait.name); + } + } + return map; + } + Runtime.getNamespaceResolutionMap = getNamespaceResolutionMap; + function resolveMultinameProperty(namespaces, name, flags) { + var self = this; + if (typeof name === 'object') { + name = String(name); + } + if (Shumway.isNumeric(name)) { + return Shumway.toNumber(name); + } + if (!namespaces) { + return Multiname.getPublicQualifiedName(name); + } + if (namespaces.length > 1) { + var resolved = self.getNamespaceResolutionMap(namespaces)[name]; + if (resolved) + return resolved; + return Multiname.getPublicQualifiedName(name); + } else { + return Multiname.qualifyName(namespaces[0], name); + } + } + Runtime.resolveMultinameProperty = resolveMultinameProperty; + function asGetPublicProperty(name) { + var self = this; + return self.asGetProperty(undefined, name, 0); + } + Runtime.asGetPublicProperty = asGetPublicProperty; + function asGetProperty(namespaces, name, flags) { + var self = this; + var resolved = self.resolveMultinameProperty(namespaces, name, flags); + if (self.asGetNumericProperty && Multiname.isNumeric(resolved)) { + return self.asGetNumericProperty(resolved); + } + return self[resolved]; + } + Runtime.asGetProperty = asGetProperty; + function asGetPropertyLikelyNumeric(namespaces, name, flags) { + var self = this; + if (typeof name === 'number') { + return self.asGetNumericProperty(name); + } + return asGetProperty.call(self, namespaces, name, flags); + } + Runtime.asGetPropertyLikelyNumeric = asGetPropertyLikelyNumeric; + function asGetResolvedStringProperty(resolved) { + true; + return this[resolved]; + } + Runtime.asGetResolvedStringProperty = asGetResolvedStringProperty; + function asCallResolvedStringProperty(resolved, isLex, args) { + var self = this; + var receiver = isLex ? null : this; + var openMethods = self.asOpenMethods; + var method; + if (receiver && openMethods && openMethods[resolved]) { + method = openMethods[resolved]; + } else { + method = self[resolved]; + } + return method.apply(receiver, args); + } + Runtime.asCallResolvedStringProperty = asCallResolvedStringProperty; + function asGetResolvedStringPropertyFallback(resolved) { + var self = this; + var name = Multiname.getNameFromPublicQualifiedName(resolved); + return self.asGetProperty([ + Namespace.PUBLIC + ], name, 0); + } + Runtime.asGetResolvedStringPropertyFallback = asGetResolvedStringPropertyFallback; + function asSetPublicProperty(name, value) { + var self = this; + return self.asSetProperty(undefined, name, 0, value); + } + Runtime.asSetPublicProperty = asSetPublicProperty; + function asSetProperty(namespaces, name, flags, value) { + var self = this; + if (typeof name === 'object') { + name = String(name); + } + var resolved = self.resolveMultinameProperty(namespaces, name, flags); + if (self.asSetNumericProperty && Multiname.isNumeric(resolved)) { + return self.asSetNumericProperty(resolved, value); + } + var slotInfo = self.asSlots.byQN[resolved]; + if (slotInfo) { + if (slotInfo.isConst) { + } + var type = slotInfo.type; + if (type && type.coerce) { + value = type.coerce(value); + } + } + self[resolved] = value; + } + Runtime.asSetProperty = asSetProperty; + function asSetPropertyLikelyNumeric(namespaces, name, flags, value) { + var self = this; + if (typeof name === 'number') { + self.asSetNumericProperty(name, value); + return; + } + return asSetProperty.call(self, namespaces, name, flags, value); + } + Runtime.asSetPropertyLikelyNumeric = asSetPropertyLikelyNumeric; + function asDefinePublicProperty(name, descriptor) { + var self = this; + return self.asDefineProperty(undefined, name, 0, descriptor); + } + Runtime.asDefinePublicProperty = asDefinePublicProperty; + function asDefineProperty(namespaces, name, flags, descriptor) { + var self = this; + if (typeof name === 'object') { + name = String(name); + } + var resolved = self.resolveMultinameProperty(namespaces, name, flags); + Object.defineProperty(self, resolved, descriptor); + } + Runtime.asDefineProperty = asDefineProperty; + function asCallPublicProperty(name, args) { + var self = this; + return self.asCallProperty(undefined, name, 0, false, args); + } + Runtime.asCallPublicProperty = asCallPublicProperty; + function asCallProperty(namespaces, name, flags, isLex, args) { + var self = this; + if (Runtime.traceCallExecution.value) { + var receiverClassName = self.class ? self.class.className + ' ' : ''; + callWriter.enter('call ' + receiverClassName + name + '(' + toSafeArrayString(args) + ') #' + callCounter.count(name)); + } + var receiver = isLex ? null : self; + var result; + if (isProxyObject(self)) { + result = self[Runtime.VM_CALL_PROXY](new Multiname(namespaces, name, flags), receiver, args); + } else { + var method; + var resolved = self.resolveMultinameProperty(namespaces, name, flags); + if (self.asGetNumericProperty && Multiname.isNumeric(resolved)) { + method = self.asGetNumericProperty(resolved); + } else { + var openMethods = self.asOpenMethods; + if (receiver && openMethods && openMethods[resolved]) { + method = openMethods[resolved]; + } else { + method = self[resolved]; + } + } + result = method.apply(receiver, args); + } + Runtime.traceCallExecution.value > 0 && callWriter.leave('return ' + toSafeString(result)); + return result; + } + Runtime.asCallProperty = asCallProperty; + function asCallSuper(scope, namespaces, name, flags, args) { + var self = this; + if (Runtime.traceCallExecution.value) { + var receiverClassName = self.class ? self.class.className + ' ' : ''; + callWriter.enter('call super ' + receiverClassName + name + '(' + toSafeArrayString(args) + ') #' + callCounter.count(name)); + } + var baseClass = scope.object.baseClass; + var resolved = baseClass.traitsPrototype.resolveMultinameProperty(namespaces, name, flags); + var openMethods = baseClass.traitsPrototype.asOpenMethods; + var method = openMethods[resolved]; + var result = method.apply(this, args); + Runtime.traceCallExecution.value > 0 && callWriter.leave('return ' + toSafeString(result)); + return result; + } + Runtime.asCallSuper = asCallSuper; + function asSetSuper(scope, namespaces, name, flags, value) { + var self = this; + if (Runtime.traceCallExecution.value) { + var receiverClassName = self.class ? self.class.className + ' ' : ''; + callWriter.enter('set super ' + receiverClassName + name + '(' + toSafeString(value) + ') #' + callCounter.count(name)); + } + var baseClass = scope.object.baseClass; + var resolved = baseClass.traitsPrototype.resolveMultinameProperty(namespaces, name, flags); + if (self.asSlots.byQN[resolved]) { + this.asSetProperty(namespaces, name, flags, value); + } else { + baseClass.traitsPrototype[Runtime.VM_OPEN_SET_METHOD_PREFIX + resolved].call(this, value); + } + Runtime.traceCallExecution.value > 0 && callWriter.leave(''); + } + Runtime.asSetSuper = asSetSuper; + function asGetSuper(scope, namespaces, name, flags) { + var self = this; + if (Runtime.traceCallExecution.value) { + var receiver = self.class ? self.class.className + ' ' : ''; + callWriter.enter('get super ' + receiver + name + ' #' + callCounter.count(name)); + } + var baseClass = scope.object.baseClass; + var resolved = baseClass.traitsPrototype.resolveMultinameProperty(namespaces, name, flags); + var result; + if (self.asSlots.byQN[resolved]) { + result = this.asGetProperty(namespaces, name, flags); + } else { + result = baseClass.traitsPrototype[Runtime.VM_OPEN_GET_METHOD_PREFIX + resolved].call(this); + } + Runtime.traceCallExecution.value > 0 && callWriter.leave('return ' + toSafeString(result)); + return result; + } + Runtime.asGetSuper = asGetSuper; + function construct(cls, args) { + if (cls.classInfo) { + var qn = Multiname.getQualifiedName(cls.classInfo.instanceInfo.name); + if (qn === Multiname.String) { + return String.apply(null, args); + } + if (qn === Multiname.Boolean) { + return Boolean.apply(null, args); + } + if (qn === Multiname.Number) { + return Number.apply(null, args); + } + } + var c = cls.instanceConstructor; + var a = args; + switch (args.length) { + case 0: + return new c(); + case 1: + return new c(a[0]); + case 2: + return new c(a[0], a[1]); + case 3: + return new c(a[0], a[1], a[2]); + case 4: + return new c(a[0], a[1], a[2], a[3]); + case 5: + return new c(a[0], a[1], a[2], a[3], a[4]); + case 6: + return new c(a[0], a[1], a[2], a[3], a[4], a[5]); + case 7: + return new c(a[0], a[1], a[2], a[3], a[4], a[5], a[6]); + case 8: + return new c(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]); + case 9: + return new c(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]); + case 10: + return new c(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]); + } + var applyArguments = []; + for (var i = 0; i < args.length; i++) { + applyArguments[i + 1] = args[i]; + } + return new (Function.bind.apply(c, applyArguments))(); + } + Runtime.construct = construct; + function asConstructProperty(namespaces, name, flags, args) { + var self = this; + var constructor = self.asGetProperty(namespaces, name, flags); + if (Runtime.traceCallExecution.value) { + callWriter.enter('construct ' + name + '(' + toSafeArrayString(args) + ') #' + callCounter.count(name)); + } + var result = construct(constructor, args); + Runtime.traceCallExecution.value > 0 && callWriter.leave('return ' + toSafeString(result)); + return result; + } + Runtime.asConstructProperty = asConstructProperty; + function nonProxyingHasProperty(object, name) { + return name in object; + } + Runtime.nonProxyingHasProperty = nonProxyingHasProperty; + function asHasProperty(namespaces, name, flags, nonProxy) { + var self = this; + if (self.hasProperty) { + return self.hasProperty(namespaces, name, flags); + } + if (nonProxy) { + return nonProxyingHasProperty(self, self.resolveMultinameProperty(namespaces, name, flags)); + } else { + return self.resolveMultinameProperty(namespaces, name, flags) in this; + } + } + Runtime.asHasProperty = asHasProperty; + function asDeleteProperty(namespaces, name, flags) { + var self = this; + if (self.asHasTraitProperty(namespaces, name, flags)) { + return false; + } + var resolved = self.resolveMultinameProperty(namespaces, name, flags); + return delete self[resolved]; + } + Runtime.asDeleteProperty = asDeleteProperty; + function asHasTraitProperty(namespaces, name, flags) { + var self = this; + var resolved = self.resolveMultinameProperty(namespaces, name, flags); + return self.asBindings.indexOf(resolved) >= 0; + } + Runtime.asHasTraitProperty = asHasTraitProperty; + function asGetNumericProperty(i) { + return this[i]; + } + Runtime.asGetNumericProperty = asGetNumericProperty; + function asSetNumericProperty(i, v) { + this[i] = v; + } + Runtime.asSetNumericProperty = asSetNumericProperty; + function asGetDescendants(namespaces, name, flags) { + Shumway.Debug.notImplemented('asGetDescendants'); + } + Runtime.asGetDescendants = asGetDescendants; + function asNextNameIndex(index) { + var self = this; + if (index === 0) { + defineNonEnumerableProperty(self, 'asEnumerableKeys', self.asGetEnumerableKeys()); + } + var asEnumerableKeys = self.asEnumerableKeys; + while (index < asEnumerableKeys.length) { + if (self.asHasProperty(undefined, asEnumerableKeys[index], 0)) { + return index + 1; + } + index++; + } + return 0; + } + Runtime.asNextNameIndex = asNextNameIndex; + function asNextName(index) { + var self = this; + var asEnumerableKeys = self.asEnumerableKeys; + true; + return asEnumerableKeys[index - 1]; + } + Runtime.asNextName = asNextName; + function asNextValue(index) { + return this.asGetPublicProperty(this.asNextName(index)); + } + Runtime.asNextValue = asNextValue; + function asGetEnumerableKeys() { + var self = this; + var boxedValue = self.valueOf(); + if (typeof boxedValue === 'string' || typeof boxedValue === 'number') { + return []; + } + var keys = Object.keys(this); + var result = []; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (Shumway.isNumeric(key)) { + result.push(key); + } else { + var name = Multiname.stripPublicQualifier(key); + if (name !== undefined) { + result.push(name); + } + } + } + return result; + } + Runtime.asGetEnumerableKeys = asGetEnumerableKeys; + function asTypeOf(x) { + if (x) { + if (x.constructor === String) { + return 'string'; + } else if (x.constructor === Number) { + return 'number'; + } else if (x.constructor === Boolean) { + return 'boolean'; + } else if (x instanceof XML || x instanceof XMLList) { + return 'xml'; + } + } + return typeof x; + } + Runtime.asTypeOf = asTypeOf; + function publicizeProperties(object) { + var keys = Object.keys(object); + for (var i = 0; i < keys.length; i++) { + var k = keys[i]; + if (!Multiname.isPublicQualifiedName(k)) { + var v = object[k]; + object[Multiname.getPublicQualifiedName(k)] = v; + delete object[k]; + } + } + } + Runtime.publicizeProperties = publicizeProperties; + function asGetSlot(object, index) { + return object[object.asSlots.byID[index].name]; + } + Runtime.asGetSlot = asGetSlot; + function asSetSlot(object, index, value) { + var slotInfo = object.asSlots.byID[index]; + if (slotInfo.const) { + return; + } + var name = slotInfo.name; + var type = slotInfo.type; + if (type && type.coerce) { + object[name] = type.coerce(value); + } else { + object[name] = value; + } + } + Runtime.asSetSlot = asSetSlot; + function throwError(name, error) { + if (true) { + var message = Shumway.AVM2.formatErrorMessage.apply(null, Array.prototype.slice.call(arguments, 1)); + throwErrorFromVM(Shumway.AVM2.Runtime.AVM2.currentDomain(), name, message, error.code); + } else { + throwErrorFromVM(Shumway.AVM2.Runtime.AVM2.currentDomain(), name, Shumway.AVM2.getErrorMessage(error.code), error.code); + } + } + Runtime.throwError = throwError; + function throwErrorFromVM(domain, errorClass, message, id) { + var error = new (domain.getClass(errorClass)).instanceConstructor(message, id); + throw error; + } + Runtime.throwErrorFromVM = throwErrorFromVM; + function translateError(domain, error) { + if (error instanceof Error) { + var type = domain.getClass(error.name); + if (type) { + return new type.instanceConstructor(Shumway.AVM2.translateErrorMessage(error)); + } + Shumway.Debug.unexpected('Can\'t translate error: ' + error); + } + return error; + } + Runtime.translateError = translateError; + function asIsInstanceOf(type, value) { + return type.isInstanceOf(value); + } + Runtime.asIsInstanceOf = asIsInstanceOf; + function asIsType(type, value) { + return type.isInstance(value); + } + Runtime.asIsType = asIsType; + function asAsType(type, value) { + return asIsType(type, value) ? value : null; + } + Runtime.asAsType = asAsType; + function asCoerceByMultiname(domain, multiname, value) { + true; + switch (Multiname.getQualifiedName(multiname)) { + case Multiname.Int: + return asCoerceInt(value); + case Multiname.Uint: + return asCoerceUint(value); + case Multiname.String: + return asCoerceString(value); + case Multiname.Number: + return asCoerceNumber(value); + case Multiname.Boolean: + return asCoerceBoolean(value); + case Multiname.Object: + return asCoerceObject(value); + } + return asCoerce(domain.getType(multiname), value); + } + Runtime.asCoerceByMultiname = asCoerceByMultiname; + function asCoerce(type, value) { + if (type.coerce) { + return type.coerce(value); + } + if (Shumway.isNullOrUndefined(value)) { + return null; + } + if (type.isInstance(value)) { + return value; + } else { + true; + } + } + Runtime.asCoerce = asCoerce; + function asCoerceString(x) { + if (typeof x === 'string') { + return x; + } else if (x == undefined) { + return null; + } + return x + ''; + } + Runtime.asCoerceString = asCoerceString; + function asCoerceInt(x) { + return x | 0; + } + Runtime.asCoerceInt = asCoerceInt; + function asCoerceUint(x) { + return x >>> 0; + } + Runtime.asCoerceUint = asCoerceUint; + function asCoerceNumber(x) { + return +x; + } + Runtime.asCoerceNumber = asCoerceNumber; + function asCoerceBoolean(x) { + return !(!x); + } + Runtime.asCoerceBoolean = asCoerceBoolean; + function asCoerceObject(x) { + if (x == undefined) { + return null; + } + if (typeof x === 'string' || typeof x === 'number') { + return x; + } + return Object(x); + } + Runtime.asCoerceObject = asCoerceObject; + function asDefaultCompareFunction(a, b) { + return String(a).localeCompare(String(b)); + } + Runtime.asDefaultCompareFunction = asDefaultCompareFunction; + function asCompare(a, b, options, compareFunction) { + true; + true; + var result = 0; + if (!compareFunction) { + compareFunction = asDefaultCompareFunction; + } + if (options & 1) { + a = String(a).toLowerCase(); + b = String(b).toLowerCase(); + } + if (options & 16) { + a = Shumway.toNumber(a); + b = Shumway.toNumber(b); + result = a < b ? -1 : a > b ? 1 : 0; + } else { + result = compareFunction(a, b); + } + if (options & 2) { + result *= -1; + } + return result; + } + Runtime.asCompare = asCompare; + function asAdd(l, r) { + if (typeof l === 'string' || typeof r === 'string') { + return String(l) + String(r); + } + return l + r; + } + Runtime.asAdd = asAdd; + function asHasNext2(object, index) { + if (Shumway.isNullOrUndefined(object)) { + return { + index: 0, + object: null + }; + } + object = boxValue(object); + var nextIndex = object.asNextNameIndex(index); + if (nextIndex > 0) { + return { + index: nextIndex, + object: object + }; + } + while (true) { + var object = Object.getPrototypeOf(object); + if (!object) { + return { + index: 0, + object: null + }; + } + nextIndex = object.asNextNameIndex(0); + if (nextIndex > 0) { + return { + index: nextIndex, + object: object + }; + } + } + return { + index: 0, + object: null + }; + } + Runtime.asHasNext2 = asHasNext2; + function getDescendants(object, mn) { + if (!isXMLType(object)) { + throw 'Not XML object in getDescendants'; + } + return object.descendants(mn); + } + Runtime.getDescendants = getDescendants; + function checkFilter(value) { + if (!value.class || !isXMLType(value)) { + throw 'TypeError operand of childFilter not of XML type'; + } + return value; + } + Runtime.checkFilter = checkFilter; + function initializeGlobalObject(global) { + var VM_NATIVE_BUILTIN_SURROGATES = [ + { + name: 'Object', + methods: [ + 'toString', + 'valueOf' + ] + }, + { + name: 'Function', + methods: [ + 'toString', + 'valueOf' + ] + } + ]; + var originals = global[Runtime.VM_NATIVE_BUILTIN_ORIGINALS] = createEmptyObject(); + VM_NATIVE_BUILTIN_SURROGATES.forEach(function (surrogate) { + var object = global[surrogate.name]; + originals[surrogate.name] = createEmptyObject(); + surrogate.methods.forEach(function (originalFunctionName) { + var originalFunction; + if (object.prototype.hasOwnProperty(originalFunctionName)) { + originalFunction = object.prototype[originalFunctionName]; + } else { + originalFunction = originals['Object'][originalFunctionName]; + } + originals[surrogate.name][originalFunctionName] = originalFunction; + var overrideFunctionName = Multiname.getPublicQualifiedName(originalFunctionName); + if (useSurrogates) { + global[surrogate.name].prototype[originalFunctionName] = function surrogate() { + if (this[overrideFunctionName]) { + return this[overrideFunctionName](); + } + return originalFunction.call(this); + }; + } + }); + }); + [ + 'Object', + 'Number', + 'Boolean', + 'String', + 'Array', + 'Date', + 'RegExp' + ].forEach(function (name) { + defineReadOnlyProperty(global[name].prototype, Runtime.VM_NATIVE_PROTOTYPE_FLAG, true); + }); + defineNonEnumerableProperty(global.Object.prototype, 'getNamespaceResolutionMap', getNamespaceResolutionMap); + defineNonEnumerableProperty(global.Object.prototype, 'resolveMultinameProperty', resolveMultinameProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asGetProperty', asGetProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asGetPublicProperty', asGetPublicProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asGetResolvedStringProperty', asGetResolvedStringProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asSetProperty', asSetProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asSetPublicProperty', asSetPublicProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asDefineProperty', asDefineProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asDefinePublicProperty', asDefinePublicProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asCallProperty', asCallProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asCallSuper', asCallSuper); + defineNonEnumerableProperty(global.Object.prototype, 'asGetSuper', asGetSuper); + defineNonEnumerableProperty(global.Object.prototype, 'asSetSuper', asSetSuper); + defineNonEnumerableProperty(global.Object.prototype, 'asCallPublicProperty', asCallPublicProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asCallResolvedStringProperty', asCallResolvedStringProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asConstructProperty', asConstructProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asHasProperty', asHasProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asHasTraitProperty', asHasTraitProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asDeleteProperty', asDeleteProperty); + defineNonEnumerableProperty(global.Object.prototype, 'asNextName', asNextName); + defineNonEnumerableProperty(global.Object.prototype, 'asNextValue', asNextValue); + defineNonEnumerableProperty(global.Object.prototype, 'asNextNameIndex', asNextNameIndex); + defineNonEnumerableProperty(global.Object.prototype, 'asGetEnumerableKeys', asGetEnumerableKeys); + [ + 'Array', + 'Int8Array', + 'Uint8Array', + 'Uint8ClampedArray', + 'Int16Array', + 'Uint16Array', + 'Int32Array', + 'Uint32Array', + 'Float32Array', + 'Float64Array' + ].forEach(function (name) { + if (!(name in global)) { + log(name + ' was not found in globals'); + return; + } + defineNonEnumerableProperty(global[name].prototype, 'asGetNumericProperty', asGetNumericProperty); + defineNonEnumerableProperty(global[name].prototype, 'asSetNumericProperty', asSetNumericProperty); + defineNonEnumerableProperty(global[name].prototype, 'asGetProperty', asGetPropertyLikelyNumeric); + defineNonEnumerableProperty(global[name].prototype, 'asSetProperty', asSetPropertyLikelyNumeric); + }); + global.Array.prototype.asGetProperty = function (namespaces, name, flags) { + if (typeof name === 'number') { + return this[name]; + } + return asGetProperty.call(this, namespaces, name, flags); + }; + global.Array.prototype.asSetProperty = function (namespaces, name, flags, value) { + if (typeof name === 'number') { + this[name] = value; + return; + } + return asSetProperty.call(this, namespaces, name, flags, value); + }; + } + Runtime.initializeGlobalObject = initializeGlobalObject; + function nameInTraits(object, qn) { + if (object.hasOwnProperty(Runtime.VM_BINDINGS) && object.hasOwnProperty(qn)) { + return true; + } + var proto = Object.getPrototypeOf(object); + return proto.hasOwnProperty(Runtime.VM_BINDINGS) && proto.hasOwnProperty(qn); + } + Runtime.nameInTraits = nameInTraits; + function CatchScopeObject(domain, trait) { + if (trait) { + new Shumway.AVM2.Runtime.CatchBindings(new Shumway.AVM2.Runtime.Scope(null, this), trait).applyTo(domain, this); + } + } + Runtime.CatchScopeObject = CatchScopeObject; + var Global = function () { + function Global(script) { + this.scriptInfo = script; + script.global = this; + this.scriptBindings = new Shumway.AVM2.Runtime.ScriptBindings(script, new Shumway.AVM2.Runtime.Scope(null, this, false)); + this.scriptBindings.applyTo(script.abc.applicationDomain, this); + script.loaded = true; + } + Global.prototype.toString = function () { + return '[object global]'; + }; + Global.prototype.isExecuted = function () { + return this.scriptInfo.executed; + }; + Global.prototype.isExecuting = function () { + return this.scriptInfo.executing; + }; + Global.prototype.ensureExecuted = function () { + Shumway.AVM2.Runtime.ensureScriptIsExecuted(this.scriptInfo); + }; + return Global; + }(); + Runtime.Global = Global; + defineNonEnumerableProperty(Global.prototype, Multiname.getPublicQualifiedName('toString'), function () { + return this.toString(); + }); + var LazyInitializer = function () { + function LazyInitializer(target) { + this.target = target; + } + LazyInitializer.create = function (target) { + if (target.asLazyInitializer) { + return target.asLazyInitializer; + } + return target.asLazyInitializer = new LazyInitializer(target); + }; + LazyInitializer.prototype.getName = function () { + if (this.name) { + return this.name; + } + var target = this.target, initialize; + if (this.target instanceof ScriptInfo) { + var scriptInfo = target; + this.name = '$' + Shumway.StringUtilities.variableLengthEncodeInt32(scriptInfo.hash); + initialize = function () { + Shumway.AVM2.Runtime.ensureScriptIsExecuted(target, 'Lazy Initializer'); + return scriptInfo.global; + }; + } else if (this.target instanceof ClassInfo) { + var classInfo = target; + this.name = '$' + Shumway.StringUtilities.variableLengthEncodeInt32(classInfo.hash); + initialize = function () { + if (classInfo.classObject) { + return classInfo.classObject; + } + return classInfo.abc.applicationDomain.getProperty(classInfo.instanceInfo.name); + }; + } else { + Shumway.Debug.notImplemented(String(target)); + } + var name = this.name; + Object.defineProperty(LazyInitializer._holder, name, { + get: function () { + var value = initialize(); + Object.defineProperty(LazyInitializer._holder, name, { + value: value, + writable: true + }); + return value; + }, + configurable: true + }); + return name; + }; + LazyInitializer._holder = jsGlobal; + return LazyInitializer; + }(); + Runtime.LazyInitializer = LazyInitializer; + function forEachPublicProperty(object, fn, self) { + if (!object.asBindings) { + for (var key in object) { + fn.call(self, key, object[key]); + } + return; + } + for (var key in object) { + if (Shumway.isNumeric(key)) { + fn.call(self, key, object[key]); + } else if (Multiname.isPublicQualifiedName(key) && object.asBindings.indexOf(key) < 0) { + var name = Multiname.stripPublicQualifier(key); + fn.call(self, name, object[key]); + } + } + } + Runtime.forEachPublicProperty = forEachPublicProperty; + function wrapJSObject(object) { + var wrapper = Object.create(object); + for (var i in object) { + Object.defineProperty(wrapper, Multiname.getPublicQualifiedName(i), function (object, i) { + return { + get: function () { + return object[i]; + }, + set: function (value) { + object[i] = value; + }, + enumerable: true + }; + }(object, i)); + } + return wrapper; + } + Runtime.wrapJSObject = wrapJSObject; + function asCreateActivation(methodInfo) { + return Object.create(methodInfo.activationPrototype); + } + Runtime.asCreateActivation = asCreateActivation; + var GlobalMultinameResolver = function () { + function GlobalMultinameResolver() { + } + GlobalMultinameResolver.updateTraits = function (traits) { + for (var i = 0; i < traits.length; i++) { + var trait = traits[i]; + var name = trait.name.name; + var namespace = trait.name.getNamespace(); + if (!namespace.isDynamic()) { + GlobalMultinameResolver.hasNonDynamicNamespaces[name] = true; + if (GlobalMultinameResolver.wasResolved[name]) { + Shumway.Debug.notImplemented('We have to the undo the optimization, ' + name + ' can now bind to ' + namespace); + } + } + } + }; + GlobalMultinameResolver.loadAbc = function (abc) { + if (!Runtime.globalMultinameAnalysis.value) { + return; + } + var scripts = abc.scripts; + var classes = abc.classes; + var methods = abc.methods; + for (var i = 0; i < scripts.length; i++) { + GlobalMultinameResolver.updateTraits(scripts[i].traits); + } + for (var i = 0; i < classes.length; i++) { + GlobalMultinameResolver.updateTraits(classes[i].traits); + GlobalMultinameResolver.updateTraits(classes[i].instanceInfo.traits); + } + for (var i = 0; i < methods.length; i++) { + if (methods[i].traits) { + GlobalMultinameResolver.updateTraits(methods[i].traits); + } + } + }; + GlobalMultinameResolver.resolveMultiname = function (multiname) { + var name = multiname.name; + if (GlobalMultinameResolver.hasNonDynamicNamespaces[name]) { + return; + } + GlobalMultinameResolver.wasResolved[name] = true; + return new Multiname([ + Namespace.PUBLIC + ], multiname.name); + }; + GlobalMultinameResolver.hasNonDynamicNamespaces = createEmptyObject(); + GlobalMultinameResolver.wasResolved = createEmptyObject(); + return GlobalMultinameResolver; + }(); + Runtime.GlobalMultinameResolver = GlobalMultinameResolver; + var ActivationInfo = function () { + function ActivationInfo(methodInfo) { + this.methodInfo = methodInfo; + } + return ActivationInfo; + }(); + Runtime.ActivationInfo = ActivationInfo; + function sliceArguments(args, offset) { + if (typeof offset === 'undefined') { + offset = 0; + } + return Array.prototype.slice.call(args, offset); + } + Runtime.sliceArguments = sliceArguments; + function canCompile(mi) { + if (!mi.hasBody) { + return false; + } + if (mi.hasExceptions() && !compilerEnableExceptions.value) { + return false; + } else if (mi.code.length > compilerMaximumMethodSize.value) { + return false; + } + return true; + } + Runtime.canCompile = canCompile; + function shouldCompile(mi) { + if (!canCompile(mi)) { + return false; + } + if (mi.isClassInitializer || mi.isScriptInitializer) { + return false; + } + return true; + } + Runtime.shouldCompile = shouldCompile; + function forceCompile(mi) { + if (mi.hasExceptions()) { + return false; + } + var holder = mi.holder; + if (holder instanceof ClassInfo) { + holder = holder.instanceInfo; + } + if (holder instanceof InstanceInfo) { + var packageName = holder.name.namespaces[0].uri; + switch (packageName) { + case 'flash.geom': + case 'flash.events': + return true; + default: + break; + } + var className = holder.name.getOriginalName(); + switch (className) { + case 'com.google.youtube.model.VideoData': + return true; + } + } + return false; + } + Runtime.forceCompile = forceCompile; + Runtime.CODE_CACHE = createEmptyObject(); + function searchCodeCache(methodInfo) { + if (!Runtime.codeCaching.value) { + return; + } + var cacheInfo = Runtime.CODE_CACHE[methodInfo.abc.hash]; + if (!cacheInfo) { + warn('Cannot Find Code Cache For ABC, name: ' + methodInfo.abc.name + ', hash: ' + methodInfo.abc.hash); + Counter.count('Code Cache ABC Miss'); + return; + } + if (!cacheInfo.isInitialized) { + methodInfo.abc.scripts.forEach(function (scriptInfo) { + LazyInitializer.create(scriptInfo).getName(); + }); + methodInfo.abc.classes.forEach(function (classInfo) { + LazyInitializer.create(classInfo).getName(); + }); + cacheInfo.isInitialized = true; + } + var method = cacheInfo.methods[methodInfo.index]; + if (!method) { + if (methodInfo.isInstanceInitializer || methodInfo.isClassInitializer) { + Counter.count('Code Cache Query On Initializer'); + } else { + Counter.count('Code Cache MISS ON OTHER'); + warn('Shouldn\'t MISS: ' + methodInfo + ' ' + methodInfo.debugName); + } + Counter.count('Code Cache Miss'); + return; + } + log('Linking CC: ' + methodInfo); + Counter.count('Code Cache Hit'); + return method; + } + Runtime.searchCodeCache = searchCodeCache; + function createInterpretedFunction(methodInfo, scope, hasDynamicScope) { + var mi = methodInfo; + var hasDefaults = false; + var defaults = mi.parameters.map(function (p) { + if (p.value !== undefined) { + hasDefaults = true; + } + return p.value; + }); + var fn; + if (hasDynamicScope) { + fn = function (scope) { + var global = this === jsGlobal ? scope.global.object : this; + var args = sliceArguments(arguments, 1); + if (hasDefaults && args.length < defaults.length) { + args = args.concat(defaults.slice(args.length - defaults.length)); + } + return Shumway.AVM2.Interpreter.interpretMethod(global, methodInfo, scope, args); + }; + } else { + fn = function () { + var global = this === jsGlobal ? scope.global.object : this; + var args = sliceArguments(arguments); + if (hasDefaults && args.length < defaults.length) { + args = args.concat(defaults.slice(arguments.length - defaults.length)); + } + return Shumway.AVM2.Interpreter.interpretMethod(global, methodInfo, scope, args); + }; + } + fn.instanceConstructor = fn; + fn.debugName = 'Interpreter Function #' + vmNextInterpreterFunctionId++; + return fn; + } + Runtime.createInterpretedFunction = createInterpretedFunction; + function debugName(value) { + if (Shumway.isFunction(value)) { + return value.debugName; + } + return value; + } + Runtime.debugName = debugName; + function createCompiledFunction(methodInfo, scope, hasDynamicScope, breakpoint, deferCompilation) { + var mi = methodInfo; + var cached = searchCodeCache(mi); + if (!cached) { + var result = Compiler.compileMethod(mi, scope, hasDynamicScope); + var parameters = result.parameters; + var body = result.body; + } + var fnName = mi.name ? Multiname.getQualifiedName(mi.name) : 'fn' + compiledFunctionCount; + if (mi.holder) { + var fnNamePrefix = ''; + if (mi.holder instanceof ClassInfo) { + fnNamePrefix = 'static$' + mi.holder.instanceInfo.name.getName(); + } else if (mi.holder instanceof InstanceInfo) { + fnNamePrefix = mi.holder.name.getName(); + } else if (mi.holder instanceof ScriptInfo) { + fnNamePrefix = 'script'; + } + fnName = fnNamePrefix + '$' + fnName; + } + fnName = Shumway.StringUtilities.escapeString(fnName); + if (mi.verified) { + fnName += '$V'; + } + if (compiledFunctionCount == functionBreak.value || breakpoint) { + body = '{ debugger; \n' + body + '}'; + } + if (!cached) { + var fnSource = 'function ' + fnName + ' (' + parameters.join(', ') + ') ' + body; + } + if (traceLevel.value > 1) { + mi.trace(new IndentingWriter(), mi.abc); + } + mi.debugTrace = function () { + mi.trace(new IndentingWriter(), mi.abc); + }; + if (traceLevel.value > 0) { + log(fnSource); + } + var fn = cached || new Function('return ' + fnSource)(); + fn.debugName = 'Compiled Function #' + vmNextCompiledFunctionId++; + return fn; + } + Runtime.createCompiledFunction = createCompiledFunction; + function createFunction(mi, scope, hasDynamicScope, breakpoint) { + if (typeof breakpoint === 'undefined') { + breakpoint = false; + } + true; + if (mi.freeMethod) { + if (hasDynamicScope) { + return Shumway.AVM2.Runtime.bindFreeMethodScope(mi, scope); + } + return mi.freeMethod; + } + var fn; + if (fn = Shumway.AVM2.Runtime.checkMethodOverrides(mi)) { + true; + return fn; + } + ensureFunctionIsInitialized(mi); + totalFunctionCount++; + var useInterpreter = false; + if ((mi.abc.applicationDomain.mode === 1 || !shouldCompile(mi)) && !forceCompile(mi)) { + useInterpreter = true; + } + if (compileOnly.value >= 0) { + if (Number(compileOnly.value) !== totalFunctionCount) { + log('Compile Only Skipping ' + totalFunctionCount); + useInterpreter = true; + } + } + if (compileUntil.value >= 0) { + if (totalFunctionCount > 1000) { + log(Shumway.Debug.backtrace()); + log(Shumway.AVM2.Runtime.AVM2.getStackTrace()); + } + if (totalFunctionCount > compileUntil.value) { + log('Compile Until Skipping ' + totalFunctionCount); + useInterpreter = true; + } + } + if (useInterpreter) { + mi.freeMethod = createInterpretedFunction(mi, scope, hasDynamicScope); + } else { + compiledFunctionCount++; + if (compileOnly.value >= 0 || compileUntil.value >= 0) { + log('Compiling ' + totalFunctionCount); + } + mi.freeMethod = createCompiledFunction(mi, scope, hasDynamicScope, breakpoint, mi.isInstanceInitializer); + } + mi.freeMethod.methodInfo = mi; + if (hasDynamicScope) { + return Shumway.AVM2.Runtime.bindFreeMethodScope(mi, scope); + } + return mi.freeMethod; + } + Runtime.createFunction = createFunction; + function ensureFunctionIsInitialized(methodInfo) { + var mi = methodInfo; + if (!mi.analysis) { + mi.analysis = new Analysis(mi); + if (mi.needsActivation()) { + mi.activationPrototype = new ActivationInfo(mi); + new Shumway.AVM2.Runtime.ActivationBindings(mi).applyTo(mi.abc.applicationDomain, mi.activationPrototype); + } + var exceptions = mi.exceptions; + for (var i = 0, j = exceptions.length; i < j; i++) { + var handler = exceptions[i]; + if (handler.varName) { + var varTrait = Object.create(Trait.prototype); + varTrait.kind = 0; + varTrait.name = handler.varName; + varTrait.typeName = handler.typeName; + varTrait.holder = mi; + handler.scopeObject = new CatchScopeObject(mi.abc.applicationDomain, varTrait); + } else { + handler.scopeObject = new CatchScopeObject(undefined, undefined); + } + } + } + } + Runtime.ensureFunctionIsInitialized = ensureFunctionIsInitialized; + function getTraitFunction(trait, scope, natives) { + true; + true; + var mi = trait.methodInfo; + var fn; + if (mi.isNative()) { + var md = trait.metadata; + if (md && md.native) { + var nativeName = md.native.value[0].value; + var makeNativeFunction = getNative(nativeName); + fn = makeNativeFunction && makeNativeFunction(null, scope); + } else if (md && md.unsafeJSNative) { + fn = getNative(md.unsafeJSNative.value[0].value); + } else if (natives) { + var k = Multiname.getName(mi.name); + if (trait.isGetter()) { + fn = natives[k] ? natives[k].get : undefined; + } else if (trait.isSetter()) { + fn = natives[k] ? natives[k].set : undefined; + } else { + fn = natives[k]; + } + } + if (!fn) { + Shumway.Debug.warning('No native method for: ' + trait.kindName() + ' ' + mi.holder.name + '::' + Multiname.getQualifiedName(mi.name)); + return function (mi) { + return function () { + Shumway.Debug.warning('Calling undefined native method: ' + trait.kindName() + ' ' + mi.holder.name + '::' + Multiname.getQualifiedName(mi.name)); + }; + }(mi); + } + } else { + if (Runtime.traceExecution.value >= 2) { + log('Creating Function For Trait: ' + trait.holder + ' ' + trait); + } + fn = createFunction(mi, scope, false, false); + true; + } + if (Runtime.traceExecution.value >= 3) { + log('Made Function: ' + Multiname.getQualifiedName(mi.name)); + } + return fn; + } + Runtime.getTraitFunction = getTraitFunction; + function createClass(classInfo, baseClass, scope) { + true; + var ci = classInfo; + var ii = ci.instanceInfo; + var domain = ci.abc.applicationDomain; + var className = Multiname.getName(ii.name); + if (Runtime.traceExecution.value) { + log('Creating ' + (ii.isInterface() ? 'Interface' : 'Class') + ': ' + className + (ci.native ? ' replaced with native ' + ci.native.cls : '')); + } + var cls; + if (ii.isInterface()) { + cls = Shumway.AVM2.Runtime.Interface.createInterface(classInfo); + } else { + cls = Shumway.AVM2.Runtime.Class.createClass(classInfo, baseClass, scope); + } + if (Runtime.traceClasses.value) { + domain.loadedClasses.push(cls); + domain.traceLoadedClasses(true); + } + if (ii.isInterface()) { + return cls; + } + domain.onMessage.notify1('classCreated', cls); + if (cls.instanceConstructor && cls !== Shumway.AVM2.Runtime.Class) { + cls.verify(); + } + if (baseClass && (Multiname.getQualifiedName(baseClass.classInfo.instanceInfo.name.name) === 'Proxy' || baseClass.isProxy)) { + installProxyClassWrapper(cls); + cls.isProxy = true; + } + classInfo.classObject = cls; + createFunction(classInfo.init, scope, false, false).call(cls); + if (Runtime.sealConstTraits) { + this.sealConstantTraits(cls, ci.traits); + } + return cls; + } + Runtime.createClass = createClass; + function sealConstantTraits(object, traits) { + for (var i = 0, j = traits.length; i < j; i++) { + var trait = traits[i]; + if (trait.isConst()) { + var qn = Multiname.getQualifiedName(trait.name); + var value = object[qn]; + (function (qn, value) { + Object.defineProperty(object, qn, { + configurable: false, + enumerable: false, + get: function () { + return value; + }, + set: function () { + throwErrorFromVM(Shumway.AVM2.Runtime.AVM2.currentDomain(), 'ReferenceError', 'Illegal write to read-only property ' + qn + '.', 0); + } + }); + }(qn, value)); + } + } + } + Runtime.sealConstantTraits = sealConstantTraits; + function applyType(domain, factory, types) { + var factoryClassName = factory.classInfo.instanceInfo.name.name; + if (factoryClassName === 'Vector') { + true; + var type = types[0]; + var typeClassName; + if (!Shumway.isNullOrUndefined(type)) { + typeClassName = type.classInfo.instanceInfo.name.name.toLowerCase(); + switch (typeClassName) { + case 'int': + case 'uint': + case 'double': + case 'object': + return domain.getClass('packageInternal __AS3__.vec.Vector$' + typeClassName); + } + } + return domain.getClass('packageInternal __AS3__.vec.Vector$object').applyType(type); + } else { + return Shumway.Debug.notImplemented(factoryClassName); + } + } + Runtime.applyType = applyType; + }(AVM2.Runtime || (AVM2.Runtime = {}))); + var Runtime = AVM2.Runtime; + }(Shumway.AVM2 || (Shumway.AVM2 = {}))); + var AVM2 = Shumway.AVM2; +}(Shumway || (Shumway = {}))); +var CC = Shumway.AVM2.Runtime.CODE_CACHE; +var VM_LENGTH = Shumway.AVM2.Runtime.VM_LENGTH; +var VM_IS_PROXY = Shumway.AVM2.Runtime.VM_IS_PROXY; +var VM_CALL_PROXY = Shumway.AVM2.Runtime.VM_CALL_PROXY; +var VM_NATIVE_BUILTIN_ORIGINALS = Shumway.AVM2.Runtime.VM_NATIVE_BUILTIN_ORIGINALS; +var VM_OPEN_METHOD_PREFIX = 'm'; +var VM_OPEN_SET_METHOD_PREFIX = 's'; +var VM_OPEN_GET_METHOD_PREFIX = 'g'; var SAVED_SCOPE_NAME = '$SS'; -var PARAMETER_PREFIX = 'p'; -var $M = []; +var originalStringReplace = String.prototype.replace; XRegExp.install({ natives: true }); -var VM_METHOD_OVERRIDES = createEmptyObject(); -var vmNextShapeId = 1; -function defineObjectShape(object) { - defineReadOnlyProperty(object, 'shape', vmNextShapeId++); -} -var vmNextInterpreterFunctionId = 1; -var vmNextCompiledFunctionId = 1; -var vmNextTrampolineId = 1; -var vmNextMemoizerId = 1; -var InlineCache = function () { - function inlineCache() { - this.key = undefined; - this.value = undefined; - } - inlineCache.prototype.update = function (key, value) { - this.key = key; - this.value = value; - return value; - }; - return inlineCache; - }(); -function ic(object) { - return object.ic || (object.ic = new InlineCache()); -} -var AS = 1, JS = 2; -var RUNTIME_ENTER_LEAVE_STACK = [ - AS - ]; -function enter(mode) { - RUNTIME_ENTER_LEAVE_STACK.push(mode); -} -function leave(mode) { - var top = RUNTIME_ENTER_LEAVE_STACK.pop(); - true; -} -function inJS() { - return RUNTIME_ENTER_LEAVE_STACK.top() === JS; -} -function inAS() { - return RUNTIME_ENTER_LEAVE_STACK.top() === AS; -} var callWriter = new IndentingWriter(false, function (str) { print(str); }); @@ -26229,1412 +29400,129 @@ function objectConstantName(object) { jsGlobal[name] = object; return name; } -var LazyInitializer = function () { - var holder = jsGlobal; - lazyInitializer.create = function (target) { - if (target.lazyInitializer) { - return target.lazyInitializer; - } - return target.lazyInitializer = new LazyInitializer(target); - }; - function lazyInitializer(target) { - this.target = target; - } - lazyInitializer.prototype.getName = function getName() { - if (this.name) { - return this.name; - } - var target = this.target, initialize; - if (this.target instanceof ScriptInfo) { - this.name = '$S' + objectIDs++; - initialize = function () { - ensureScriptIsExecuted(target, 'Lazy Initializer'); - return target.global; - }; - } else if (this.target instanceof ClassInfo) { - this.name = Multiname.getQualifiedName(target.instanceInfo.name); - initialize = function () { - return target.abc.applicationDomain.getProperty(target.instanceInfo.name); - }; - } else { - notImplemented(target); - } - var name = this.name; - Object.defineProperty(holder, name, { - get: function () { - var value = initialize(); - Object.defineProperty(holder, name, { - value: value, - writable: true - }); - return value; - }, - configurable: true - }); - return name; - }; - return lazyInitializer; - }(); -function getNamespaceResolutionMap(namespaces) { - var map = this.resolutionMap[namespaces.id]; - if (map) - return map; - map = this.resolutionMap[namespaces.id] = createEmptyObject(); - var bindings = this.bindings; - for (var key in bindings.map) { - var multiname = key; - var trait = bindings.map[key].trait; - if (trait.isGetter() || trait.isSetter()) { - multiname = multiname.substring(Binding.KEY_PREFIX_LENGTH); - } - var k = multiname; - multiname = Multiname.fromQualifiedName(multiname); - if (multiname.getNamespace().inNamespaceSet(namespaces)) { - map[multiname.getName()] = Multiname.getQualifiedName(trait.name); - } - } - return map; -} -function resolveMultinameProperty(namespaces, name, flags) { - if (typeof name === 'object') { - name = String(name); - } - if (isNumeric(name)) { - return toNumber(name); - } - if (!namespaces) { - return Multiname.getPublicQualifiedName(name); - } - if (namespaces.length > 1) { - var resolved = this.getNamespaceResolutionMap(namespaces)[name]; - if (resolved) - return resolved; - return Multiname.getPublicQualifiedName(name); - } else { - return namespaces[0].qualifiedName + '$' + name; - } -} -function asGetPublicProperty(name) { - return this.asGetProperty(undefined, name, 0); -} -function asGetProperty(namespaces, name, flags) { - var resolved = this.resolveMultinameProperty(namespaces, name, flags); - if (this.asGetNumericProperty && Multiname.isNumeric(resolved)) { - return this.asGetNumericProperty(resolved); - } - return this[resolved]; -} -function asGetPropertyLikelyNumeric(namespaces, name, flags) { - if (typeof name === 'number') { - return this.asGetNumericProperty(name); - } - return asGetProperty.call(this, namespaces, name, flags); -} -function asGetResolvedStringProperty(resolved) { - true; - return this[resolved]; -} -function asCallResolvedStringProperty(resolved, isLex, args) { - var receiver = isLex ? null : this; - var openMethods = this[VM_OPEN_METHODS]; - var method; - if (receiver && openMethods && openMethods[resolved]) { - method = openMethods[resolved]; - } else { - method = this[resolved]; - } - return method.apply(receiver, args); -} -function fromResolvedName(resolved) { - true; - return resolved.substring(Multiname.PUBLIC_QUALIFIED_NAME_PREFIX.length); -} -function asGetResolvedStringPropertyFallback(resolved) { - var name = fromResolvedName(resolved); - return this.asGetProperty([ - ShumwayNamespace.PUBLIC - ], name, 0); -} -function asSetPublicProperty(name, value) { - return this.asSetProperty(undefined, name, 0, value); -} -function asSetProperty(namespaces, name, flags, value) { - if (typeof name === 'object') { - name = String(name); - } - var resolved = this.resolveMultinameProperty(namespaces, name, flags); - if (this.asSetNumericProperty && Multiname.isNumeric(resolved)) { - return this.asSetNumericProperty(resolved, value); - } - var slotInfo = this[VM_SLOTS].byQN[resolved]; - if (slotInfo) { - if (slotInfo.const) { - return; - } - var type = slotInfo.type; - if (type && type.coerce) { - value = type.coerce(value); - } - } - this[resolved] = value; -} -function asSetPropertyLikelyNumeric(namespaces, name, flags, value) { - if (typeof name === 'number') { - this.asSetNumericProperty(name, value); - return; - } - return asSetProperty.call(this, namespaces, name, flags, value); -} -function asDefinePublicProperty(name, descriptor) { - return this.asDefineProperty(undefined, name, 0, descriptor); -} -function asDefineProperty(namespaces, name, flags, descriptor) { - if (typeof name === 'object') { - name = String(name); - } - var resolved = this.resolveMultinameProperty(namespaces, name, flags); - Object.defineProperty(this, resolved, descriptor); -} -function asCallPublicProperty(name, args) { - return this.asCallProperty(undefined, name, 0, false, args); -} -var callCounter = new metrics.Counter(true); -function asCallProperty(namespaces, name, flags, isLex, args) { - if (traceCallExecution.value) { - var receiver = this.class ? this.class.className + ' ' : ''; - callWriter.enter('call ' + receiver + name + '(' + toSafeArrayString(args) + ') #' + callCounter.count(name)); - } - var receiver = isLex ? null : this; - var result; - if (isProxyObject(this)) { - result = this[VM_CALL_PROXY](new Multiname(namespaces, name, flags), receiver, args); - } else { - var method; - var resolved = this.resolveMultinameProperty(namespaces, name, flags); - if (this.asGetNumericProperty && Multiname.isNumeric(resolved)) { - method = this.asGetNumericProperty(resolved); - } else { - var openMethods = this[VM_OPEN_METHODS]; - if (receiver && openMethods && openMethods[resolved]) { - method = openMethods[resolved]; - } else { - method = this[resolved]; - } - } - result = method.apply(receiver, args); - } - traceCallExecution.value > 0 && callWriter.leave('return ' + toSafeString(result)); - return result; -} -function asCallSuper(scope, namespaces, name, flags, args) { - if (traceCallExecution.value) { - var receiver = this.class ? this.class.className + ' ' : ''; - callWriter.enter('call super ' + receiver + name + '(' + toSafeArrayString(args) + ') #' + callCounter.count(name)); - } - var baseClass = scope.object.baseClass; - var resolved = baseClass.traitsPrototype.resolveMultinameProperty(namespaces, name, flags); - var openMethods = baseClass.traitsPrototype[VM_OPEN_METHODS]; - var method = openMethods[resolved]; - var result = method.apply(this, args); - traceCallExecution.value > 0 && callWriter.leave('return ' + toSafeString(result)); - return result; -} -function asSetSuper(scope, namespaces, name, flags, value) { - if (traceCallExecution.value) { - var receiver = this.class ? this.class.className + ' ' : ''; - callWriter.enter('set super ' + receiver + name + '(' + toSafeString(value) + ') #' + callCounter.count(name)); - } - var baseClass = scope.object.baseClass; - var resolved = baseClass.traitsPrototype.resolveMultinameProperty(namespaces, name, flags); - if (this[VM_SLOTS].byQN[resolved]) { - this.asSetProperty(namespaces, name, flags, value); - } else { - baseClass.traitsPrototype[VM_OPEN_SET_METHOD_PREFIX + resolved].call(this, value); - } - traceCallExecution.value > 0 && callWriter.leave(''); -} -function asGetSuper(scope, namespaces, name, flags) { - if (traceCallExecution.value) { - var receiver = this.class ? this.class.className + ' ' : ''; - callWriter.enter('get super ' + receiver + name + ' #' + callCounter.count(name)); - } - var baseClass = scope.object.baseClass; - var resolved = baseClass.traitsPrototype.resolveMultinameProperty(namespaces, name, flags); - var result; - if (this[VM_SLOTS].byQN[resolved]) { - result = this.asGetProperty(namespaces, name, flags); - } else { - result = baseClass.traitsPrototype[VM_OPEN_GET_METHOD_PREFIX + resolved].call(this); - } - traceCallExecution.value > 0 && callWriter.leave('return ' + toSafeString(result)); - return result; -} -function construct(constructor, args) { - if (constructor.classInfo) { - var qn = constructor.classInfo.instanceInfo.name.qualifiedName; - if (qn === Multiname.String) { - return String.apply(null, args); - } - if (qn === Multiname.Boolean) { - return Boolean.apply(null, args); - } - if (qn === Multiname.Number) { - return Number.apply(null, args); - } - } - return new (Function.bind.apply(constructor.instanceConstructor, [ - , - ].concat(args)))(); -} -function asConstructProperty(namespaces, name, flags, args) { - var constructor = this.asGetProperty(namespaces, name, flags); - if (traceCallExecution.value) { - callWriter.enter('construct ' + name + '(' + toSafeArrayString(args) + ') #' + callCounter.count(name)); - } - var result = construct(constructor, args); - traceCallExecution.value > 0 && callWriter.leave('return ' + toSafeString(result)); - return result; -} -function asHasProperty(namespaces, name, flags, nonProxy) { - if (this.hasProperty) { - return this.hasProperty(namespaces, name, flags); - } - if (nonProxy) { - return nonProxyingHasProperty(this, this.resolveMultinameProperty(namespaces, name, flags)); - } else { - return this.resolveMultinameProperty(namespaces, name, flags) in this; - } -} -function asDeleteProperty(namespaces, name, flags) { - var resolved = this.resolveMultinameProperty(namespaces, name, flags); - return delete this[resolved]; -} -function asGetNumericProperty(i) { - return this[i]; -} -function asSetNumericProperty(i, v) { - this[i] = v; -} -function asGetDescendants(namespaces, name, flags) { - notImplemented('asGetDescendants'); -} -function asNextNameIndex(index) { - if (index === 0) { - defineNonEnumerableProperty(this, 'enumerableKeys', this.asGetEnumerableKeys()); - } - var enumerableKeys = this.enumerableKeys; - while (index < enumerableKeys.length) { - if (this.asHasProperty(undefined, enumerableKeys[index], 0)) { - return index + 1; - } - index++; - } - return 0; -} -function asNextName(index) { - var enumerableKeys = this.enumerableKeys; - true; - return enumerableKeys[index - 1]; -} -function asNextValue(index) { - return this.asGetPublicProperty(this.asNextName(index)); -} -function asGetEnumerableKeys() { - var boxedValue = this.valueOf(); - if (typeof boxedValue === 'string' || typeof boxedValue === 'number') { - return []; - } - var keys = Object.keys(this); - var result = []; - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - if (isNumeric(key)) { - result.push(key); - } else { - var name = Multiname.stripPublicQualifier(key); - if (name !== undefined) { - result.push(name); - } - } - } - return result; -} -function initializeGlobalObject(global) { - var originals = global[VM_NATIVE_BUILTIN_ORIGINALS] = createEmptyObject(); - VM_NATIVE_BUILTIN_SURROGATES.forEach(function (surrogate) { - var object = surrogate.object; - originals[object.name] = createEmptyObject(); - surrogate.methods.forEach(function (originalFunctionName) { - var originalFunction = object.prototype[originalFunctionName]; - originals[object.name][originalFunctionName] = originalFunction; - var overrideFunctionName = Multiname.getPublicQualifiedName(originalFunctionName); - if (useSurrogates) { - global[object.name].prototype[originalFunctionName] = function surrogate() { - if (this[overrideFunctionName]) { - return this[overrideFunctionName](); - } - return originalFunction.call(this); - }; - } - }); - }); - [ - 'Object', - 'Number', - 'Boolean', - 'String', - 'Array', - 'Date', - 'RegExp' - ].forEach(function (name) { - defineReadOnlyProperty(global[name].prototype, VM_NATIVE_PROTOTYPE_FLAG, true); - }); - defineNonEnumerableProperty(global.Object.prototype, 'getNamespaceResolutionMap', getNamespaceResolutionMap); - defineNonEnumerableProperty(global.Object.prototype, 'resolveMultinameProperty', resolveMultinameProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asGetProperty', asGetProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asGetPublicProperty', asGetPublicProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asGetResolvedStringProperty', asGetResolvedStringProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asSetProperty', asSetProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asSetPublicProperty', asSetPublicProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asDefineProperty', asDefineProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asDefinePublicProperty', asDefinePublicProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asCallProperty', asCallProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asCallSuper', asCallSuper); - defineNonEnumerableProperty(global.Object.prototype, 'asGetSuper', asGetSuper); - defineNonEnumerableProperty(global.Object.prototype, 'asSetSuper', asSetSuper); - defineNonEnumerableProperty(global.Object.prototype, 'asCallPublicProperty', asCallPublicProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asCallResolvedStringProperty', asCallResolvedStringProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asConstructProperty', asConstructProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asHasProperty', asHasProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asDeleteProperty', asDeleteProperty); - defineNonEnumerableProperty(global.Object.prototype, 'asNextName', asNextName); - defineNonEnumerableProperty(global.Object.prototype, 'asNextValue', asNextValue); - defineNonEnumerableProperty(global.Object.prototype, 'asNextNameIndex', asNextNameIndex); - defineNonEnumerableProperty(global.Object.prototype, 'asGetEnumerableKeys', asGetEnumerableKeys); - [ - 'Array', - 'Int8Array', - 'Uint8Array', - 'Uint8ClampedArray', - 'Int16Array', - 'Uint16Array', - 'Int32Array', - 'Uint32Array', - 'Float32Array', - 'Float64Array' - ].forEach(function (name) { - if (!(name in global)) { - print(name + ' was not found in globals'); - return; - } - defineNonEnumerableProperty(global[name].prototype, 'asGetNumericProperty', asGetNumericProperty); - defineNonEnumerableProperty(global[name].prototype, 'asSetNumericProperty', asSetNumericProperty); - defineNonEnumerableProperty(global[name].prototype, 'asGetProperty', asGetPropertyLikelyNumeric); - defineNonEnumerableProperty(global[name].prototype, 'asSetProperty', asSetPropertyLikelyNumeric); - }); - global.Array.prototype.asGetProperty = function (namespaces, name, flags) { - if (typeof name === 'number') { - return this[name]; - } - return asGetProperty.call(this, namespaces, name, flags); - }; - global.Array.prototype.asSetProperty = function (namespaces, name, flags, value) { - if (typeof name === 'number') { - this[name] = value; - return; - } - return asSetProperty.call(this, namespaces, name, flags, value); - }; -} +var isClass = Shumway.AVM2.Runtime.isClass; +var isTrampoline = Shumway.AVM2.Runtime.isTrampoline; +var isMemoizer = Shumway.AVM2.Runtime.isMemoizer; +var LazyInitializer = Shumway.AVM2.Runtime.LazyInitializer; +var getNamespaceResolutionMap = Shumway.AVM2.Runtime.getNamespaceResolutionMap; +var resolveMultinameProperty = Shumway.AVM2.Runtime.resolveMultinameProperty; +var asGetPublicProperty = Shumway.AVM2.Runtime.asGetPublicProperty; +var asGetProperty = Shumway.AVM2.Runtime.asGetProperty; +var asGetPropertyLikelyNumeric = Shumway.AVM2.Runtime.asGetPropertyLikelyNumeric; +var asGetResolvedStringProperty = Shumway.AVM2.Runtime.asGetResolvedStringProperty; +var asCallResolvedStringProperty = Shumway.AVM2.Runtime.asCallResolvedStringProperty; +var asGetResolvedStringPropertyFallback = Shumway.AVM2.Runtime.asGetResolvedStringPropertyFallback; +var asSetPublicProperty = Shumway.AVM2.Runtime.asSetPublicProperty; +var asSetProperty = Shumway.AVM2.Runtime.asSetProperty; +var asSetPropertyLikelyNumeric = Shumway.AVM2.Runtime.asSetPropertyLikelyNumeric; +var asDefinePublicProperty = Shumway.AVM2.Runtime.asDefinePublicProperty; +var asDefineProperty = Shumway.AVM2.Runtime.asDefineProperty; +var asCallPublicProperty = Shumway.AVM2.Runtime.asCallPublicProperty; +var asCallProperty = Shumway.AVM2.Runtime.asCallProperty; +var asCallSuper = Shumway.AVM2.Runtime.asCallSuper; +var asSetSuper = Shumway.AVM2.Runtime.asSetSuper; +var asGetSuper = Shumway.AVM2.Runtime.asGetSuper; +var construct = Shumway.AVM2.Runtime.construct; +var asConstructProperty = Shumway.AVM2.Runtime.asConstructProperty; +var asHasProperty = Shumway.AVM2.Runtime.asHasProperty; +var asDeleteProperty = Shumway.AVM2.Runtime.asDeleteProperty; +var asGetNumericProperty = Shumway.AVM2.Runtime.asGetNumericProperty; +var asSetNumericProperty = Shumway.AVM2.Runtime.asSetNumericProperty; +var asGetDescendants = Shumway.AVM2.Runtime.asGetDescendants; +var asNextNameIndex = Shumway.AVM2.Runtime.asNextNameIndex; +var asNextName = Shumway.AVM2.Runtime.asNextName; +var asNextValue = Shumway.AVM2.Runtime.asNextValue; +var asGetEnumerableKeys = Shumway.AVM2.Runtime.asGetEnumerableKeys; +var initializeGlobalObject = Shumway.AVM2.Runtime.initializeGlobalObject; initializeGlobalObject(jsGlobal); -function isNativePrototype(object) { - return Object.prototype.hasOwnProperty.call(object, VM_NATIVE_PROTOTYPE_FLAG); -} -function asTypeOf(x) { - if (x) { - if (x.constructor === String) { - return 'string'; - } else if (x.constructor === Number) { - return 'number'; - } else if (x.constructor === Boolean) { - return 'boolean'; - } else if (x instanceof XML || x instanceof XMLList) { - return 'xml'; - } - } - return typeof x; -} -function publicizeProperties(object) { - var keys = Object.keys(object); - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - if (!Multiname.isPublicQualifiedName(k)) { - var v = object[k]; - object[Multiname.getPublicQualifiedName(k)] = v; - delete object[k]; - } - } -} -function asGetSlot(object, index) { - return object[object[VM_SLOTS].byID[index].name]; -} -function asSetSlot(object, index, value) { - var slotInfo = object[VM_SLOTS].byID[index]; - if (slotInfo.const) { - return; - } - var name = slotInfo.name; - var type = slotInfo.type; - if (type && type.coerce) { - object[name] = type.coerce(value); - } else { - object[name] = value; - } -} -function asHasNext2(object, index) { - if (isNullOrUndefined(object)) { - return { - index: 0, - object: null - }; - } - object = boxValue(object); - var nextIndex = object.asNextNameIndex(index); - if (nextIndex > 0) { - return { - index: nextIndex, - object: object - }; - } - while (true) { - var object = Object.getPrototypeOf(object); - if (!object) { - return { - index: 0, - object: null - }; - } - nextIndex = object.asNextNameIndex(0); - if (nextIndex > 0) { - return { - index: nextIndex, - object: object - }; - } - } - return { - index: 0, - object: null - }; -} -function getDescendants(object, mn) { - if (!isXMLType(object)) { - throw 'Not XML object in getDescendants'; - } - return object.descendants(mn); -} -function checkFilter(value) { - if (!value.class || !isXMLType(value)) { - throw 'TypeError operand of childFilter not of XML type'; - } - return value; -} -function Activation(methodInfo) { - this.methodInfo = methodInfo; -} -var ScopeStack = function () { - function scopeStack(parent) { - this.parent = parent; - this.stack = []; - this.isWith = []; - } - scopeStack.prototype.push = function push(object, isWith) { - this.stack.push(object); - this.isWith.push(!(!isWith)); - }; - scopeStack.prototype.get = function get(index) { - return this.stack[index]; - }; - scopeStack.prototype.clear = function clear() { - this.stack.length = 0; - this.isWith.length = 0; - }; - scopeStack.prototype.pop = function pop() { - this.isWith.pop(); - this.stack.pop(); - }; - scopeStack.prototype.topScope = function topScope() { - if (!this.scopes) { - this.scopes = []; - } - var parent = this.parent; - for (var i = 0; i < this.stack.length; i++) { - var object = this.stack[i], isWith = this.isWith[i], scope = this.scopes[i]; - if (!scope || scope.parent !== parent || scope.object !== object || scope.isWith !== isWith) { - scope = this.scopes[i] = new Scope(parent, object, isWith); - } - parent = scope; - } - return parent; - }; - return scopeStack; - }(); -var Scope = function () { - function scope(parent, object, isWith) { - this.parent = parent; - this.object = boxValue(object); - true; - this.global = parent ? parent.global : this; - this.isWith = isWith; - this.cache = createEmptyObject(); - } - scope.prototype.findDepth = function findDepth(object) { - var current = this; - var depth = 0; - while (current) { - if (current.object === object) { - return depth; - } - depth++; - current = current.parent; - } - return -1; - }; - function makeCacheKey(namespaces, name, flags) { - if (!namespaces) { - return name; - } else if (namespaces.length > 1) { - return namespaces.id + '$' + name; - } else { - return namespaces[0].qualifiedName + '$' + name; - } - } - scope.prototype.findScopeProperty = function findScopeProperty(namespaces, name, flags, domain, strict, scopeOnly) { - var object; - var key = makeCacheKey(namespaces, name, flags); - if (!scopeOnly && (object = this.cache[key])) { - return object; - } - if (this.object.asHasProperty(namespaces, name, flags, true)) { - return this.isWith ? this.object : this.cache[key] = this.object; - } - if (this.parent) { - return this.cache[key] = this.parent.findScopeProperty(namespaces, name, flags, domain, strict, scopeOnly); - } - if (scopeOnly) - return null; - if (object = domain.findDomainProperty(new Multiname(namespaces, name, flags), strict, true)) { - return object; - } - if (strict) { - unexpected('Cannot find property ' + name); - } - return this.global.object; - }; - scope.prototype.trace = function () { - var current = this; - while (current) { - print(current.object + (current.object ? ' - ' + current.object.debugName : '')); - current = current.parent; - } - }; - return scope; - }(); -function bindFreeMethodScope(methodInfo, scope) { - var fn = methodInfo.freeMethod; - if (methodInfo.lastBoundMethod && methodInfo.lastBoundMethod.scope === scope) { - return methodInfo.lastBoundMethod.boundMethod; - } - true; - var boundMethod; - var asGlobal = scope.global.object; - if (!methodInfo.hasOptional() && !methodInfo.needsArguments() && !methodInfo.needsRest()) { - switch (methodInfo.parameters.length) { - case 0: - boundMethod = function () { - return fn.call(this === jsGlobal ? asGlobal : this, scope); - }; - break; - case 1: - boundMethod = function (x) { - return fn.call(this === jsGlobal ? asGlobal : this, scope, x); - }; - break; - case 2: - boundMethod = function (x, y) { - return fn.call(this === jsGlobal ? asGlobal : this, scope, x, y); - }; - break; - case 3: - boundMethod = function (x, y, z) { - return fn.call(this === jsGlobal ? asGlobal : this, scope, x, y, z); - }; - break; - default: - break; - } - } - if (!boundMethod) { - Counter.count('Bind Scope - Slow Path'); - boundMethod = function () { - Array.prototype.unshift.call(arguments, scope); - var global = this === jsGlobal ? scope.global.object : this; - return fn.apply(global, arguments); - }; - } - boundMethod.methodInfo = methodInfo; - boundMethod.instanceConstructor = boundMethod; - methodInfo.lastBoundMethod = { - scope: scope, - boundMethod: boundMethod - }; - return boundMethod; -} -function nameInTraits(object, qn) { - if (object.hasOwnProperty(VM_BINDINGS) && object.hasOwnProperty(qn)) { - return true; - } - var proto = Object.getPrototypeOf(object); - return proto.hasOwnProperty(VM_BINDINGS) && proto.hasOwnProperty(qn); -} -function resolveMultinameUnguarded(object, mn, traitsOnly) { - true; - true; - object = boxValue(object); - var publicQn; - var isNative = isNativePrototype(object); - for (var i = 0, j = mn.namespaces.length; i < j; i++) { - var qn = mn.getQName(i); - if (traitsOnly) { - if (nameInTraits(object, Multiname.getQualifiedName(qn))) { - return qn; - } - continue; - } - if (mn.namespaces[i].isDynamic()) { - publicQn = qn; - if (isNative) { - break; - } - } else if (!isNative) { - if (Multiname.getQualifiedName(qn) in object) { - return qn; - } - } - } - if (publicQn && !traitsOnly && Multiname.getQualifiedName(publicQn) in object) { - return publicQn; - } - return undefined; -} +var asTypeOf = Shumway.AVM2.Runtime.asTypeOf; +var publicizeProperties = Shumway.AVM2.Runtime.publicizeProperties; +var asGetSlot = Shumway.AVM2.Runtime.asGetSlot; +var asSetSlot = Shumway.AVM2.Runtime.asSetSlot; +var asHasNext2 = Shumway.AVM2.Runtime.asHasNext2; +var getDescendants = Shumway.AVM2.Runtime.getDescendants; +var checkFilter = Shumway.AVM2.Runtime.checkFilter; +var ActivationInfo = Shumway.AVM2.Runtime.ActivationInfo; +var ScopeStack = Shumway.AVM2.Runtime.ScopeStack; +var Scope = Shumway.AVM2.Runtime.Scope; +var bindFreeMethodScope = Shumway.AVM2.Runtime.bindFreeMethodScope; +var nameInTraits = Shumway.AVM2.Runtime.nameInTraits; function resolveMultiname(object, mn, traitsOnly) { - enter(JS); - var result = resolveMultinameUnguarded(object, mn, traitsOnly); - leave(JS); - return result; + return object.resolveMultinameProperty(mn.namespaces, mn.name, mn.flags); } -function sliceArguments(args, offset) { - return Array.prototype.slice.call(args, offset); -} -function nonProxyingHasProperty(object, name) { - return name in object; -} -function forEachPublicProperty(object, fn, self) { - if (!object[VM_BINDINGS]) { - for (var key in object) { - fn.call(self, key, object[key]); - } - return; - } - for (var key in object) { - if (isNumeric(key)) { - fn.call(self, key, object[key]); - } else if (Multiname.isPublicQualifiedName(key) && object[VM_BINDINGS].indexOf(key) < 0) { - var name = key.substr(Multiname.PUBLIC_QUALIFIED_NAME_PREFIX.length); - fn.call(self, name, object[key]); - } - } -} -function wrapJSObject(object) { - var wrapper = Object.create(object); - for (var i in object) { - Object.defineProperty(wrapper, Multiname.getPublicQualifiedName(i), function (object, i) { - return { - get: function () { - return object[i]; - }, - set: function (value) { - object[i] = value; - }, - enumerable: true +var sliceArguments = Shumway.AVM2.Runtime.sliceArguments; +var nonProxyingHasProperty = Shumway.AVM2.Runtime.nonProxyingHasProperty; +var forEachPublicProperty = Shumway.AVM2.Runtime.forEachPublicProperty; +var wrapJSObject = Shumway.AVM2.Runtime.wrapJSObject; +var asCreateActivation = Shumway.AVM2.Runtime.asCreateActivation; +var CatchScopeObject = Shumway.AVM2.Runtime.CatchScopeObject; +var Global = Shumway.AVM2.Runtime.Global; +var canCompile = Shumway.AVM2.Runtime.canCompile; +var shouldCompile = Shumway.AVM2.Runtime.shouldCompile; +var forceCompile = Shumway.AVM2.Runtime.forceCompile; +var createInterpretedFunction = Shumway.AVM2.Runtime.createInterpretedFunction; +var debugName = Shumway.AVM2.Runtime.debugName; +var createCompiledFunction = Shumway.AVM2.Runtime.createCompiledFunction; +var getMethodOverrideKey = Shumway.AVM2.Runtime.getMethodOverrideKey; +var checkMethodOverrides = Shumway.AVM2.Runtime.checkMethodOverrides; +var makeTrampoline = Shumway.AVM2.Runtime.makeTrampoline; +var makeMemoizer = Shumway.AVM2.Runtime.makeMemoizer; +var createFunction = Shumway.AVM2.Runtime.createFunction; +var ensureFunctionIsInitialized = Shumway.AVM2.Runtime.ensureFunctionIsInitialized; +var getTraitFunction = Shumway.AVM2.Runtime.getTraitFunction; +var createClass = Shumway.AVM2.Runtime.createClass; +var sealConstantTraits = Shumway.AVM2.Runtime.sealConstantTraits; +var applyType = Shumway.AVM2.Runtime.applyType; +var throwError = Shumway.AVM2.Runtime.throwError; +var throwErrorFromVM = Shumway.AVM2.Runtime.throwErrorFromVM; +var translateError = Shumway.AVM2.Runtime.translateError; +var asIsInstanceOf = Shumway.AVM2.Runtime.asIsInstanceOf; +var asIsType = Shumway.AVM2.Runtime.asIsType; +var asAsType = Shumway.AVM2.Runtime.asAsType; +var asCoerceByMultiname = Shumway.AVM2.Runtime.asCoerceByMultiname; +var asCoerce = Shumway.AVM2.Runtime.asCoerce; +var asCoerceString = Shumway.AVM2.Runtime.asCoerceString; +var asCoerceInt = Shumway.AVM2.Runtime.asCoerceInt; +var asCoerceUint = Shumway.AVM2.Runtime.asCoerceUint; +var asCoerceNumber = Shumway.AVM2.Runtime.asCoerceNumber; +var asCoerceBoolean = Shumway.AVM2.Runtime.asCoerceBoolean; +var asCoerceObject = Shumway.AVM2.Runtime.asCoerceObject; +var asDefaultCompareFunction = Shumway.AVM2.Runtime.asDefaultCompareFunction; +var asCompare = Shumway.AVM2.Runtime.asCompare; +var asAdd = Shumway.AVM2.Runtime.asAdd; +var GlobalMultinameResolver = Shumway.AVM2.Runtime.GlobalMultinameResolver; +var Shumway; +(function (Shumway) { + (function (AVM2) { + (function (Runtime) { + Shumway.AVM2.Runtime.VM_METHOD_OVERRIDES['static mochi.as3.MochiServices::connect'] = function () { + return; }; - }(object, i)); - } - return wrapper; -} -function createActivation(methodInfo) { - return Object.create(methodInfo.activationPrototype); -} -function isClass(object) { - true; - return Object.hasOwnProperty.call(object, VM_IS_CLASS); -} -function isTrampoline(fn) { - true; - return fn.isTrampoline; -} -function isMemoizer(fn) { - true; - return fn.isMemoizer; -} -function CatchScopeObject(domain, trait) { - if (trait) { - new CatchBindings(new Scope(null, this), trait).applyTo(domain, this); - } -} -var Global = function () { - function global(script) { - this.scriptInfo = script; - script.global = this; - script.scriptBindings = new ScriptBindings(script, new Scope(null, this)); - script.scriptBindings.applyTo(script.abc.applicationDomain, this); - script.loaded = true; - } - global.prototype.toString = function () { - return '[object global]'; - }; - global.prototype.isExecuted = function () { - return this.scriptInfo.executed; - }; - global.prototype.isExecuting = function () { - return this.scriptInfo.executing; - }; - global.prototype.ensureExecuted = function () { - ensureScriptIsExecuted(this.scriptInfo); - }; - defineNonEnumerableProperty(global.prototype, Multiname.getPublicQualifiedName('toString'), function () { - return this.toString(); - }); - return global; - }(); -function canCompile(mi) { - if (!mi.hasBody) { - return false; - } - if (mi.hasExceptions() && !compilerEnableExceptions.value) { - return false; - } else if (mi.code.length > compilerMaximumMethodSize.value) { - return false; - } - return true; -} -function shouldCompile(mi) { - if (!canCompile(mi)) { - return false; - } - if (mi.isClassInitializer || mi.isScriptInitializer) { - return false; - } - return true; -} -function forceCompile(mi) { - if (mi.hasExceptions()) { - return false; - } - var holder = mi.holder; - if (holder instanceof ClassInfo) { - holder = holder.instanceInfo; - } - if (holder instanceof InstanceInfo) { - var packageName = holder.name.namespaces[0].originalURI; - switch (packageName) { - case 'flash.geom': - case 'flash.events': - return true; - default: - break; - } - var className = holder.name.getOriginalName(); - switch (className) { - case 'com.google.youtube.model.VideoData': - return true; - } - } - return false; -} -function createInterpretedFunction(methodInfo, scope, hasDynamicScope) { - var mi = methodInfo; - var hasDefaults = false; - var defaults = mi.parameters.map(function (p) { - if (p.value !== undefined) { - hasDefaults = true; - } - return p.value; - }); - var fn; - if (hasDynamicScope) { - fn = function (scope) { - var global = this === jsGlobal ? scope.global.object : this; - var args = sliceArguments(arguments, 1); - if (hasDefaults && args.length < defaults.length) { - args = args.concat(defaults.slice(args.length - defaults.length)); - } - return Interpreter.interpretMethod(global, methodInfo, scope, args); - }; - } else { - fn = function () { - var global = this === jsGlobal ? scope.global.object : this; - var args = sliceArguments(arguments); - if (hasDefaults && args.length < defaults.length) { - args = args.concat(defaults.slice(arguments.length - defaults.length)); - } - return Interpreter.interpretMethod(global, methodInfo, scope, args); - }; - } - fn.instanceConstructor = fn; - fn.debugName = 'Interpreter Function #' + vmNextInterpreterFunctionId++; - return fn; -} -var totalFunctionCount = 0; -var compiledFunctionCount = 0; -function debugName(value) { - if (isFunction(value)) { - return value.debugName; - } - return value; -} -function createCompiledFunction(methodInfo, scope, hasDynamicScope, breakpoint, deferCompilation) { - var mi = methodInfo; - $M.push(mi); - var result = Compiler.compileMethod(mi, scope, hasDynamicScope); - var parameters = result.parameters; - var body = result.body; - var fnName = mi.name ? Multiname.getQualifiedName(mi.name) : 'fn' + compiledFunctionCount; - if (mi.holder) { - var fnNamePrefix = ''; - if (mi.holder instanceof ClassInfo) { - fnNamePrefix = 'static$' + mi.holder.instanceInfo.name.getName(); - } else if (mi.holder instanceof InstanceInfo) { - fnNamePrefix = mi.holder.name.getName(); - } else if (mi.holder instanceof ScriptInfo) { - fnNamePrefix = 'script'; - } - fnName = fnNamePrefix + '$' + fnName; - } - fnName = escapeString(fnName); - if (mi.verified) { - fnName += '$V'; - } - if (compiledFunctionCount == functionBreak.value || breakpoint) { - body = '{ debugger; \n' + body + '}'; - } - var fnSource = 'function ' + fnName + ' (' + parameters.join(', ') + ') ' + body; - if (traceLevel.value > 1) { - mi.trace(new IndentingWriter(), mi.abc); - } - mi.debugTrace = function () { - mi.trace(new IndentingWriter(), mi.abc); - }; - if (traceLevel.value > 0) { - print(fnSource); - } - var fn = new Function('return ' + fnSource)(); - fn.debugName = 'Compiled Function #' + vmNextCompiledFunctionId++; - return fn; -} -function getMethodOverrideKey(methodInfo) { - var key; - if (methodInfo.holder instanceof ClassInfo) { - key = 'static ' + methodInfo.holder.instanceInfo.name.getOriginalName() + '::' + methodInfo.name.getOriginalName(); - } else if (methodInfo.holder instanceof InstanceInfo) { - key = methodInfo.holder.name.getOriginalName() + '::' + methodInfo.name.getOriginalName(); - } else { - key = methodInfo.name.getOriginalName(); - } - return key; -} -function checkMethodOverrides(methodInfo) { - if (methodInfo.name) { - var key = getMethodOverrideKey(methodInfo); - if (key in VM_METHOD_OVERRIDES) { - warning('Overriding Method: ' + key); - return VM_METHOD_OVERRIDES[key]; - } - } -} -function makeTrampoline(forward, parameterLength, description) { - true; - return function trampolineContext() { - var target = null; - var trampoline = function execute() { - if (traceExecution.value >= 3) { - print('Trampolining'); - } - Counter.count('Executing Trampoline'); - traceCallExecution.value > 1 && callWriter.writeLn('Trampoline: ' + description); - if (!target) { - target = forward(trampoline); - true; - } - return target.apply(this, arguments); - }; - trampoline.trigger = function trigger() { - Counter.count('Triggering Trampoline'); - if (!target) { - target = forward(trampoline); - true; - } - }; - trampoline.isTrampoline = true; - trampoline.debugName = 'Trampoline #' + vmNextTrampolineId++; - defineReadOnlyProperty(trampoline, VM_LENGTH, parameterLength); - return trampoline; - }(); -} -function makeMemoizer(qn, target) { - function memoizer() { - Counter.count('Runtime: Memoizing'); - if (traceExecution.value >= 3) { - print('Memoizing: ' + qn); - } - traceCallExecution.value > 1 && callWriter.writeLn('Memoizing: ' + qn); - if (isNativePrototype(this)) { - Counter.count('Runtime: Method Closures'); - return bindSafely(target.value, this); - } - if (isTrampoline(target.value)) { - target.value.trigger(); - } - true; - var mc = null; - if (isClass(this)) { - Counter.count('Runtime: Static Method Closures'); - mc = bindSafely(target.value, this); - defineReadOnlyProperty(this, qn, mc); - return mc; - } - if (Object.prototype.hasOwnProperty.call(this, qn)) { - var pd = Object.getOwnPropertyDescriptor(this, qn); - if (pd.get) { - Counter.count('Runtime: Method Closures'); - return bindSafely(target.value, this); - } - Counter.count('Runtime: Unpatched Memoizer'); - return this[qn]; - } - mc = bindSafely(target.value, this); - mc.methodInfo = target.value.methodInfo; - defineReadOnlyProperty(mc, Multiname.getPublicQualifiedName('prototype'), null); - defineReadOnlyProperty(this, qn, mc); - return mc; - } - Counter.count('Runtime: Memoizers'); - memoizer.isMemoizer = true; - memoizer.debugName = 'Memoizer #' + vmNextMemoizerId++; - return memoizer; -} -function createFunction(mi, scope, hasDynamicScope, breakpoint) { - true; - if (mi.freeMethod) { - if (hasDynamicScope) { - return bindFreeMethodScope(mi, scope); - } - return mi.freeMethod; - } - var fn; - if (fn = checkMethodOverrides(mi)) { - true; - return fn; - } - ensureFunctionIsInitialized(mi); - totalFunctionCount++; - var useInterpreter = false; - if ((mi.abc.applicationDomain.mode === EXECUTION_MODE.INTERPRET || !shouldCompile(mi)) && !forceCompile(mi)) { - useInterpreter = true; - } - if (compileOnly.value >= 0) { - if (Number(compileOnly.value) !== totalFunctionCount) { - print('Compile Only Skipping ' + totalFunctionCount); - useInterpreter = true; - } - } - if (compileUntil.value >= 0) { - if (totalFunctionCount > 1000) { - print(backtrace()); - print(AVM2.getStackTrace()); - } - if (totalFunctionCount > compileUntil.value) { - print('Compile Until Skipping ' + totalFunctionCount); - useInterpreter = true; - } - } - if (useInterpreter) { - mi.freeMethod = createInterpretedFunction(mi, scope, hasDynamicScope); - } else { - compiledFunctionCount++; - console.info('Compiling: ' + mi + ' count: ' + compiledFunctionCount); - if (compileOnly.value >= 0 || compileUntil.value >= 0) { - print('Compiling ' + totalFunctionCount); - } - mi.freeMethod = createCompiledFunction(mi, scope, hasDynamicScope, breakpoint, mi.isInstanceInitializer); - } - mi.freeMethod.methodInfo = mi; - if (hasDynamicScope) { - return bindFreeMethodScope(mi, scope); - } - return mi.freeMethod; -} -function ensureFunctionIsInitialized(methodInfo) { - var mi = methodInfo; - if (!mi.analysis) { - mi.analysis = new Analysis(mi); - if (mi.needsActivation()) { - mi.activationPrototype = new Activation(mi); - new ActivationBindings(mi).applyTo(mi.abc.applicationDomain, mi.activationPrototype); - } - var exceptions = mi.exceptions; - for (var i = 0, j = exceptions.length; i < j; i++) { - var handler = exceptions[i]; - if (handler.varName) { - var varTrait = Object.create(Trait.prototype); - varTrait.kind = TRAIT_Slot; - varTrait.name = handler.varName; - varTrait.typeName = handler.typeName; - varTrait.holder = mi; - handler.scopeObject = new CatchScopeObject(mi.abc.applicationDomain, varTrait); - } else { - handler.scopeObject = new CatchScopeObject(); - } - } - } -} -function getTraitFunction(trait, scope, natives) { - true; - true; - var mi = trait.methodInfo; - var fn; - if (mi.isNative()) { - var md = trait.metadata; - if (md && md.native) { - var nativeName = md.native.value[0].value; - var makeNativeFunction = getNative(nativeName); - fn = makeNativeFunction && makeNativeFunction(null, scope); - } else if (md && md.unsafeJSNative) { - fn = getNative(md.unsafeJSNative.value[0].value); - } else if (natives) { - var k = Multiname.getName(mi.name); - if (trait.isGetter()) { - fn = natives[k] ? natives[k].get : undefined; - } else if (trait.isSetter()) { - fn = natives[k] ? natives[k].set : undefined; - } else { - fn = natives[k]; - } - } - if (!fn) { - warning('No native method for: ' + trait.kindName() + ' ' + mi.holder.name + '::' + Multiname.getQualifiedName(mi.name)); - return function (mi) { - return function () { - warning('Calling undefined native method: ' + trait.kindName() + ' ' + mi.holder.name + '::' + Multiname.getQualifiedName(mi.name)); - }; - }(mi); - } - } else { - if (traceExecution.value >= 2) { - print('Creating Function For Trait: ' + trait.holder + ' ' + trait); - } - fn = createFunction(mi, scope, false); - true; - } - if (traceExecution.value >= 3) { - print('Made Function: ' + Multiname.getQualifiedName(mi.name)); - } - return fn; -} -function makeQualifiedNameTraitMap(traits) { - var map = createEmptyObject(); - for (var i = 0; i < traits.length; i++) { - map[Multiname.getQualifiedName(traits[i].name)] = traits[i]; - } - return map; -} -function createClass(classInfo, baseClass, scope) { - true; - var ci = classInfo; - var ii = ci.instanceInfo; - var domain = ci.abc.applicationDomain; - var className = Multiname.getName(ii.name); - if (traceExecution.value) { - print('Creating ' + (ii.isInterface() ? 'Interface' : 'Class') + ': ' + className + (ci.native ? ' replaced with native ' + ci.native.cls : '')); - } - var cls; - if (ii.isInterface()) { - cls = Interface.createInterface(classInfo); - } else { - cls = Class.createClass(classInfo, baseClass, scope); - } - if (traceClasses.value) { - domain.loadedClasses.push(cls); - domain.traceLoadedClasses(true); - } - if (ii.isInterface()) { - return cls; - } - domain.onMessage.notify1('classCreated', cls); - if (cls.instanceConstructor && cls !== Class) { - cls.verify(); - } - if (baseClass && (Multiname.getQualifiedName(baseClass.classInfo.instanceInfo.name.name) === 'Proxy' || baseClass.isProxy)) { - installProxyClassWrapper(cls); - cls.isProxy = true; - } - createFunction(classInfo.init, scope, false).call(cls); - if (sealConstTraits) { - this.sealConstantTraits(cls, ci.traits); - } - return cls; -} -function sealConstantTraits(object, traits) { - for (var i = 0, j = traits.length; i < j; i++) { - var trait = traits[i]; - if (trait.isConst()) { - var qn = Multiname.getQualifiedName(trait.name); - var value = object[qn]; - (function (qn, value) { - Object.defineProperty(object, qn, { - configurable: false, - enumerable: false, - get: function () { - return value; - }, - set: function () { - throwErrorFromVM(AVM2.currentDomain(), 'ReferenceError', 'Illegal write to read-only property ' + qn + '.'); - } - }); - }(qn, value)); - } - } -} -function applyType(domain, factory, types) { - var factoryClassName = factory.classInfo.instanceInfo.name.name; - if (factoryClassName === 'Vector') { - true; - var type = types[0]; - var typeClassName; - if (!isNullOrUndefined(type)) { - typeClassName = type.classInfo.instanceInfo.name.name.toLowerCase(); - switch (typeClassName) { - case 'int': - case 'uint': - case 'double': - case 'object': - return domain.getClass('packageInternal __AS3__.vec.Vector$' + typeClassName); - } - } - return domain.getClass('packageInternal __AS3__.vec.Vector$object').applyType(type); - } else { - return notImplemented(factoryClassName); - } -} -function checkArgumentCount(name, expected, got) { - if (got !== expected) { - throwError('ArgumentError', Errors.WrongArgumentCountError, name, expected, got); - } -} -function throwError(name, error) { - if (true) { - var message = formatErrorMessage.apply(null, Array.prototype.slice.call(arguments, 1)); - throwErrorFromVM(AVM2.currentDomain(), name, message, error.code); - } else { - throwErrorFromVM(AVM2.currentDomain(), name, getErrorMessage(error.code), error.code); - } -} -function throwErrorFromVM(domain, errorClass, message, id) { - var error = new (domain.getClass(errorClass)).instanceConstructor(message, id); - throw error; -} -function translateError(domain, error) { - if (error instanceof Error) { - var type = domain.getClass(error.name); - if (type) { - return new type.instanceConstructor(translateErrorMessage(error)); - } - unexpected('Can\'t translate error: ' + error); - } - return error; -} -function asIsInstanceOf(type, value) { - return type.isInstanceOf(value); -} -function asIsType(type, value) { - return type.isInstance(value); -} -function asAsType(type, value) { - return asIsType(type, value) ? value : null; -} -function asCoerceByMultiname(domain, multiname, value) { - true; - switch (Multiname.getQualifiedName(multiname)) { - case Multiname.Int: - return asCoerceInt(value); - case Multiname.Uint: - return asCoerceUint(value); - case Multiname.String: - return asCoerceString(value); - case Multiname.Number: - return asCoerceNumber(value); - case Multiname.Boolean: - return asCoerceBoolean(value); - case Multiname.Object: - return asCoerceObject(value); - } - return asCoerce(domain.getType(multiname), value); -} -function asCoerce(type, value) { - if (type.coerce) { - return type.coerce(value); - } - if (isNullOrUndefined(value)) { - return null; - } - if (type.isInstance(value)) { - return value; - } else { - true; - } -} -function asCoerceString(x) { - if (typeof x === 'string') { - return x; - } else if (x == undefined) { - return null; - } - return x + ''; -} -function asCoerceInt(x) { - return x | 0; -} -function asCoerceUint(x) { - return x >>> 0; -} -function asCoerceNumber(x) { - return +x; -} -function asCoerceBoolean(x) { - return !(!x); -} -function asCoerceObject(x) { - if (x == undefined) { - return null; - } - if (typeof x === 'string' || typeof x === 'number') { - return x; - } - return Object(x); -} -function asDefaultCompareFunction(a, b) { - return String(a).localeCompare(String(b)); -} -function asCompare(a, b, options, compareFunction) { - true; - true; - var result = 0; - if (!compareFunction) { - compareFunction = asDefaultCompareFunction; - } - if (options & SORT_CASEINSENSITIVE) { - a = String(a).toLowerCase(); - b = String(b).toLowerCase(); - } - if (options & SORT_NUMERIC) { - a = toNumber(a); - b = toNumber(b); - result = a < b ? -1 : a > b ? 1 : 0; - } else { - result = compareFunction(a, b); - } - if (options & SORT_DESCENDING) { - result *= -1; - } - return result; -} -function asAdd(l, r) { - if (typeof l === 'string' || typeof r === 'string') { - return String(l) + String(r); - } - return l + r; -} -var GlobalMultinameResolver = function () { - var hasNonDynamicNamespaces = createEmptyObject(); - var wasResolved = createEmptyObject(); - function updateTraits(traits) { - for (var i = 0; i < traits.length; i++) { - var trait = traits[i]; - var name = trait.name.name; - var namespace = trait.name.getNamespace(); - if (!namespace.isDynamic()) { - hasNonDynamicNamespaces[name] = true; - if (wasResolved[name]) { - notImplemented('We have to the undo the optimization, ' + name + ' can now bind to ' + namespace); - } - } - } - } - return { - loadAbc: function loadAbc(abc) { - if (!globalMultinameAnalysis.value) { - return; - } - var scripts = abc.scripts; - var classes = abc.classes; - var methods = abc.methods; - for (var i = 0; i < scripts.length; i++) { - updateTraits(scripts[i].traits); - } - for (var i = 0; i < classes.length; i++) { - updateTraits(classes[i].traits); - updateTraits(classes[i].instanceInfo.traits); - } - for (var i = 0; i < methods.length; i++) { - if (methods[i].traits) { - updateTraits(methods[i].traits); - } - } - }, - resolveMultiname: function resolveMultiname(multiname) { - var name = multiname.name; - if (hasNonDynamicNamespaces[name]) { - return; - } - wasResolved[name] = true; - return new Multiname([ - ShumwayNamespace.PUBLIC - ], multiname.name); - } - }; - }(); -VM_METHOD_OVERRIDES['static mochi.as3.MochiServices::connect'] = function () { - return; -}; -VM_METHOD_OVERRIDES['static MochiBot::track'] = function () { - return; -}; -VM_METHOD_OVERRIDES['com.midasplayer.debug.DebugLog::trace'] = function (msg) { - console.log(msg); -}; -VM_METHOD_OVERRIDES['com.midasplayer.engine.comm.DebugGameComm::getGameData'] = function () { - return '\ntrue\ntrue\nfalse\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\nCandy crushed\nbest ever\nscored {0} in one game\nAll Clear Created\ncrushed {0} candy in one game\nScore\nPlease register to play the full game\nLongest chain\nGame ends in {0} seconds\nSuper Stripes Created\nNo more moves!\nMega-Candy Created\nGame starts in {0} seconds\nnow\nLevel reached\nGame Over\nMatch 3 Candy of the same colour to crush them. Matching 4 or 5 in different formations generates special sweets that are extra tasty.\nYou can also combine the special sweets for additional effects by switching them with each other. Try these combinations for a taste you will not forget: \nDouble Colour Bombs Created\nmade {0} combined candy in one game\nPlay like this:\n'; -}; -VM_METHOD_OVERRIDES['com.antkarlov.Preloader::com.antkarlov:Preloader.isUrl'] = function () { - return true; -}; -VM_METHOD_OVERRIDES['static com.demonsters.debugger.MonsterDebugger::initialize'] = function () { -}; -VM_METHOD_OVERRIDES['com.spilgames.api.core.tracking.TrackConfig::getTrackers'] = function () { - return []; -}; -VM_METHOD_OVERRIDES['com.spilgames.api.components.TextFields.AutoFitTextFieldEx::com.spilgames.api.components.TextFields:AutoFitTextFieldEx.updateProperties'] = VM_METHOD_OVERRIDES['com.spilgames.api.components.TextFields.AutoFitTextFieldEx::com.spilgames.api.components.TextFields:AutoFitTextFieldEx.updateTextSize'] = function () { -}; + Shumway.AVM2.Runtime.VM_METHOD_OVERRIDES['static MochiBot::track'] = function () { + return; + }; + Shumway.AVM2.Runtime.VM_METHOD_OVERRIDES['com.midasplayer.debug.DebugLog::trace'] = function (msg) { + log(msg); + }; + Shumway.AVM2.Runtime.VM_METHOD_OVERRIDES['com.midasplayer.engine.comm.DebugGameComm::getGameData'] = function () { + return '\ntrue\ntrue\nfalse\n0\n0\n0\n0\n0\n0\n0\n0\n0\n0\nCandy crushed\nbest ever\nscored {0} in one game\nAll Clear Created\ncrushed {0} candy in one game\nScore\nPlease register to play the full game\nLongest chain\nGame ends in {0} seconds\nSuper Stripes Created\nNo more moves!\nMega-Candy Created\nGame starts in {0} seconds\nnow\nLevel reached\nGame Over\nMatch 3 Candy of the same colour to crush them. Matching 4 or 5 in different formations generates special sweets that are extra tasty.\nYou can also combine the special sweets for additional effects by switching them with each other. Try these combinations for a taste you will not forget: \nDouble Colour Bombs Created\nmade {0} combined candy in one game\nPlay like this:\n'; + }; + Shumway.AVM2.Runtime.VM_METHOD_OVERRIDES['com.antkarlov.Preloader::com.antkarlov:Preloader.isUrl'] = function () { + return true; + }; + Shumway.AVM2.Runtime.VM_METHOD_OVERRIDES['static com.demonsters.debugger.MonsterDebugger::initialize'] = function () { + }; + Shumway.AVM2.Runtime.VM_METHOD_OVERRIDES['com.spilgames.api.core.tracking.TrackConfig::getTrackers'] = function () { + return []; + }; + Shumway.AVM2.Runtime.VM_METHOD_OVERRIDES['com.spilgames.api.components.TextFields.AutoFitTextFieldEx::com.spilgames.api.components.TextFields:AutoFitTextFieldEx.updateProperties'] = Shumway.AVM2.Runtime.VM_METHOD_OVERRIDES['com.spilgames.api.components.TextFields.AutoFitTextFieldEx::com.spilgames.api.components.TextFields:AutoFitTextFieldEx.updateTextSize'] = function () { + }; + }(AVM2.Runtime || (AVM2.Runtime = {}))); + var Runtime = AVM2.Runtime; + }(Shumway.AVM2 || (Shumway.AVM2 = {}))); + var AVM2 = Shumway.AVM2; +}(Shumway || (Shumway = {}))); +var checkArguments = true; function asCheckVectorSetNumericProperty(i, length, fixed) { if (i < 0 || i > length || i === length && fixed || !isNumeric(i)) { throwError('RangeError', Errors.OutOfRangeError, i, length); @@ -28034,10 +29922,9 @@ var TypedArrayVector = function () { return vector; }(); var typedArrayVectorTemplate = 'var EXTRA_CAPACITY=4,INITIAL_CAPACITY=10,DEFAULT_VALUE=0;function vector(a,b){a|=0;this._fixed=!!b;this._buffer=new Int32Array(Math.max(INITIAL_CAPACITY,a+EXTRA_CAPACITY));this._offset=0;this._length=a}vector.callable=function(a){if(a instanceof vector)return a;var b=a.asGetProperty(void 0,"length");if(void 0!==b){for(var c=new vector(b,!1),d=0;d>2,this._buffer.set(this._view(),b),this._offset=b):(a=3*this._buffer.length>>2,ab?1:0):f=d(a,b);c&vector.DESCENDING&&(f*=-1);return f} function _sort(a){for(var b=[],c=-1,d=0,f=a.length-1,e,g,h,k;;)if(100>=f-d){for(g=d+1;g<=f;g++){h=a[g];for(e=g-1;e>=d&&a[e]>h;)a[e+1]=a[e--];a[e+1]=h}if(-1==c)break;f=b[c--];d=b[c--]}else{k=d+f>>1;e=d+1;g=f;h=a[k];a[k]=a[e];a[e]=h;a[d]>a[f]&&(h=a[d],a[d]=a[f],a[f]=h);a[e]>a[f]&&(h=a[e],a[e]=a[f],a[f]=h);a[d]>a[e]&&(h=a[d],a[d]=a[e],a[e]=h);for(k=a[e];;){do e++;while(a[e]k);if(g=g-d?(b[++c]=e,b[++c]=f,f=g-1):(b[++c]=d, b[++c]=g-1,d=e)}return a}vector.prototype._sortNumeric=function(a){_sort(this._view());a&&this.reverse()};vector.prototype.sort=function(){if(0===arguments.length)return Array.prototype.sort.call(this._view());var a,b=0;arguments[0]instanceof Function?a=arguments[0]:isNumber(arguments[0])&&(b=arguments[0]);isNumber(arguments[1])&&(b=arguments[1]);if(b&TypedArrayVector.NUMERIC)return this._sortNumeric(b&vector.DESCENDING);Array.prototype.sort.call(this._view(),function(c,d){return compare(c,d,b,a)})}; vector.prototype.asGetNumericProperty=function(a){checkArguments&&asCheckVectorGetNumericProperty(a,this._length);return this._buffer[this._offset+a]};vector.prototype.asSetNumericProperty=function(a,b){checkArguments&&asCheckVectorSetNumericProperty(a,this._length,this._fixed);a===this._length&&(this._ensureCapacity(this._length+1),this._length++);this._buffer[this._offset+a]=b};vector.prototype.shift=function(){this._checkFixed();if(0===this._length)return 0;this._length--;return this._buffer[this._offset++]}; vector.prototype._checkFixed=function(){this._fixed&&throwError("RangeError",Errors.VectorFixedError)};vector.prototype._slide=function(a){this._buffer.set(this._view(),this._offset+a);this._offset+=a};vector.prototype.unshift=function(){this._checkFixed();if(arguments.length){this._ensureCapacity(this._length+arguments.length);this._slide(arguments.length);this._offset-=arguments.length;this._length+=arguments.length;for(var a=0;a>>=0;if(a>this._length){this._ensureCapacity(a);for(var b=this._offset+this._length,c=this._offset+a;b/g, '>'); + return escapeAttributeValue(text.value); }, attribute: function (n) { return escapeAttributeValue(n.value); @@ -28576,7 +30462,7 @@ var isXMLType, isXMLName, XMLParser; this.encode = encode; } function escapeAttributeValue(v) { - return v.replace(/&/g, '&').replace(//g, '>'); + return v.replace('&', '&').replace('<', '<').replace('>', '>'); } XMLParser = function XMLParser() { function parseXml(s, sink) { @@ -28662,9 +30548,14 @@ var isXMLType, isXMLName, XMLParser; }; } } + var whitespaceMap = { + '10': true, + '13': true, + '9': true, + '32': true + }; function isWhitespace(s, index) { - var ch = s.charCodeAt(index); - return ch == 10 || ch == 13 || ch == 9 || ch == 32; + return s.charCodeAt(index) in whitespaceMap; } function parseContent(s, start) { var pos = start, name, attributes = []; @@ -28783,39 +30674,42 @@ var isXMLType, isXMLName, XMLParser; var scope = { namespaces: [] }; - for (q = 0; q < content.attributes.length; ++q) { - if (content.attributes[q].name.substring(0, 6) === 'xmlns:') { - var prefix = content.attributes[q].name.substring(6); - var uri = content.attributes[q].value; + var contentAttributes = content.attributes; + for (q = 0; q < contentAttributes.length; ++q) { + var attribute = contentAttributes[q]; + var attributeName = attribute.name; + if (attributeName.substring(0, 6) === 'xmlns:') { + var prefix = attributeName.substring(6); + var uri = attribute.value; scope.namespaces[prefix] = trim(uri); scope.namespaces.push({ uri: uri, prefix: prefix }); - delete content.attributes[q]; - } else if (content.attributes[q].name === 'xmlns') { - var prefix = ''; - var uri = content.attributes[q].value; + delete contentAttributes[q]; + } else if (attributeName === 'xmlns') { + var uri = attribute.value; scope.namespaces['xmlns'] = trim(uri); scope.namespaces.push({ uri: uri, - prefix: prefix + prefix: '' }); - delete content.attributes[q]; - } else if (content.attributes[q].name.substring(0, 4) === 'xml:') { - scope[content.attributes[q].name.substring(4)] = trim(content.attributes[q].value); - } else if (content.attributes[q].name.substring(0, 3) === 'xml') { + delete contentAttributes[q]; + } else if (attributeName.substring(0, 4) === 'xml:') { + scope[attributeName.substring(4)] = trim(attribute.value); + } else if (attributeName.substring(0, 3) === 'xml') { throw 'Invalid xml attribute'; } else { } } scopes.push(scope); var attributes = []; - for (q = 0; q < content.attributes.length; ++q) { - if (content.attributes[q]) { + for (q = 0; q < contentAttributes.length; ++q) { + attribute = contentAttributes[q]; + if (attribute) { attributes.push({ - name: getName(content.attributes[q].name, false), - value: content.attributes[q].value + name: getName(attribute.name, false), + value: attribute.value }); } } @@ -28848,13 +30742,15 @@ var isXMLType, isXMLName, XMLParser; elementsStack.push(parent); currentElement = createNode('element', name.namespace, name.localName, name.prefix); for (var i = 0; i < attrs.length; ++i) { - var attr = createNode('attribute', attrs[i].name.namespace, attrs[i].name.localName, attrs[i].name.prefix); - attr.value = attrs[i].value; + var rawAttr = attrs[i]; + var attr = createNode('attribute', rawAttr.name.namespace, rawAttr.name.localName, rawAttr.name.prefix); + attr.value = rawAttr.value; currentElement.attributes.push(attr); } var namespaces = scope.namespaces; for (var i = 0; i < namespaces.length; ++i) { - var ns = ShumwayNamespace.createNamespace(namespaces[i].uri, namespaces[i].prefix); + var rawNs = namespaces[i]; + var ns = ASNamespace.createNamespace(rawNs.uri, rawNs.prefix); currentElement.inScopeNamespaces.push(ns); } parent.insert(parent.length(), currentElement); @@ -28992,7 +30888,7 @@ var isXMLType, isXMLName, XMLParser; } scope = scope.parent; } - var ns = ShumwayNamespace.createNamespace('', ''); + var ns = ASNamespace.createNamespace('', ''); return ns; } isXMLName = function isXMLName(v) { @@ -29005,19 +30901,19 @@ var isXMLType, isXMLName, XMLParser; }; function asGetProperty(namespaces, name, flags, isMethod) { var mn = isNumeric(name) ? toNumber(name) : name instanceof QName ? name.mn : new Multiname(namespaces ? namespaces : [ - ShumwayNamespace.PUBLIC + ASNamespace.PUBLIC ], name, flags); return this.getProperty(mn, isMethod); } function asSetProperty(namespaces, name, flags, value) { var mn = isNumeric(name) ? toNumber(name) : name instanceof QName ? name.mn : new Multiname(namespaces ? namespaces : [ - ShumwayNamespace.PUBLIC + ASNamespace.PUBLIC ], name, flags); this.setProperty(mn, value); } function asHasProperty(namespaces, name, flags) { var mn = isNumeric(name) ? toNumber(name) : name instanceof QName ? name.mn : new Multiname(namespaces ? namespaces : [ - ShumwayNamespace.PUBLIC + ASNamespace.PUBLIC ], name, flags); return this.hasProperty(mn); } @@ -29026,7 +30922,7 @@ var isXMLType, isXMLName, XMLParser; var property = this.asGetProperty(namespaces, name, flags, true); if (!property) { return this.toString().asCallProperty(namespaces ? namespaces : [ - ShumwayNamespace.PUBLIC + ASNamespace.PUBLIC ], name, flags, isLex, args); } return property.apply(receiver, args); @@ -29232,10 +31128,10 @@ var isXMLType, isXMLName, XMLParser; Xp.asCallProperty = asCallProperty; Xp.getProperty = function (mn, isMethod) { if (isMethod) { - var resolved = Multiname.isQName(mn) ? mn : resolveMultiname(this, mn); + var resolved = Multiname.isQName(mn) ? mn : this.resolveMultinameProperty(mn.namespaces, mn.name, mn.flags); return this[Multiname.getQualifiedName(resolved)]; } - if (isNumeric(mn)) { + if (!Multiname.isQName(mn) && isNumeric(mn)) { if (Number(0) === 0) { return this; } @@ -29266,10 +31162,10 @@ var isXMLType, isXMLName, XMLParser; }; Xp.hasProperty = function (mn, isMethod) { if (isMethod) { - var resolved = Multiname.isQName(mn) ? mn : resolveMultiname(this, mn); + var resolved = Multiname.isQName(mn) ? mn : this.resolveMultinameProperty(mn.namespaces, mn.name, mn.flags); return !(!this[Multiname.getQualifiedName(resolved)]); } - if (isNumeric(mn)) { + if (!Multiname.isQName(mn) && isNumeric(mn)) { if (Number(0) === 0) { return true; } @@ -29300,7 +31196,7 @@ var isXMLType, isXMLName, XMLParser; })) { return true; } - var resolved = Multiname.isQName(mn) ? mn : resolveMultiname(this, mn); + var resolved = Multiname.isQName(mn) ? mn : this.resolveMultinameProperty(mn.namespaces, mn.name, mn.flags); return !(!this[Multiname.getQualifiedName(resolved)]); } }; @@ -29889,7 +31785,7 @@ var isXMLType, isXMLName, XMLParser; }; XLp.getProperty = function (mn, isMethod) { if (isMethod) { - var resolved = Multiname.isQName(mn) ? mn : resolveMultiname(this, mn); + var resolved = Multiname.isQName(mn) ? mn : this.resolveMultinameProperty(mn.namespaces, mn.name, mn.flags); return this[Multiname.getQualifiedName(resolved)]; } var x = this; @@ -29912,7 +31808,7 @@ var isXMLType, isXMLName, XMLParser; }; XLp.hasProperty = function (mn, isMethod) { if (isMethod) { - var resolved = Multiname.isQName(mn) ? mn : resolveMultiname(this, mn); + var resolved = Multiname.isQName(mn) ? mn : this.resolveMultinameProperty(mn.namespaces, mn.name, mn.flags); return !(!this[Multiname.getQualifiedName(resolved)]); } var x = this; @@ -30252,7 +32148,7 @@ var isXMLType, isXMLName, XMLParser; defineNonEnumerableGetter(QNp, 'uri', function () { if (!this._uri) { var ns = this.mn.namespaces[0]; - this._uri = ns && ns.originalURI ? ns.originalURI : this.isAny || this.isAnyNamespace ? null : ''; + this._uri = ns && ns.uri ? ns.uri : this.isAny || this.isAnyNamespace ? null : ''; } return this._uri; }); @@ -30276,7 +32172,7 @@ var isXMLType, isXMLName, XMLParser; } } if (!ns) { - ns = ShumwayNamespace.createNamespace(this.uri); + ns = ASNamespace.createNamespace(this.uri); } return ns; }; @@ -30298,107 +32194,6 @@ var isXMLType, isXMLName, XMLParser; return c; }; }()); -var JSON; -JSON || (JSON = {}); -(function () { - function k(a) { - return a < 10 ? '0' + a : a; - } - function o(a) { - p.lastIndex = 0; - return p.test(a) ? '"' + a.replace(p, function (a) { - var c = r[a]; - return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : '"' + a + '"'; - } - function l(a, j) { - var c, d, h, m, g = e, f, b = j[a]; - b && typeof b === 'object' && typeof b.toJSON === 'function' && (b = b.toJSON(a)); - typeof i === 'function' && (b = i.call(j, a, b)); - switch (typeof b) { - case 'string': - return o(b); - case 'number': - return isFinite(b) ? String(b) : 'null'; - case 'boolean': - case 'null': - return String(b); - case 'object': - if (!b) - return 'null'; - e += n; - f = []; - if (Object.prototype.toString.apply(b) === '[object Array]') { - m = b.length; - for (c = 0; c < m; c += 1) - f[c] = l(c, b) || 'null'; - h = f.length === 0 ? '[]' : e ? '[\n' + e + f.join(',\n' + e) + '\n' + g + ']' : '[' + f.join(',') + ']'; - e = g; - return h; - } - if (i && typeof i === 'object') { - m = i.length; - for (c = 0; c < m; c += 1) - typeof i[c] === 'string' && (d = i[c], (h = l(d, b)) && f.push(o(d) + (e ? ': ' : ':') + h)); - } else - for (d in b) - Object.prototype.hasOwnProperty.call(b, d) && (h = l(d, b)) && f.push(o(d) + (e ? ': ' : ':') + h); - h = f.length === 0 ? '{}' : e ? '{\n' + e + f.join(',\n' + e) + '\n' + g + '}' : '{' + f.join(',') + '}'; - e = g; - return h; - } - } - if (typeof Date.prototype.toJSON !== 'function') - Date.prototype.toJSON = function () { - return isFinite(this.valueOf()) ? this.getUTCFullYear() + '-' + k(this.getUTCMonth() + 1) + '-' + k(this.getUTCDate()) + 'T' + k(this.getUTCHours()) + ':' + k(this.getUTCMinutes()) + ':' + k(this.getUTCSeconds()) + 'Z' : null; - }, String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function () { - return this.valueOf(); - }; - var q = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, p = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, e, n, r = { - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"': '\\"', - '\\': '\\\\' - }, i; - if (typeof JSON.stringify !== 'function') - JSON.stringify = function (a, j, c) { - var d; - n = e = ''; - if (typeof c === 'number') - for (d = 0; d < c; d += 1) - n += ' '; - else - typeof c === 'string' && (n = c); - if ((i = j) && typeof j !== 'function' && (typeof j !== 'object' || typeof j.length !== 'number')) - throw Error('JSON.stringify'); - return l('', { - '': a - }); - }; - if (typeof JSON.parse !== 'function') - JSON.parse = function (a, e) { - function c(a, d) { - var g, f, b = a[d]; - if (b && typeof b === 'object') - for (g in b) - Object.prototype.hasOwnProperty.call(b, g) && (f = c(b, g), f !== void 0 ? b[g] = f : delete b[g]); - return e.call(a, d, b); - } - var d, a = String(a); - q.lastIndex = 0; - q.test(a) && (a = a.replace(q, function (a) { - return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - })); - if (/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) - return d = eval('(' + a + ')'), typeof e === 'function' ? c({ - '': d - }, '') : d; - throw new SyntaxError('JSON.parse'); - }; -}()); var AMFUtils = function AMFUtilsClosure() { var AMF0_NUMBER_MARKER = 0; var AMF0_BOOLEAN_MARKER = 1; @@ -30896,11 +32691,9 @@ var proxyTrapQns = { }; for (var name in proxyTrapQns) { proxyTrapQns[name] = VM_OPEN_METHOD_PREFIX + Multiname.getQualifiedName(new Multiname([ - ShumwayNamespace.PROXY + ASNamespace.PROXY ], name)); } -var VM_IS_PROXY = 'vm is proxy'; -var VM_CALL_PROXY = 'vm call proxy'; function isProxyObject(obj) { return obj[VM_IS_PROXY]; } @@ -30950,7 +32743,7 @@ function installProxyClassWrapper(cls) { if (TRACE_PROXY) { print('proxy call, class: ' + target.class + ', mn: ' + mn + 'hasNonProxyingCallerr: ' + hasNonProxyingCaller()); } - var resolved = Multiname.isQName(mn) ? mn : resolveMultiname(target, mn); + var resolved = Multiname.isQName(mn) ? mn : target.resolveMultinameProperty(mn.namespaces, mn.name, mn.flags); var qn = resolved ? Multiname.getQualifiedName(resolved) : Multiname.getPublicQualifiedName(mn.name); if (!nameInTraits(target, qn)) { return target[proxyTrapQns.callProperty](mn.name, args); @@ -30958,8 +32751,8 @@ function installProxyClassWrapper(cls) { if (TRACE_PROXY) { TRACE_PROXY && print('> proxy pass through ' + resolved); } - if (target[VM_OPEN_METHODS] && target[VM_OPEN_METHODS][qn]) { - return target[VM_OPEN_METHODS][qn].apply(o, args); + if (target.asOpenMethods && target.asOpenMethods[qn]) { + return target.asOpenMethods[qn].apply(o, args); } return undefined; }; @@ -30973,8 +32766,8 @@ function installProxyClassWrapper(cls) { return target[proxyTrapQns.getProperty](name); } } - if (target[VM_OPEN_METHODS] && target[VM_OPEN_METHODS][qn]) { - return bindSafely(target[VM_OPEN_METHODS][qn], o); + if (target.asOpenMethods && target.asOpenMethods[qn]) { + return bindSafely(target.asOpenMethods[qn], o); } TRACE_PROXY && print('> proxy pass through ' + qn); return target[qn]; @@ -31114,7 +32907,7 @@ function debugBreak(message) { debugger; print('\x1b[91mdebugBreak: ' + message + '\x1b[0m'); } -var ASNamespace; +var NativeASNamespace; var natives = function () { var C = ApplicationDomain.passthroughCallable; var CC = ApplicationDomain.constructingCallable; @@ -31122,14 +32915,6 @@ var natives = function () { var c = new Class('Object', Object, C(Object)); c.native = { instance: { - length: { - get: function () { - return this.length; - }, - set: function (l) { - this.length = l; - } - }, isPrototypeOf: Object.prototype.isPrototypeOf, hasOwnProperty: function (name) { if (name === undefined) { @@ -31230,7 +33015,7 @@ var natives = function () { length: { get: function () { if (this.hasOwnProperty(VM_LENGTH)) { - return this[VM_LENGTH]; + return this.asLength; } return this.length; } @@ -31250,6 +33035,16 @@ var natives = function () { }; return c; } + function MethodClosure($this, fn) { + var bound = bindSafely(fn, $this); + defineNonEnumerableProperty(this, 'call', bound.call.bind(bound)); + defineNonEnumerableProperty(this, 'apply', bound.apply.bind(bound)); + } + MethodClosure.prototype = { + toString: function () { + return 'function Function() {}'; + } + }; function MethodClosureClass(runtime, scope, instanceConstructor, baseClass) { var c = new Class('MethodClosure', MethodClosure); c.extendBuiltin(baseClass); @@ -31626,7 +33421,7 @@ var natives = function () { return c; } function NamespaceClass(runtime, scope, instanceConstructor, baseClass) { - ASNamespace = function ASNamespace(prefixValue, uriValue) { + NativeASNamespace = function NativeASNamespace(prefixValue, uriValue) { if (uriValue === undefined) { uriValue = prefixValue; prefixValue = undefined; @@ -31638,8 +33433,8 @@ var natives = function () { uri = ''; } else if (typeof uriValue === 'object') { prefix = uriValue.prefix; - if (uriValue instanceof ShumwayNamespace) { - uri = uriValue.originalURI; + if (uriValue instanceof ASNamespace) { + uri = uriValue.uri; } else if (uriValue instanceof QName) { uri = uriValue.uri; } @@ -31671,11 +33466,11 @@ var natives = function () { prefix = prefixValue + ''; } } - return ShumwayNamespace.createNamespace(uri, prefix); + return ASNamespace.createNamespace(uri, prefix); }; - var c = new Class('Namespace', ASNamespace, C(ASNamespace)); - c.extendNative(baseClass, ShumwayNamespace); - var Np = ShumwayNamespace.prototype; + var c = new Class('Namespace', NativeASNamespace, C(NativeASNamespace)); + c.extendNative(baseClass, ASNamespace); + var Np = ASNamespace.prototype; c.native = { instance: { prefix: { @@ -31710,7 +33505,7 @@ var natives = function () { var key = keys[i]; var jsKey = key; if (!isNumeric(key)) { - jsKey = fromResolvedName(key); + jsKey = Multiname.getNameFromPublicQualifiedName(key); } result[jsKey] = transformASValueToJS(value[key]); } @@ -31951,7 +33746,7 @@ var natives = function () { instance: { init: function (base) { this.base = base; - this.nativeObject = new ApplicationDomain(avm2, base ? base.nativeObject : null); + this.nativeObject = new ApplicationDomain(AVM2.instance, base ? base.nativeObject : null); }, loadBytes: function (byteArray, swfVersion) { this.nativeObject.executeAbc(new AbcFile(byteArray.readRawBytes())); @@ -32104,9 +33899,9 @@ var natives = function () { } if (cls) { var name = cls.classInfo.instanceInfo.name; - var originalURI = name.namespaces[0].originalURI; - if (originalURI) { - return originalURI + '::' + name.name; + var uri = name.namespaces[0].uri; + if (uri) { + return uri + '::' + name.name; } return name.name; } @@ -32134,9 +33929,9 @@ var natives = function () { } if (cls && cls.baseClass) { var name = cls.baseClass.classInfo.instanceInfo.name; - var originalURI = name.namespaces[0].originalURI; - if (originalURI) { - return originalURI + '::' + name.name; + var uri = name.namespaces[0].uri; + if (uri) { + return uri + '::' + name.name; } return name.name; } @@ -32201,8 +33996,8 @@ var natives = function () { function unmangledQualifiedName(mn) { var name = mn.name; var namespace = mn.namespaces[0]; - if (namespace && namespace.originalURI) { - return namespace.originalURI + '::' + name; + if (namespace && namespace.uri) { + return namespace.uri + '::' + name; } return name; } @@ -32592,7 +34387,7 @@ var SourceTracer = function () { traits.forEach(function (trait) { var str; var accessModifier = Multiname.getAccessModifier(trait.name); - var namespaceName = trait.name.namespaces[0].originalURI; + var namespaceName = trait.name.namespaces[0].uri; if (namespaceName) { if (namespaceName === 'http://adobe.com/AS3/2006/builtin') { namespaceName = 'AS3'; @@ -32642,15 +34437,15 @@ var SourceTracer = function () { var prefix = ''; if (trait.holder instanceof ClassInfo) { className = trait.holder.instanceInfo.name; - if (className.namespaces[0].originalURI) { - prefix += className.namespaces[0].originalURI + '::'; + if (className.namespaces[0].uri) { + prefix += className.namespaces[0].uri + '::'; } prefix += className.getName(); prefix += '$/'; } else if (trait.holder instanceof InstanceInfo) { className = trait.holder.name; - if (className.namespaces[0].originalURI) { - prefix += className.namespaces[0].originalURI + '::'; + if (className.namespaces[0].uri) { + prefix += className.namespaces[0].uri + '::'; } prefix += className.getName(); prefix += '/'; @@ -32672,7 +34467,7 @@ var SourceTracer = function () { } } else if (trait.isClass()) { var className = trait.classInfo.instanceInfo.name; - writer.enter('package ' + className.namespaces[0].originalURI + ' {\n'); + writer.enter('package ' + className.namespaces[0].uri + ' {\n'); tracer.traceMetadata(trait.metadata); tracer.traceClass(trait.classInfo); writer.leave('\n}'); @@ -32742,7 +34537,7 @@ var SourceTracer = function () { writer.writeLn('Cut and paste the following glue and edit accordingly.'); writer.writeLn('Class ' + ii); writer.writeLn('8< --------------------------------------------------------------'); - var originalURI = ii.name.namespaces[0].originalURI; + var uri = ii.name.namespaces[0].uri; writer.enter('var ' + className + 'Definition = (function () {'); function maxTraitNameLength(traits) { var length = 0; @@ -32825,7 +34620,7 @@ var SourceTracer = function () { } writer.enter('return {'); writer.writeLn('// (' + getSignature(ii.init, false) + ')'); - writer.writeLn('__class__: "' + originalURI + '.' + className + '",'); + writer.writeLn('__class__: "' + uri + '.' + className + '",'); writer.enter('initialize: function () {'); writer.leave('},'); writer.enter('__glue__: {'); @@ -32873,7 +34668,7 @@ var SourceTracer = function () { } var interfaceNamespace; if (ii.isInterface()) { - interfaceNamespace = name.namespaces[0].originalURI + ':' + name.name; + interfaceNamespace = name.namespaces[0].uri + ':' + name.name; } this.traceTraits(ci.traits, true, interfaceNamespace); this.traceTraits(ii.traits, false, interfaceNamespace); @@ -32903,10 +34698,10 @@ function traceSource(writer, abc) { }); } function traceStatistics(writer, abc) { - var libraryClassCounter = new metrics.Counter(true); - var librarySuperClassCounter = new metrics.Counter(true); - var libraryMethodCounter = new metrics.Counter(true); - var libraryProperties = new metrics.Counter(true); + var libraryClassCounter = new Shumway.Metrics.Counter(true); + var librarySuperClassCounter = new Shumway.Metrics.Counter(true); + var libraryMethodCounter = new Shumway.Metrics.Counter(true); + var libraryProperties = new Shumway.Metrics.Counter(true); var definedClasses = {}; var definedMethods = {}; var definedProperties = {}; @@ -32938,7 +34733,7 @@ function traceStatistics(writer, abc) { } }); }); - var opCounter = new metrics.Counter(true); + var opCounter = new Shumway.Metrics.Counter(true); abc.methods.forEach(function (m) { if (!m.code) { return; @@ -33049,9 +34844,71 @@ function traceStatistics(writer, abc) { operations: opCounter.counts }, null, 2)); } -var Interpreter = new (function () { - function Interpreter() { - } +var Shumway; +(function (Shumway) { + (function (AVM2) { + var OP = Shumway.AVM2.ABC.OP; + var Scope = Shumway.AVM2.Runtime.Scope; + var asCoerceByMultiname = Shumway.AVM2.Runtime.asCoerceByMultiname; + var asGetSlot = Shumway.AVM2.Runtime.asGetSlot; + var asSetSlot = Shumway.AVM2.Runtime.asSetSlot; + var asHasNext2 = Shumway.AVM2.Runtime.asHasNext2; + var asCoerce = Shumway.AVM2.Runtime.asCoerce; + var asCoerceString = Shumway.AVM2.Runtime.asCoerceString; + var asAsType = Shumway.AVM2.Runtime.asAsType; + var asTypeOf = Shumway.AVM2.Runtime.asTypeOf; + var asIsInstanceOf = Shumway.AVM2.Runtime.asIsInstanceOf; + var asIsType = Shumway.AVM2.Runtime.asIsType; + var applyType = Shumway.AVM2.Runtime.applyType; + var createFunction = Shumway.AVM2.Runtime.createFunction; + var createClass = Shumway.AVM2.Runtime.createClass; + var getDescendants = Shumway.AVM2.Runtime.getDescendants; + var checkFilter = Shumway.AVM2.Runtime.checkFilter; + var asAdd = Shumway.AVM2.Runtime.asAdd; + var translateError = Shumway.AVM2.Runtime.translateError; + var asCreateActivation = Shumway.AVM2.Runtime.asCreateActivation; + var sliceArguments = Shumway.AVM2.Runtime.sliceArguments; + var boxValue = Shumway.ObjectUtilities.boxValue; + var popManyInto = Shumway.ArrayUtilities.popManyInto; + var construct = Shumway.AVM2.Runtime.construct; + var Multiname = Shumway.AVM2.ABC.Multiname; + var ScopeStack = function () { + function ScopeStack(parent) { + this.parent = parent; + this.stack = []; + this.isWith = []; + } + ScopeStack.prototype.push = function (object, isWith) { + this.stack.push(object); + this.isWith.push(!(!isWith)); + }; + ScopeStack.prototype.get = function (index) { + return this.stack[index]; + }; + ScopeStack.prototype.clear = function () { + this.stack.length = 0; + this.isWith.length = 0; + }; + ScopeStack.prototype.pop = function () { + this.isWith.pop(); + this.stack.pop(); + }; + ScopeStack.prototype.topScope = function () { + if (!this.scopes) { + this.scopes = []; + } + var parent = this.parent; + for (var i = 0; i < this.stack.length; i++) { + var object = this.stack[i], isWith = this.isWith[i], scope = this.scopes[i]; + if (!scope || scope.parent !== parent || scope.object !== object || scope.isWith !== isWith) { + scope = this.scopes[i] = new Scope(parent, object, isWith); + } + parent = scope; + } + return parent; + }; + return ScopeStack; + }(); function popNameInto(stack, mn, out) { out.flags = mn.flags; if (mn.isRuntimeName()) { @@ -33067,3888 +34924,536 @@ var Interpreter = new (function () { out.namespaces = mn.namespaces; } } - Interpreter.prototype = { - interpretMethod: function interpretMethod($this, method, savedScope, methodArgs) { - true; - Counter.count('Interpret Method'); - var abc = method.abc; - var ints = abc.constantPool.ints; - var uints = abc.constantPool.uints; - var doubles = abc.constantPool.doubles; - var strings = abc.constantPool.strings; - var methods = abc.methods; - var multinames = abc.constantPool.multinames; - var domain = abc.applicationDomain; - var exceptions = method.exceptions; - var locals = [ - $this - ]; - var stack = [], scopeStack = new ScopeStack(savedScope); - var parameterCount = method.parameters.length; - var argCount = methodArgs.length; - var value; - for (var i = 0; i < parameterCount; i++) { - var parameter = method.parameters[i]; - if (i < argCount) { - value = methodArgs[i]; - } else { - value = parameter.value; - } - if (parameter.type && !parameter.type.isAnyName()) { - value = asCoerceByMultiname(domain, parameter.type, value); - } - locals.push(value); + var Interpreter = function () { + function Interpreter() { } - if (method.needsRest()) { - locals.push(sliceArguments(methodArgs, parameterCount)); - } else if (method.needsArguments()) { - locals.push(sliceArguments(methodArgs, 0)); - } - var bytecodes = method.analysis.bytecodes; - var object, index, multiname, result, a, b, args = [], mn = Multiname.TEMPORARY; - interpret: - for (var pc = 0, end = bytecodes.length; pc < end;) { - try { - var bc = bytecodes[pc]; - var op = bc.op; - switch (op | 0) { - case 3: - throw stack.pop(); - case 4: - popNameInto(stack, multinames[bc.index], mn); - stack.push(stack.pop().asGetSuper(savedScope, mn.namespaces, mn.name, mn.flags)); - break; - case 5: - value = stack.pop(); - popNameInto(stack, multinames[bc.index], mn); - stack.pop().asSetSuper(savedScope, mn.namespaces, mn.name, mn.flags, value); - break; - case 8: - locals[bc.index] = undefined; - break; - case 12: - b = stack.pop(); - a = stack.pop(); - pc = !(a < b) ? bc.offset : pc + 1; - continue; - case 24: - b = stack.pop(); - a = stack.pop(); - pc = a >= b ? bc.offset : pc + 1; - continue; - case 13: - b = stack.pop(); - a = stack.pop(); - pc = !(a <= b) ? bc.offset : pc + 1; - continue; - case 23: - b = stack.pop(); - a = stack.pop(); - pc = a > b ? bc.offset : pc + 1; - continue; - case 14: - b = stack.pop(); - a = stack.pop(); - pc = !(a > b) ? bc.offset : pc + 1; - continue; - case 22: - b = stack.pop(); - a = stack.pop(); - pc = a <= b ? bc.offset : pc + 1; - continue; - case 15: - b = stack.pop(); - a = stack.pop(); - pc = !(a >= b) ? bc.offset : pc + 1; - continue; - case 21: - b = stack.pop(); - a = stack.pop(); - pc = a < b ? bc.offset : pc + 1; - continue; - case 16: - pc = bc.offset; - continue; - case 17: - pc = !(!stack.pop()) ? bc.offset : pc + 1; - continue; - case 18: - pc = !stack.pop() ? bc.offset : pc + 1; - continue; - case 19: - b = stack.pop(); - a = stack.pop(); - pc = a == b ? bc.offset : pc + 1; - continue; - case 20: - b = stack.pop(); - a = stack.pop(); - pc = a != b ? bc.offset : pc + 1; - continue; - case 25: - b = stack.pop(); - a = stack.pop(); - pc = a === b ? bc.offset : pc + 1; - continue; - case 26: - b = stack.pop(); - a = stack.pop(); - pc = a !== b ? bc.offset : pc + 1; - continue; - case 27: - index = stack.pop(); - if (index < 0 || index >= bc.offsets.length) { - index = bc.offsets.length - 1; - } - pc = bc.offsets[index]; - continue; - case 28: - scopeStack.push(boxValue(stack.pop()), true); - break; - case 29: - scopeStack.pop(); - break; - case 30: - index = stack.pop(); - stack[stack.length - 1] = boxValue(stack[stack.length - 1]).asNextName(index); - break; - case 35: - index = stack.pop(); - stack[stack.length - 1] = boxValue(stack[stack.length - 1]).asNextValue(index); - break; - case 50: - result = asHasNext2(locals[bc.object], locals[bc.index]); - locals[bc.object] = result.object; - locals[bc.index] = result.index; - stack.push(!(!result.index)); - break; - case 32: - stack.push(null); - break; - case 33: - stack.push(undefined); - break; - case 36: - case 37: - stack.push(bc.value); - break; - case 44: - stack.push(strings[bc.index]); - break; - case 45: - stack.push(ints[bc.index]); - break; - case 46: - stack.push(uints[bc.index]); - break; - case 47: - stack.push(doubles[bc.index]); - break; - case 38: - stack.push(true); - break; - case 39: - stack.push(false); - break; - case 40: - stack.push(NaN); - break; - case 41: - stack.pop(); - break; - case 42: - stack.push(stack[stack.length - 1]); - break; - case 43: - object = stack[stack.length - 1]; - stack[stack.length - 1] = stack[stack.length - 2]; - stack[stack.length - 2] = object; - break; - case 48: - scopeStack.push(boxValue(stack.pop())); - break; - case 64: - stack.push(createFunction(methods[bc.index], scopeStack.topScope(), true)); - break; - case 65: - popManyInto(stack, bc.argCount, args); - object = stack.pop(); - stack[stack.length - 1] = stack[stack.length - 1].apply(object, args); - break; - case 66: - popManyInto(stack, bc.argCount, args); - stack[stack.length - 1] = construct(stack[stack.length - 1], args); - break; - case 71: - return; - case 72: - if (method.returnType) { - return asCoerceByMultiname(domain, method.returnType, stack.pop()); - } - return stack.pop(); - case 73: - popManyInto(stack, bc.argCount, args); - object = stack.pop(); - savedScope.object.baseClass.instanceConstructorNoInitialize.apply(object, args); - break; - case 74: - popManyInto(stack, bc.argCount, args); - popNameInto(stack, multinames[bc.index], mn); - object = boxValue(stack[stack.length - 1]); - object = object.asConstructProperty(mn.namespaces, mn.name, mn.flags, args); - stack[stack.length - 1] = object; - break; - case 75: - notImplemented(); - break; - case 76: - case 70: - case 79: - popManyInto(stack, bc.argCount, args); - popNameInto(stack, multinames[bc.index], mn); - result = boxValue(stack.pop()).asCallProperty(mn.namespaces, mn.name, mn.flags, op === OP_callproplex, args); - if (op !== OP_callpropvoid) { - stack.push(result); - } - break; - case 69: - case 78: - popManyInto(stack, bc.argCount, args); - popNameInto(stack, multinames[bc.index], mn); - result = stack.pop().asCallSuper(savedScope, mn.namespaces, mn.name, mn.flags, args); - if (op !== OP_callsupervoid) { - stack.push(result); - } - break; - case 83: - popManyInto(stack, bc.argCount, args); - stack[stack.length - 1] = applyType(domain, stack[stack.length - 1], args); - break; - case 85: - object = {}; - for (var i = 0; i < bc.argCount; i++) { + Interpreter.interpretMethod = function ($this, method, savedScope, methodArgs) { + true; + Counter.count('Interpret Method'); + var abc = method.abc; + var ints = abc.constantPool.ints; + var uints = abc.constantPool.uints; + var doubles = abc.constantPool.doubles; + var strings = abc.constantPool.strings; + var methods = abc.methods; + var multinames = abc.constantPool.multinames; + var domain = abc.applicationDomain; + var exceptions = method.exceptions; + var locals = [ + $this + ]; + var stack = [], scopeStack = new ScopeStack(savedScope); + var parameterCount = method.parameters.length; + var argCount = methodArgs.length; + var value; + for (var i = 0; i < parameterCount; i++) { + var parameter = method.parameters[i]; + if (i < argCount) { + value = methodArgs[i]; + } else { + value = parameter.value; + } + if (parameter.type && !parameter.type.isAnyName()) { + value = asCoerceByMultiname(domain, parameter.type, value); + } + locals.push(value); + } + if (method.needsRest()) { + locals.push(sliceArguments(methodArgs, parameterCount)); + } else if (method.needsArguments()) { + locals.push(sliceArguments(methodArgs, 0)); + } + var bytecodes = method.analysis.bytecodes; + var object, index, multiname, result, a, b, args = [], mn = Multiname.TEMPORARY; + interpretLabel: + for (var pc = 0, end = bytecodes.length; pc < end;) { + try { + var bc = bytecodes[pc]; + var op = bc.op; + switch (op | 0) { + case 3: + throw stack.pop(); + case 4: + popNameInto(stack, multinames[bc.index], mn); + stack.push(stack.pop().asGetSuper(savedScope, mn.namespaces, mn.name, mn.flags)); + break; + case 5: value = stack.pop(); - object[Multiname.getPublicQualifiedName(stack.pop())] = value; + popNameInto(stack, multinames[bc.index], mn); + stack.pop().asSetSuper(savedScope, mn.namespaces, mn.name, mn.flags, value); + break; + case 8: + locals[bc.index] = undefined; + break; + case 12: + b = stack.pop(); + a = stack.pop(); + pc = !(a < b) ? bc.offset : pc + 1; + continue; + case 24: + b = stack.pop(); + a = stack.pop(); + pc = a >= b ? bc.offset : pc + 1; + continue; + case 13: + b = stack.pop(); + a = stack.pop(); + pc = !(a <= b) ? bc.offset : pc + 1; + continue; + case 23: + b = stack.pop(); + a = stack.pop(); + pc = a > b ? bc.offset : pc + 1; + continue; + case 14: + b = stack.pop(); + a = stack.pop(); + pc = !(a > b) ? bc.offset : pc + 1; + continue; + case 22: + b = stack.pop(); + a = stack.pop(); + pc = a <= b ? bc.offset : pc + 1; + continue; + case 15: + b = stack.pop(); + a = stack.pop(); + pc = !(a >= b) ? bc.offset : pc + 1; + continue; + case 21: + b = stack.pop(); + a = stack.pop(); + pc = a < b ? bc.offset : pc + 1; + continue; + case 16: + pc = bc.offset; + continue; + case 17: + pc = !(!stack.pop()) ? bc.offset : pc + 1; + continue; + case 18: + pc = !stack.pop() ? bc.offset : pc + 1; + continue; + case 19: + b = stack.pop(); + a = stack.pop(); + pc = a == b ? bc.offset : pc + 1; + continue; + case 20: + b = stack.pop(); + a = stack.pop(); + pc = a != b ? bc.offset : pc + 1; + continue; + case 25: + b = stack.pop(); + a = stack.pop(); + pc = a === b ? bc.offset : pc + 1; + continue; + case 26: + b = stack.pop(); + a = stack.pop(); + pc = a !== b ? bc.offset : pc + 1; + continue; + case 27: + index = stack.pop(); + if (index < 0 || index >= bc.offsets.length) { + index = bc.offsets.length - 1; + } + pc = bc.offsets[index]; + continue; + case 28: + scopeStack.push(boxValue(stack.pop()), true); + break; + case 29: + scopeStack.pop(); + break; + case 30: + index = stack.pop(); + stack[stack.length - 1] = boxValue(stack[stack.length - 1]).asNextName(index); + break; + case 35: + index = stack.pop(); + stack[stack.length - 1] = boxValue(stack[stack.length - 1]).asNextValue(index); + break; + case 50: + result = asHasNext2(locals[bc.object], locals[bc.index]); + locals[bc.object] = result.object; + locals[bc.index] = result.index; + stack.push(!(!result.index)); + break; + case 32: + stack.push(null); + break; + case 33: + stack.push(undefined); + break; + case 36: + case 37: + stack.push(bc.value); + break; + case 44: + stack.push(strings[bc.index]); + break; + case 45: + stack.push(ints[bc.index]); + break; + case 46: + stack.push(uints[bc.index]); + break; + case 47: + stack.push(doubles[bc.index]); + break; + case 38: + stack.push(true); + break; + case 39: + stack.push(false); + break; + case 40: + stack.push(NaN); + break; + case 41: + stack.pop(); + break; + case 42: + stack.push(stack[stack.length - 1]); + break; + case 43: + object = stack[stack.length - 1]; + stack[stack.length - 1] = stack[stack.length - 2]; + stack[stack.length - 2] = object; + break; + case 48: + scopeStack.push(boxValue(stack.pop()), false); + break; + case 64: + stack.push(createFunction(methods[bc.index], scopeStack.topScope(), true)); + break; + case 65: + popManyInto(stack, bc.argCount, args); + object = stack.pop(); + stack[stack.length - 1] = stack[stack.length - 1].apply(object, args); + break; + case 66: + popManyInto(stack, bc.argCount, args); + stack[stack.length - 1] = construct(stack[stack.length - 1], args); + break; + case 71: + return; + case 72: + if (method.returnType) { + return asCoerceByMultiname(domain, method.returnType, stack.pop()); + } + return stack.pop(); + case 73: + popManyInto(stack, bc.argCount, args); + object = stack.pop(); + savedScope.object.baseClass.instanceConstructorNoInitialize.apply(object, args); + break; + case 74: + popManyInto(stack, bc.argCount, args); + popNameInto(stack, multinames[bc.index], mn); + object = boxValue(stack[stack.length - 1]); + object = object.asConstructProperty(mn.namespaces, mn.name, mn.flags, args); + stack[stack.length - 1] = object; + break; + case 75: + Shumway.Debug.notImplemented('OP.callsuperid'); + break; + case 76: + case 70: + case 79: + popManyInto(stack, bc.argCount, args); + popNameInto(stack, multinames[bc.index], mn); + result = boxValue(stack.pop()).asCallProperty(mn.namespaces, mn.name, mn.flags, op === 76, args); + if (op !== 79) { + stack.push(result); + } + break; + case 69: + case 78: + popManyInto(stack, bc.argCount, args); + popNameInto(stack, multinames[bc.index], mn); + result = stack.pop().asCallSuper(savedScope, mn.namespaces, mn.name, mn.flags, args); + if (op !== 78) { + stack.push(result); + } + break; + case 83: + popManyInto(stack, bc.argCount, args); + stack[stack.length - 1] = applyType(domain, stack[stack.length - 1], args); + break; + case 85: + object = {}; + for (var i = 0; i < bc.argCount; i++) { + value = stack.pop(); + object[Multiname.getPublicQualifiedName(stack.pop())] = value; + } + stack.push(object); + break; + case 86: + object = []; + popManyInto(stack, bc.argCount, args); + object.push.apply(object, args); + stack.push(object); + break; + case 87: + true; + stack.push(asCreateActivation(method)); + break; + case 88: + stack[stack.length - 1] = createClass(abc.classes[bc.index], stack[stack.length - 1], scopeStack.topScope()); + break; + case 89: + popNameInto(stack, multinames[bc.index], mn); + stack.push(getDescendants(stack.pop(), mn)); + break; + case 90: + true; + stack.push(exceptions[bc.index].scopeObject); + break; + case 94: + case 93: + popNameInto(stack, multinames[bc.index], mn); + stack.push(scopeStack.topScope().findScopeProperty(mn.namespaces, mn.name, mn.flags, domain, op === 93, false)); + break; + case 96: + multiname = multinames[bc.index]; + object = scopeStack.topScope().findScopeProperty(multiname.namespaces, multiname.name, multiname.flags, domain, true, false); + stack.push(object.asGetProperty(multiname.namespaces, multiname.name, multiname.flags)); + break; + case 104: + case 97: + value = stack.pop(); + popNameInto(stack, multinames[bc.index], mn); + boxValue(stack.pop()).asSetProperty(mn.namespaces, mn.name, mn.flags, value); + break; + case 98: + stack.push(locals[bc.index]); + break; + case 99: + locals[bc.index] = stack.pop(); + break; + case 100: + stack.push(savedScope.global.object); + break; + case 101: + stack.push(scopeStack.get(bc.index)); + break; + case 102: + popNameInto(stack, multinames[bc.index], mn); + stack[stack.length - 1] = boxValue(stack[stack.length - 1]).asGetProperty(mn.namespaces, mn.name, mn.flags); + break; + case 106: + popNameInto(stack, multinames[bc.index], mn); + stack[stack.length - 1] = boxValue(stack[stack.length - 1]).asDeleteProperty(mn.namespaces, mn.name, mn.flags); + break; + case 108: + stack[stack.length - 1] = asGetSlot(stack[stack.length - 1], bc.index); + break; + case 109: + value = stack.pop(); + object = stack.pop(); + asSetSlot(object, bc.index, value); + break; + case 112: + stack[stack.length - 1] = stack[stack.length - 1] + ''; + break; + case 131: + case 115: + stack[stack.length - 1] |= 0; + break; + case 136: + case 116: + stack[stack.length - 1] >>>= 0; + break; + case 132: + case 117: + stack[stack.length - 1] = +stack[stack.length - 1]; + break; + case 129: + case 118: + stack[stack.length - 1] = !(!stack[stack.length - 1]); + break; + case 120: + stack[stack.length - 1] = checkFilter(stack[stack.length - 1]); + break; + case 128: + stack[stack.length - 1] = asCoerce(domain.getType(multinames[bc.index]), stack[stack.length - 1]); + break; + case 130: + break; + case 133: + stack[stack.length - 1] = asCoerceString(stack[stack.length - 1]); + break; + case 135: + stack[stack.length - 2] = asAsType(stack.pop(), stack[stack.length - 1]); + break; + case 137: + object = stack[stack.length - 1]; + stack[stack.length - 1] = object == undefined ? null : object; + break; + case 144: + stack[stack.length - 1] = -stack[stack.length - 1]; + break; + case 145: + ++stack[stack.length - 1]; + break; + case 146: + ++locals[bc.index]; + break; + case 147: + --stack[stack.length - 1]; + break; + case 148: + --locals[bc.index]; + break; + case 149: + stack[stack.length - 1] = asTypeOf(stack[stack.length - 1]); + break; + case 150: + stack[stack.length - 1] = !stack[stack.length - 1]; + break; + case 151: + stack[stack.length - 1] = ~stack[stack.length - 1]; + break; + case 160: + stack[stack.length - 2] = asAdd(stack[stack.length - 2], stack.pop()); + break; + case 161: + stack[stack.length - 2] -= stack.pop(); + break; + case 162: + stack[stack.length - 2] *= stack.pop(); + break; + case 163: + stack[stack.length - 2] /= stack.pop(); + break; + case 164: + stack[stack.length - 2] %= stack.pop(); + break; + case 165: + stack[stack.length - 2] <<= stack.pop(); + break; + case 166: + stack[stack.length - 2] >>= stack.pop(); + break; + case 167: + stack[stack.length - 2] >>>= stack.pop(); + break; + case 168: + stack[stack.length - 2] &= stack.pop(); + break; + case 169: + stack[stack.length - 2] |= stack.pop(); + break; + case 170: + stack[stack.length - 2] ^= stack.pop(); + break; + case 171: + stack[stack.length - 2] = stack[stack.length - 2] == stack.pop(); + break; + case 172: + stack[stack.length - 2] = stack[stack.length - 2] === stack.pop(); + break; + case 173: + stack[stack.length - 2] = stack[stack.length - 2] < stack.pop(); + break; + case 174: + stack[stack.length - 2] = stack[stack.length - 2] <= stack.pop(); + break; + case 175: + stack[stack.length - 2] = stack[stack.length - 2] > stack.pop(); + break; + case 176: + stack[stack.length - 2] = stack[stack.length - 2] >= stack.pop(); + break; + case 177: + stack[stack.length - 2] = asIsInstanceOf(stack.pop(), stack[stack.length - 1]); + break; + case 178: + stack[stack.length - 1] = asIsType(domain.getType(multinames[bc.index]), stack[stack.length - 1]); + break; + case 179: + stack[stack.length - 2] = asIsType(stack.pop(), stack[stack.length - 1]); + break; + case 180: + stack[stack.length - 2] = boxValue(stack.pop()).asHasProperty(null, stack[stack.length - 1]); + break; + case 192: + stack[stack.length - 1] = (stack[stack.length - 1] | 0) + 1; + break; + case 193: + stack[stack.length - 1] = (stack[stack.length - 1] | 0) - 1; + break; + case 194: + locals[bc.index] = (locals[bc.index] | 0) + 1; + break; + case 195: + locals[bc.index] = (locals[bc.index] | 0) - 1; + break; + case 196: + stack[stack.length - 1] = ~stack[stack.length - 1]; + break; + case 197: + stack[stack.length - 2] = stack[stack.length - 2] + stack.pop() | 0; + break; + case 198: + stack[stack.length - 2] = stack[stack.length - 2] - stack.pop() | 0; + break; + case 199: + stack[stack.length - 2] = stack[stack.length - 2] * stack.pop() | 0; + break; + case 208: + case 209: + case 210: + case 211: + stack.push(locals[op - 208]); + break; + case 212: + case 213: + case 214: + case 215: + locals[op - 212] = stack.pop(); + break; + case 239: + case 240: + case 241: + break; + default: + Shumway.Debug.notImplemented(Shumway.AVM2.opcodeName(op)); + } + pc++; + } catch (e) { + if (exceptions.length < 1) { + throw e; + } + e = translateError(domain, e); + for (var i = 0, j = exceptions.length; i < j; i++) { + var handler = exceptions[i]; + if (pc >= handler.start && pc <= handler.end && (!handler.typeName || domain.getType(handler.typeName).isInstance(e))) { + stack.length = 0; + stack.push(e); + scopeStack.clear(); + pc = handler.offset; + continue interpretLabel; + } } - stack.push(object); - break; - case 86: - object = []; - popManyInto(stack, bc.argCount, args); - object.push.apply(object, args); - stack.push(object); - break; - case 87: - true; - stack.push(createActivation(method)); - break; - case 88: - stack[stack.length - 1] = createClass(abc.classes[bc.index], stack[stack.length - 1], scopeStack.topScope()); - break; - case 89: - popNameInto(stack, multinames[bc.index], mn); - stack.push(getDescendants(stack.pop(), mn)); - break; - case 90: - true; - stack.push(exceptions[bc.index].scopeObject); - break; - case 94: - case 93: - popNameInto(stack, multinames[bc.index], mn); - stack.push(scopeStack.topScope().findScopeProperty(mn.namespaces, mn.name, mn.flags, domain, op === OP_findpropstrict)); - break; - case 96: - multiname = multinames[bc.index]; - object = scopeStack.topScope().findScopeProperty(multiname.namespaces, multiname.name, multiname.flags, domain, true); - stack.push(object.asGetProperty(multiname.namespaces, multiname.name, multiname.flags)); - break; - case 104: - case 97: - value = stack.pop(); - popNameInto(stack, multinames[bc.index], mn); - boxValue(stack.pop()).asSetProperty(mn.namespaces, mn.name, mn.flags, value); - break; - case 98: - stack.push(locals[bc.index]); - break; - case 99: - locals[bc.index] = stack.pop(); - break; - case 100: - stack.push(savedScope.global.object); - break; - case 101: - stack.push(scopeStack.get(bc.index)); - break; - case 102: - popNameInto(stack, multinames[bc.index], mn); - stack[stack.length - 1] = boxValue(stack[stack.length - 1]).asGetProperty(mn.namespaces, mn.name, mn.flags); - break; - case 106: - popNameInto(stack, multinames[bc.index], mn); - stack[stack.length - 1] = boxValue(stack[stack.length - 1]).asDeleteProperty(mn.namespaces, mn.name, mn.flags); - break; - case 108: - stack[stack.length - 1] = asGetSlot(stack[stack.length - 1], bc.index); - break; - case 109: - value = stack.pop(); - object = stack.pop(); - asSetSlot(object, bc.index, value); - break; - case 112: - stack[stack.length - 1] = stack[stack.length - 1] + ''; - break; - case 131: - case 115: - stack[stack.length - 1] |= 0; - break; - case 136: - case 116: - stack[stack.length - 1] >>>= 0; - break; - case 132: - case 117: - stack[stack.length - 1] = +stack[stack.length - 1]; - break; - case 129: - case 118: - stack[stack.length - 1] = !(!stack[stack.length - 1]); - break; - case 120: - stack[stack.length - 1] = checkFilter(stack[stack.length - 1]); - break; - case 128: - stack[stack.length - 1] = asCoerce(domain.getType(multinames[bc.index]), stack[stack.length - 1]); - break; - case 130: - break; - case 133: - stack[stack.length - 1] = asCoerceString(stack[stack.length - 1]); - break; - case 135: - stack[stack.length - 2] = asAsType(stack.pop(), stack[stack.length - 1]); - break; - case 137: - object = stack[stack.length - 1]; - stack[stack.length - 1] = object == undefined ? null : object; - break; - case 144: - stack[stack.length - 1] = -stack[stack.length - 1]; - break; - case 145: - ++stack[stack.length - 1]; - break; - case 146: - ++locals[bc.index]; - break; - case 147: - --stack[stack.length - 1]; - break; - case 148: - --locals[bc.index]; - break; - case 149: - stack[stack.length - 1] = asTypeOf(stack[stack.length - 1]); - break; - case 150: - stack[stack.length - 1] = !stack[stack.length - 1]; - break; - case 151: - stack[stack.length - 1] = ~stack[stack.length - 1]; - break; - case 160: - stack[stack.length - 2] = asAdd(stack[stack.length - 2], stack.pop()); - break; - case 161: - stack[stack.length - 2] -= stack.pop(); - break; - case 162: - stack[stack.length - 2] *= stack.pop(); - break; - case 163: - stack[stack.length - 2] /= stack.pop(); - break; - case 164: - stack[stack.length - 2] %= stack.pop(); - break; - case 165: - stack[stack.length - 2] <<= stack.pop(); - break; - case 166: - stack[stack.length - 2] >>= stack.pop(); - break; - case 167: - stack[stack.length - 2] >>>= stack.pop(); - break; - case 168: - stack[stack.length - 2] &= stack.pop(); - break; - case 169: - stack[stack.length - 2] |= stack.pop(); - break; - case 170: - stack[stack.length - 2] ^= stack.pop(); - break; - case 171: - stack[stack.length - 2] = stack[stack.length - 2] == stack.pop(); - break; - case 172: - stack[stack.length - 2] = stack[stack.length - 2] === stack.pop(); - break; - case 173: - stack[stack.length - 2] = stack[stack.length - 2] < stack.pop(); - break; - case 174: - stack[stack.length - 2] = stack[stack.length - 2] <= stack.pop(); - break; - case 175: - stack[stack.length - 2] = stack[stack.length - 2] > stack.pop(); - break; - case 176: - stack[stack.length - 2] = stack[stack.length - 2] >= stack.pop(); - break; - case 177: - stack[stack.length - 2] = asIsInstanceOf(stack.pop(), stack[stack.length - 1]); - break; - case 178: - stack[stack.length - 1] = asIsType(domain.getType(multinames[bc.index]), stack[stack.length - 1]); - break; - case 179: - stack[stack.length - 2] = asIsType(stack.pop(), stack[stack.length - 1]); - break; - case 180: - stack[stack.length - 2] = boxValue(stack.pop()).asHasProperty(null, stack[stack.length - 1]); - break; - case 192: - stack[stack.length - 1] = (stack[stack.length - 1] | 0) + 1; - break; - case 193: - stack[stack.length - 1] = (stack[stack.length - 1] | 0) - 1; - break; - case 194: - locals[bc.index] = (locals[bc.index] | 0) + 1; - break; - case 195: - locals[bc.index] = (locals[bc.index] | 0) - 1; - break; - case 196: - stack[stack.length - 1] = ~stack[stack.length - 1]; - break; - case 197: - stack[stack.length - 2] = stack[stack.length - 2] + stack.pop() | 0; - break; - case 198: - stack[stack.length - 2] = stack[stack.length - 2] - stack.pop() | 0; - break; - case 199: - stack[stack.length - 2] = stack[stack.length - 2] * stack.pop() | 0; - break; - case 208: - case 209: - case 210: - case 211: - stack.push(locals[op - OP_getlocal0]); - break; - case 212: - case 213: - case 214: - case 215: - locals[op - OP_setlocal0] = stack.pop(); - break; - case 239: - case 240: - case 241: - break; - default: - notImplemented(opcodeName(op)); - } - pc++; - } catch (e) { - if (exceptions.length < 1) { throw e; } - e = translateError(domain, e); - for (var i = 0, j = exceptions.length; i < j; i++) { - var handler = exceptions[i]; - if (pc >= handler.start && pc <= handler.end && (!handler.typeName || domain.getType(handler.typeName).isInstance(e))) { - stack.length = 0; - stack.push(e); - scopeStack.clear(); - pc = handler.offset; - continue interpret; - } - } - throw e; } - } - } - }; - return Interpreter; - }())(); -var AVM2 = function () { - function findDefiningAbc(mn) { - if (!avm2.builtinsLoaded) { - return null; - } - for (var i = 0; i < mn.namespaces.length; i++) { - var name = mn.namespaces[i].originalURI + ':' + mn.name; - var abcName = playerGlobalNames[name]; - if (abcName) { - break; - } - } - if (abcName) { - return grabAbc(abcName); - } - return null; - } - function avm2Ctor(sysMode, appMode, loadAVM1) { - this.systemDomain = new ApplicationDomain(this, null, sysMode, true); - this.applicationDomain = new ApplicationDomain(this, this.systemDomain, appMode, false); - this.findDefiningAbc = findDefiningAbc; - this.loadAVM1 = loadAVM1; - this.isAVM1Loaded = false; - this.exception = { - value: undefined - }; - this.exceptions = []; - } - avm2Ctor.currentAbc = function () { - var caller = arguments.callee; - var maxDepth = 20; - var abc = null; - for (var i = 0; i < maxDepth && caller; i++) { - var mi = caller.methodInfo; - if (mi) { - abc = mi.abc; - break; - } - caller = caller.caller; - } - return abc; - }; - avm2Ctor.currentDomain = function () { - var abc = this.currentAbc(); - return abc.applicationDomain; - }; - avm2Ctor.prototype = { - notifyConstruct: function notifyConstruct(instanceConstructor, args) { - } - }; - return avm2Ctor; - }(); -var playerGlobalNames = {}; -var playerGlobalScripts = {}; -(function () { - var index = [ - { - 'name': 'Object', - 'offset': 0, - 'length': 53432, - 'defs': [ - 'Object', - 'Class', - 'Function', - 'Namespace', - 'Boolean', - 'Number', - 'int', - 'uint', - 'String', - 'Array', - 'AS3', - 'bugzilla', - 'decodeURI', - 'decodeURIComponent', - 'encodeURI', - 'encodeURIComponent', - 'isNaN', - 'isFinite', - 'parseInt', - 'parseFloat', - 'escape', - 'unescape', - 'isXMLName', - 'NaN', - 'Infinity', - 'undefined', - '__AS3__.vec:Vector', - '__AS3__.vec:Vector$object', - '__AS3__.vec:Vector$int', - '__AS3__.vec:Vector$uint', - '__AS3__.vec:Vector$double', - 'avmplus:describeTypeJSON', - 'avmplus:extendsXml', - 'avmplus:implementsXml', - 'avmplus:constructorXml', - 'avmplus:constantXml', - 'avmplus:variableXml', - 'avmplus:accessorXml', - 'avmplus:methodXml', - 'avmplus:parameterXml', - 'avmplus:metadataXml', - 'avmplus:argXml', - 'avmplus:typeXml', - 'avmplus:factoryXml', - 'avmplus:describeParams', - 'avmplus:describeMetadata', - 'avmplus:finish', - 'avmplus:describeTraits', - 'avmplus:HIDE_NSURI_METHODS', - 'avmplus:INCLUDE_BASES', - 'avmplus:INCLUDE_INTERFACES', - 'avmplus:INCLUDE_VARIABLES', - 'avmplus:INCLUDE_ACCESSORS', - 'avmplus:INCLUDE_METHODS', - 'avmplus:INCLUDE_METADATA', - 'avmplus:INCLUDE_CONSTRUCTOR', - 'avmplus:INCLUDE_TRAITS', - 'avmplus:USE_ITRAITS', - 'avmplus:HIDE_OBJECT', - 'avmplus:FLASH10_FLAGS', - 'avmplus:describeType', - 'avmplus:getQualifiedClassName', - 'avmplus:getQualifiedSuperclassName' - ] - }, - { - 'name': 'flash/xml/XMLTag', - 'offset': 53432, - 'length': 859, - 'defs': [ - 'flash.xml:XMLTag' - ] - }, - { - 'name': 'flash/net/NetStreamInfo', - 'offset': 54291, - 'length': 5307, - 'defs': [ - 'flash.net:NetStreamInfo' - ] - }, - { - 'name': 'flash/sampler/StackFrame', - 'offset': 59598, - 'length': 4475, - 'defs': [ - 'flash.sampler:StackFrame', - 'flash.sampler:Sample', - 'flash.sampler:NewObjectSample', - 'flash.sampler:DeleteObjectSample', - 'flash.sampler:clearSamples', - 'flash.sampler:startSampling', - 'flash.sampler:stopSampling', - 'flash.sampler:pauseSampling', - 'flash.sampler:sampleInternalAllocs', - 'flash.sampler:setSamplerCallback', - 'flash.sampler:_setSamplerCallback', - 'flash.sampler:getSize', - 'flash.sampler:getMemberNames', - 'flash.sampler:getSamples', - 'flash.sampler:_getSamples', - 'flash.sampler:getSampleCount', - 'flash.sampler:getInvocationCount', - 'flash.sampler:getSetterInvocationCount', - 'flash.sampler:getGetterInvocationCount', - 'flash.sampler:_getInvocationCount', - 'flash.sampler:isGetterSetter', - 'flash.sampler:getLexicalScopes', - 'flash.sampler:getSavedThis', - 'flash.sampler:getMasterString', - 'flash.sampler:ClassFactory' - ] - }, - { - 'name': 'flash/display3D/Context3DBlendFactor', - 'offset': 64073, - 'length': 1101, - 'defs': [ - 'flash.display3D:Context3DBlendFactor' - ] - }, - { - 'name': 'flash/net/registerClassAlias', - 'offset': 65174, - 'length': 429, - 'defs': [ - 'flash.net:registerClassAlias', - 'flash.net:getClassByAlias' - ] - }, - { - 'name': 'flash/display3D/Context3DStencilAction', - 'offset': 65603, - 'length': 896, - 'defs': [ - 'flash.display3D:Context3DStencilAction' - ] - }, - { - 'name': 'flash/text/engine/CFFHinting', - 'offset': 66499, - 'length': 504, - 'defs': [ - 'flash.text.engine:CFFHinting' - ] - }, - { - 'name': 'flash/display/IDrawCommand', - 'offset': 67003, - 'length': 280, - 'defs': [ - 'flash.display:IDrawCommand' - ] - }, - { - 'name': 'flash/net/Responder', - 'offset': 67283, - 'length': 600, - 'defs': [ - 'flash.net:Responder' - ] - }, - { - 'name': 'flash/utils/IDataInput', - 'offset': 67883, - 'length': 2232, - 'defs': [ - 'flash.utils:IDataInput' - ] - }, - { - 'name': 'flash/utils/ObjectInput', - 'offset': 70115, - 'length': 1952, - 'defs': [ - 'flash.utils:ObjectInput' - ] - }, - { - 'name': 'flash/events/EventPhase', - 'offset': 72067, - 'length': 504, - 'defs': [ - 'flash.events:EventPhase' - ] - }, - { - 'name': 'flash/net/URLLoaderDataFormat', - 'offset': 72571, - 'length': 551, - 'defs': [ - 'flash.net:URLLoaderDataFormat' - ] - }, - { - 'name': 'flash/net/IDynamicPropertyWriter', - 'offset': 73122, - 'length': 537, - 'defs': [ - 'flash.net:IDynamicPropertyWriter' - ] - }, - { - 'name': 'flash/geom/PerspectiveProjection', - 'offset': 73659, - 'length': 1312, - 'defs': [ - 'flash.geom:PerspectiveProjection' - ] - }, - { - 'name': 'flash/events/IEventDispatcher', - 'offset': 74971, - 'length': 1046, - 'defs': [ - 'flash.events:IEventDispatcher' - ] - }, - { - 'name': 'flash/events/EventDispatcher', - 'offset': 76017, - 'length': 3072, - 'defs': [ - 'flash.events:EventDispatcher' - ] - }, - { - 'name': 'flash/display/Stage3D', - 'offset': 79089, - 'length': 1225, - 'defs': [ - 'flash.display:Stage3D' - ] - }, - { - 'name': 'flash/sensors/Geolocation', - 'offset': 80314, - 'length': 932, - 'defs': [ - 'flash.sensors:Geolocation' - ] - }, - { - 'name': 'Error', - 'offset': 81246, - 'length': 5961, - 'defs': [ - 'Error', - 'DefinitionError', - 'EvalError', - 'RangeError', - 'ReferenceError', - 'SecurityError', - 'SyntaxError', - 'TypeError', - 'URIError', - 'VerifyError', - 'UninitializedError', - 'ArgumentError', - 'flash.errors:IOError', - 'flash.errors:EOFError', - 'flash.errors:MemoryError', - 'flash.errors:IllegalOperationError' - ] - }, - { - 'name': 'flash/text/engine/ContentElement', - 'offset': 87207, - 'length': 1868, - 'defs': [ - 'flash.text.engine:ContentElement' - ] - }, - { - 'name': 'flash/text/engine/TextElement', - 'offset': 89075, - 'length': 954, - 'defs': [ - 'flash.text.engine:TextElement' - ] - }, - { - 'name': 'flash/concurrent/Mutex', - 'offset': 90029, - 'length': 2484, - 'defs': [ - 'flash.concurrent:Mutex', - 'flash.concurrent:Condition', - 'avm2.intrinsics.memory:mfence', - 'avm2.intrinsics.memory:casi32' - ] - }, - { - 'name': 'flash/display/NativeMenu', - 'offset': 92513, - 'length': 604, - 'defs': [ - 'flash.display:NativeMenu' - ] - }, - { - 'name': 'flash/ui/ContextMenu', - 'offset': 93117, - 'length': 2359, - 'defs': [ - 'flash.ui:ContextMenu' - ] - }, - { - 'name': 'flash/net/drm/DRMManagerSession', - 'offset': 95476, - 'length': 20509, - 'defs': [ - 'flash.net.drm:DRMManagerSession', - 'flash.net.drm:DRMAuthenticationContext', - 'flash.net.drm:DRMPlaybackTimeWindow', - 'flash.net.drm:DRMVoucher', - 'flash.net.drm:DRMVoucherDownloadContext', - 'flash.net.drm:DRMVoucherStoreContext', - 'flash.net.drm:DRMManager', - 'flash.net.drm:DRMModuleCycleProvider', - 'flash.net.drm:DRMURLDownloadContext' - ] - }, - { - 'name': 'flash/display/IBitmapDrawable', - 'offset': 115985, - 'length': 281, - 'defs': [ - 'flash.display:IBitmapDrawable' - ] - }, - { - 'name': 'flash/display/DisplayObject', - 'offset': 116266, - 'length': 5912, - 'defs': [ - 'flash.display:DisplayObject' - ] - }, - { - 'name': 'flash/display/Bitmap', - 'offset': 122178, - 'length': 1149, - 'defs': [ - 'flash.display:Bitmap' - ] - }, - { - 'name': 'flash/globalization/DateTimeFormatter', - 'offset': 123327, - 'length': 2422, - 'defs': [ - 'flash.globalization:DateTimeFormatter' - ] - }, - { - 'name': 'flash/media/VideoStatus', - 'offset': 125749, - 'length': 545, - 'defs': [ - 'flash.media:VideoStatus' - ] - }, - { - 'name': 'flash/system/fscommand', - 'offset': 126294, - 'length': 632, - 'defs': [ - 'flash.system:fscommand', - 'flash.system:FSCommand' - ] - }, - { - 'name': 'adobe/utils/MMExecute', - 'offset': 126926, - 'length': 436, - 'defs': [ - 'adobe.utils:MMExecute', - 'adobe.utils:MMEndCommand' - ] - }, - { - 'name': 'flash/external/ExternalInterface', - 'offset': 127362, - 'length': 7206, - 'defs': [ - 'flash.external:ExternalInterface' - ] - }, - { - 'name': 'flash/security/CertificateStatus', - 'offset': 134568, - 'length': 939, - 'defs': [ - 'flash.security:CertificateStatus' - ] - }, - { - 'name': 'flash/system/Security', - 'offset': 135507, - 'length': 2365, - 'defs': [ - 'flash.system:Security' - ] - }, - { - 'name': 'flash/events/Event', - 'offset': 137872, - 'length': 4511, - 'defs': [ - 'flash.events:Event' - ] - }, - { - 'name': 'flash/events/KeyboardEvent', - 'offset': 142383, - 'length': 2329, - 'defs': [ - 'flash.events:KeyboardEvent' - ] - }, - { - 'name': 'flash/net/navigateToURL', - 'offset': 144712, - 'length': 392, - 'defs': [ - 'flash.net:navigateToURL', - 'flash.net:sendToURL' - ] - }, - { - 'name': 'flash/events/SoftKeyboardTrigger', - 'offset': 145104, - 'length': 562, - 'defs': [ - 'flash.events:SoftKeyboardTrigger' - ] - }, - { - 'name': 'flash/display3D/Context3DRenderMode', - 'offset': 145666, - 'length': 534, - 'defs': [ - 'flash.display3D:Context3DRenderMode' - ] - }, - { - 'name': 'flash/ui/GameInputControl', - 'offset': 146200, - 'length': 1234, - 'defs': [ - 'flash.ui:GameInputControl' - ] - }, - { - 'name': 'flash/geom/Matrix', - 'offset': 147434, - 'length': 4980, - 'defs': [ - 'flash.geom:Matrix' - ] - }, - { - 'name': 'flash/events/ThrottleType', - 'offset': 152414, - 'length': 534, - 'defs': [ - 'flash.events:ThrottleType' - ] - }, - { - 'name': 'flash/text/TextInteractionMode', - 'offset': 152948, - 'length': 526, - 'defs': [ - 'flash.text:TextInteractionMode' - ] - }, - { - 'name': 'flash/filters/DisplacementMapFilterMode', - 'offset': 153474, - 'length': 636, - 'defs': [ - 'flash.filters:DisplacementMapFilterMode' - ] - }, - { - 'name': 'flash/geom/Rectangle', - 'offset': 154110, - 'length': 5057, - 'defs': [ - 'flash.geom:Rectangle' - ] - }, - { - 'name': 'flash/net/drm/AuthenticationMethod', - 'offset': 159167, - 'length': 1246, - 'defs': [ - 'flash.net.drm:AuthenticationMethod', - 'flash.net.drm:LoadVoucherSetting', - 'flash.net.drm:AddToDeviceGroupSetting' - ] - }, - { - 'name': 'flash/utils/Timer', - 'offset': 160413, - 'length': 2134, - 'defs': [ - 'flash.utils:Timer' - ] - }, - { - 'name': 'flash/utils/SetIntervalTimer', - 'offset': 162547, - 'length': 1758, - 'defs': [ - 'flash.utils:SetIntervalTimer', - 'flash.utils:setInterval', - 'flash.utils:setTimeout', - 'flash.utils:clearInterval', - 'flash.utils:clearTimeout' - ] - }, - { - 'name': 'flash/text/engine/TextJustifier', - 'offset': 164305, - 'length': 1512, - 'defs': [ - 'flash.text.engine:TextJustifier' - ] - }, - { - 'name': 'flash/media/Microphone', - 'offset': 165817, - 'length': 3070, - 'defs': [ - 'flash.media:Microphone' - ] - }, - { - 'name': 'flash/sensors/Accelerometer', - 'offset': 168887, - 'length': 958, - 'defs': [ - 'flash.sensors:Accelerometer' - ] - }, - { - 'name': 'flash/display3D/textures/TextureBase', - 'offset': 169845, - 'length': 622, - 'defs': [ - 'flash.display3D.textures:TextureBase' - ] - }, - { - 'name': 'flash/display3D/textures/Texture', - 'offset': 170467, - 'length': 1061, - 'defs': [ - 'flash.display3D.textures:Texture' - ] - }, - { - 'name': 'flash/net/drm/DRMDeviceGroup', - 'offset': 171528, - 'length': 1200, - 'defs': [ - 'flash.net.drm:DRMDeviceGroup' - ] - }, - { - 'name': 'flash/display/InteractiveObject', - 'offset': 172728, - 'length': 4152, - 'defs': [ - 'flash.display:InteractiveObject' - ] - }, - { - 'name': 'flash/display/DisplayObjectContainer', - 'offset': 176880, - 'length': 2730, - 'defs': [ - 'flash.display:DisplayObjectContainer' - ] - }, - { - 'name': 'flash/display/FocusDirection', - 'offset': 179610, - 'length': 11058, - 'defs': [ - 'flash.display:FocusDirection', - 'flash.display:Stage' - ] - }, - { - 'name': 'flash/events/UncaughtErrorEvents', - 'offset': 190668, - 'length': 573, - 'defs': [ - 'flash.events:UncaughtErrorEvents' - ] - }, - { - 'name': 'flash/display/IGraphicsData', - 'offset': 191241, - 'length': 289, - 'defs': [ - 'flash.display:IGraphicsData' - ] - }, - { - 'name': 'flash/display/IGraphicsFill', - 'offset': 191530, - 'length': 289, - 'defs': [ - 'flash.display:IGraphicsFill' - ] - }, - { - 'name': 'flash/display/GraphicsEndFill', - 'offset': 191819, - 'length': 485, - 'defs': [ - 'flash.display:GraphicsEndFill' - ] - }, - { - 'name': 'flash/accessibility/Accessibility', - 'offset': 192304, - 'length': 842, - 'defs': [ - 'flash.accessibility:Accessibility' - ] - }, - { - 'name': 'flash/text/GridFitType', - 'offset': 193146, - 'length': 503, - 'defs': [ - 'flash.text:GridFitType' - ] - }, - { - 'name': 'flash/globalization/CollatorMode', - 'offset': 193649, - 'length': 517, - 'defs': [ - 'flash.globalization:CollatorMode' - ] - }, - { - 'name': 'adobe/utils/CustomActions', - 'offset': 194166, - 'length': 799, - 'defs': [ - 'adobe.utils:CustomActions' - ] - }, - { - 'name': 'flash/errors/StackOverflowError', - 'offset': 194965, - 'length': 1011, - 'defs': [ - 'flash.errors:StackOverflowError', - 'flash.errors:ScriptTimeoutError', - 'flash.errors:InvalidSWFError' - ] - }, - { - 'name': 'flash/media/VideoCodec', - 'offset': 195976, - 'length': 510, - 'defs': [ - 'flash.media:VideoCodec' - ] - }, - { - 'name': 'flash/geom/Point', - 'offset': 196486, - 'length': 2138, - 'defs': [ - 'flash.geom:Point' - ] - }, - { - 'name': 'flash/ui/Mouse', - 'offset': 198624, - 'length': 996, - 'defs': [ - 'flash.ui:Mouse' - ] - }, - { - 'name': 'flash/xml/XMLParser', - 'offset': 199620, - 'length': 619, - 'defs': [ - 'flash.xml:XMLParser' - ] - }, - { - 'name': 'flash/net/NetGroupInfo', - 'offset': 200239, - 'length': 2622, - 'defs': [ - 'flash.net:NetGroupInfo' - ] - }, - { - 'name': 'flash/display/ShaderJob', - 'offset': 202861, - 'length': 1486, - 'defs': [ - 'flash.display:ShaderJob' - ] - }, - { - 'name': 'flash/text/FontStyle', - 'offset': 204347, - 'length': 547, - 'defs': [ - 'flash.text:FontStyle' - ] - }, - { - 'name': 'flash/accessibility/ISearchableText', - 'offset': 204894, - 'length': 479, - 'defs': [ - 'flash.accessibility:ISearchableText' - ] - }, - { - 'name': 'flash/display/GraphicsShaderFill', - 'offset': 205373, - 'length': 648, - 'defs': [ - 'flash.display:GraphicsShaderFill' - ] - }, - { - 'name': 'flash/net/NetStream', - 'offset': 206021, - 'length': 12820, - 'defs': [ - 'flash.net:NetStream' - ] - }, - { - 'name': 'flash/printing/PrintJobOptions', - 'offset': 218841, - 'length': 520, - 'defs': [ - 'flash.printing:PrintJobOptions' - ] - }, - { - 'name': 'flash/net/FileReference', - 'offset': 219361, - 'length': 3031, - 'defs': [ - 'flash.net:FileReference' - ] - }, - { - 'name': 'flash/display/StageQuality', - 'offset': 222392, - 'length': 777, - 'defs': [ - 'flash.display:StageQuality' - ] - }, - { - 'name': 'flash/geom/Transform', - 'offset': 223169, - 'length': 1655, - 'defs': [ - 'flash.geom:Transform' - ] - }, - { - 'name': 'flash/accessibility/AccessibilityProperties', - 'offset': 224824, - 'length': 783, - 'defs': [ - 'flash.accessibility:AccessibilityProperties' - ] - }, - { - 'name': 'flash/filters/BitmapFilter', - 'offset': 225607, - 'length': 554, - 'defs': [ - 'flash.filters:BitmapFilter' - ] - }, - { - 'name': 'flash/filters/DropShadowFilter', - 'offset': 226161, - 'length': 2578, - 'defs': [ - 'flash.filters:DropShadowFilter' - ] - }, - { - 'name': 'flash/system/ApplicationInstaller', - 'offset': 228739, - 'length': 1092, - 'defs': [ - 'flash.system:ApplicationInstaller' - ] - }, - { - 'name': 'flash/display3D/Context3DVertexBufferFormat', - 'offset': 229831, - 'length': 725, - 'defs': [ - 'flash.display3D:Context3DVertexBufferFormat' - ] - }, - { - 'name': 'flash/globalization/DateTimeNameContext', - 'offset': 230556, - 'length': 561, - 'defs': [ - 'flash.globalization:DateTimeNameContext' - ] - }, - { - 'name': 'flash/display/GraphicsSolidFill', - 'offset': 231117, - 'length': 635, - 'defs': [ - 'flash.display:GraphicsSolidFill' - ] - }, - { - 'name': 'flash/display/ShaderParameterType', - 'offset': 231752, - 'length': 1144, - 'defs': [ - 'flash.display:ShaderParameterType' - ] - }, - { - 'name': 'flash/filters/GradientGlowFilter', - 'offset': 232896, - 'length': 2661, - 'defs': [ - 'flash.filters:GradientGlowFilter' - ] - }, - { - 'name': 'JSON', - 'offset': 235557, - 'length': 2655, - 'defs': [ - 'JSON', - 'Walker' - ] - }, - { - 'name': 'flash/system/SecurityDomain', - 'offset': 238212, - 'length': 813, - 'defs': [ - 'flash.system:SecurityDomain' - ] - }, - { - 'name': 'flash/net/IDynamicPropertyOutput', - 'offset': 239025, - 'length': 507, - 'defs': [ - 'flash.net:IDynamicPropertyOutput' - ] - }, - { - 'name': 'flash/net/DynamicPropertyOutput', - 'offset': 239532, - 'length': 695, - 'defs': [ - 'flash.net:DynamicPropertyOutput' - ] - }, - { - 'name': 'flash/media/SoundTransform', - 'offset': 240227, - 'length': 1599, - 'defs': [ - 'flash.media:SoundTransform' - ] - }, - { - 'name': 'flash/text/engine/FontLookup', - 'offset': 241826, - 'length': 501, - 'defs': [ - 'flash.text.engine:FontLookup' - ] - }, - { - 'name': 'flash/display/MorphShape', - 'offset': 242327, - 'length': 526, - 'defs': [ - 'flash.display:MorphShape' - ] - }, - { - 'name': 'flash/net/LocalConnection', - 'offset': 242853, - 'length': 1613, - 'defs': [ - 'flash.net:LocalConnection' - ] - }, - { - 'name': 'flash/display3D/Program3D', - 'offset': 244466, - 'length': 707, - 'defs': [ - 'flash.display3D:Program3D' - ] - }, - { - 'name': 'flash/ui/MouseCursor', - 'offset': 245173, - 'length': 596, - 'defs': [ - 'flash.ui:MouseCursor' - ] - }, - { - 'name': 'flash/events/TextEvent', - 'offset': 245769, - 'length': 1293, - 'defs': [ - 'flash.events:TextEvent' - ] - }, - { - 'name': 'flash/net/URLRequestHeader', - 'offset': 247062, - 'length': 542, - 'defs': [ - 'flash.net:URLRequestHeader' - ] - }, - { - 'name': 'flash/display/TriangleCulling', - 'offset': 247604, - 'length': 561, - 'defs': [ - 'flash.display:TriangleCulling' - ] - }, - { - 'name': 'flash/display/JPEGEncoderOptions', - 'offset': 248165, - 'length': 624, - 'defs': [ - 'flash.display:JPEGEncoderOptions' - ] - }, - { - 'name': 'flash/net/URLLoader', - 'offset': 248789, - 'length': 2592, - 'defs': [ - 'flash.net:URLLoader' - ] - }, - { - 'name': 'flash/accessibility/ISimpleTextSelection', - 'offset': 251381, - 'length': 685, - 'defs': [ - 'flash.accessibility:ISimpleTextSelection' - ] - }, - { - 'name': 'flash/display/Sprite', - 'offset': 252066, - 'length': 1976, - 'defs': [ - 'flash.display:Sprite' - ] - }, - { - 'name': '_3fa260287b70f9c2758634de100a49d54c3f5d3f6359cd77d07fc7f4a8ccecbd_flash_display_Sprite', - 'offset': 254042, - 'length': 1433, - 'defs': [ - '_3fa260287b70f9c2758634de100a49d54c3f5d3f6359cd77d07fc7f4a8ccecbd_flash_display_Sprite' - ] - }, - { - 'name': 'flash/utils/IDataOutput', - 'offset': 255475, - 'length': 1976, - 'defs': [ - 'flash.utils:IDataOutput' - ] - }, - { - 'name': 'flash/net/Socket', - 'offset': 257451, - 'length': 4914, - 'defs': [ - 'flash.net:Socket' - ] - }, - { - 'name': 'flash/net/SecureSocket', - 'offset': 262365, - 'length': 3247, - 'defs': [ - 'flash.net:SecureSocket' - ] - }, - { - 'name': 'flash/text/engine/TypographicCase', - 'offset': 265612, - 'length': 793, - 'defs': [ - 'flash.text.engine:TypographicCase' - ] - }, - { - 'name': 'flash/display/IGraphicsPath', - 'offset': 266405, - 'length': 289, - 'defs': [ - 'flash.display:IGraphicsPath' - ] - }, - { - 'name': 'flash/display/GraphicsTrianglePath', - 'offset': 266694, - 'length': 1240, - 'defs': [ - 'flash.display:GraphicsTrianglePath' - ] - }, - { - 'name': 'flash/display/PixelSnapping', - 'offset': 267934, - 'length': 521, - 'defs': [ - 'flash.display:PixelSnapping' - ] - }, - { - 'name': 'flash/display3D/Context3DProgramType', - 'offset': 268455, - 'length': 543, - 'defs': [ - 'flash.display3D:Context3DProgramType' - ] - }, - { - 'name': 'flash/display/Shape', - 'offset': 268998, - 'length': 590, - 'defs': [ - 'flash.display:Shape' - ] - }, - { - 'name': 'flash/media/SoundMixer', - 'offset': 269588, - 'length': 1436, - 'defs': [ - 'flash.media:SoundMixer' - ] - }, - { - 'name': 'flash/filters/ConvolutionFilter', - 'offset': 271024, - 'length': 2284, - 'defs': [ - 'flash.filters:ConvolutionFilter' - ] - }, - { - 'name': 'flash/net/NetGroupReceiveMode', - 'offset': 273308, - 'length': 523, - 'defs': [ - 'flash.net:NetGroupReceiveMode' - ] - }, - { - 'name': 'flash/events/DRMDeviceGroupEvent', - 'offset': 273831, - 'length': 1334, - 'defs': [ - 'flash.events:DRMDeviceGroupEvent' - ] - }, - { - 'name': 'flash/text/engine/TextLineCreationResult', - 'offset': 275165, - 'length': 689, - 'defs': [ - 'flash.text.engine:TextLineCreationResult' - ] - }, - { - 'name': 'flash/events/StatusEvent', - 'offset': 275854, - 'length': 1267, - 'defs': [ - 'flash.events:StatusEvent' - ] - }, - { - 'name': 'flash/display/ShaderData', - 'offset': 277121, - 'length': 672, - 'defs': [ - 'flash.display:ShaderData' - ] - }, - { - 'name': 'flash/system/WorkerState', - 'offset': 277793, - 'length': 2870, - 'defs': [ - 'flash.system:WorkerState', - 'flash.system:Worker' - ] - }, - { - 'name': 'flash/system/LoaderContext', - 'offset': 280663, - 'length': 1320, - 'defs': [ - 'flash.system:LoaderContext' - ] - }, - { - 'name': 'flash/system/JPEGLoaderContext', - 'offset': 281983, - 'length': 735, - 'defs': [ - 'flash.system:JPEGLoaderContext' - ] - }, - { - 'name': 'flash/debugger/enterDebugger', - 'offset': 282718, - 'length': 279, - 'defs': [ - 'flash.debugger:enterDebugger' - ] - }, - { - 'name': 'flash/ui/Multitouch', - 'offset': 282997, - 'length': 1121, - 'defs': [ - 'flash.ui:Multitouch' - ] - }, - { - 'name': 'Date', - 'offset': 284118, - 'length': 10379, - 'defs': [ - 'Date' - ] - }, - { - 'name': 'flash/display/SWFVersion', - 'offset': 294497, - 'length': 864, - 'defs': [ - 'flash.display:SWFVersion' - ] - }, - { - 'name': 'flash/events/ProgressEvent', - 'offset': 295361, - 'length': 1435, - 'defs': [ - 'flash.events:ProgressEvent' - ] - }, - { - 'name': 'flash/media/scanHardware', - 'offset': 296796, - 'length': 2968, - 'defs': [ - 'flash.media:scanHardware', - 'flash.media:Camera' - ] - }, - { - 'name': 'flash/text/engine/TextBaseline', - 'offset': 299764, - 'length': 832, - 'defs': [ - 'flash.text.engine:TextBaseline' - ] - }, - { - 'name': 'flash/text/AntiAliasType', - 'offset': 300596, - 'length': 474, - 'defs': [ - 'flash.text:AntiAliasType' - ] - }, - { - 'name': 'flash/net/NetGroup', - 'offset': 301070, - 'length': 5049, - 'defs': [ - 'flash.net:NetGroup' - ] - }, - { - 'name': 'flash/events/ErrorEvent', - 'offset': 306119, - 'length': 1052, - 'defs': [ - 'flash.events:ErrorEvent' - ] - }, - { - 'name': 'flash/events/IOErrorEvent', - 'offset': 307171, - 'length': 1204, - 'defs': [ - 'flash.events:IOErrorEvent' - ] - }, - { - 'name': 'flash/utils/describeType', - 'offset': 308375, - 'length': 1393, - 'defs': [ - 'flash.utils:describeType', - 'flash.utils:getAliasName', - 'flash.utils:getQualifiedClassName', - 'flash.utils:getDefinitionByName', - 'flash.utils:getQualifiedSuperclassName', - 'flash.utils:getTimer', - 'flash.utils:escapeMultiByte', - 'flash.utils:unescapeMultiByte', - 'trace', - 'watson' - ] - }, - { - 'name': 'flash/display/ColorCorrectionSupport', - 'offset': 309768, - 'length': 621, - 'defs': [ - 'flash.display:ColorCorrectionSupport' - ] - }, - { - 'name': 'flash/ui/MultitouchInputMode', - 'offset': 310389, - 'length': 573, - 'defs': [ - 'flash.ui:MultitouchInputMode' - ] - }, - { - 'name': 'flash/text/TextFormatAlign', - 'offset': 310962, - 'length': 658, - 'defs': [ - 'flash.text:TextFormatAlign' - ] - }, - { - 'name': 'flash/text/engine/Kerning', - 'offset': 311620, - 'length': 500, - 'defs': [ - 'flash.text.engine:Kerning' - ] - }, - { - 'name': 'flash/net/NetStreamAppendBytesAction', - 'offset': 312120, - 'length': 639, - 'defs': [ - 'flash.net:NetStreamAppendBytesAction' - ] - }, - { - 'name': 'flash/display/IGraphicsStroke', - 'offset': 312759, - 'length': 297, - 'defs': [ - 'flash.display:IGraphicsStroke' - ] - }, - { - 'name': 'flash/net/NetGroupSendResult', - 'offset': 313056, - 'length': 560, - 'defs': [ - 'flash.net:NetGroupSendResult' - ] - }, - { - 'name': 'flash/display/LineScaleMode', - 'offset': 313616, - 'length': 582, - 'defs': [ - 'flash.display:LineScaleMode' - ] - }, - { - 'name': 'flash/events/AsyncErrorEvent', - 'offset': 314198, - 'length': 1076, - 'defs': [ - 'flash.events:AsyncErrorEvent' - ] - }, - { - 'name': 'flash/display/StageScaleMode', - 'offset': 315274, - 'length': 595, - 'defs': [ - 'flash.display:StageScaleMode' - ] - }, - { - 'name': 'flash/ui/GameInput', - 'offset': 315869, - 'length': 835, - 'defs': [ - 'flash.ui:GameInput' - ] - }, - { - 'name': 'flash/filters/BitmapFilterQuality', - 'offset': 316704, - 'length': 535, - 'defs': [ - 'flash.filters:BitmapFilterQuality' - ] - }, - { - 'name': 'flash/profiler/profile', - 'offset': 317239, - 'length': 454, - 'defs': [ - 'flash.profiler:profile', - 'flash.profiler:showRedrawRegions' - ] - }, - { - 'name': 'flash/display/BitmapData', - 'offset': 317693, - 'length': 4790, - 'defs': [ - 'flash.display:BitmapData' - ] - }, - { - 'name': 'flash/events/ShaderEvent', - 'offset': 322483, - 'length': 1669, - 'defs': [ - 'flash.events:ShaderEvent' - ] - }, - { - 'name': 'flash/events/TimerEvent', - 'offset': 324152, - 'length': 1048, - 'defs': [ - 'flash.events:TimerEvent' - ] - }, - { - 'name': 'XML', - 'offset': 325200, - 'length': 12638, - 'defs': [ - 'XML', - 'XMLList', - 'QName' - ] - }, - { - 'name': 'flash/ui/GameInputHand', - 'offset': 337838, - 'length': 523, - 'defs': [ - 'flash.ui:GameInputHand' - ] - }, - { - 'name': 'Math', - 'offset': 338361, - 'length': 1672, - 'defs': [ - 'Math' - ] - }, - { - 'name': 'flash/events/DRMAuthenticateEvent', - 'offset': 340033, - 'length': 2108, - 'defs': [ - 'flash.events:DRMAuthenticateEvent' - ] - }, - { - 'name': 'flash/media/H264Level', - 'offset': 342141, - 'length': 1104, - 'defs': [ - 'flash.media:H264Level' - ] - }, - { - 'name': 'flash/text/FontType', - 'offset': 343245, - 'length': 504, - 'defs': [ - 'flash.text:FontType' - ] - }, - { - 'name': 'flash/display/NativeMenuItem', - 'offset': 343749, - 'length': 787, - 'defs': [ - 'flash.display:NativeMenuItem' - ] - }, - { - 'name': 'flash/net/FileFilter', - 'offset': 344536, - 'length': 937, - 'defs': [ - 'flash.net:FileFilter' - ] - }, - { - 'name': 'flash/text/Font', - 'offset': 345473, - 'length': 845, - 'defs': [ - 'flash.text:Font' - ] - }, - { - 'name': 'flash/events/SampleDataEvent', - 'offset': 346318, - 'length': 1415, - 'defs': [ - 'flash.events:SampleDataEvent' - ] - }, - { - 'name': 'flash/utils/Endian', - 'offset': 347733, - 'length': 454, - 'defs': [ - 'flash.utils:Endian' - ] - }, - { - 'name': 'flash/filters/BevelFilter', - 'offset': 348187, - 'length': 2674, - 'defs': [ - 'flash.filters:BevelFilter' - ] - }, - { - 'name': 'flash/net/SharedObject', - 'offset': 350861, - 'length': 3383, - 'defs': [ - 'flash.net:SharedObject' - ] - }, - { - 'name': 'flash/media/SoundLoaderContext', - 'offset': 354244, - 'length': 596, - 'defs': [ - 'flash.media:SoundLoaderContext' - ] - }, - { - 'name': 'flash/events/AccelerometerEvent', - 'offset': 354840, - 'length': 1946, - 'defs': [ - 'flash.events:AccelerometerEvent' - ] - }, - { - 'name': 'flash/display/ShaderParameter', - 'offset': 356786, - 'length': 845, - 'defs': [ - 'flash.display:ShaderParameter' - ] - }, - { - 'name': 'flash/ui/ContextMenuClipboardItems', - 'offset': 357631, - 'length': 1879, - 'defs': [ - 'flash.ui:ContextMenuClipboardItems' - ] - }, - { - 'name': 'flash/media/SoundCodec', - 'offset': 359510, - 'length': 563, - 'defs': [ - 'flash.media:SoundCodec' - ] - }, - { - 'name': 'flash/events/DRMCustomProperties', - 'offset': 360073, - 'length': 2540, - 'defs': [ - 'flash.events:DRMCustomProperties', - 'flash.events:DRMStatusEvent' - ] - }, - { - 'name': 'flash/automation/ActionGenerator', - 'offset': 362613, - 'length': 801, - 'defs': [ - 'flash.automation:ActionGenerator' - ] - }, - { - 'name': 'flash/text/TextFormat', - 'offset': 363414, - 'length': 3332, - 'defs': [ - 'flash.text:TextFormat' - ] - }, - { - 'name': 'flash/events/NetStatusEvent', - 'offset': 366746, - 'length': 1085, - 'defs': [ - 'flash.events:NetStatusEvent' - ] - }, - { - 'name': 'flash/display/GraphicsBitmapFill', - 'offset': 367831, - 'length': 760, - 'defs': [ - 'flash.display:GraphicsBitmapFill' - ] - }, - { - 'name': 'flash/system/DomainMemoryWithStage3D', - 'offset': 368591, - 'length': 1743, - 'defs': [ - 'flash.system:DomainMemoryWithStage3D' - ] - }, - { - 'name': 'flash/system/MessageChannelState', - 'offset': 370334, - 'length': 2210, - 'defs': [ - 'flash.system:MessageChannelState', - 'flash.system:MessageChannel' - ] - }, - { - 'name': 'RegExp', - 'offset': 372544, - 'length': 1471, - 'defs': [ - 'RegExp' - ] - }, - { - 'name': 'flash/display/LoaderInfo', - 'offset': 374015, - 'length': 3881, - 'defs': [ - 'flash.display:LoaderInfo' - ] - }, - { - 'name': 'flash/text/TextDisplayMode', - 'offset': 377896, - 'length': 518, - 'defs': [ - 'flash.text:TextDisplayMode' - ] - }, - { - 'name': 'flash/net/URLRequestMethod', - 'offset': 378414, - 'length': 624, - 'defs': [ - 'flash.net:URLRequestMethod' - ] - }, - { - 'name': 'flash/display/Shader', - 'offset': 379038, - 'length': 961, - 'defs': [ - 'flash.display:Shader' - ] - }, - { - 'name': 'flash/events/NetDataEvent', - 'offset': 379999, - 'length': 1149, - 'defs': [ - 'flash.events:NetDataEvent' - ] - }, - { - 'name': 'flash/system/ImageDecodingPolicy', - 'offset': 381148, - 'length': 539, - 'defs': [ - 'flash.system:ImageDecodingPolicy' - ] - }, - { - 'name': 'flash/display/GraphicsGradientFill', - 'offset': 381687, - 'length': 2224, - 'defs': [ - 'flash.display:GraphicsGradientFill' - ] - }, - { - 'name': 'flash/text/engine/TextLineMirrorRegion', - 'offset': 383911, - 'length': 1170, - 'defs': [ - 'flash.text.engine:TextLineMirrorRegion' - ] - }, - { - 'name': 'flash/display3D/IndexBuffer3D', - 'offset': 385081, - 'length': 921, - 'defs': [ - 'flash.display3D:IndexBuffer3D' - ] - }, - { - 'name': 'flash/events/IMEEvent', - 'offset': 386002, - 'length': 1303, - 'defs': [ - 'flash.events:IMEEvent' - ] - }, - { - 'name': 'flash/text/engine/TextLine', - 'offset': 387305, - 'length': 5029, - 'defs': [ - 'flash.text.engine:TextLine' - ] - }, - { - 'name': 'flash/display3D/VertexBuffer3D', - 'offset': 392334, - 'length': 940, - 'defs': [ - 'flash.display3D:VertexBuffer3D' - ] - }, - { - 'name': 'flash/utils/CompressionAlgorithm', - 'offset': 393274, - 'length': 5295, - 'defs': [ - 'flash.utils:CompressionAlgorithm', - 'flash.utils:IDataInput2', - 'flash.utils:IDataOutput2', - 'flash.utils:ByteArray' - ] - }, - { - 'name': 'flash/display/FrameLabel', - 'offset': 398569, - 'length': 871, - 'defs': [ - 'flash.display:FrameLabel' - ] - }, - { - 'name': 'adobe/utils/ProductManager', - 'offset': 399440, - 'length': 2071, - 'defs': [ - 'adobe.utils:ProductManager' - ] - }, - { - 'name': 'flash/events/GameInputEvent', - 'offset': 401511, - 'length': 849, - 'defs': [ - 'flash.events:GameInputEvent' - ] - }, - { - 'name': 'flash/net/ObjectEncoding', - 'offset': 402360, - 'length': 794, - 'defs': [ - 'flash.net:ObjectEncoding' - ] - }, - { - 'name': 'flash/geom/Matrix3D', - 'offset': 403154, - 'length': 3313, - 'defs': [ - 'flash.geom:Matrix3D' - ] - }, - { - 'name': 'flash/media/H264Profile', - 'offset': 406467, - 'length': 474, - 'defs': [ - 'flash.media:H264Profile' - ] - }, - { - 'name': 'flash/display/Scene', - 'offset': 406941, - 'length': 802, - 'defs': [ - 'flash.display:Scene' - ] - }, - { - 'name': 'flash/display3D/Context3DClearMask', - 'offset': 407743, - 'length': 611, - 'defs': [ - 'flash.display3D:Context3DClearMask' - ] - }, - { - 'name': 'flash/net/NetStreamMulticastInfo', - 'offset': 408354, - 'length': 5325, - 'defs': [ - 'flash.net:NetStreamMulticastInfo' - ] - }, - { - 'name': 'flash/globalization/LastOperationStatus', - 'offset': 413679, - 'length': 1671, - 'defs': [ - 'flash.globalization:LastOperationStatus' - ] - }, - { - 'name': 'flash/events/ActivityEvent', - 'offset': 415350, - 'length': 1099, - 'defs': [ - 'flash.events:ActivityEvent' - ] - }, - { - 'name': 'flash/net/NetConnection', - 'offset': 416449, - 'length': 3692, - 'defs': [ - 'flash.net:NetConnection' - ] - }, - { - 'name': 'flash/events/VideoEvent', - 'offset': 420141, - 'length': 968, - 'defs': [ - 'flash.events:VideoEvent' - ] - }, - { - 'name': 'flash/filters/BitmapFilterType', - 'offset': 421109, - 'length': 535, - 'defs': [ - 'flash.filters:BitmapFilterType' - ] - }, - { - 'name': 'flash/display/SpreadMethod', - 'offset': 421644, - 'length': 519, - 'defs': [ - 'flash.display:SpreadMethod' - ] - }, - { - 'name': 'flash/text/TextField', - 'offset': 422163, - 'length': 10471, - 'defs': [ - 'flash.text:TextField' - ] - }, - { - 'name': 'flash/events/GestureEvent', - 'offset': 432634, - 'length': 2768, - 'defs': [ - 'flash.events:GestureEvent' - ] - }, - { - 'name': 'flash/events/PressAndTapGestureEvent', - 'offset': 435402, - 'length': 2208, - 'defs': [ - 'flash.events:PressAndTapGestureEvent' - ] - }, - { - 'name': 'flash/media/SoundChannel', - 'offset': 437610, - 'length': 1031, - 'defs': [ - 'flash.media:SoundChannel' - ] - }, - { - 'name': 'flash/text/engine/EastAsianJustifier', - 'offset': 438641, - 'length': 1350, - 'defs': [ - 'flash.text.engine:EastAsianJustifier' - ] - }, - { - 'name': 'flash/accessibility/AccessibilityImplementation', - 'offset': 439991, - 'length': 2663, - 'defs': [ - 'flash.accessibility:AccessibilityImplementation' - ] - }, - { - 'name': 'flash/text/CSMSettings', - 'offset': 442654, - 'length': 648, - 'defs': [ - 'flash.text:CSMSettings' - ] - }, - { - 'name': 'flash/net/drm/DRMContentData', - 'offset': 443302, - 'length': 2300, - 'defs': [ - 'flash.net.drm:DRMContentData' - ] - }, - { - 'name': 'flash/events/StageVideoAvailabilityEvent', - 'offset': 445602, - 'length': 890, - 'defs': [ - 'flash.events:StageVideoAvailabilityEvent' - ] - }, - { - 'name': 'flash/net/NetGroupSendMode', - 'offset': 446492, - 'length': 538, - 'defs': [ - 'flash.net:NetGroupSendMode' - ] - }, - { - 'name': 'flash/text/TextRun', - 'offset': 447030, - 'length': 569, - 'defs': [ - 'flash.text:TextRun' - ] - }, - { - 'name': 'flash/net/XMLSocket', - 'offset': 447599, - 'length': 2766, - 'defs': [ - 'flash.net:XMLSocket' - ] - }, - { - 'name': 'flash/utils/Dictionary', - 'offset': 450365, - 'length': 722, - 'defs': [ - 'flash.utils:Dictionary' - ] - }, - { - 'name': 'flash/display3D/Context3DCompareMode', - 'offset': 451087, - 'length': 827, - 'defs': [ - 'flash.display3D:Context3DCompareMode' - ] - }, - { - 'name': 'flash/text/TextFieldAutoSize', - 'offset': 451914, - 'length': 578, - 'defs': [ - 'flash.text:TextFieldAutoSize' - ] - }, - { - 'name': 'flash/text/engine/GroupElement', - 'offset': 452492, - 'length': 1911, - 'defs': [ - 'flash.text.engine:GroupElement' - ] - }, - { - 'name': 'flash/automation/AutomationAction', - 'offset': 454403, - 'length': 669, - 'defs': [ - 'flash.automation:AutomationAction' - ] - }, - { - 'name': 'flash/automation/KeyboardAutomationAction', - 'offset': 455072, - 'length': 992, - 'defs': [ - 'flash.automation:KeyboardAutomationAction' - ] - }, - { - 'name': 'flash/net/NetStreamPlayOptions', - 'offset': 456064, - 'length': 891, - 'defs': [ - 'flash.net:NetStreamPlayOptions' - ] - }, - { - 'name': 'flash/text/engine/ElementFormat', - 'offset': 456955, - 'length': 4281, - 'defs': [ - 'flash.text.engine:ElementFormat' - ] - }, - { - 'name': 'flash/filters/DisplacementMapFilter', - 'offset': 461236, - 'length': 2454, - 'defs': [ - 'flash.filters:DisplacementMapFilter' - ] - }, - { - 'name': 'flash/globalization/CurrencyParseResult', - 'offset': 463690, - 'length': 936, - 'defs': [ - 'flash.globalization:CurrencyParseResult' - ] - }, - { - 'name': 'flash/display3D/Context3D', - 'offset': 464626, - 'length': 5441, - 'defs': [ - 'flash.display3D:Context3D' - ] - }, - { - 'name': 'flash/printing/PrintJob', - 'offset': 470067, - 'length': 2693, - 'defs': [ - 'flash.printing:PrintJob' - ] - }, - { - 'name': 'flash/xml/XMLNodeType', - 'offset': 472760, - 'length': 746, - 'defs': [ - 'flash.xml:XMLNodeType' - ] - }, - { - 'name': 'flash/events/TransformGestureEvent', - 'offset': 473506, - 'length': 2762, - 'defs': [ - 'flash.events:TransformGestureEvent' - ] - }, - { - 'name': 'flash/net/GroupSpecifier', - 'offset': 476268, - 'length': 9817, - 'defs': [ - 'flash.net:GroupSpecifier' - ] - }, - { - 'name': 'flash/system/SecurityPanel', - 'offset': 486085, - 'length': 760, - 'defs': [ - 'flash.system:SecurityPanel' - ] - }, - { - 'name': 'flash/globalization/Collator', - 'offset': 486845, - 'length': 2251, - 'defs': [ - 'flash.globalization:Collator' - ] - }, - { - 'name': 'flash/display/Graphics', - 'offset': 489096, - 'length': 5565, - 'defs': [ - 'flash.display:Graphics' - ] - }, - { - 'name': 'flash/ui/ContextMenuItem', - 'offset': 494661, - 'length': 1400, - 'defs': [ - 'flash.ui:ContextMenuItem' - ] - }, - { - 'name': 'flash/net/FileReferenceList', - 'offset': 496061, - 'length': 805, - 'defs': [ - 'flash.net:FileReferenceList' - ] - }, - { - 'name': 'flash/events/DataEvent', - 'offset': 496866, - 'length': 1126, - 'defs': [ - 'flash.events:DataEvent' - ] - }, - { - 'name': 'flash/ui/GameInputFinger', - 'offset': 497992, - 'length': 584, - 'defs': [ - 'flash.ui:GameInputFinger' - ] - }, - { - 'name': 'flash/geom/Utils3D', - 'offset': 498576, - 'length': 768, - 'defs': [ - 'flash.geom:Utils3D' - ] - }, - { - 'name': 'flash/text/TextColorType', - 'offset': 499344, - 'length': 476, - 'defs': [ - 'flash.text:TextColorType' - ] - }, - { - 'name': 'flash/ui/KeyLocation', - 'offset': 499820, - 'length': 574, - 'defs': [ - 'flash.ui:KeyLocation' - ] - }, - { - 'name': 'flash/display/BitmapDataChannel', - 'offset': 500394, - 'length': 566, - 'defs': [ - 'flash.display:BitmapDataChannel' - ] - }, - { - 'name': 'flash/text/StaticText', - 'offset': 500960, - 'length': 616, - 'defs': [ - 'flash.text:StaticText' - ] - }, - { - 'name': 'flash/events/FocusEvent', - 'offset': 501576, - 'length': 2097, - 'defs': [ - 'flash.events:FocusEvent' - ] - }, - { - 'name': 'flash/display/BlendMode', - 'offset': 503673, - 'length': 1090, - 'defs': [ - 'flash.display:BlendMode' - ] - }, - { - 'name': 'flash/net/SharedObjectFlushStatus', - 'offset': 504763, - 'length': 531, - 'defs': [ - 'flash.net:SharedObjectFlushStatus' - ] - }, - { - 'name': 'flash/display/GraphicsPath', - 'offset': 505294, - 'length': 2513, - 'defs': [ - 'flash.display:GraphicsPath' - ] - }, - { - 'name': 'flash/events/HTTPStatusEvent', - 'offset': 507807, - 'length': 1677, - 'defs': [ - 'flash.events:HTTPStatusEvent' - ] - }, - { - 'name': 'flash/geom/Orientation3D', - 'offset': 509484, - 'length': 560, - 'defs': [ - 'flash.geom:Orientation3D' - ] - }, - { - 'name': 'flash/text/engine/TextBlock', - 'offset': 510044, - 'length': 5617, - 'defs': [ - 'flash.text.engine:TextBlock' - ] - }, - { - 'name': 'flash/system/System', - 'offset': 515661, - 'length': 1753, - 'defs': [ - 'flash.system:System' - ] - }, - { - 'name': 'flash/filters/BlurFilter', - 'offset': 517414, - 'length': 1123, - 'defs': [ - 'flash.filters:BlurFilter' - ] - }, - { - 'name': 'flash/media/StageVideoAvailability', - 'offset': 518537, - 'length': 556, - 'defs': [ - 'flash.media:StageVideoAvailability' - ] - }, - { - 'name': 'flash/system/Capabilities', - 'offset': 519093, - 'length': 3483, - 'defs': [ - 'flash.system:Capabilities' - ] - }, - { - 'name': 'flash/system/ApplicationDomain', - 'offset': 522576, - 'length': 1494, - 'defs': [ - 'flash.system:ApplicationDomain' - ] - }, - { - 'name': 'flash/display/StageAlign', - 'offset': 524070, - 'length': 716, - 'defs': [ - 'flash.display:StageAlign' - ] - }, - { - 'name': 'flash/text/TextFieldType', - 'offset': 524786, - 'length': 470, - 'defs': [ - 'flash.text:TextFieldType' - ] - }, - { - 'name': 'flash/display/GraphicsStroke', - 'offset': 525256, - 'length': 2213, - 'defs': [ - 'flash.display:GraphicsStroke' - ] - }, - { - 'name': 'flash/utils/flash_proxy', - 'offset': 527469, - 'length': 1800, - 'defs': [ - 'flash.utils:flash_proxy', - 'flash.utils:Proxy' - ] - }, - { - 'name': 'flash/globalization/DateTimeStyle', - 'offset': 529269, - 'length': 647, - 'defs': [ - 'flash.globalization:DateTimeStyle' - ] - }, - { - 'name': 'flash/events/DRMAuthenticationErrorEvent', - 'offset': 529916, - 'length': 1895, - 'defs': [ - 'flash.events:DRMAuthenticationErrorEvent' - ] - }, - { - 'name': 'flash/net/NetGroupReplicationStrategy', - 'offset': 531811, - 'length': 591, - 'defs': [ - 'flash.net:NetGroupReplicationStrategy' - ] - }, - { - 'name': 'flash/events/NetFilterEvent', - 'offset': 532402, - 'length': 950, - 'defs': [ - 'flash.events:NetFilterEvent' - ] - }, - { - 'name': 'flash/geom/Vector3D', - 'offset': 533352, - 'length': 3920, - 'defs': [ - 'flash.geom:Vector3D' - ] - }, - { - 'name': 'flash/events/ThrottleEvent', - 'offset': 537272, - 'length': 1278, - 'defs': [ - 'flash.events:ThrottleEvent' - ] - }, - { - 'name': 'flash/globalization/LocaleID', - 'offset': 538550, - 'length': 1487, - 'defs': [ - 'flash.globalization:LocaleID' - ] - }, - { - 'name': 'flash/events/GesturePhase', - 'offset': 540037, - 'length': 570, - 'defs': [ - 'flash.events:GesturePhase' - ] - }, - { - 'name': 'flash/globalization/DateTimeNameStyle', - 'offset': 540607, - 'length': 627, - 'defs': [ - 'flash.globalization:DateTimeNameStyle' - ] - }, - { - 'name': 'flash/automation/MouseAutomationAction', - 'offset': 541234, - 'length': 1829, - 'defs': [ - 'flash.automation:MouseAutomationAction' - ] - }, - { - 'name': 'flash/ui/GameInputControlType', - 'offset': 543063, - 'length': 738, - 'defs': [ - 'flash.ui:GameInputControlType' - ] - }, - { - 'name': 'flash/display3D/Context3DTextureFormat', - 'offset': 543801, - 'length': 631, - 'defs': [ - 'flash.display3D:Context3DTextureFormat' - ] - }, - { - 'name': 'flash/ui/MouseCursorData', - 'offset': 544432, - 'length': 1004, - 'defs': [ - 'flash.ui:MouseCursorData' - ] - }, - { - 'name': 'flash/display/StageDisplayState', - 'offset': 545436, - 'length': 592, - 'defs': [ - 'flash.display:StageDisplayState' - ] - }, - { - 'name': 'flash/net/NetMonitor', - 'offset': 546028, - 'length': 655, - 'defs': [ - 'flash.net:NetMonitor' - ] - }, - { - 'name': 'flash/events/SyncEvent', - 'offset': 546683, - 'length': 1055, - 'defs': [ - 'flash.events:SyncEvent' - ] - }, - { - 'name': 'flash/globalization/NumberFormatter', - 'offset': 547738, - 'length': 3379, - 'defs': [ - 'flash.globalization:NumberFormatter' - ] - }, - { - 'name': 'flash/media/MicrophoneEnhancedOptions', - 'offset': 551117, - 'length': 2019, - 'defs': [ - 'flash.media:MicrophoneEnhancedOptions' - ] - }, - { - 'name': 'flash/xml/XMLNode', - 'offset': 553136, - 'length': 4338, - 'defs': [ - 'flash.xml:XMLNode' - ] - }, - { - 'name': 'flash/trace/Trace', - 'offset': 557474, - 'length': 1014, - 'defs': [ - 'flash.trace:Trace' - ] - }, - { - 'name': 'flash/system/IMEConversionMode', - 'offset': 558488, - 'length': 793, - 'defs': [ - 'flash.system:IMEConversionMode' - ] - }, - { - 'name': 'flash/text/TextFormatDisplay', - 'offset': 559281, - 'length': 508, - 'defs': [ - 'flash.text:TextFormatDisplay' - ] - }, - { - 'name': 'flash/events/DRMErrorEvent', - 'offset': 559789, - 'length': 2017, - 'defs': [ - 'flash.events:DRMErrorEvent' - ] - }, - { - 'name': 'flash/filters/ColorMatrixFilter', - 'offset': 561806, - 'length': 895, - 'defs': [ - 'flash.filters:ColorMatrixFilter' - ] - }, - { - 'name': 'flash/system/SystemUpdater', - 'offset': 562701, - 'length': 2410, - 'defs': [ - 'flash.system:SystemUpdater', - 'flash.system:SystemUpdaterType' - ] - }, - { - 'name': 'flash/display/ActionScriptVersion', - 'offset': 565111, - 'length': 515, - 'defs': [ - 'flash.display:ActionScriptVersion' - ] - }, - { - 'name': 'flash/media/Video', - 'offset': 565626, - 'length': 1376, - 'defs': [ - 'flash.media:Video' - ] - }, - { - 'name': 'flash/desktop/ClipboardFormats', - 'offset': 567002, - 'length': 8298, - 'defs': [ - 'flash.desktop:ClipboardFormats', - 'flash.desktop:ClipboardTransferMode', - 'flash.desktop:Clipboard' - ] - }, - { - 'name': 'flash/display/AVM1Movie', - 'offset': 575300, - 'length': 1865, - 'defs': [ - 'flash.display:AVM1Movie' - ] - }, - { - 'name': 'flash/filters/GradientBevelFilter', - 'offset': 577165, - 'length': 2694, - 'defs': [ - 'flash.filters:GradientBevelFilter' - ] - }, - { - 'name': 'flash/ui/ContextMenuBuiltInItems', - 'offset': 579859, - 'length': 2547, - 'defs': [ - 'flash.ui:ContextMenuBuiltInItems' - ] - }, - { - 'name': 'flash/text/engine/BreakOpportunity', - 'offset': 582406, - 'length': 601, - 'defs': [ - 'flash.text.engine:BreakOpportunity' - ] - }, - { - 'name': 'flash/display/PNGEncoderOptions', - 'offset': 583007, - 'length': 627, - 'defs': [ - 'flash.display:PNGEncoderOptions' - ] - }, - { - 'name': 'flash/globalization/NationalDigitsType', - 'offset': 583634, - 'length': 1896, - 'defs': [ - 'flash.globalization:NationalDigitsType' - ] - }, - { - 'name': 'flash/text/TextExtent', - 'offset': 585530, - 'length': 695, - 'defs': [ - 'flash.text:TextExtent' - ] - }, - { - 'name': 'flash/text/engine/GraphicElement', - 'offset': 586225, - 'length': 1341, - 'defs': [ - 'flash.text.engine:GraphicElement' - ] - }, - { - 'name': 'flash/system/IME', - 'offset': 587566, - 'length': 1381, - 'defs': [ - 'flash.system:IME' - ] - }, - { - 'name': 'flash/text/engine/FontMetrics', - 'offset': 588947, - 'length': 1075, - 'defs': [ - 'flash.text.engine:FontMetrics' - ] - }, - { - 'name': 'flash/security/X509Certificate', - 'offset': 590022, - 'length': 1735, - 'defs': [ - 'flash.security:X509Certificate' - ] - }, - { - 'name': 'flash/events/TouchEvent', - 'offset': 591757, - 'length': 5240, - 'defs': [ - 'flash.events:TouchEvent' - ] - }, - { - 'name': 'flash/text/engine/TextRotation', - 'offset': 596997, - 'length': 661, - 'defs': [ - 'flash.text.engine:TextRotation' - ] - }, - { - 'name': 'flash/display3D/Context3DProfile', - 'offset': 597658, - 'length': 547, - 'defs': [ - 'flash.display3D:Context3DProfile' - ] - }, - { - 'name': 'flash/text/ime/IIMEClient', - 'offset': 598205, - 'length': 1802, - 'defs': [ - 'flash.text.ime:IIMEClient' - ] - }, - { - 'name': 'flash/display3D/Context3DTriangleFace', - 'offset': 600007, - 'length': 641, - 'defs': [ - 'flash.display3D:Context3DTriangleFace' - ] - }, - { - 'name': 'flash/events/MouseEvent', - 'offset': 600648, - 'length': 4905, - 'defs': [ - 'flash.events:MouseEvent' - ] - }, - { - 'name': 'flash/xml/XMLDocument', - 'offset': 605553, - 'length': 3522, - 'defs': [ - 'flash.xml:XMLDocument' - ] - }, - { - 'name': 'flash/text/engine/RenderingMode', - 'offset': 609075, - 'length': 502, - 'defs': [ - 'flash.text.engine:RenderingMode' - ] - }, - { - 'name': 'flash/net/URLRequest', - 'offset': 609577, - 'length': 2169, - 'defs': [ - 'flash.net:URLRequest' - ] - }, - { - 'name': 'flash/automation/StageCapture', - 'offset': 611746, - 'length': 1555, - 'defs': [ - 'flash.automation:StageCapture' - ] - }, - { - 'name': 'flash/media/StageVideo', - 'offset': 613301, - 'length': 1641, - 'defs': [ - 'flash.media:StageVideo' - ] - }, - { - 'name': 'flash/events/DRMDeviceGroupErrorEvent', - 'offset': 614942, - 'length': 2201, - 'defs': [ - 'flash.events:DRMDeviceGroupErrorEvent' - ] - }, - { - 'name': 'flash/events/SoftKeyboardEvent', - 'offset': 617143, - 'length': 1653, - 'defs': [ - 'flash.events:SoftKeyboardEvent' - ] - }, - { - 'name': 'flash/errors/DRMManagerError', - 'offset': 618796, - 'length': 874, - 'defs': [ - 'flash.errors:DRMManagerError' - ] - }, - { - 'name': 'flash/text/engine/FontPosture', - 'offset': 619670, - 'length': 494, - 'defs': [ - 'flash.text.engine:FontPosture' - ] - }, - { - 'name': 'flash/display/JointStyle', - 'offset': 620164, - 'length': 502, - 'defs': [ - 'flash.display:JointStyle' - ] - }, - { - 'name': 'flash/display/ShaderPrecision', - 'offset': 620666, - 'length': 502, - 'defs': [ - 'flash.display:ShaderPrecision' - ] - }, - { - 'name': 'flash/text/engine/LineJustification', - 'offset': 621168, - 'length': 710, - 'defs': [ - 'flash.text.engine:LineJustification' - ] - }, - { - 'name': 'flash/globalization/StringTools', - 'offset': 621878, - 'length': 1250, - 'defs': [ - 'flash.globalization:StringTools' - ] - }, - { - 'name': 'flash/text/StyleSheet', - 'offset': 623128, - 'length': 3305, - 'defs': [ - 'flash.text:StyleSheet' - ] - }, - { - 'name': 'flash/display/ShaderInput', - 'offset': 626433, - 'length': 1038, - 'defs': [ - 'flash.display:ShaderInput' - ] - }, - { - 'name': 'flash/net/NetStreamPlayTransitions', - 'offset': 627471, - 'length': 848, - 'defs': [ - 'flash.net:NetStreamPlayTransitions' - ] - }, - { - 'name': 'flash/display/BitmapEncodingColorSpace', - 'offset': 628319, - 'length': 688, - 'defs': [ - 'flash.display:BitmapEncodingColorSpace' - ] - }, - { - 'name': 'flash/display/InterpolationMethod', - 'offset': 629007, - 'length': 518, - 'defs': [ - 'flash.display:InterpolationMethod' - ] - }, - { - 'name': 'flash/media/ID3Info', - 'offset': 629525, - 'length': 541, - 'defs': [ - 'flash.media:ID3Info' - ] - }, - { - 'name': 'flash/system/TouchscreenType', - 'offset': 630066, - 'length': 549, - 'defs': [ - 'flash.system:TouchscreenType' - ] - }, - { - 'name': 'flash/events/DRMAuthenticationCompleteEvent', - 'offset': 630615, - 'length': 1774, - 'defs': [ - 'flash.events:DRMAuthenticationCompleteEvent' - ] - }, - { - 'name': 'flash/events/SecurityErrorEvent', - 'offset': 632389, - 'length': 1045, - 'defs': [ - 'flash.events:SecurityErrorEvent' - ] - }, - { - 'name': 'flash/system/AuthorizedFeatures', - 'offset': 633434, - 'length': 1104, - 'defs': [ - 'flash.system:AuthorizedFeatures' - ] - }, - { - 'name': 'flash/media/Sound', - 'offset': 634538, - 'length': 2359, - 'defs': [ - 'flash.media:Sound' - ] - }, - { - 'name': 'flash/system/WorkerDomain', - 'offset': 636897, - 'length': 996, - 'defs': [ - 'flash.system:WorkerDomain' - ] - }, - { - 'name': 'flash/net/URLStream', - 'offset': 637893, - 'length': 2721, - 'defs': [ - 'flash.net:URLStream' - ] - }, - { - 'name': 'flash/events/OutputProgressEvent', - 'offset': 640614, - 'length': 1459, - 'defs': [ - 'flash.events:OutputProgressEvent' - ] - }, - { - 'name': 'flash/display/SimpleButton', - 'offset': 642073, - 'length': 2124, - 'defs': [ - 'flash.display:SimpleButton' - ] - }, - { - 'name': 'flash/display/JPEGXREncoderOptions', - 'offset': 644197, - 'length': 760, - 'defs': [ - 'flash.display:JPEGXREncoderOptions' - ] - }, - { - 'name': 'flash/display/GradientType', - 'offset': 644957, - 'length': 472, - 'defs': [ - 'flash.display:GradientType' - ] - }, - { - 'name': 'flash/net/URLVariables', - 'offset': 645429, - 'length': 1584, - 'defs': [ - 'flash.net:URLVariables' - ] - }, - { - 'name': 'flash/globalization/CurrencyFormatter', - 'offset': 647013, - 'length': 4010, - 'defs': [ - 'flash.globalization:CurrencyFormatter' - ] - }, - { - 'name': 'flash/printing/PrintJobOrientation', - 'offset': 651023, - 'length': 529, - 'defs': [ - 'flash.printing:PrintJobOrientation' - ] - }, - { - 'name': 'flash/crypto/generateRandomBytes', - 'offset': 651552, - 'length': 347, - 'defs': [ - 'flash.crypto:generateRandomBytes' - ] - }, - { - 'name': 'flash/events/NetMonitorEvent', - 'offset': 651899, - 'length': 1060, - 'defs': [ - 'flash.events:NetMonitorEvent' - ] - }, - { - 'name': 'flash/text/engine/TextLineValidity', - 'offset': 652959, - 'length': 638, - 'defs': [ - 'flash.text.engine:TextLineValidity' - ] - }, - { - 'name': 'flash/text/TextSnapshot', - 'offset': 653597, - 'length': 1344, - 'defs': [ - 'flash.text:TextSnapshot' - ] - }, - { - 'name': 'flash/display/Loader', - 'offset': 654941, - 'length': 4198, - 'defs': [ - 'flash.display:Loader' - ] - }, - { - 'name': 'flash/events/FullScreenEvent', - 'offset': 659139, - 'length': 1328, - 'defs': [ - 'flash.events:FullScreenEvent' - ] - }, - { - 'name': 'flash/utils/ObjectOutput', - 'offset': 660467, - 'length': 1784, - 'defs': [ - 'flash.utils:ObjectOutput' - ] - }, - { - 'name': 'flash/utils/IExternalizable', - 'offset': 662251, - 'length': 577, - 'defs': [ - 'flash.utils:IExternalizable' - ] - }, - { - 'name': 'flash/text/engine/FontDescription', - 'offset': 662828, - 'length': 2196, - 'defs': [ - 'flash.text.engine:FontDescription' - ] - }, - { - 'name': 'flash/globalization/NumberParseResult', - 'offset': 665024, - 'length': 1000, - 'defs': [ - 'flash.globalization:NumberParseResult' - ] - }, - { - 'name': 'flash/automation/StageCaptureEvent', - 'offset': 666024, - 'length': 1310, - 'defs': [ - 'flash.automation:StageCaptureEvent' - ] - }, - { - 'name': 'flash/security/X500DistinguishedName', - 'offset': 667334, - 'length': 1215, - 'defs': [ - 'flash.security:X500DistinguishedName' - ] - }, - { - 'name': 'adobe/utils/XMLUI', - 'offset': 668549, - 'length': 662, - 'defs': [ - 'adobe.utils:XMLUI' - ] - }, - { - 'name': 'flash/display/ColorCorrection', - 'offset': 669211, - 'length': 542, - 'defs': [ - 'flash.display:ColorCorrection' - ] - }, - { - 'name': 'flash/text/engine/LigatureLevel', - 'offset': 669753, - 'length': 652, - 'defs': [ - 'flash.text.engine:LigatureLevel' - ] - }, - { - 'name': 'flash/media/VideoStreamSettings', - 'offset': 670405, - 'length': 2164, - 'defs': [ - 'flash.media:VideoStreamSettings' - ] - }, - { - 'name': 'flash/media/H264VideoStreamSettings', - 'offset': 672569, - 'length': 1813, - 'defs': [ - 'flash.media:H264VideoStreamSettings' - ] - }, - { - 'name': 'flash/automation/Configuration', - 'offset': 674382, - 'length': 786, - 'defs': [ - 'flash.automation:Configuration' - ] - }, - { - 'name': 'flash/text/engine/JustificationStyle', - 'offset': 675168, - 'length': 652, - 'defs': [ - 'flash.text.engine:JustificationStyle' - ] - }, - { - 'name': 'flash/ui/KeyboardType', - 'offset': 675820, - 'length': 532, - 'defs': [ - 'flash.ui:KeyboardType' - ] - }, - { - 'name': 'flash/display/CapsStyle', - 'offset': 676352, - 'length': 497, - 'defs': [ - 'flash.display:CapsStyle' - ] - }, - { - 'name': 'flash/text/ime/CompositionAttributeRange', - 'offset': 676849, - 'length': 753, - 'defs': [ - 'flash.text.ime:CompositionAttributeRange' - ] - }, - { - 'name': 'flash/text/engine/TabStop', - 'offset': 677602, - 'length': 1048, - 'defs': [ - 'flash.text.engine:TabStop' - ] - }, - { - 'name': 'flash/text/engine/FontWeight', - 'offset': 678650, - 'length': 485, - 'defs': [ - 'flash.text.engine:FontWeight' - ] - }, - { - 'name': 'flash/ui/GameInputDevice', - 'offset': 679135, - 'length': 1552, - 'defs': [ - 'flash.ui:GameInputDevice' - ] - }, - { - 'name': 'flash/media/AudioDecoder', - 'offset': 680687, - 'length': 768, - 'defs': [ - 'flash.media:AudioDecoder' - ] - }, - { - 'name': 'flash/text/TextRenderer', - 'offset': 681455, - 'length': 1074, - 'defs': [ - 'flash.text:TextRenderer' - ] - }, - { - 'name': 'flash/events/StageVideoEvent', - 'offset': 682529, - 'length': 1341, - 'defs': [ - 'flash.events:StageVideoEvent' - ] - }, - { - 'name': 'flash/text/engine/DigitWidth', - 'offset': 683870, - 'length': 553, - 'defs': [ - 'flash.text.engine:DigitWidth' - ] - }, - { - 'name': 'flash/geom/ColorTransform', - 'offset': 684423, - 'length': 1790, - 'defs': [ - 'flash.geom:ColorTransform' - ] - }, - { - 'name': 'flash/system/AuthorizedFeaturesLoader', - 'offset': 686213, - 'length': 969, - 'defs': [ - 'flash.system:AuthorizedFeaturesLoader' - ] - }, - { - 'name': 'flash/display/GraphicsPathWinding', - 'offset': 687182, - 'length': 539, - 'defs': [ - 'flash.display:GraphicsPathWinding' - ] - }, - { - 'name': 'flash/display/GraphicsPathCommand', - 'offset': 687721, - 'length': 744, - 'defs': [ - 'flash.display:GraphicsPathCommand' - ] - }, - { - 'name': 'flash/text/engine/TabAlignment', - 'offset': 688465, - 'length': 588, - 'defs': [ - 'flash.text.engine:TabAlignment' - ] - }, - { - 'name': 'flash/profiler/Telemetry', - 'offset': 689053, - 'length': 1062, - 'defs': [ - 'flash.profiler:Telemetry' - ] - }, - { - 'name': 'flash/events/UncaughtErrorEvent', - 'offset': 690115, - 'length': 1159, - 'defs': [ - 'flash.events:UncaughtErrorEvent' - ] - }, - { - 'name': 'flash/text/engine/DigitCase', - 'offset': 691274, - 'length': 538, - 'defs': [ - 'flash.text.engine:DigitCase' - ] - }, - { - 'name': 'flash/filters/ShaderFilter', - 'offset': 691812, - 'length': 1919, - 'defs': [ - 'flash.filters:ShaderFilter' - ] - }, - { - 'name': 'flash/events/GeolocationEvent', - 'offset': 693731, - 'length': 2920, - 'defs': [ - 'flash.events:GeolocationEvent' - ] - }, - { - 'name': 'flash/ui/Keyboard', - 'offset': 696651, - 'length': 17797, - 'defs': [ - 'flash.ui:Keyboard' - ] - }, - { - 'name': 'flash/media/MicrophoneEnhancedMode', - 'offset': 714448, - 'length': 708, - 'defs': [ - 'flash.media:MicrophoneEnhancedMode' - ] - }, - { - 'name': 'flash/filters/GlowFilter', - 'offset': 715156, - 'length': 1920, - 'defs': [ - 'flash.filters:GlowFilter' - ] - }, - { - 'name': 'flash/display/MovieClip', - 'offset': 717076, - 'length': 2591, - 'defs': [ - 'flash.display:MovieClip' - ] - }, - { - 'name': 'flash/text/engine/SpaceJustifier', - 'offset': 719667, - 'length': 1661, - 'defs': [ - 'flash.text.engine:SpaceJustifier' - ] - }, - { - 'name': 'flash/net/drm/VoucherAccessInfo', - 'offset': 721328, - 'length': 1113, - 'defs': [ - 'flash.net.drm:VoucherAccessInfo' - ] - }, - { - 'name': 'flash/events/ContextMenuEvent', - 'offset': 722441, - 'length': 1822, - 'defs': [ - 'flash.events:ContextMenuEvent' - ] - }, - { - 'name': 'flash/display3D/textures/CubeTexture', - 'offset': 724263, - 'length': 1114, - 'defs': [ - 'flash.display3D.textures:CubeTexture' - ] - }, - { - 'name': 'flash/text/TextLineMetrics', - 'offset': 725377, - 'length': 732, - 'defs': [ - 'flash.text:TextLineMetrics' - ] - } - ]; - for (var i = 0; i < index.length; i++) { - var abc = index[i]; - playerGlobalScripts[abc.name] = abc; - if (typeof abc.defs === 'string') { - playerGlobalNames[abc.defs] = abc.name; - } else { - for (var j = 0; j < abc.defs.length; j++) { - var def = abc.defs[j]; - playerGlobalNames[def] = abc.name; - } - } - } -}()); -enableVerifier.value = true; -enableC4.value = true; + }; + return Interpreter; + }(); + AVM2.Interpreter = Interpreter; + }(Shumway.AVM2 || (Shumway.AVM2 = {}))); + var AVM2 = Shumway.AVM2; +}(Shumway || (Shumway = {}))); +Shumway.AVM2.Runtime.enableVerifier.value = true; release = true; var avm2Root = SHUMWAY_ROOT + 'avm2/'; var builtinPath = avm2Root + 'generated/builtin/builtin.abc'; var avm1Path = avm2Root + 'generated/avm1lib/avm1lib.abc'; -var playerGlobalPath = SHUMWAY_ROOT + 'flash/playerglobal.abc'; var BinaryFileReader = function binaryFileReader() { function constructor(url, responseType) { this.url = url; @@ -37040,13 +35545,10 @@ function grabAbc(abcName) { return null; } var avm2; -var libraryScripts = playerGlobalScripts; -var libraryNames = playerGlobalNames; function createAVM2(builtinPath, libraryPath, avm1Path, sysMode, appMode, next) { avm2 = new AVM2(sysMode, appMode, loadAVM1); - var builtinAbc, libraryAbc, avm1Abc; - new BinaryFileReader(libraryPath).readAll(null, function (buffer) { - libraryAbcs = buffer; + var builtinAbc, avm1Abc; + AVM2.loadPlayerglobal(libraryPath.abcs, libraryPath.catalog).then(function () { new BinaryFileReader(builtinPath).readAll(null, function (buffer) { builtinAbc = new AbcFile(new Uint8Array(buffer), 'builtin.abc'); executeAbc(); @@ -38852,14 +37354,11 @@ var GraphicsDefinition = function () { this._currentPath.curveTo(cpx * 20 | 0, cpy * 20 | 0, x * 20 | 0, y * 20 | 0); }, drawCircle: function (x, y, radius) { - this._invalidate(); - this._currentPath.circle(x * 20 | 0, y * 20 | 0, radius * 20 | 0); + var radius2 = radius * 2; + this.drawRoundRect(x - radius, y - radius, radius2, radius2, radius2, radius2); }, drawEllipse: function (x, y, width, height) { - this._invalidate(); - var radiusX = width / 2 * 20 | 0; - var radiusY = height / 2 * 20 | 0; - this._currentPath.ellipse(x * 20 | 0 + radiusX, y * 20 | 0 + radiusY, radiusX, radiusY); + this.drawRoundRect(x, y, width, height, width, height); }, drawPath: function (commands, data, winding) { this._invalidate(); @@ -38953,7 +37452,45 @@ var GraphicsDefinition = function () { this._currentPath.curveTo(right, y, right, y + topRightRadius); this._currentPath.lineTo(right, bottom - bottomRightRadius); }, - drawTriangles: function (vertices, indices, uvtData, culling) { + drawTriangles: function (vertices, indices, uvtData, cullingStr) { + if (vertices === null || vertices.length === 0) { + return; + } + var numVertices = vertices.length / 2; + var numTriangles = 0; + if (indices) { + if (indices.length % 3) { + throwError('ArgumentError', Errors.InvalidParamError); + } else { + numTriangles = indices.length / 3; + } + } else { + if (vertices.length % 6) { + throwError('ArgumentError', Errors.InvalidParamError); + } else { + numTriangles = vertices.length / 6; + } + } + var numStrides = 0; + if (uvtData) { + if (uvtData.length == numVertices * 2) { + numStrides = 2; + } else if (uvtData.length == numVertices * 3) { + numStrides = 3; + } else { + throwError('ArgumentError', Errors.InvalidParamError); + } + } + var culling = 0; + if (cullingStr === 'none') { + culling = 0; + } else if (cullingStr === 'negative') { + culling = -1; + } else if (cullingStr === 'positive') { + culling = 1; + } else { + throwError('ArgumentError', Errors.InvalidEnumError, 'culling'); + } notImplemented('Graphics#drawTriangles'); }, endFill: function () { @@ -39130,6 +37667,21 @@ function createGradientStyle(type, colors, alphas, ratios, matrix, spreadMethod, transform: transform }; } +function drawGraphicsData(data) { + if (data === null) { + return; + } + for (var i = 0; i < data.length; i++) { + var item = data[i]; + if (flash.display.IGraphicsPath.class.isInstanceOf(item)) { + this._drawPathObject(item); + } else if (flash.display.IGraphicsStroke.class.isInstanceOf(item)) { + this.beginStrokeObject(item); + } else if (flash.display.IGraphicsFill.class.isInstanceOf(item)) { + this.beginFillObject(item); + } + } +} var InteractiveObjectDefinition = function () { var def = { initialize: function () { @@ -39244,7 +37796,7 @@ var LoaderDefinition = function () { this._uncaughtErrorEvents = null; this._worker = null; var abc = AVM2.currentAbc(); - if (abc) { + if (abc && abc.env.loader) { this._contentLoaderInfo._loaderURL = abc.env.loader._contentLoaderInfo._url; } }, @@ -39265,6 +37817,7 @@ var LoaderDefinition = function () { } }); }); + this._contentLoaderInfo._dispatchEvent('parsed'); Promise.all([ frameConstructed, this._lastPromise @@ -39629,7 +38182,7 @@ var LoaderDefinition = function () { loaderInfo._dispatchEvent('init'); }; img.src = URL.createObjectURL(imageInfo.data); - delete imageInfo.data; + imageInfo.data = null; }, _commitSymbol: function (symbol) { var dictionary = this._dictionary; @@ -39917,7 +38470,7 @@ var LoaderDefinition = function () { loader._isAvm2Enabled = info.fileAttributes.doAbc; this._setup(); }, - _load: function (request, checkPolicyFile, applicationDomain, securityDomain, deblockingFilter) { + _load: function (request, checkPolicyFile, applicationDomain, securityDomain, requestedContentParent, parameters, deblockingFilter, allowCodeImport, imageDecodingPolicy) { if (flash.net.URLRequest.class.isInstanceOf(request)) { this._contentLoaderInfo._url = request._url; } @@ -39991,7 +38544,12 @@ var LoaderDefinition = function () { loader._vmPromise.resolve(); }; if (avm2.isAVM1Loaded) { - loaded(); + if (AS2Context.instance) { + loader._avm1Context = AS2Context.instance; + loader._vmPromise.resolve(); + } else { + loaded(); + } } else { avm2.isAVM1Loaded = true; avm2.loadAVM1(loaded); @@ -40015,7 +38573,7 @@ var LoaderDefinition = function () { }, _load: def._load, _loadBytes: function _loadBytes(bytes, checkPolicyFile, applicationDomain, securityDomain, requestedContentParent, parameters, deblockingFilter, allowLoadBytesCodeExecution, imageDecodingPolicy) { - this._load(bytes.a, checkPolicyFile, applicationDomain, securityDomain); + this._load(bytes.a, checkPolicyFile, applicationDomain, securityDomain, requestedContentParent, parameters, deblockingFilter, allowLoadBytesCodeExecution, imageDecodingPolicy); }, _unload: function _unload(halt, gc) { somewhatImplemented('Loader._unload, do we even need to do anything here?'); @@ -40057,6 +38615,7 @@ var LoaderInfoDefinition = function () { this._swfVersion = null; this._url = null; this._width = null; + this._uncaughtErrorEvents = null; }, __glue__: { native: { @@ -40075,10 +38634,12 @@ var LoaderInfoDefinition = function () { return mangled; }, _getUncaughtErrorEvents: function _getUncaughtErrorEvents() { - notImplemented('LoaderInfo._getUncaughtErrorEvents'); + somewhatImplemented('Loader._getUncaughtErrorEvents'); + return this._uncaughtErrorEvents; }, _setUncaughtErrorEvents: function _setUncaughtErrorEvents(value) { - notImplemented('LoaderInfo._setUncaughtErrorEvents'); + somewhatImplemented('Loader._setUncaughtErrorEvents'); + this._uncaughtErrorEvents = value; }, loaderURL: { get: function loaderURL() { @@ -40366,7 +38927,7 @@ var MovieClipDefinition = function () { currentChild.name = nextCmd.name; } if (nextCmd.blend) { - currentChild.blendMode = this._resolveBlendMode(nextCmd.blendMode); + currentChild._blendMode = this._resolveBlendMode(nextCmd.blendMode); } } currentDisplayListItem.cmd = nextCmd; @@ -40568,7 +39129,7 @@ var MovieClipDefinition = function () { } if (sound.channel) { sound.channel.stop(); - delete sound.channel; + sound.channel = null; } if (!info.stop) { var loops = info.hasLoops ? info.loopCount : 0; @@ -41519,7 +40080,7 @@ var SpriteDefinition = function () { for (var i = 0; i < children.length; i++) { var instance = children[i]; if (instance._needLoadEvent) { - delete instance._needLoadEvent; + instance._needLoadEvent = false; instance._dispatchEvent('load'); } } @@ -42103,6 +40664,9 @@ var StageDefinition = function () { displayState: { get: function displayState() { return this._displayState; + }, + set: function displayState(value) { + this._displayState = value; } }, simulatedDisplayState: { @@ -42349,7 +40913,7 @@ var EventDispatcherDefinition = function () { if (eventClass) { event = new eventClass(event); } else { - if (event in mouseEvents) { + if (mouseEvents[event]) { event = new flash.events.MouseEvent(event, mouseEvents[event]); if (target._stage) { event._localX = target.mouseX; @@ -42434,7 +40998,7 @@ var EventDispatcherDefinition = function () { if (item.handleEvent === listener) { queue.splice(i, 1); if (!queue.length) { - delete listeners[type]; + listeners[type] = null; } return; } @@ -42445,7 +41009,7 @@ var EventDispatcherDefinition = function () { this._removeEventListenerImpl(type, listener, useCapture); }, _hasEventListener: function hasEventListener(type) { - return type in this._listeners || type in this._captureListeners; + return this._listeners[type] || this._captureListeners[type]; }, _dispatchEvent: function dispatchEvent(event, eventClass, bubbles) { doDispatchEvent(this, event, eventClass, bubbles); @@ -42475,7 +41039,7 @@ var EventDispatcherDefinition = function () { return false; }, dispatchEventFunction: function dispatchEventFunction(event) { - doDispatchEvent(this, event); + return doDispatchEvent(this, event); } } } @@ -44912,6 +43476,12 @@ var NetStreamDefinition = function () { videoElement.currentTime = args[4] / 1000; } break; + case 'seek': + simulated = true; + if (videoElement && !videoElement.paused) { + videoElement.currentTime = args[3] / 1000; + } + break; } break; case 300: @@ -52217,7 +50787,7 @@ var TimerDefinition = function () { this._running = false; clearInterval(this.interval); }, - _timerDispatch: function () { + _tick: function () { if (!this._running) { return; } @@ -52405,7 +50975,7 @@ var AS2MovieClipLoaderDefinition = function () { initialize: function () { }, get _bytesLoaded() { - return this.$nativeObject._bytesLoaded; + return this.$nativeObject._contentLoaderInfo._bytesLoaded; } }; var desc = Object.getOwnPropertyDescriptor; @@ -52540,11 +51110,11 @@ var AS2UtilsDefinition = function () { getAS2Object: function (nativeObject) { return nativeObject && nativeObject._getAS2Object ? nativeObject._getAS2Object() : null; }, - addProperty: function (obj, propertyName, getter, setter) { + addProperty: function (obj, propertyName, getter, setter, enumerable) { obj.asDefinePublicProperty(propertyName, { get: getter, set: setter || undefined, - enumerable: true, + enumerable: enumerable, configurable: true }); }, diff --git a/browser/extensions/shumway/content/version.txt b/browser/extensions/shumway/content/version.txt index b5df5910f2a..2238672f7ff 100644 --- a/browser/extensions/shumway/content/version.txt +++ b/browser/extensions/shumway/content/version.txt @@ -1,2 +1,2 @@ -0.8.6 -4728574 +0.8.271 +2717b0c diff --git a/browser/extensions/shumway/content/web/avm-sandbox.js b/browser/extensions/shumway/content/web/avm-sandbox.js index 4ddd6d05d37..f8bf1ff5b27 100644 --- a/browser/extensions/shumway/content/web/avm-sandbox.js +++ b/browser/extensions/shumway/content/web/avm-sandbox.js @@ -80,6 +80,11 @@ function fallback() { FirefoxCom.requestSync('fallback', null) } +var playerglobalInfo = { + abcs: SHUMWAY_ROOT + "playerglobal/playerglobal.abcs", + catalog: SHUMWAY_ROOT + "playerglobal/playerglobal.json" +}; + function runViewer() { var flashParams = JSON.parse(FirefoxCom.requestSync('getPluginParams', null)); FileLoadingService.setBaseUrl(flashParams.baseUrl); @@ -222,7 +227,7 @@ var FileLoadingService = { case "open": this.onopen(); break; case "close": this.onclose(); - delete FileLoadingService.sessions[sessionId]; + FileLoadingService.sessions[sessionId] = null; console.log('Session #' + sessionId +': closed'); break; case "error": @@ -258,6 +263,9 @@ var FileLoadingService = { }; function parseSwf(url, movieParams, objectParams) { + var enableVerifier = Shumway.AVM2.Runtime.enableVerifier; + var EXECUTION_MODE = Shumway.AVM2.Runtime.EXECUTION_MODE; + var compilerSettings = JSON.parse( FirefoxCom.requestSync('getCompilerSettings', null)); enableVerifier.value = compilerSettings.verifier; @@ -274,7 +282,7 @@ function parseSwf(url, movieParams, objectParams) { FirefoxCom.request('endActivation', null); } - createAVM2(builtinPath, playerGlobalPath, avm1Path, + createAVM2(builtinPath, playerglobalInfo, avm1Path, compilerSettings.sysCompiler ? EXECUTION_MODE.COMPILE : EXECUTION_MODE.INTERPRET, compilerSettings.appCompiler ? EXECUTION_MODE.COMPILE : EXECUTION_MODE.INTERPRET, function (avm2) { From 20b3ea56d71e11c31f5ea0eee9437e81186fd101 Mon Sep 17 00:00:00 2001 From: Heather Arthur Date: Mon, 14 Apr 2014 19:25:00 +0200 Subject: [PATCH 07/20] Bug 993162 - Make default indent size 2 spaces. r=jwalker --- browser/app/profile/firefox.js | 2 +- .../sourceeditor/test/browser_detectindent.js | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 215725139fa..55ddc249f54 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -1283,7 +1283,7 @@ pref("devtools.eyedropper.zoom", 6); // - keymap: which keymap to use (can be 'default', 'emacs' or 'vim') // - autoclosebrackets: whether to permit automatic bracket/quote closing. // - detectindentation: whether to detect the indentation from the file -pref("devtools.editor.tabsize", 4); +pref("devtools.editor.tabsize", 2); pref("devtools.editor.expandtab", true); pref("devtools.editor.keymap", "default"); pref("devtools.editor.autoclosebrackets", true); diff --git a/browser/devtools/sourceeditor/test/browser_detectindent.js b/browser/devtools/sourceeditor/test/browser_detectindent.js index 60568159f70..f7b0d38a890 100644 --- a/browser/devtools/sourceeditor/test/browser_detectindent.js +++ b/browser/devtools/sourceeditor/test/browser_detectindent.js @@ -62,26 +62,26 @@ function test() { waitForExplicitFinish(); setup((ed, win) => { - is(ed.getOption("indentUnit"), 4, - "4 spaces before code added"); + is(ed.getOption("indentUnit"), 2, + "2 spaces before code added"); is(ed.getOption("indentWithTabs"), false, "spaces is default"); - ed.setText(TWO_SPACES_CODE); - is(ed.getOption("indentUnit"), 2, - "2 spaces detected in 2 space code"); - is(ed.getOption("indentWithTabs"), false, - "spaces detected in 2 space code"); - ed.setText(FOUR_SPACES_CODE); is(ed.getOption("indentUnit"), 4, "4 spaces detected in 4 space code"); is(ed.getOption("indentWithTabs"), false, "spaces detected in 4 space code"); + ed.setText(TWO_SPACES_CODE); + is(ed.getOption("indentUnit"), 2, + "2 spaces detected in 2 space code"); + is(ed.getOption("indentWithTabs"), false, + "spaces detected in 2 space code"); + ed.setText(TABS_CODE); - is(ed.getOption("indentUnit"), 4, - "4 space indentation unit"); + is(ed.getOption("indentUnit"), 2, + "2 space indentation unit"); is(ed.getOption("indentWithTabs"), true, "tabs detected in majority tabs code"); From c971438f56c145ce9a8274552ba8951540b39603 Mon Sep 17 00:00:00 2001 From: James Gilbertson Date: Thu, 30 Jan 2014 19:14:03 -0700 Subject: [PATCH 08/20] Bug 901360 - Part1 Use Downloads.jsm for download notifications. r=wesj --- .../android/modules/DownloadNotifications.jsm | 232 ++++++++++++++++++ mobile/android/modules/moz.build | 1 + 2 files changed, 233 insertions(+) create mode 100644 mobile/android/modules/DownloadNotifications.jsm diff --git a/mobile/android/modules/DownloadNotifications.jsm b/mobile/android/modules/DownloadNotifications.jsm new file mode 100644 index 00000000000..fb039c746a5 --- /dev/null +++ b/mobile/android/modules/DownloadNotifications.jsm @@ -0,0 +1,232 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +this.EXPORTED_SYMBOLS = ["DownloadNotifications"]; + +const Cu = Components.utils; + +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "Downloads", "resource://gre/modules/Downloads.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "Notifications", "resource://gre/modules/Notifications.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "Services", "resource://gre/modules/Services.jsm"); + +XPCOMUtils.defineLazyGetter(this, "strings", + () => Services.strings.createBundle("chrome://browser/locale/browser.properties")); +Object.defineProperty(this, "nativeWindow", + { get: () => Services.wm.getMostRecentWindow("navigator:browser").NativeWindow }); + +const kButtons = { + PAUSE: new DownloadNotificationButton("pause", + "drawable://pause", + "alertDownloadsPause", + notification => notification.pauseDownload()), + RESUME: new DownloadNotificationButton("resume", + "drawable://play", + "alertDownloadsResume", + notification => notification.resumeDownload()), + CANCEL: new DownloadNotificationButton("cancel", + "drawable://close", + "alertDownloadsCancel", + notification => notification.cancelDownload()) +}; + +let notifications = new Map(); + +var DownloadNotifications = { + init: function () { + if (!this._viewAdded) { + Downloads.getList(Downloads.ALL) + .then(list => list.addView(this)) + .then(null, Cu.reportError); + + this._viewAdded = true; + } + }, + + uninit: function () { + if (this._viewAdded) { + Downloads.getList(Downloads.ALL) + .then(list => list.removeView(this)) + .then(null, Cu.reportError); + + for (let notification of notifications.values()) { + notification.hide(); + } + + this._viewAdded = false; + } + }, + + onDownloadAdded: function (download) { + let notification = new DownloadNotification(download); + notifications.set(download, notification); + + notification.showOrUpdate(); + if (download.currentBytes == 0) { + nativeWindow.toast.show(strings.GetStringFromName("alertDownloadsToast"), "long"); + } + }, + + onDownloadChanged: function (download) { + let notification = notifications.get(download); + if (!notification) { + Cu.reportError("Download doesn't have a notification."); + return; + } + + notification.showOrUpdate(); + }, + + onDownloadRemoved: function (download) { + let notification = notifications.get(download); + if (!notification) { + Cu.reportError("Download doesn't have a notification."); + return; + } + + notification.hide(); + notifications.delete(download); + } +}; + +function DownloadNotification(download) { + this.download = download; + this._fileName = OS.Path.basename(download.target.path); + + this.id = null; +} + +DownloadNotification.prototype = { + _updateFromDownload: function () { + this._downloading = !this.download.stopped; + this._paused = this.download.canceled && this.download.hasPartialData; + this._succeeded = this.download.succeeded; + + this._show = this._downloading || this._paused || this._succeeded; + }, + + get options() { + if (!this._show) { + return null; + } + + let options = { + icon : "drawable://alert_download", + onClick : (id, cookie) => this.onClick(), + onCancel : (id, cookie) => this._notificationId = null, + cookie : this.download + }; + + if (this._downloading) { + if (this.download.currentBytes == 0) { + this._updateOptionsForStatic(options, "alertDownloadsStart2"); + } else { + this._updateOptionsForOngoing(options, [kButtons.PAUSE, kButtons.CANCEL]); + } + } else if (this._paused) { + this._updateOptionsForOngoing(options, [kButtons.RESUME, kButtons.CANCEL]); + } else if (this._succeeded) { + options.persistent = false; + this._updateOptionsForStatic(options, "alertDownloadsDone2"); + } + + return options; + }, + + _updateOptionsForStatic : function (options, titleName) { + options.title = strings.GetStringFromName(titleName); + options.message = this._fileName; + }, + + _updateOptionsForOngoing: function (options, buttons) { + options.title = this._fileName; + options.message = this.download.progress + "%"; + options.buttons = buttons; + options.ongoing = true; + options.progress = this.download.progress; + options.persistent = true; + }, + + showOrUpdate: function () { + this._updateFromDownload(); + + if (this._show) { + if (!this.id) { + this.id = Notifications.create(this.options); + } else { + Notifications.update(this.id, this.options); + } + } else { + this.hide(); + } + }, + + hide: function () { + if (this.id) { + Notifications.cancel(this.id); + this.id = null; + } + }, + + onClick: function () { + if (this.download.succeeded) { + this.download.launch().then(null, Cu.reportError); + } else { + ConfirmCancelPrompt.show(this); + } + }, + + pauseDownload: function () { + this.download.cancel().then(null, Cu.reportError); + }, + + resumeDownload: function () { + this.download.start().then(null, Cu.reportError); + }, + + cancelDownload: function () { + this.hide(); + + this.download.cancel().then(null, Cu.reportError); + this.download.removePartialData().then(null, Cu.reportError); + } +}; + +var ConfirmCancelPrompt = { + showing: false, + show: function (downloadNotification) { + if (this.showing) { + return; + } + + this.showing = true; + // Open a prompt that offers a choice to cancel the download + let title = strings.GetStringFromName("downloadCancelPromptTitle"); + let message = strings.GetStringFromName("downloadCancelPromptMessage"); + + if (Services.prompt.confirm(null, title, message)) { + downloadNotification.cancelDownload(); + } + this.showing = false; + } +}; + +function DownloadNotificationButton(buttonId, iconUrl, titleStringName, onClicked) { + this.buttonId = buttonId; + this.title = strings.GetStringFromName(titleStringName); + this.icon = iconUrl; + this.onClicked = (id, download) => { + let notification = notifications.get(download); + if (!notification) { + Cu.reportError("No DownloadNotification for button"); + return; + } + + onClicked(notification); + } +} diff --git a/mobile/android/modules/moz.build b/mobile/android/modules/moz.build index 72b52f9a55a..786134b3cdf 100644 --- a/mobile/android/modules/moz.build +++ b/mobile/android/modules/moz.build @@ -7,6 +7,7 @@ EXTRA_JS_MODULES += [ 'Accounts.jsm', 'ContactService.jsm', + 'DownloadNotifications.jsm', 'HelperApps.jsm', 'Home.jsm', 'HomeProvider.jsm', From 978785d12ed75601d615c58b97b9891f821ef1b4 Mon Sep 17 00:00:00 2001 From: James Gilbertson Date: Thu, 30 Jan 2014 19:16:36 -0700 Subject: [PATCH 09/20] Bug 901360 - Part2 Use Downloads.jsm for about:downloads. r=wesj --- .../android/chrome/content/aboutDownloads.js | 921 +++++++----------- .../chrome/content/aboutDownloads.xhtml | 18 +- mobile/android/chrome/content/browser.js | 40 +- mobile/android/chrome/content/browser.xul | 1 - mobile/android/chrome/content/downloads.js | 298 ------ mobile/android/chrome/jar.mn | 1 - mobile/android/installer/package-manifest.in | 3 + mobile/android/themes/core/aboutDownloads.css | 4 +- 8 files changed, 381 insertions(+), 905 deletions(-) delete mode 100644 mobile/android/chrome/content/downloads.js diff --git a/mobile/android/chrome/content/aboutDownloads.js b/mobile/android/chrome/content/aboutDownloads.js index f031ac73c55..ea601f37865 100644 --- a/mobile/android/chrome/content/aboutDownloads.js +++ b/mobile/android/chrome/content/aboutDownloads.js @@ -1,617 +1,354 @@ /* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -let Ci = Components.interfaces, Cc = Components.classes, Cu = Components.utils; +"use strict"; -Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/DownloadUtils.jsm"); -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource://gre/modules/PluralForm.jsm"); -Cu.import("resource://gre/modules/PrivateBrowsingUtils.jsm"); +const Cu = Components.utils; +Cu.import("resource://gre/modules/XPCOMUtils.jsm", this); + +XPCOMUtils.defineLazyModuleGetter(this, "Downloads", "resource://gre/modules/Downloads.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "DownloadUtils", "resource://gre/modules/DownloadUtils.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "PluralForm", "resource://gre/modules/PluralForm.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "Services", "resource://gre/modules/Services.jsm"); -let gStrings = Services.strings.createBundle("chrome://browser/locale/aboutDownloads.properties"); +XPCOMUtils.defineLazyGetter(this, "strings", + () => Services.strings.createBundle("chrome://browser/locale/aboutDownloads.properties")); -let downloadTemplate = -"
  • " + - "" + - "
    " + - "
    " + - // This is a hack so that we can crop this label in its center - "" + - "
    {date}
    " + - "
    " + - "
    {size}
    " + - "
    {domain}
    " + - "
    {displayState}
    " + - "
    " + -"
  • "; +function deleteDownload(download) { + download.finalize(true).then(null, Cu.reportError); + OS.File.remove(download.target.path).then(null, ex => { + if (!(ex instanceof OS.File.Error && ex.becauseNoSuchFile)) { + Cu.reportError(ex); + } + }); +} -XPCOMUtils.defineLazyGetter(window, "gChromeWin", function () - window.QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIWebNavigation) - .QueryInterface(Ci.nsIDocShellTreeItem) - .rootTreeItem - .QueryInterface(Ci.nsIInterfaceRequestor) - .getInterface(Ci.nsIDOMWindow) - .QueryInterface(Ci.nsIDOMChromeWindow)); +let contextMenu = { + _items: [], + _targetDownload: null, + init: function () { + let element = document.getElementById("downloadmenu"); + element.addEventListener("click", + event => event.download = this._targetDownload, + true); -var ContextMenus = { - target: null, - - init: function() { - document.addEventListener("contextmenu", this, false); - document.getElementById("contextmenu-open").addEventListener("click", this.open.bind(this), false); - document.getElementById("contextmenu-retry").addEventListener("click", this.retry.bind(this), false); - document.getElementById("contextmenu-remove").addEventListener("click", this.remove.bind(this), false); - document.getElementById("contextmenu-pause").addEventListener("click", this.pause.bind(this), false); - document.getElementById("contextmenu-resume").addEventListener("click", this.resume.bind(this), false); - document.getElementById("contextmenu-cancel").addEventListener("click", this.cancel.bind(this), false); - document.getElementById("contextmenu-removeall").addEventListener("click", this.removeAll.bind(this), false); - this.items = [ - { name: "open", states: [Downloads._dlmgr.DOWNLOAD_FINISHED] }, - { name: "retry", states: [Downloads._dlmgr.DOWNLOAD_FAILED, Downloads._dlmgr.DOWNLOAD_CANCELED] }, - { name: "remove", states: [Downloads._dlmgr.DOWNLOAD_FINISHED,Downloads._dlmgr.DOWNLOAD_FAILED, Downloads._dlmgr.DOWNLOAD_CANCELED] }, - { name: "removeall", states: [Downloads._dlmgr.DOWNLOAD_FINISHED,Downloads._dlmgr.DOWNLOAD_FAILED, Downloads._dlmgr.DOWNLOAD_CANCELED] }, - { name: "pause", states: [Downloads._dlmgr.DOWNLOAD_DOWNLOADING] }, - { name: "resume", states: [Downloads._dlmgr.DOWNLOAD_PAUSED] }, - { name: "cancel", states: [Downloads._dlmgr.DOWNLOAD_DOWNLOADING, Downloads._dlmgr.DOWNLOAD_NOTSTARTED, Downloads._dlmgr.DOWNLOAD_QUEUED, Downloads._dlmgr.DOWNLOAD_PAUSED] }, + this._items = [ + new ContextMenuItem("open", + download => download.succeeded, + download => download.launch().then(null, Cu.reportError)), + new ContextMenuItem("retry", + download => download.error || + (download.canceled && !download.hasPartialData), + download => download.start().then(null, Cu.reportError)), + new ContextMenuItem("remove", + download => download.stopped, + download => { + Downloads.getList(Downloads.ALL) + .then(list => list.remove(download)) + .then(null, Cu.reportError); + deleteDownload(download); + }), + new ContextMenuItem("pause", + download => !download.stopped, + download => download.cancel().then(null, Cu.reportError)), + new ContextMenuItem("resume", + download => download.canceled && download.hasPartialData, + download => download.start().then(null, Cu.reportError)), + new ContextMenuItem("cancel", + download => !download.stopped || + (download.canceled && download.hasPartialData), + download => { + download.cancel().then(null, Cu.reportError); + download.removePartialData().then(null, Cu.reportError); + }), + // following menu item is a global action + new ContextMenuItem("removeall", + () => downloadLists.finished.length > 0, + () => downloadLists.removeFinished()) ]; }, - handleEvent: function(event) { - // store the target of context menu events so that we know which app to act on - this.target = event.target; - while (!this.target.hasAttribute("contextmenu")) { - this.target = this.target.parentNode; + addContextMenuEventListener: function (element) { + element.addEventListener("contextmenu", this.onContextMenu.bind(this)); + }, + + onContextMenu: function (event) { + let target = event.target; + while (target && !target.download) { + target = target.parentNode; } - if (!this.target) + if (!target) { + Cu.reportError("No download found for context menu target"); + event.preventDefault(); return; - - let state = parseInt(this.target.getAttribute("state")); - for (let i = 0; i < this.items.length; i++) { - var item = this.items[i]; - let enabled = (item.states.indexOf(state) > -1); - if (enabled) - document.getElementById("contextmenu-" + item.name).removeAttribute("hidden"); - else - document.getElementById("contextmenu-" + item.name).setAttribute("hidden", "true"); } - }, - // Open shown only for downloads that completed successfully - open: function(event) { - Downloads.openDownload(this.target); - this.target = null; - }, - - // Retry shown when its failed, canceled, blocked(covered in failed, see _getState()) - retry: function (event) { - Downloads.retryDownload(this.target); - this.target = null; - }, - - // Remove shown when its canceled, finished, failed(failed includes blocked and dirty, see _getState()) - remove: function (event) { - Downloads.removeDownload(this.target); - this.target = null; - }, - - // Pause shown when item is currently downloading - pause: function (event) { - Downloads.pauseDownload(this.target); - this.target = null; - }, - - // Resume shown for paused items only - resume: function (event) { - Downloads.resumeDownload(this.target); - this.target = null; - }, - - // Cancel shown when its downloading, notstarted, queued or paused - cancel: function (event) { - Downloads.cancelDownload(this.target); - this.target = null; - }, - - removeAll: function(event) { - Downloads.removeAll(); - this.target = null; + // capture the target download for menu items to use in a click event + this._targetDownload = target.download; + for (let item of this._items) { + item.updateVisibility(target.download); + } } +}; + +function ContextMenuItem(name, isVisible, action) { + this.element = document.getElementById("contextmenu-" + name); + this.isVisible = isVisible; + + this.element.addEventListener("click", event => action(event.download)); } - -let Downloads = { - init: function dl_init() { - function onClick(evt) { - let target = evt.target; - while (target.nodeName != "li") { - target = target.parentNode; - if (!target) - return; - } - - Downloads.openDownload(target); - } - - this._normalList = document.getElementById("normal-downloads-list"); - this._privateList = document.getElementById("private-downloads-list"); - - this._normalList.addEventListener("click", onClick, false); - this._privateList.addEventListener("click", onClick, false); - - this._dlmgr = Cc["@mozilla.org/download-manager;1"].getService(Ci.nsIDownloadManager); - this._dlmgr.addPrivacyAwareListener(this); - - Services.obs.addObserver(this, "last-pb-context-exited", false); - Services.obs.addObserver(this, "download-manager-remove-download-guid", false); - - // If we have private downloads, show them all immediately. If we were to - // add them asynchronously, there's a small chance we could get a - // "last-pb-context-exited" notification before downloads are added to the - // list, meaning we'd show private downloads without any private tabs open. - let privateEntries = this.getDownloads({ isPrivate: true }); - this._stepAddEntries(privateEntries, this._privateList, privateEntries.length); - - // Add non-private downloads - let normalEntries = this.getDownloads({ isPrivate: false }); - this._stepAddEntries(normalEntries, this._normalList, 1, this._scrollToSelectedDownload.bind(this)); - ContextMenus.init(); - }, - - uninit: function dl_uninit() { - let contextmenus = gChromeWin.NativeWindow.contextmenus; - contextmenus.remove(this.openMenuItem); - contextmenus.remove(this.removeMenuItem); - contextmenus.remove(this.pauseMenuItem); - contextmenus.remove(this.resumeMenuItem); - contextmenus.remove(this.retryMenuItem); - contextmenus.remove(this.cancelMenuItem); - contextmenus.remove(this.deleteAllMenuItem); - - this._dlmgr.removeListener(this); - Services.obs.removeObserver(this, "last-pb-context-exited"); - Services.obs.removeObserver(this, "download-manager-remove-download-guid"); - }, - - onProgressChange: function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, - aCurTotalProgress, aMaxTotalProgress, aDownload) { }, - onDownloadStateChange: function(aState, aDownload) { - switch (aDownload.state) { - case Ci.nsIDownloadManager.DOWNLOAD_FAILED: - case Ci.nsIDownloadManager.DOWNLOAD_CANCELED: - case Ci.nsIDownloadManager.DOWNLOAD_BLOCKED_PARENTAL: - case Ci.nsIDownloadManager.DOWNLOAD_DIRTY: - case Ci.nsIDownloadManager.DOWNLOAD_FINISHED: - // For all "completed" states, move them after active downloads - this._moveDownloadAfterActive(this._getElementForDownload(aDownload.guid)); - - // Fall-through the rest - case Ci.nsIDownloadManager.DOWNLOAD_SCANNING: - case Ci.nsIDownloadManager.DOWNLOAD_QUEUED: - case Ci.nsIDownloadManager.DOWNLOAD_DOWNLOADING: - let item = this._getElementForDownload(aDownload.guid); - if (item) - this._updateDownloadRow(item, aDownload); - else - this._insertDownloadRow(aDownload); - break; - } - }, - onStateChange: function(aWebProgress, aRequest, aState, aStatus, aDownload) { }, - onSecurityChange: function(aWebProgress, aRequest, aState, aDownload) { }, - - observe: function (aSubject, aTopic, aData) { - switch (aTopic) { - case "last-pb-context-exited": - this._privateList.innerHTML = ""; - break; - case "download-manager-remove-download-guid": { - let guid = aSubject.QueryInterface(Ci.nsISupportsCString).data; - this._removeItem(this._getElementForDownload(guid)); - break; - } - } - }, - - _moveDownloadAfterActive: function dl_moveDownloadAfterActive(aItem) { - // Move downloads that just reached a "completed" state below any active - try { - // Iterate down until we find a non-active download - let next = aItem.nextElementSibling; - while (next && this._inProgress(next.getAttribute("state"))) - next = next.nextElementSibling; - // Move the item - aItem.parentNode.insertBefore(aItem, next); - } catch (ex) { - this.logError("_moveDownloadAfterActive() " + ex); - } - }, - - _inProgress: function dl_inProgress(aState) { - return [ - this._dlmgr.DOWNLOAD_NOTSTARTED, - this._dlmgr.DOWNLOAD_QUEUED, - this._dlmgr.DOWNLOAD_DOWNLOADING, - this._dlmgr.DOWNLOAD_PAUSED, - this._dlmgr.DOWNLOAD_SCANNING, - ].indexOf(parseInt(aState)) != -1; - }, - - _insertDownloadRow: function dl_insertDownloadRow(aDownload) { - let updatedState = this._getState(aDownload.state); - let item = this._createItem(downloadTemplate, { - guid: aDownload.guid, - target: aDownload.displayName, - icon: "moz-icon://" + aDownload.displayName + "?size=64", - date: DownloadUtils.getReadableDates(new Date())[0], - domain: DownloadUtils.getURIHost(aDownload.source.spec)[0], - size: this._getDownloadSize(aDownload.size), - displayState: this._getStateString(updatedState), - state: updatedState - }); - list = aDownload.isPrivate ? this._privateList : this._normalList; - list.insertAdjacentHTML("afterbegin", item); - }, - - _getDownloadSize: function dl_getDownloadSize(aSize) { - if (aSize > 0) { - let displaySize = DownloadUtils.convertByteUnits(aSize); - return displaySize.join(""); // [0] is size, [1] is units - } - return gStrings.GetStringFromName("downloadState.unknownSize"); - }, - - // Not all states are displayed as-is on mobile, some are translated to a generic state - _getState: function dl_getState(aState) { - let str; - switch (aState) { - // Downloading and Scanning states show up as "Downloading" - case this._dlmgr.DOWNLOAD_DOWNLOADING: - case this._dlmgr.DOWNLOAD_SCANNING: - str = this._dlmgr.DOWNLOAD_DOWNLOADING; - break; - - // Failed, Dirty and Blocked states show up as "Failed" - case this._dlmgr.DOWNLOAD_FAILED: - case this._dlmgr.DOWNLOAD_DIRTY: - case this._dlmgr.DOWNLOAD_BLOCKED_POLICY: - case this._dlmgr.DOWNLOAD_BLOCKED_PARENTAL: - str = this._dlmgr.DOWNLOAD_FAILED; - break; - - /* QUEUED and NOTSTARTED are not translated as they - dont fall under a common state but we still need - to display a common "status" on the UI */ - - default: - str = aState; - } - return str; - }, - - // Note: This doesn't cover all states as some of the states are translated in _getState() - _getStateString: function dl_getStateString(aState) { - let str; - switch (aState) { - case this._dlmgr.DOWNLOAD_DOWNLOADING: - str = "downloadState.downloading"; - break; - case this._dlmgr.DOWNLOAD_CANCELED: - str = "downloadState.canceled"; - break; - case this._dlmgr.DOWNLOAD_FAILED: - str = "downloadState.failed"; - break; - case this._dlmgr.DOWNLOAD_PAUSED: - str = "downloadState.paused"; - break; - - // Queued and Notstarted show up as "Starting..." - case this._dlmgr.DOWNLOAD_QUEUED: - case this._dlmgr.DOWNLOAD_NOTSTARTED: - str = "downloadState.starting"; - break; - - default: - return ""; - } - return gStrings.GetStringFromName(str); - }, - - _updateItem: function dl_updateItem(aItem, aValues) { - for (let i in aValues) { - aItem.querySelector("." + i).textContent = aValues[i]; - } - }, - - _initStatement: function dv__initStatement(aIsPrivate) { - let dbConn = aIsPrivate ? this._dlmgr.privateDBConnection : this._dlmgr.DBConnection; - return dbConn.createStatement( - "SELECT guid, name, source, state, startTime, endTime, referrer, " + - "currBytes, maxBytes, state IN (?1, ?2, ?3, ?4, ?5) isActive " + - "FROM moz_downloads " + - "ORDER BY isActive DESC, endTime DESC, startTime DESC"); - }, - - _createItem: function _createItem(aTemplate, aValues) { - function htmlEscape(s) { - s = s.replace(/&/g, "&"); - s = s.replace(/>/g, ">"); - s = s.replace(/ 1) { - this._stepAddEntries(aEntries, aList, aNumItems - 1, aCallback); - } else { - // Use a shorter delay for earlier downloads to display them faster - let delay = Math.min(aList.itemCount * 10, 300); - setTimeout(function () { - this._stepAddEntries(aEntries, aList, 5, aCallback); - }.bind(this), delay); - } - }, - - getDownloads: function dl_getDownloads(aParams) { - aParams = aParams || {}; - let stmt = this._initStatement(aParams.isPrivate); - - stmt.reset(); - stmt.bindInt32Parameter(0, Ci.nsIDownloadManager.DOWNLOAD_NOTSTARTED); - stmt.bindInt32Parameter(1, Ci.nsIDownloadManager.DOWNLOAD_DOWNLOADING); - stmt.bindInt32Parameter(2, Ci.nsIDownloadManager.DOWNLOAD_PAUSED); - stmt.bindInt32Parameter(3, Ci.nsIDownloadManager.DOWNLOAD_QUEUED); - stmt.bindInt32Parameter(4, Ci.nsIDownloadManager.DOWNLOAD_SCANNING); - - let entries = []; - while (entry = this._getEntry(stmt)) { - entries.push(entry); - } - - stmt.finalize(); - - return entries; - }, - - _getElementForDownload: function dl_getElementForDownload(aKey) { - return document.body.querySelector("li[downloadGUID='" + aKey + "']"); - }, - - _getDownloadForElement: function dl_getDownloadForElement(aElement, aCallback) { - let guid = aElement.getAttribute("downloadGUID"); - this._dlmgr.getDownloadByGUID(guid, function(status, download) { - if (!Components.isSuccessCode(status)) { - return; - } - aCallback(download); - }); - }, - - _removeItem: function dl_removeItem(aItem) { - // Make sure we have an item to remove - if (!aItem) - return; - - aItem.parentNode.removeChild(aItem); - }, - - openDownload: function dl_openDownload(aItem) { - this._getDownloadForElement(aItem, function(aDownload) { - if (aDownload.state !== Ci.nsIDownloadManager.DOWNLOAD_FINISHED) { - // Do not open unfinished downloads. - return; - } - try { - let f = aDownload.targetFile; - if (f) f.launch(); - } catch (ex) { - this.logError("openDownload() " + ex, aDownload); - } - }.bind(this)); - }, - - removeDownload: function dl_removeDownload(aItem) { - this._getDownloadForElement(aItem, function(aDownload) { - if (aDownload.targetFile) { - OS.File.remove(aDownload.targetFile.path).then(null, function onError(reason) { - if (!(reason instanceof OS.File.Error && reason.becauseNoSuchFile)) { - this.logError("removeDownload() " + reason, aDownload); - } - }.bind(this)); - } - - aDownload.remove(); - }.bind(this)); - }, - - removeAll: function dl_removeAll() { - let title = gStrings.GetStringFromName("downloadAction.deleteAll"); - let messageForm = gStrings.GetStringFromName("downloadMessage.deleteAll"); - let elements = document.body.querySelectorAll("li[state='" + this._dlmgr.DOWNLOAD_FINISHED + "']," + - "li[state='" + this._dlmgr.DOWNLOAD_CANCELED + "']," + - "li[state='" + this._dlmgr.DOWNLOAD_FAILED + "']"); - let message = PluralForm.get(elements.length, messageForm) - .replace("#1", elements.length); - let flags = Services.prompt.BUTTON_POS_0 * Services.prompt.BUTTON_TITLE_OK + - Services.prompt.BUTTON_POS_1 * Services.prompt.BUTTON_TITLE_CANCEL; - let choice = Services.prompt.confirmEx(null, title, message, flags, - null, null, null, null, {}); - if (choice == 0) { - for (let i = 0; i < elements.length; i++) { - this.removeDownload(elements[i]); - } - } - }, - - pauseDownload: function dl_pauseDownload(aItem) { - this._getDownloadForElement(aItem, function(aDownload) { - try { - aDownload.pause(); - this._updateDownloadRow(aItem, aDownload); - } catch (ex) { - this.logError("Error: pauseDownload() " + ex, aDownload); - } - }.bind(this)); - }, - - resumeDownload: function dl_resumeDownload(aItem) { - this._getDownloadForElement(aItem, function(aDownload) { - try { - aDownload.resume(); - this._updateDownloadRow(aItem, aDownload); - } catch (ex) { - this.logError("resumeDownload() " + ex, aDownload); - } - }.bind(this)); - }, - - retryDownload: function dl_retryDownload(aItem) { - this._getDownloadForElement(aItem, function(aDownload) { - try { - this._removeItem(aItem); - aDownload.retry(); - } catch (ex) { - this.logError("retryDownload() " + ex, aDownload); - } - }.bind(this)); - }, - - cancelDownload: function dl_cancelDownload(aItem) { - this._getDownloadForElement(aItem, function(aDownload) { - OS.File.remove(aDownload.targetFile.path).then(null, function onError(reason) { - if (!(reason instanceof OS.File.Error && reason.becauseNoSuchFile)) { - this.logError("cancelDownload() " + reason, aDownload); - } - }.bind(this)); - - aDownload.cancel(); - - this._updateDownloadRow(aItem, aDownload); - }.bind(this)); - }, - - _updateDownloadRow: function dl_updateDownloadRow(aItem, aDownload) { - try { - let updatedState = this._getState(aDownload.state); - aItem.setAttribute("state", updatedState); - this._updateItem(aItem, { - size: this._getDownloadSize(aDownload.size), - displayState: this._getStateString(updatedState), - date: DownloadUtils.getReadableDates(new Date())[0] - }); - } catch (ex) { - this.logError("_updateDownloadRow() " + ex, aDownload); - } - }, - - /** - * In case a specific downloadId was passed while opening, scrolls the list to - * the given elemenet - */ - - _scrollToSelectedDownload : function dl_scrollToSelected() { - let spec = document.location.href; - let pos = spec.indexOf("?"); - let query = ""; - if (pos >= 0) - query = spec.substring(pos + 1); - - // Just assume the query is "id=" - let id = query.substring(3); - if (!id) { - return; - } - downloadElement = this._getElementForDownload(id); - if (!downloadElement) { - return; - } - - downloadElement.scrollIntoView(); - }, - - /** - * Logs the error to the console. - * - * @param aMessage error message to log - * @param aDownload (optional) if given, and if the download is private, the - * log message is suppressed - */ - logError: function dl_logError(aMessage, aDownload) { - if (!aDownload || !aDownload.isPrivate) { - console.log("Error: " + aMessage); - } - }, - - QueryInterface: function (aIID) { - if (!aIID.equals(Ci.nsIDownloadProgressListener) && - !aIID.equals(Ci.nsISupports)) - throw Components.results.NS_ERROR_NO_INTERFACE; - return this; +ContextMenuItem.prototype = { + updateVisibility: function (download) { + this.element.hidden = !this.isVisible(download); } +}; + +function DownloadListView(type, listElementId) { + this.listElement = document.getElementById(listElementId); + contextMenu.addContextMenuEventListener(this.listElement); + + this.items = new Map(); + + Downloads.getList(type) + .then(list => list.addView(this)) + .then(null, Cu.reportError); + + window.addEventListener("unload", event => { + Downloads.getList(type) + .then(list => list.removeView(this)) + .then(null, Cu.reportError); + }); } -document.addEventListener("DOMContentLoaded", Downloads.init.bind(Downloads), true); -window.addEventListener("unload", Downloads.uninit.bind(Downloads), false); +DownloadListView.prototype = { + get finished() { + let finished = []; + for (let download of this.items.keys()) { + if (download.stopped && (!download.hasPartialData || download.error)) { + finished.push(download); + } + } + return finished; + }, + insertOrMoveItem: function (item) { + var compare = (a, b) => { + // active downloads always before stopped downloads + if (a.stopped != b.stopped) { + return b.stopped ? -1 : 1 + } + // most recent downloads first + return b.startTime - a.startTime; + }; + + let insertLocation = this.listElement.firstChild; + while (insertLocation && compare(item.download, insertLocation.download) > 0) { + insertLocation = insertLocation.nextElementSibling; + } + this.listElement.insertBefore(item.element, insertLocation); + }, + + onDownloadAdded: function (download) { + let item = new DownloadItem(download); + this.items.set(download, item); + this.insertOrMoveItem(item); + }, + + onDownloadChanged: function (download) { + let item = this.items.get(download); + if (!item) { + Cu.reportError("No DownloadItem found for download"); + return; + } + + if (item.stateChanged) { + this.insertOrMoveItem(item); + } + + item.onDownloadChanged(); + }, + + onDownloadRemoved: function (download) { + let item = this.items.get(download); + if (!item) { + Cu.reportError("No DownloadItem found for download"); + return; + } + + this.items.delete(download); + this.listElement.removeChild(item.element); + } +}; + +let downloadLists = { + init: function () { + this.publicDownloads = new DownloadListView(Downloads.PUBLIC, "public-downloads-list"); + this.privateDownloads = new DownloadListView(Downloads.PRIVATE, "private-downloads-list"); + }, + + get finished() { + return this.publicDownloads.finished.concat(this.privateDownloads.finished); + }, + + removeFinished: function () { + let finished = this.finished; + if (finished.length == 0) { + return; + } + + let title = strings.GetStringFromName("downloadAction.deleteAll"); + let messageForm = strings.GetStringFromName("downloadMessage.deleteAll"); + let message = PluralForm.get(finished.length, messageForm).replace("#1", finished.length); + + if (Services.prompt.confirm(null, title, message)) { + Downloads.getList(Downloads.ALL) + .then(list => { + for (let download of finished) { + list.remove(download).then(null, Cu.reportError); + deleteDownload(download); + } + }, Cu.reportError); + } + } +}; + +function DownloadItem(download) { + this._download = download; + this._updateFromDownload(); + + this._domain = DownloadUtils.getURIHost(download.source.url)[0]; + this._fileName = this._htmlEscape(OS.Path.basename(download.target.path)); + this._iconUrl = "moz-icon://" + this._fileName + "?size=64"; + this._startDate = this._htmlEscape(DownloadUtils.getReadableDates(download.startTime)[0]); + + this._element = this.createElement(); +} + +const kDownloadStatePropertyNames = [ + "stopped", + "succeeded", + "canceled", + "error", + "startTime" +]; + +DownloadItem.prototype = { + _htmlEscape : function (s) { + s = s.replace(/&/g, "&"); + s = s.replace(/>/g, ">"); + s = s.replace(/ this._state[name] = this._download[name], + this); + }, + + get stateChanged() { + return kDownloadStatePropertyNames.some( + name => this._state[name] != this._download[name], + this); + }, + + get download() this._download, + get element() this._element, + + createElement: function() { + let template = document.getElementById("download-item"); + // TODO: use this once