author | Carsten "Tomcat" Book <cbook@mozilla.com> |
Thu, 10 Nov 2016 16:59:38 +0100 | |
changeset 321989 | d38d06f85ef59c5dbb5d4a1a8d895957a78714de |
parent 321988 | 4ee98684375e8c3c3dabccf8285268fa57f0f8a5 (current diff) |
parent 321902 | 6c0d7c338607bf58a09d9a9c9bbece1e8bd5321a (diff) |
child 321990 | aa765b477532542fb4db29d48819f55f7376a250 |
child 322102 | 17435b7791134833f8b275163793fba0bf59fc01 |
child 322111 | 7ef0d8dca3a6df1f5130970832237457eed2a9f1 |
push id | 83727 |
push user | cbook@mozilla.com |
push date | Thu, 10 Nov 2016 16:09:24 +0000 |
treeherder | mozilla-inbound@aa765b477532 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | merge |
milestone | 52.0a1 |
first release with | nightly linux32
d38d06f85ef5
/
52.0a1
/
20161111030203
/
files
nightly linux64
d38d06f85ef5
/
52.0a1
/
20161111030203
/
files
nightly mac
d38d06f85ef5
/
52.0a1
/
20161111030203
/
files
nightly win32
d38d06f85ef5
/
52.0a1
/
20161111030203
/
files
nightly win64
d38d06f85ef5
/
52.0a1
/
20161111030203
/
files
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
releases | nightly linux32
52.0a1
/
20161111030203
/
pushlog to previous
nightly linux64
52.0a1
/
20161111030203
/
pushlog to previous
nightly mac
52.0a1
/
20161111030203
/
pushlog to previous
nightly win32
52.0a1
/
20161111030203
/
pushlog to previous
nightly win64
52.0a1
/
20161111030203
/
pushlog to previous
|
docshell/base/nsDocShell.cpp | file | annotate | diff | comparison | revisions | |
gfx/layers/client/TextureClient.cpp | file | annotate | diff | comparison | revisions | |
modules/libpref/init/all.js | file | annotate | diff | comparison | revisions | |
toolkit/content/browser-content.js | file | annotate | diff | comparison | revisions | |
toolkit/mozapps/downloads/content/helperApps.js | file | annotate | diff | comparison | revisions | |
widget/nsIPrintOptions.idl | file | annotate | diff | comparison | revisions | |
xpcom/tests/TestDeadlockDetector.cpp | file | annotate | diff | comparison | revisions | |
xpcom/tests/TestDeadlockDetectorScalability.cpp | file | annotate | diff | comparison | revisions | |
xpcom/tests/TestJemalloc.cpp | file | annotate | diff | comparison | revisions | |
xpcom/tests/TestTimers.cpp | file | annotate | diff | comparison | revisions | |
xpcom/tests/nsIFileEnumerator.cpp | file | annotate | diff | comparison | revisions |
--- a/addon-sdk/test/browser.ini +++ b/addon-sdk/test/browser.ini @@ -2,14 +2,13 @@ support-files = head.js Math.jsm math.js data.json invalid.json [browser_sdk_loader_sdk_modules.js] [browser_sdk_loader_sdk_gui_modules.js] -skip-if = e10s # Bug 1315042 [browser_sdk_loader_jsm_modules.js] [browser_sdk_loader_js_modules.js] [browser_sdk_loader_json.js] [browser_sdk_loader_chrome.js] [browser_sdk_loader_chrome_in_sdk.js]
--- a/browser/base/content/test/plugins/browser.ini +++ b/browser/base/content/test/plugins/browser.ini @@ -51,17 +51,16 @@ skip-if = toolkit == "gtk2" || toolkit = [browser_CTP_crashreporting.js] skip-if = !crashreporter [browser_CTP_data_urls.js] [browser_CTP_drag_drop.js] [browser_CTP_hide_overlay.js] [browser_CTP_iframe.js] [browser_CTP_multi_allow.js] [browser_CTP_nonplugins.js] -skip-if = e10s # Bug 1315042 [browser_CTP_notificationBar.js] [browser_CTP_outsideScrollArea.js] [browser_CTP_remove_navigate.js] [browser_CTP_resize.js] [browser_CTP_zoom.js] [browser_blocking.js] [browser_plugins_added_dynamically.js] [browser_pluginnotification.js]
--- a/browser/base/content/test/referrer/browser.ini +++ b/browser/base/content/test/referrer/browser.ini @@ -1,17 +1,16 @@ [DEFAULT] support-files = file_referrer_policyserver.sjs file_referrer_policyserver_attr.sjs file_referrer_testserver.sjs head.js [browser_referrer_middle_click.js] -skip-if = e10s # Bug 1315042 [browser_referrer_middle_click_in_container.js] [browser_referrer_open_link_in_private.js] skip-if = os == 'linux' # Bug 1145199 [browser_referrer_open_link_in_tab.js] skip-if = os == 'linux' # Bug 1144816 [browser_referrer_open_link_in_window.js] skip-if = os == 'linux' # Bug 1145199 [browser_referrer_open_link_in_window_in_container.js]
--- a/browser/base/content/test/webrtc/browser.ini +++ b/browser/base/content/test/webrtc/browser.ini @@ -4,9 +4,8 @@ support-files = get_user_media_content_script.js head.js [browser_devices_get_user_media.js] skip-if = (os == "linux" && debug) # linux: bug 976544 [browser_devices_get_user_media_anim.js] [browser_devices_get_user_media_in_frame.js] [browser_devices_get_user_media_tear_off_tab.js] -skip-if = e10s # Bug 1315042
--- a/browser/base/content/test/webrtc/browser_devices_get_user_media.js +++ b/browser/base/content/test/webrtc/browser_devices_get_user_media.js @@ -19,18 +19,19 @@ var gTests = [ let promise = promisePopupNotificationShown("webRTC-shareDevices"); yield promiseRequestDevice(true, true); yield promise; yield expectObserverCalled("getUserMedia:request"); is(PopupNotifications.getNotification("webRTC-shareDevices").anchorID, "webRTC-shareDevices-notification-icon", "anchored to device icon"); checkDeviceSelectors(true, true); - is(PopupNotifications.panel.firstChild.getAttribute("popupid"), - "webRTC-shareDevices", "panel using devices icon"); + let iconclass = + PopupNotifications.panel.firstChild.getAttribute("iconclass"); + ok(iconclass.includes("camera-icon"), "panel using devices icon"); let indicator = promiseIndicatorWindow(); yield promiseMessage("ok", () => { PopupNotifications.panel.firstChild.button.click(); }); yield expectObserverCalled("getUserMedia:response:allow"); yield expectObserverCalled("recording-device-events"); is((yield getMediaCaptureState()), "CameraAndMicrophone", @@ -48,18 +49,19 @@ var gTests = [ let promise = promisePopupNotificationShown("webRTC-shareDevices"); yield promiseRequestDevice(true); yield promise; yield expectObserverCalled("getUserMedia:request"); is(PopupNotifications.getNotification("webRTC-shareDevices").anchorID, "webRTC-shareMicrophone-notification-icon", "anchored to mic icon"); checkDeviceSelectors(true); - is(PopupNotifications.panel.firstChild.getAttribute("popupid"), - "webRTC-shareMicrophone", "panel using microphone icon"); + let iconclass = + PopupNotifications.panel.firstChild.getAttribute("iconclass"); + ok(iconclass.includes("microphone-icon"), "panel using microphone icon"); let indicator = promiseIndicatorWindow(); yield promiseMessage("ok", () => { PopupNotifications.panel.firstChild.button.click(); }); yield expectObserverCalled("getUserMedia:response:allow"); yield expectObserverCalled("recording-device-events"); is((yield getMediaCaptureState()), "Microphone", @@ -77,18 +79,19 @@ var gTests = [ let promise = promisePopupNotificationShown("webRTC-shareDevices"); yield promiseRequestDevice(false, true); yield promise; yield expectObserverCalled("getUserMedia:request"); is(PopupNotifications.getNotification("webRTC-shareDevices").anchorID, "webRTC-shareDevices-notification-icon", "anchored to device icon"); checkDeviceSelectors(false, true); - is(PopupNotifications.panel.firstChild.getAttribute("popupid"), - "webRTC-shareDevices", "panel using devices icon"); + let iconclass = + PopupNotifications.panel.firstChild.getAttribute("iconclass"); + ok(iconclass.includes("camera-icon"), "panel using devices icon"); let indicator = promiseIndicatorWindow(); yield promiseMessage("ok", () => { PopupNotifications.panel.firstChild.button.click(); }); yield expectObserverCalled("getUserMedia:response:allow"); yield expectObserverCalled("recording-device-events"); is((yield getMediaCaptureState()), "Camera", "expected camera to be shared");
new file mode 100644 --- /dev/null +++ b/browser/docs/BrowserUsageTelemetry.rst @@ -0,0 +1,28 @@ +.. _browserusagetelemetry: + +======================= +Browser Usage Telemetry +======================= + +The `BrowserUsageTelemetry.jsm <https://dxr.mozilla.org/mozilla-central/source/browser/modules/BrowserUsageTelemetry.jsm>`_ module is the main module for measurements regarding the browser usage (e.g. tab and window counts, search counts, ...). + +The measurements recording begins right after the ``SessionStore`` has finished restoring the session (i.e. restoring tabs/windows after Firefox starts). + +Search telemetry +================ +This module exposes the ``recordSearch`` method, which serves as the main entry point for recording search related Telemetry. It records only the search *counts* per engine and the origin of the search, but nothing pertaining the search contents themselves. + +As the transition to the ``BrowserUsageTelemetry`` happens, the ``recordSearch`` calls are dispatched through `BrowserSearch.recordSearchInTelemetry <https://dxr.mozilla.org/mozilla-central/rev/3e73fd638e687a4d7f46613586e5156b8e2af846/browser/base/content/browser.js#3752>`_, that is called by all the search related UI components (urlbar, searchbar, context menu and about\:\* pages). + +A list of the components recording search Telemetry can be found using the following `DXR search <https://dxr.mozilla.org/mozilla-central/search?q=recordSearchInTelemetry>`_. + +Measured interactions +===================== +The usage telemetry module currently measures these interactions with the browser: + +- *tab and window engagement*: counts the number of non-private tabs and windows opened in a subsession, after the session is restored (see e.g. ``browser.engagement.max_concurrent_tab_count``); +- *URI loads*: counts the number of page loads (doesn't track and send the addresses, just the counts) directly triggered by the users (see ``browser.engagement.total_uri_count``); +- *navigation events*: at this time, this only counts the number of time a page load is triggered by a particular UI interaction (e.g. by searching through the URL bar, see ``browser.engagement.navigation.urlbar``). + + +Please see `Scalars.yaml <https://dxr.mozilla.org/mozilla-central/source/toolkit/components/telemetry/Scalars.yaml>`_ for the full list of tracked interactions.
--- a/browser/docs/index.rst +++ b/browser/docs/index.rst @@ -4,8 +4,9 @@ Firefox This is the nascent documentation of the Firefox front-end code. .. toctree:: :maxdepth: 1 DirectoryLinksProvider UITelemetry + BrowserUsageTelemetry
--- a/browser/modules/webrtcUI.jsm +++ b/browser/modules/webrtcUI.jsm @@ -358,27 +358,16 @@ function prompt(aBrowser, aRequest) { let options = { eventCallback: function(aTopic, aNewBrowser) { if (aTopic == "swapping") return true; let chromeDoc = this.browser.ownerDocument; - if (aTopic == "shown") { - let popupId = "Devices"; - if (requestTypes.length == 1 && (requestTypes[0] == "Microphone" || - requestTypes[0] == "AudioCapture")) - popupId = "Microphone"; - if (requestTypes.includes("Screen")) - popupId = "Screen"; - chromeDoc.getElementById("webRTC-shareDevices-notification") - .setAttribute("popupid", "webRTC-share" + popupId); - } - // Clean-up video streams of screensharing previews. if ((aTopic == "dismissed" || aTopic == "removed") && requestTypes.includes("Screen")) { let video = chromeDoc.getElementById("webRTC-previewVideo"); video.deviceId = undefined; if (video.stream) { video.stream.getTracks().forEach(t => t.stop()); video.stream = null; @@ -666,21 +655,29 @@ function prompt(aBrowser, aRequest) { mm.sendAsyncMessage("webrtc:Allow", {callID: aRequest.callID, windowID: aRequest.windowID, devices: allowedDevices}); }; return false; } }; - let anchorId = "webRTC-shareDevices-notification-icon"; - if (requestTypes.length == 1 && requestTypes[0] == "Microphone") - anchorId = "webRTC-shareMicrophone-notification-icon"; + let iconType = "Devices"; + if (requestTypes.length == 1 && (requestTypes[0] == "Microphone" || + requestTypes[0] == "AudioCapture")) + iconType = "Microphone"; if (requestTypes.includes("Screen")) - anchorId = "webRTC-shareScreen-notification-icon"; + iconType = "Screen"; + let anchorId = "webRTC-share" + iconType + "-notification-icon"; + + let iconClass = iconType.toLowerCase(); + if (iconClass == "devices") + iconClass = "camera"; + options.popupIconClass = iconClass + "-icon"; + notification = chromeWin.PopupNotifications.show(aBrowser, "webRTC-shareDevices", message, anchorId, mainAction, secondaryActions, options); notification.callID = aRequest.callID; } function removePrompt(aBrowser, aCallId) {
--- a/browser/themes/shared/notification-icons.inc.css +++ b/browser/themes/shared/notification-icons.inc.css @@ -108,18 +108,17 @@ .login-icon { list-style-image: url(chrome://browser/skin/notification-icons.svg#login); } .popup-notification-icon[popupid="password"] { list-style-image: url(chrome://browser/skin/notification-icons.svg#login-detailed); } -.camera-icon, -.popup-notification-icon[popupid="webRTC-shareDevices"] { +.camera-icon { list-style-image: url(chrome://browser/skin/notification-icons.svg#camera); } .camera-icon.in-use { list-style-image: url(chrome://browser/skin/notification-icons.svg#camera-sharing); } .camera-icon.blocked-permission-icon { @@ -133,21 +132,20 @@ .microphone-icon.in-use { list-style-image: url(chrome://browser/skin/notification-icons.svg#microphone-sharing); } .microphone-icon.blocked-permission-icon { list-style-image: url(chrome://browser/skin/notification-icons.svg#microphone-blocked); } -.popup-notification-icon[popupid="webRTC-shareMicrophone"] { +.popup-notification-icon.microphone-icon { list-style-image: url(chrome://browser/skin/notification-icons.svg#microphone-detailed); } -.popup-notification-icon[popupid="webRTC-shareScreen"], .screen-icon { list-style-image: url(chrome://browser/skin/notification-icons.svg#screen); } .screen-icon.in-use { list-style-image: url(chrome://browser/skin/notification-icons.svg#screen-sharing); }
--- a/build/valgrind/mach_commands.py +++ b/build/valgrind/mach_commands.py @@ -108,16 +108,19 @@ class MachCommands(MachCommandBase): '--vex-iropt-register-updates=allregs-at-mem-access', '--gen-suppressions=all', '--num-callers=36', '--leak-check=full', '--show-possibly-lost=no', '--track-origins=yes', '--trace-children=yes', '-v', # Enable verbosity to get the list of used suppressions + # Avoid excessive delays in the presence of spinlocks. + # See bug 1309851. + '--fair-sched=yes', ] for s in suppressions: valgrind_args.append('--suppressions=' + s) supps_dir = os.path.join(build_dir, 'valgrind') supps_file1 = os.path.join(supps_dir, 'cross-architecture.sup') valgrind_args.append('--suppressions=' + supps_file1)
--- a/caps/BasePrincipal.cpp +++ b/caps/BasePrincipal.cpp @@ -319,16 +319,17 @@ OriginAttributes::SetFromGenericAttribut mAppId = aAttrs.mAppId; mInIsolatedMozBrowser = aAttrs.mInIsolatedMozBrowser; mAddonId = aAttrs.mAddonId; mUserContextId = aAttrs.mUserContextId; mPrivateBrowsingId = aAttrs.mPrivateBrowsingId; mFirstPartyDomain = aAttrs.mFirstPartyDomain; } +/* static */ bool OriginAttributes::IsFirstPartyEnabled() { // Cache the privacy.firstparty.isolate pref. static bool sFirstPartyIsolation = false; static bool sCachedFirstPartyPref = false; if (!sCachedFirstPartyPref) { sCachedFirstPartyPref = true;
--- a/caps/BasePrincipal.h +++ b/caps/BasePrincipal.h @@ -56,23 +56,23 @@ public: nsACString& aOriginNoSuffix); // Helper function to match mIsPrivateBrowsing to existing private browsing // flags. Once all other flags are removed, this can be removed too. void SyncAttributesWithPrivateBrowsing(bool aInPrivateBrowsing); void SetFromGenericAttributes(const GenericOriginAttributes& aAttrs); + // check if "privacy.firstparty.isolate" is enabled. + static bool IsFirstPartyEnabled(); + protected: OriginAttributes() {} explicit OriginAttributes(const OriginAttributesDictionary& aOther) : OriginAttributesDictionary(aOther) {} - - // check if "privacy.firstparty.isolate" is enabled. - bool IsFirstPartyEnabled(); }; class PrincipalOriginAttributes; class DocShellOriginAttributes; class NeckoOriginAttributes; // Various classes in Gecko contain OriginAttributes members, and those // OriginAttributes get propagated to other classes according to certain rules.
--- a/devtools/client/aboutdebugging/components/aboutdebugging.js +++ b/devtools/client/aboutdebugging/components/aboutdebugging.js @@ -1,29 +1,34 @@ /* 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/. */ /* eslint-env browser */ "use strict"; -const { createFactory, createClass, DOM: dom } = +const { createFactory, createClass, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); const Services = require("Services"); const PanelMenu = createFactory(require("./panel-menu")); loader.lazyGetter(this, "AddonsPanel", () => createFactory(require("./addons/panel"))); loader.lazyGetter(this, "TabsPanel", () => createFactory(require("./tabs/panel"))); loader.lazyGetter(this, "WorkersPanel", () => createFactory(require("./workers/panel"))); +loader.lazyRequireGetter(this, "DebuggerClient", + "devtools/shared/client/main", true); +loader.lazyRequireGetter(this, "Telemetry", + "devtools/client/shared/telemetry"); + const Strings = Services.strings.createBundle( "chrome://devtools/locale/aboutdebugging.properties"); const panels = [{ id: "addons", name: Strings.GetStringFromName("addons"), icon: "chrome://devtools/skin/images/debugging-addons.svg", component: AddonsPanel @@ -39,16 +44,21 @@ const panels = [{ component: WorkersPanel }]; const defaultPanelId = "addons"; module.exports = createClass({ displayName: "AboutDebuggingApp", + propTypes: { + client: PropTypes.instanceOf(DebuggerClient).isRequired, + telemetry: PropTypes.instanceOf(Telemetry).isRequired + }, + getInitialState() { return { selectedPanelId: defaultPanelId }; }, componentDidMount() { window.addEventListener("hashchange", this.onHashChange);
--- a/devtools/client/aboutdebugging/components/addons/controls.js +++ b/devtools/client/aboutdebugging/components/addons/controls.js @@ -6,30 +6,34 @@ /* globals AddonManager */ "use strict"; loader.lazyImporter(this, "AddonManager", "resource://gre/modules/AddonManager.jsm"); const { Cc, Ci } = require("chrome"); -const { createFactory, createClass, DOM: dom } = +const { createFactory, createClass, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); const Services = require("Services"); const AddonsInstallError = createFactory(require("./install-error")); const Strings = Services.strings.createBundle( "chrome://devtools/locale/aboutdebugging.properties"); const MORE_INFO_URL = "https://developer.mozilla.org/docs/Tools" + "/about:debugging#Enabling_add-on_debugging"; module.exports = createClass({ displayName: "AddonsControls", + propTypes: { + debugDisabled: PropTypes.bool + }, + getInitialState() { return { installError: null, }; }, onEnableAddonDebuggingChange(event) { let enabled = event.target.checked;
--- a/devtools/client/aboutdebugging/components/addons/install-error.js +++ b/devtools/client/aboutdebugging/components/addons/install-error.js @@ -1,20 +1,24 @@ /* 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/. */ /* eslint-env browser */ "use strict"; -const { createClass, DOM: dom } = require("devtools/client/shared/vendor/react"); +const { createClass, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); module.exports = createClass({ displayName: "AddonsInstallError", + propTypes: { + error: PropTypes.string + }, + render() { if (!this.props.error) { return null; } let text = `There was an error during installation: ${this.props.error}`; return dom.div({ className: "addons-install-error" }, dom.div({ className: "warning" }), dom.span({}, text));
--- a/devtools/client/aboutdebugging/components/addons/panel.js +++ b/devtools/client/aboutdebugging/components/addons/panel.js @@ -1,34 +1,42 @@ /* 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"; const { AddonManager } = require("resource://gre/modules/AddonManager.jsm"); -const { createFactory, createClass, DOM: dom } = +const { createFactory, createClass, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); const Services = require("Services"); const AddonsControls = createFactory(require("./controls")); const AddonTarget = createFactory(require("./target")); const PanelHeader = createFactory(require("../panel-header")); const TargetList = createFactory(require("../target-list")); +loader.lazyRequireGetter(this, "DebuggerClient", + "devtools/shared/client/main", true); + const Strings = Services.strings.createBundle( "chrome://devtools/locale/aboutdebugging.properties"); const ExtensionIcon = "chrome://mozapps/skin/extensions/extensionGeneric.svg"; const CHROME_ENABLED_PREF = "devtools.chrome.enabled"; const REMOTE_ENABLED_PREF = "devtools.debugger.remote-enabled"; module.exports = createClass({ displayName: "AddonsPanel", + propTypes: { + client: PropTypes.instanceOf(DebuggerClient).isRequired, + id: PropTypes.string.isRequired + }, + getInitialState() { return { extensions: [], debugDisabled: false, }; }, componentDidMount() { @@ -120,16 +128,17 @@ module.exports = createClass({ }, PanelHeader({ id: id + "-header", name: Strings.GetStringFromName("addons") }), AddonsControls({ debugDisabled }), dom.div({ id: "addons" }, TargetList({ + id: "extensions", name, targets, client, debugDisabled, targetClass, sort: true }) ));
--- a/devtools/client/aboutdebugging/components/addons/target.js +++ b/devtools/client/aboutdebugging/components/addons/target.js @@ -1,27 +1,45 @@ /* 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/. */ /* eslint-env browser */ "use strict"; -const { createClass, DOM: dom } = +const { createClass, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); const { debugAddon } = require("../../modules/addon"); const Services = require("Services"); +loader.lazyImporter(this, "BrowserToolboxProcess", + "resource://devtools/client/framework/ToolboxProcess.jsm"); + +loader.lazyRequireGetter(this, "DebuggerClient", + "devtools/shared/client/main", true); + const Strings = Services.strings.createBundle( "chrome://devtools/locale/aboutdebugging.properties"); module.exports = createClass({ displayName: "AddonTarget", + propTypes: { + client: PropTypes.instanceOf(DebuggerClient).isRequired, + debugDisabled: PropTypes.bool, + target: PropTypes.shape({ + addonActor: PropTypes.string.isRequired, + addonID: PropTypes.string.isRequired, + icon: PropTypes.string, + name: PropTypes.string.isRequired, + temporarilyInstalled: PropTypes.bool + }).isRequired + }, + debug() { let { target } = this.props; debugAddon(target.addonID); }, reload() { let { client, target } = this.props; // This function sometimes returns a partial promise that only
--- a/devtools/client/aboutdebugging/components/panel-header.js +++ b/devtools/client/aboutdebugging/components/panel-header.js @@ -1,19 +1,24 @@ /* 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"; -const { createClass, DOM: dom } = +const { createClass, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); module.exports = createClass({ displayName: "PanelHeader", + propTypes: { + id: PropTypes.string.isRequired, + name: PropTypes.string.isRequired + }, + render() { let { name, id } = this.props; return dom.div({ className: "header" }, dom.h1({ id, className: "header-name" }, name)); }, });
--- a/devtools/client/aboutdebugging/components/panel-menu-entry.js +++ b/devtools/client/aboutdebugging/components/panel-menu-entry.js @@ -1,20 +1,28 @@ /* 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"; -const { createClass, DOM: dom } = +const { createClass, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); module.exports = createClass({ displayName: "PanelMenuEntry", + propTypes: { + icon: PropTypes.string.isRequired, + id: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + selected: PropTypes.bool, + selectPanel: PropTypes.func.isRequired + }, + onClick() { this.props.selectPanel(this.props.id); }, onKeyDown(event) { if ([" ", "Enter"].includes(event.key)) { this.props.selectPanel(this.props.id); }
--- a/devtools/client/aboutdebugging/components/panel-menu.js +++ b/devtools/client/aboutdebugging/components/panel-menu.js @@ -1,21 +1,32 @@ /* 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"; -const { createClass, createFactory, DOM: dom } = +const { createClass, createFactory, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); const PanelMenuEntry = createFactory(require("./panel-menu-entry")); module.exports = createClass({ displayName: "PanelMenu", + propTypes: { + panels: PropTypes.arrayOf(PropTypes.shape({ + id: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + icon: PropTypes.string.isRequired, + component: PropTypes.func.isRequired + })).isRequired, + selectPanel: PropTypes.func.isRequired, + selectedPanelId: PropTypes.string + }, + render() { let { panels, selectedPanelId, selectPanel } = this.props; let panelLinks = panels.map(({ id, name, icon }) => { let selected = id == selectedPanelId; return PanelMenuEntry({ id, name, icon,
--- a/devtools/client/aboutdebugging/components/tabs/panel.js +++ b/devtools/client/aboutdebugging/components/tabs/panel.js @@ -1,30 +1,38 @@ /* 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/. */ /* eslint-env browser */ "use strict"; -const { createClass, createFactory, DOM: dom } = +const { createClass, createFactory, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); const Services = require("Services"); const PanelHeader = createFactory(require("../panel-header")); const TargetList = createFactory(require("../target-list")); const TabTarget = createFactory(require("./target")); +loader.lazyRequireGetter(this, "DebuggerClient", + "devtools/shared/client/main", true); + const Strings = Services.strings.createBundle( "chrome://devtools/locale/aboutdebugging.properties"); module.exports = createClass({ displayName: "TabsPanel", + propTypes: { + client: PropTypes.instanceOf(DebuggerClient).isRequired, + id: PropTypes.string.isRequired + }, + getInitialState() { return { tabs: [] }; }, componentDidMount() { let { client } = this.props;
--- a/devtools/client/aboutdebugging/components/tabs/target.js +++ b/devtools/client/aboutdebugging/components/tabs/target.js @@ -1,26 +1,35 @@ /* 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/. */ /* eslint-env browser */ "use strict"; -const { createClass, DOM: dom } = +const { createClass, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); const Services = require("Services"); const Strings = Services.strings.createBundle( "chrome://devtools/locale/aboutdebugging.properties"); module.exports = createClass({ displayName: "TabTarget", + propTypes: { + target: PropTypes.shape({ + icon: PropTypes.string, + outerWindowID: PropTypes.number.isRequired, + title: PropTypes.string, + url: PropTypes.string.isRequired + }).isRequired + }, + debug() { let { target } = this.props; window.open("about:devtools-toolbox?type=tab&id=" + target.outerWindowID); }, render() { let { target } = this.props;
--- a/devtools/client/aboutdebugging/components/target-list.js +++ b/devtools/client/aboutdebugging/components/target-list.js @@ -1,28 +1,42 @@ /* 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"; -const { createClass, DOM: dom } = +const { createClass, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); const Services = require("Services"); +loader.lazyRequireGetter(this, "DebuggerClient", + "devtools/shared/client/main", true); + const Strings = Services.strings.createBundle( "chrome://devtools/locale/aboutdebugging.properties"); const LocaleCompare = (a, b) => { return a.name.toLowerCase().localeCompare(b.name.toLowerCase()); }; module.exports = createClass({ displayName: "TargetList", + propTypes: { + client: PropTypes.instanceOf(DebuggerClient).isRequired, + debugDisabled: PropTypes.bool, + error: PropTypes.node, + id: PropTypes.string.isRequired, + name: PropTypes.string, + sort: PropTypes.bool, + targetClass: PropTypes.func.isRequired, + targets: PropTypes.arrayOf(PropTypes.object).isRequired + }, + render() { let { client, debugDisabled, error, targetClass, targets, sort } = this.props; if (sort) { targets = targets.sort(LocaleCompare); } targets = targets.map(target => { return targetClass({ client, target, debugDisabled }); });
--- a/devtools/client/aboutdebugging/components/workers/panel.js +++ b/devtools/client/aboutdebugging/components/workers/panel.js @@ -3,35 +3,46 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* globals window */ "use strict"; loader.lazyImporter(this, "PrivateBrowsingUtils", "resource://gre/modules/PrivateBrowsingUtils.jsm"); const { Ci } = require("chrome"); -const { createClass, createFactory, DOM: dom } = +const { createClass, createFactory, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); const { getWorkerForms } = require("../../modules/worker"); const Services = require("Services"); const PanelHeader = createFactory(require("../panel-header")); const TargetList = createFactory(require("../target-list")); const WorkerTarget = createFactory(require("./target")); const ServiceWorkerTarget = createFactory(require("./service-worker-target")); +loader.lazyImporter(this, "PrivateBrowsingUtils", + "resource://gre/modules/PrivateBrowsingUtils.jsm"); + +loader.lazyRequireGetter(this, "DebuggerClient", + "devtools/shared/client/main", true); + const Strings = Services.strings.createBundle( "chrome://devtools/locale/aboutdebugging.properties"); const WorkerIcon = "chrome://devtools/skin/images/debugging-workers.svg"; const MORE_INFO_URL = "https://developer.mozilla.org/en-US/docs/Tools/about%3Adebugging"; module.exports = createClass({ displayName: "WorkersPanel", + propTypes: { + client: PropTypes.instanceOf(DebuggerClient).isRequired, + id: PropTypes.string.isRequired + }, + getInitialState() { return { workers: { service: [], shared: [], other: [] } };
--- a/devtools/client/aboutdebugging/components/workers/service-worker-target.js +++ b/devtools/client/aboutdebugging/components/workers/service-worker-target.js @@ -1,27 +1,45 @@ /* 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/. */ /* eslint-env browser */ "use strict"; -const { createClass, DOM: dom } = +const { createClass, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); const { debugWorker } = require("../../modules/worker"); const Services = require("Services"); +loader.lazyRequireGetter(this, "DebuggerClient", + "devtools/shared/client/main", true); + const Strings = Services.strings.createBundle( "chrome://devtools/locale/aboutdebugging.properties"); module.exports = createClass({ displayName: "ServiceWorkerTarget", + propTypes: { + client: PropTypes.instanceOf(DebuggerClient).isRequired, + debugDisabled: PropTypes.bool, + target: PropTypes.shape({ + active: PropTypes.bool, + icon: PropTypes.string, + name: PropTypes.string.isRequired, + url: PropTypes.string, + scope: PropTypes.string.isRequired, + // registrationActor can be missing in e10s. + registrationActor: PropTypes.string, + workerActor: PropTypes.string + }).isRequired + }, + getInitialState() { return { pushSubscription: null }; }, componentDidMount() { let { client } = this.props;
--- a/devtools/client/aboutdebugging/components/workers/target.js +++ b/devtools/client/aboutdebugging/components/workers/target.js @@ -1,27 +1,40 @@ /* 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/. */ /* eslint-env browser */ "use strict"; -const { createClass, DOM: dom } = +const { createClass, DOM: dom, PropTypes } = require("devtools/client/shared/vendor/react"); const { debugWorker } = require("../../modules/worker"); const Services = require("Services"); +loader.lazyRequireGetter(this, "DebuggerClient", + "devtools/shared/client/main", true); + const Strings = Services.strings.createBundle( "chrome://devtools/locale/aboutdebugging.properties"); module.exports = createClass({ displayName: "WorkerTarget", + propTypes: { + client: PropTypes.instanceOf(DebuggerClient).isRequired, + debugDisabled: PropTypes.bool, + target: PropTypes.shape({ + icon: PropTypes.string, + name: PropTypes.string.isRequired, + workerActor: PropTypes.string + }).isRequired + }, + debug() { let { client, target } = this.props; debugWorker(client, target.workerActor); }, render() { let { target, debugDisabled } = this.props;
--- a/devtools/client/responsive.html/test/browser/browser.ini +++ b/devtools/client/responsive.html/test/browser/browser.ini @@ -33,12 +33,11 @@ support-files = [browser_permission_doorhanger.js] [browser_resize_cmd.js] [browser_screenshot_button.js] [browser_tab_close.js] [browser_tab_remoteness_change.js] [browser_toolbox_computed_view.js] [browser_toolbox_rule_view.js] [browser_toolbox_swap_browsers.js] -skip-if = true # Bug 1315042 [browser_touch_simulation.js] [browser_viewport_basics.js] [browser_window_close.js]
--- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -3568,31 +3568,73 @@ nsDocShell::CanAccessItem(nsIDocShellTre } if (targetDS->GetIsInIsolatedMozBrowserElement() != accessingDS->GetIsInIsolatedMozBrowserElement() || targetDS->GetAppId() != accessingDS->GetAppId()) { return false; } - if (static_cast<nsDocShell*>(targetDS.get())->GetOriginAttributes() != - static_cast<nsDocShell*>(accessingDS.get())->GetOriginAttributes()) { + nsCOMPtr<nsIDocShellTreeItem> accessingRoot; + aAccessingItem->GetSameTypeRootTreeItem(getter_AddRefs(accessingRoot)); + nsCOMPtr<nsIDocShell> accessingRootDS = do_QueryInterface(accessingRoot); + + nsCOMPtr<nsIDocShellTreeItem> targetRoot; + aTargetItem->GetSameTypeRootTreeItem(getter_AddRefs(targetRoot)); + nsCOMPtr<nsIDocShell> targetRootDS = do_QueryInterface(targetRoot); + + DocShellOriginAttributes targetOA = + static_cast<nsDocShell*>(targetDS.get())->GetOriginAttributes(); + DocShellOriginAttributes accessingOA = + static_cast<nsDocShell*>(accessingDS.get())->GetOriginAttributes(); + + // When the first party isolation is on, the top-level docShell may not have + // the firstPartyDomain in its originAttributes, but its document will have + // it. So we get the firstPartyDomain from the nodePrincipal of the document + // before we compare the originAttributes. + if (OriginAttributes::IsFirstPartyEnabled()) { + if (accessingDS == accessingRootDS && + aAccessingItem->ItemType() == nsIDocShellTreeItem::typeContent && + !accessingDS->GetIsMozBrowserOrApp()) { + + nsCOMPtr<nsIDocument> accessingDoc = aAccessingItem->GetDocument(); + + if (accessingDoc) { + nsCOMPtr<nsIPrincipal> accessingPrincipal = accessingDoc->NodePrincipal(); + + accessingOA.mFirstPartyDomain = + BasePrincipal::Cast(accessingPrincipal)->OriginAttributesRef().mFirstPartyDomain; + } + } + + if (targetDS == targetRootDS && + aTargetItem->ItemType() == nsIDocShellTreeItem::typeContent && + !targetDS->GetIsMozBrowserOrApp()) { + + nsCOMPtr<nsIDocument> targetDoc = aAccessingItem->GetDocument(); + + if (targetDoc) { + nsCOMPtr<nsIPrincipal> targetPrincipal = targetDoc->NodePrincipal(); + + targetOA.mFirstPartyDomain = + BasePrincipal::Cast(targetPrincipal)->OriginAttributesRef().mFirstPartyDomain; + } + } + } + + if (targetOA != accessingOA) { return false; } // A private document can't access a non-private one, and vice versa. if (static_cast<nsDocShell*>(targetDS.get())->UsePrivateBrowsing() != static_cast<nsDocShell*>(accessingDS.get())->UsePrivateBrowsing()) { return false; } - - nsCOMPtr<nsIDocShellTreeItem> accessingRoot; - aAccessingItem->GetSameTypeRootTreeItem(getter_AddRefs(accessingRoot)); - if (aTargetItem == accessingRoot) { // A frame can navigate its root. return true; } // Check if aAccessingItem can navigate one of aTargetItem's ancestors. nsCOMPtr<nsIDocShellTreeItem> target = aTargetItem; do { @@ -3600,19 +3642,16 @@ nsDocShell::CanAccessItem(nsIDocShellTre return true; } nsCOMPtr<nsIDocShellTreeItem> parent; target->GetSameTypeParent(getter_AddRefs(parent)); parent.swap(target); } while (target); - nsCOMPtr<nsIDocShellTreeItem> targetRoot; - aTargetItem->GetSameTypeRootTreeItem(getter_AddRefs(targetRoot)); - if (aTargetItem != targetRoot) { // target is a subframe, not in accessor's frame hierarchy, and all its // ancestors have origins different from that of the accessor. Don't // allow access. return false; } if (!aConsiderOpener) {
--- a/dom/base/test/browser.ini +++ b/dom/base/test/browser.ini @@ -15,17 +15,16 @@ support-files = file_use_counter_svg_fill_pattern_data.svg [browser_bug593387.js] [browser_bug902350.js] tags = mcb [browser_bug1011748.js] [browser_bug1058164.js] [browser_messagemanager_loadprocessscript.js] -skip-if = e10s # Bug 1315042 [browser_messagemanager_targetframeloader.js] [browser_messagemanager_unload.js] [browser_pagehide_on_tab_close.js] skip-if = e10s # this tests non-e10s behavior. it's not expected to work in e10s. [browser_state_notifications.js] skip-if = true # Bug 1271028 [browser_use_counters.js] [browser_bug1307747.js]
--- a/dom/browser-element/mochitest/mochitest-oop.ini +++ b/dom/browser-element/mochitest/mochitest-oop.ini @@ -66,17 +66,16 @@ disabled = disabled for bug 1266035 [test_browserElement_oop_OpenWindow.html] [test_browserElement_oop_OpenWindowDifferentOrigin.html] [test_browserElement_oop_OpenWindowInFrame.html] [test_browserElement_oop_OpenWindowRejected.html] [test_browserElement_oop_Opensearch.html] [test_browserElement_oop_OpenTab.html] disabled = Disabling some OOP tests for WebIDL scope changes [test_browserElement_oop_PrivateBrowsing.html] -skip-if = e10s # Bug 1315042 [test_browserElement_oop_PromptCheck.html] [test_browserElement_oop_PromptConfirm.html] [test_browserElement_oop_Proxy.html] [test_browserElement_oop_PurgeHistory.html] disabled = Disabling some OOP tests for WebIDL scope changes [test_browserElement_oop_Reload.html] disabled = Disabling some OOP tests for WebIDL scope changes [test_browserElement_oop_ReloadPostRequest.html]
--- a/dom/canvas/WebGLFormats.cpp +++ b/dom/canvas/WebGLFormats.cpp @@ -163,17 +163,17 @@ AddFormatInfo(EffectiveFormat format, co case UnsizedFormat::D: MOZ_ASSERT(!r && !g && !b && !a && d && !s); break; case UnsizedFormat::S: MOZ_ASSERT(!r && !g && !b && !a && !d && s); break; - case UnsizedFormat::DS: + case UnsizedFormat::DEPTH_STENCIL: MOZ_ASSERT(!r && !g && !b && !a && d && s); break; } const CompressedFormatInfo* compressedFormatInfo = GetCompressedFormatInfo(format); MOZ_ASSERT(!bytesPerPixel == bool(compressedFormatInfo)); #ifdef DEBUG @@ -257,18 +257,18 @@ InitFormatInfo() AddFormatInfo(FOO(RGBA16UI ), 8, 16,16,16,16, 0,0, UnsizedFormat::RGBA, false, ComponentType::UInt ); AddFormatInfo(FOO(RGBA32I ), 16, 32,32,32,32, 0,0, UnsizedFormat::RGBA, false, ComponentType::Int ); AddFormatInfo(FOO(RGBA32UI ), 16, 32,32,32,32, 0,0, UnsizedFormat::RGBA, false, ComponentType::UInt ); // GLES 3.0.4, p133, table 3.14 AddFormatInfo(FOO(DEPTH_COMPONENT16 ), 2, 0,0,0,0, 16,0, UnsizedFormat::D , false, ComponentType::NormUInt); AddFormatInfo(FOO(DEPTH_COMPONENT24 ), 3, 0,0,0,0, 24,0, UnsizedFormat::D , false, ComponentType::NormUInt); AddFormatInfo(FOO(DEPTH_COMPONENT32F), 4, 0,0,0,0, 32,0, UnsizedFormat::D , false, ComponentType::Float); - AddFormatInfo(FOO(DEPTH24_STENCIL8 ), 4, 0,0,0,0, 24,8, UnsizedFormat::DS, false, ComponentType::Special); - AddFormatInfo(FOO(DEPTH32F_STENCIL8 ), 5, 0,0,0,0, 32,8, UnsizedFormat::DS, false, ComponentType::Special); + AddFormatInfo(FOO(DEPTH24_STENCIL8 ), 4, 0,0,0,0, 24,8, UnsizedFormat::DEPTH_STENCIL, false, ComponentType::Special); + AddFormatInfo(FOO(DEPTH32F_STENCIL8 ), 5, 0,0,0,0, 32,8, UnsizedFormat::DEPTH_STENCIL, false, ComponentType::Special); // GLES 3.0.4, p205-206, "Required Renderbuffer Formats" AddFormatInfo(FOO(STENCIL_INDEX8), 1, 0,0,0,0, 0,8, UnsizedFormat::S, false, ComponentType::UInt); // GLES 3.0.4, p147, table 3.19 // GLES 3.0.4 p286+ $C.1 "ETC Compressed Texture Image Formats" AddFormatInfo(FOO(COMPRESSED_RGB8_ETC2 ), 0, 1,1,1,0, 0,0, UnsizedFormat::RGB , false, ComponentType::NormUInt); AddFormatInfo(FOO(COMPRESSED_SRGB8_ETC2 ), 0, 1,1,1,0, 0,0, UnsizedFormat::RGB , true , ComponentType::NormUInt);
--- a/dom/canvas/WebGLFormats.h +++ b/dom/canvas/WebGLFormats.h @@ -153,17 +153,17 @@ enum class UnsizedFormat : uint8_t { RG, RGB, RGBA, LA, L, A, D, S, - DS, + DEPTH_STENCIL, // `DS` is a macro on Solaris. (regset.h) }; // GLES 3.0.4 p114 Table 3.4, p240 enum class ComponentType : uint8_t { None, Int, // RGBA32I UInt, // RGBA32UI, STENCIL_INDEX8 NormInt, // RGBA8_SNORM
--- a/dom/canvas/WebGLFramebuffer.cpp +++ b/dom/canvas/WebGLFramebuffer.cpp @@ -532,17 +532,17 @@ WebGLFBAttachPoint::GetParameter(const c : LOCAL_GL_LINEAR); break; case LOCAL_GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: MOZ_ASSERT(attachment != LOCAL_GL_DEPTH_STENCIL_ATTACHMENT); if (format->componentType == webgl::ComponentType::Special) { // Special format is used for DS mixed format(e.g. D24S8 and D32FS8). - MOZ_ASSERT(format->unsizedFormat == webgl::UnsizedFormat::DS); + MOZ_ASSERT(format->unsizedFormat == webgl::UnsizedFormat::DEPTH_STENCIL); MOZ_ASSERT(attachment == LOCAL_GL_DEPTH_ATTACHMENT || attachment == LOCAL_GL_STENCIL_ATTACHMENT); if (attachment == LOCAL_GL_DEPTH_ATTACHMENT) { switch (format->effectiveFormat) { case webgl::EffectiveFormat::DEPTH24_STENCIL8: format = webgl::GetFormat(webgl::EffectiveFormat::DEPTH_COMPONENT24); break;
--- a/dom/ipc/Blob.cpp +++ b/dom/ipc/Blob.cpp @@ -204,17 +204,21 @@ ActorManagerIsSameProcess(PBackgroundPar bool EventTargetIsOnCurrentThread(nsIEventTarget* aEventTarget) { if (!aEventTarget) { return NS_IsMainThread(); } bool current; - MOZ_ALWAYS_SUCCEEDS(aEventTarget->IsOnCurrentThread(¤t)); + + // If this fails, we are probably shutting down. + if (NS_WARN_IF(NS_FAILED(aEventTarget->IsOnCurrentThread(¤t)))) { + return true; + } return current; } class CancelableRunnableWrapper final : public CancelableRunnable { nsCOMPtr<nsIRunnable> mRunnable;
--- a/dom/media/platforms/omx/moz.build +++ b/dom/media/platforms/omx/moz.build @@ -43,8 +43,15 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk EXTRA_DSO_LDOPTS += [ '-libbinder', ] FINAL_LIBRARY = 'xul' if CONFIG['GNU_CXX']: CXXFLAGS += ['-Wno-error=shadow'] + +if CONFIG['_MSC_VER']: + # Avoid warnings from third-party code that we can not modify. + if CONFIG['CLANG_CL']: + CXXFLAGS += ['-Wno-invalid-source-encoding'] + else: + CXXFLAGS += ['-validate-charset-']
--- a/embedding/components/printingui/ipc/PrintDataUtils.cpp +++ b/embedding/components/printingui/ipc/PrintDataUtils.cpp @@ -1,16 +1,15 @@ /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* vim: set sw=4 ts=8 et tw=80 : */ /* 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/. */ #include "PrintDataUtils.h" -#include "nsIPrintOptions.h" #include "nsIPrintSettings.h" #include "nsIServiceManager.h" #include "nsIWebBrowserPrint.h" #include "nsXPIDLString.h" namespace mozilla { namespace embedding {
--- a/embedding/components/printingui/win/nsPrintDialogUtil.cpp +++ b/embedding/components/printingui/win/nsPrintDialogUtil.cpp @@ -28,17 +28,17 @@ WIN_LIBS= #include <commdlg.h> #include "nsIWebBrowserPrint.h" #include "nsString.h" #include "nsIServiceManager.h" #include "nsReadableUtils.h" #include "nsIPrintSettings.h" #include "nsIPrintSettingsWin.h" -#include "nsIPrintOptions.h" +#include "nsIPrinterEnumerator.h" #include "nsRect.h" #include "nsIPrefService.h" #include "nsIPrefBranch.h" #include "nsCRT.h" #include "prenv.h" /* for PR_GetEnv */
--- a/extensions/spellcheck/hunspell/glue/mozHunspell.cpp +++ b/extensions/spellcheck/hunspell/glue/mozHunspell.cpp @@ -7,24 +7,24 @@ * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Initial Developers of the Original Code are Kevin Hendricks (MySpell) - * and Lszl Nmeth (Hunspell). Portions created by the Initial Developers + * and László Németh (Hunspell). Portions created by the Initial Developers * are Copyright (C) 2002-2005 the Initial Developers. All Rights Reserved. * * Contributor(s): Kevin Hendricks (kevin.hendricks@sympatico.ca) * David Einstein (deinst@world.std.com) * Michiel van Leeuwen (mvl@exedo.nl) * Caolan McNamara (cmc@openoffice.org) - * Lszl Nmeth (nemethl@gyorsposta.hu) + * László Németh (nemethl@gyorsposta.hu) * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas
--- a/extensions/spellcheck/hunspell/glue/mozHunspell.h +++ b/extensions/spellcheck/hunspell/glue/mozHunspell.h @@ -7,24 +7,24 @@ * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Initial Developers of the Original Code are Kevin Hendricks (MySpell) - * and Lszl Nmeth (Hunspell). Portions created by the Initial Developers + * and László Németh (Hunspell). Portions created by the Initial Developers * are Copyright (C) 2002-2005 the Initial Developers. All Rights Reserved. * * Contributor(s): Kevin Hendricks (kevin.hendricks@sympatico.ca) * David Einstein (deinst@world.std.com) * Michiel van Leeuwen (mvl@exedo.nl) * Caolan McNamara (cmc@openoffice.org) - * Lszl Nmeth (nemethl@gyorsposta.hu) + * László Németh (nemethl@gyorsposta.hu) * Davide Prina * Giuseppe Modugno * Gianluca Turconi * Simon Brouwer * Noll Janos * Biro Arpad * Goldman Eleonora * Sarlos Tamas
--- a/extensions/spellcheck/hunspell/glue/mozHunspellDirProvider.cpp +++ b/extensions/spellcheck/hunspell/glue/mozHunspellDirProvider.cpp @@ -7,21 +7,21 @@ * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Initial Developers of the Original Code are Kevin Hendricks (MySpell) - * and Lszl Nmeth (Hunspell). Portions created by the Initial Developers + * and László Németh (Hunspell). Portions created by the Initial Developers * are Copyright (C) 2002-2005 the Initial Developers. All Rights Reserved. * * Contributor(s): Benjamin Smedberg (benjamin@smedbergs.us) (Original Code) - * Lszl Nmeth (nemethl@gyorsposta.hu) + * László Németh (nemethl@gyorsposta.hu) * Ryan VanderMeulen (ryanvm@gmail.com) * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to
--- a/extensions/spellcheck/hunspell/glue/mozHunspellDirProvider.h +++ b/extensions/spellcheck/hunspell/glue/mozHunspellDirProvider.h @@ -7,21 +7,21 @@ * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Initial Developers of the Original Code are Kevin Hendricks (MySpell) - * and Lszl Nmeth (Hunspell). Portions created by the Initial Developers + * and László Németh (Hunspell). Portions created by the Initial Developers * are Copyright (C) 2002-2005 the Initial Developers. All Rights Reserved. * * Contributor(s): Benjamin Smedberg (benjamin@smedbergs.us) (Original Code) - * Lszl Nmeth (nemethl@gyorsposta.hu) + * László Németh (nemethl@gyorsposta.hu) * Ryan VanderMeulen (ryanvm@gmail.com) * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to
--- a/gfx/2d/DrawTargetSkia.cpp +++ b/gfx/2d/DrawTargetSkia.cpp @@ -1562,20 +1562,27 @@ DrawTargetSkia::CreateSimilarDrawTarget( // Try to create a GPU draw target first if we're currently using the GPU. // Mark the DT as cached so that shadow DTs, extracted subrects, and similar can be reused. if (target->InitWithGrContext(mGrContext.get(), aSize, aFormat, true)) { return target.forget(); } // Otherwise, just fall back to a software draw target. } #endif + +#ifdef DEBUG // Check that our SkCanvas isn't backed by vector storage such as PDF. If it - // is then we want similar storage to avoid losing fidelity. - MOZ_ASSERT(mCanvas->imageInfo().colorType() != kUnknown_SkColorType, - "Not backed by pixels - we need to handle PDF backed SkCanvas"); + // is then we want similar storage to avoid losing fidelity (if and when this + // DrawTarget is Snapshot()'ed, drawning a raster back into this DrawTarget + // will lose fidelity). + if (mCanvas->imageInfo().colorType() != kUnknown_SkColorType) { + NS_WARNING("Not backed by pixels - we need to handle PDF backed SkCanvas"); + } +#endif + if (!target->Init(aSize, aFormat)) { return nullptr; } return target.forget(); } bool DrawTargetSkia::UsingSkiaGPU() const
--- a/gfx/2d/Factory.cpp +++ b/gfx/2d/Factory.cpp @@ -506,16 +506,19 @@ Factory::CreateNativeFontResource(uint8_ #ifdef WIN32 case FontType::DWRITE: { return NativeFontResourceDWrite::Create(aData, aSize, /* aNeedsCairo = */ false); } #endif case FontType::CAIRO: +#ifdef USE_SKIA + case FontType::SKIA: +#endif { #ifdef WIN32 if (GetDirect3D11Device()) { return NativeFontResourceDWrite::Create(aData, aSize, /* aNeedsCairo = */ true); } else { return NativeFontResourceGDI::Create(aData, aSize, /* aNeedsCairo = */ true);
--- a/gfx/cairo/cairo/src/cairo-platform.h +++ b/gfx/cairo/cairo/src/cairo-platform.h @@ -1,11 +1,11 @@ /* cairo - a vector graphics library with display and print output * - * Copyright 2005 Mozilla Foundation + * Copyright © 2005 Mozilla Foundation * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL.
--- a/gfx/layers/client/TextureClient.cpp +++ b/gfx/layers/client/TextureClient.cpp @@ -89,17 +89,17 @@ void DeallocateTextureClient(TextureDeal * deallocte or recycle the it. */ class TextureChild final : PTextureChild { ~TextureChild() { // We should have deallocated mTextureData in ActorDestroy MOZ_ASSERT(!mTextureData); - MOZ_ASSERT(mOwnerCalledDestroy); + MOZ_ASSERT_IF(!mOwnerCalledDestroy, !mTextureClient); } public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TextureChild) TextureChild() : mCompositableForwarder(nullptr) , mTextureForwarder(nullptr) , mTextureClient(nullptr) @@ -930,21 +930,30 @@ TextureClient::InitIPDLActor(KnowsCompos } MOZ_ASSERT(!mActor || mActor->mDestroyed, "Cannot use a texture on several IPC channels."); SurfaceDescriptor desc; if (!ToSurfaceDescriptor(desc)) { return false; } - mActor = static_cast<TextureChild*>(fwd->CreateTexture(desc, - aForwarder->GetCompositorBackendType(), - GetFlags(), - mSerial)); - MOZ_ASSERT(mActor); + PTextureChild* actor = fwd->CreateTexture( + desc, + aForwarder->GetCompositorBackendType(), + GetFlags(), + mSerial); + if (!actor) { + gfxCriticalNote << static_cast<int32_t>(desc.type()) << ", " + << static_cast<int32_t>(aForwarder->GetCompositorBackendType()) << ", " + << static_cast<uint32_t>(GetFlags()) + << ", " << mSerial; + return false; + } + + mActor = static_cast<TextureChild*>(actor); mActor->mTextureForwarder = fwd; mActor->mTextureClient = this; mActor->mMainThreadOnly = !!(mFlags & TextureFlags::DEALLOCATE_MAIN_THREAD); // If the TextureClient is already locked, we have to lock TextureChild's mutex // since it will be unlocked in TextureClient::Unlock. if (mIsLocked) { LockActor();
--- a/gfx/layers/ipc/ShadowLayers.cpp +++ b/gfx/layers/ipc/ShadowLayers.cpp @@ -368,42 +368,52 @@ ShadowLayerForwarder::CheckSurfaceDescri } } #endif void ShadowLayerForwarder::UseTiledLayerBuffer(CompositableClient* aCompositable, const SurfaceDescriptorTiles& aTileLayerDescriptor) { - MOZ_ASSERT(aCompositable && aCompositable->IsConnected()); + MOZ_ASSERT(aCompositable); + + if (!aCompositable->IsConnected()) { + return; + } mTxn->AddNoSwapPaint(CompositableOperation(nullptr, aCompositable->GetIPDLActor(), OpUseTiledLayerBuffer(aTileLayerDescriptor))); } void ShadowLayerForwarder::UpdateTextureRegion(CompositableClient* aCompositable, const ThebesBufferData& aThebesBufferData, const nsIntRegion& aUpdatedRegion) { MOZ_ASSERT(aCompositable); - MOZ_ASSERT(aCompositable); - MOZ_ASSERT(aCompositable->IsConnected()); + + if (!aCompositable->IsConnected()) { + return; + } mTxn->AddPaint( CompositableOperation( nullptr, aCompositable->GetIPDLActor(), OpPaintTextureRegion(aThebesBufferData, aUpdatedRegion))); } void ShadowLayerForwarder::UseTextures(CompositableClient* aCompositable, const nsTArray<TimedTextureClient>& aTextures) { - MOZ_ASSERT(aCompositable && aCompositable->IsConnected()); + MOZ_ASSERT(aCompositable); + + if (!aCompositable->IsConnected()) { + return; + } AutoTArray<TimedTexture,4> textures; for (auto& t : aTextures) { MOZ_ASSERT(t.mTextureClient); MOZ_ASSERT(t.mTextureClient->GetIPDLActor()); MOZ_RELEASE_ASSERT(t.mTextureClient->GetIPDLActor()->GetIPCChannel() == mShadowManager->GetIPCChannel()); ReadLockDescriptor readLock; @@ -427,17 +437,21 @@ ShadowLayerForwarder::UseTextures(Compos } void ShadowLayerForwarder::UseComponentAlphaTextures(CompositableClient* aCompositable, TextureClient* aTextureOnBlack, TextureClient* aTextureOnWhite) { MOZ_ASSERT(aCompositable); - MOZ_ASSERT(aCompositable->IsConnected()); + + if (!aCompositable->IsConnected()) { + return; + } + MOZ_ASSERT(aTextureOnWhite); MOZ_ASSERT(aTextureOnBlack); MOZ_ASSERT(aCompositable->GetIPDLActor()); MOZ_ASSERT(aTextureOnBlack->GetIPDLActor()); MOZ_ASSERT(aTextureOnWhite->GetIPDLActor()); MOZ_ASSERT(aTextureOnBlack->GetSize() == aTextureOnWhite->GetSize()); MOZ_RELEASE_ASSERT(aTextureOnWhite->GetIPDLActor()->GetIPCChannel() == mShadowManager->GetIPCChannel()); MOZ_RELEASE_ASSERT(aTextureOnBlack->GetIPDLActor()->GetIPCChannel() == mShadowManager->GetIPCChannel()); @@ -489,17 +503,16 @@ ShadowLayerForwarder::DestroyInTransacti } void ShadowLayerForwarder::RemoveTextureFromCompositable(CompositableClient* aCompositable, TextureClient* aTexture) { MOZ_ASSERT(aCompositable); MOZ_ASSERT(aTexture); - MOZ_ASSERT(aCompositable->IsConnected()); MOZ_ASSERT(aTexture->GetIPDLActor()); MOZ_RELEASE_ASSERT(aTexture->GetIPDLActor()->GetIPCChannel() == mShadowManager->GetIPCChannel()); if (!aCompositable->IsConnected() || !aTexture->GetIPDLActor()) { // We don't have an actor anymore, don't try to use it! return; } mTxn->AddEdit(
--- a/gfx/thebes/PrintTargetThebes.cpp +++ b/gfx/thebes/PrintTargetThebes.cpp @@ -81,28 +81,37 @@ nsresult PrintTargetThebes::EndPrinting() { return mGfxSurface->EndPrinting(); } nsresult PrintTargetThebes::AbortPrinting() { +#ifdef DEBUG + mHasActivePage = false; +#endif return mGfxSurface->AbortPrinting(); } nsresult PrintTargetThebes::BeginPage() { +#ifdef DEBUG + mHasActivePage = true; +#endif return mGfxSurface->BeginPage(); } nsresult PrintTargetThebes::EndPage() { +#ifdef DEBUG + mHasActivePage = false; +#endif return mGfxSurface->EndPage(); } void PrintTargetThebes::Finish() { return mGfxSurface->Finish(); }
--- a/gfx/thebes/gfxPlatform.cpp +++ b/gfx/thebes/gfxPlatform.cpp @@ -972,17 +972,17 @@ gfxPlatform::~gfxPlatform() #endif #if MOZ_TREE_CAIRO cairo_debug_reset_static_data(); #endif #endif } -already_AddRefed<DrawTarget> +/* static */ already_AddRefed<DrawTarget> gfxPlatform::CreateDrawTargetForSurface(gfxASurface *aSurface, const IntSize& aSize) { SurfaceFormat format = aSurface->GetSurfaceFormat(); RefPtr<DrawTarget> drawTarget = Factory::CreateDrawTargetForCairoSurface(aSurface->CairoSurface(), aSize, &format); if (!drawTarget) { gfxWarning() << "gfxPlatform::CreateDrawTargetForSurface failed in CreateDrawTargetForCairoSurface"; return nullptr; }
--- a/gfx/thebes/gfxPlatform.h +++ b/gfx/thebes/gfxPlatform.h @@ -191,17 +191,17 @@ public: /** * Beware that this method may return DrawTargets which are not fully supported * on the current platform and might fail silently in subtle ways. This is a massive * potential footgun. You should only use these methods for canvas drawing really. * Use extreme caution if you use them for content where you are not 100% sure we * support the DrawTarget we get back. * See SupportsAzureContentForDrawTarget. */ - virtual already_AddRefed<DrawTarget> + static already_AddRefed<DrawTarget> CreateDrawTargetForSurface(gfxASurface *aSurface, const mozilla::gfx::IntSize& aSize); /* * Creates a SourceSurface for a gfxASurface. This function does no caching, * so the caller should cache the gfxASurface if it will be used frequently. * The returned surface keeps a reference to aTarget, so it is OK to keep the * surface, even if aTarget changes. * aTarget should not keep a reference to the returned surface because that
--- a/intl/lwbrk/nsJISx4051LineBreaker.cpp +++ b/intl/lwbrk/nsJISx4051LineBreaker.cpp @@ -542,20 +542,30 @@ GetClass(uint32_t u) /* H2 = 31, [H2] */ CLASS_BREAKABLE, /* H3 = 32, [H3] */ CLASS_BREAKABLE, /* JL = 33, [JL] */ CLASS_CHARACTER, /* JT = 34, [JT] */ CLASS_CHARACTER, /* JV = 35, [JV] */ CLASS_CHARACTER, /* CLOSE_PARENTHESIS = 36, [CP] */ CLASS_CLOSE_LIKE_CHARACTER, /* CONDITIONAL_JAPANESE_STARTER = 37, [CJ] */ CLASS_CLOSE, /* HEBREW_LETTER = 38, [HL] */ CLASS_CHARACTER, - /* REGIONAL_INDICATOR = 39, [RI] */ CLASS_CHARACTER + /* REGIONAL_INDICATOR = 39, [RI] */ CLASS_CHARACTER, + /* E_BASE = 40, [EB] */ CLASS_BREAKABLE, + /* E_MODIFIER = 41, [EM] */ CLASS_CHARACTER, + /* ZWJ = 42, [ZWJ]*/ CLASS_CHARACTER }; - return sUnicodeLineBreakToClass[mozilla::unicode::GetLineBreakClass(u)]; +#if ENABLE_INTL_API + static_assert(U_LB_COUNT == mozilla::ArrayLength(sUnicodeLineBreakToClass), + "Gecko vs ICU LineBreak class mismatch"); +#endif + + auto cls = mozilla::unicode::GetLineBreakClass(u); + MOZ_ASSERT(cls < mozilla::ArrayLength(sUnicodeLineBreakToClass)); + return sUnicodeLineBreakToClass[cls]; } static bool GetPair(int8_t c1, int8_t c2) { NS_ASSERTION(c1 < MAX_CLASSES ,"illegal classes 1"); NS_ASSERTION(c2 < MAX_CLASSES ,"illegal classes 2");
--- a/js/src/doc/Debugger/Debugger.Object.md +++ b/js/src/doc/Debugger/Debugger.Object.md @@ -152,16 +152,24 @@ from its prototype: [`Debugger.Environment`][environment] instance representing the lexical environment enclosing the function when it was created. If the referent is a function proxy or not debuggee code, this is `undefined`. `errorMessageName` : If the referent is an error created with an engine internal message template this is a string which is the name of the template; `undefined` otherwise. +`errorLineNumber` +: If the referent is an Error object, this is the line number at which the + referent was created; `undefined` otherwise. + +`errorColumnNumber` +: If the referent is an Error object, this is the column number at which the + referent was created; `undefined` otherwise. + `isBoundFunction` : If the referent is a debuggee function, returns `true` if the referent is a bound function; `false` otherwise. If the referent is not a debuggee function, or not a function at all, returns `undefined` instead. `isArrowFunction` : If the referent is a debuggee function, returns `true` if the referent is an arrow function; `false` otherwise. If the referent is not a debuggee
--- a/js/src/gc/Verifier.cpp +++ b/js/src/gc/Verifier.cpp @@ -549,13 +549,13 @@ CheckHeapTracer::check(AutoLockForExclus MOZ_RELEASE_ASSERT(failures == 0); } void js::gc::CheckHeapAfterGC(JSRuntime* rt) { AutoTraceSession session(rt, JS::HeapState::Tracing); CheckHeapTracer tracer(rt); - if (!tracer.init()) + if (tracer.init()) tracer.check(session.lock); } #endif /* JSGC_HASH_TABLE_CHECKS */
--- a/js/src/jit-test/tests/asm.js/bug1201124-simd-proxy.js +++ b/js/src/jit-test/tests/asm.js/bug1201124-simd-proxy.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); load(libdir + "asserts.js"); if (typeof newGlobal !== 'function' || !isSimdAvailable() || typeof SIMD === 'undefined') { quit();
--- a/js/src/jit-test/tests/asm.js/bug1268955-usestrict-semantics.js +++ b/js/src/jit-test/tests/asm.js/bug1268955-usestrict-semantics.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs var scope = {}; scope.mod = eval(`"use strict"; (function() { "use asm"; function f() {} return f; });`); scope.fun = scope.mod(); var caught = false; for (let callee of ['mod', 'fun']) {
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/asm.js/directives.txt @@ -0,0 +1,1 @@ +|jit-test| test-also-noasmjs; test-also-wasm-baseline
--- a/js/src/jit-test/tests/asm.js/neuter-during-arguments-coercion.js +++ b/js/src/jit-test/tests/asm.js/neuter-during-arguments-coercion.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); function f(stdlib, foreign, buffer) { "use asm"; var i32 = new stdlib.Int32Array(buffer); function set(v) {
--- a/js/src/jit-test/tests/asm.js/simd-fbirds.js +++ b/js/src/jit-test/tests/asm.js/simd-fbirds.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs /* -*- Mode: javascript; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 ; js-indent-level : 2 ; js-curly-indent-offset: 0 -*- */ /* vim: set ts=4 et sw=4 tw=80: */ // Author: Peter Jensen load(libdir + "asm.js"); if (!isSimdAvailable() || typeof SIMD === 'undefined') { print("won't run tests as simd extensions aren't activated yet");
--- a/js/src/jit-test/tests/asm.js/simd-mandelbrot.js +++ b/js/src/jit-test/tests/asm.js/simd-mandelbrot.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs /* -*- Mode: javascript; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 ; js-indent-level : 2 ; js-curly-indent-offset: 0 -*- */ /* vim: set ts=2 et sw=2 tw=80: */ // Mandelbrot using SIMD // Author: Peter Jensen, Intel Corporation load(libdir + "asm.js"); if (!isSimdAvailable() || typeof SIMD === 'undefined') {
--- a/js/src/jit-test/tests/asm.js/testAddressErrors.js +++ b/js/src/jit-test/tests/asm.js/testAddressErrors.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); setIonCheckGraphCoherency(false); setCachingEnabled(false); // constants var buf = new ArrayBuffer(BUF_MIN);
--- a/js/src/jit-test/tests/asm.js/testAtomic-effect.js +++ b/js/src/jit-test/tests/asm.js/testAtomic-effect.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs if (!this.Atomics) quit(); load(libdir + "asm.js"); setJitCompilerOption('asmjs.atomics.enable', 1); var code = ` "use asm";
--- a/js/src/jit-test/tests/asm.js/testBasic.js +++ b/js/src/jit-test/tests/asm.js/testBasic.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); load(libdir + "asserts.js"); assertAsmTypeFail(USE_ASM); assertAsmTypeFail(USE_ASM + 'return'); assertAsmTypeFail(USE_ASM + 'function f() 0'); assertAsmTypeFail(USE_ASM + 'function f(){}'); assertAsmTypeFail(USE_ASM + 'function f(){} return 0');
--- a/js/src/jit-test/tests/asm.js/testBullet.js +++ b/js/src/jit-test/tests/asm.js/testBullet.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs // Test a big fat asm.js module. First load/compile/cache bullet.js in a // separate process and then load it again in this process, which should be a // cache hit. setCachingEnabled(true); if (!isAsmJSCompilationAvailable()) quit();
--- a/js/src/jit-test/tests/asm.js/testCaching.js +++ b/js/src/jit-test/tests/asm.js/testCaching.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); setCachingEnabled(true); if (!isAsmJSCompilationAvailable() || !isCachingEnabled()) quit(); var body1 = "'use asm'; function f() { return 42 } function ff() { return 43 } return f"; var m = new Function(body1);
--- a/js/src/jit-test/tests/asm.js/testCall.js +++ b/js/src/jit-test/tests/asm.js/testCall.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); load(libdir + "asserts.js"); assertAsmTypeFail(USE_ASM+"function f(){i=i|0} function g() { f(0) } return g"); assertAsmTypeFail(USE_ASM+"function f(i){i=i|0} function g() { f() } return g"); assertAsmTypeFail(USE_ASM+"function f(){} function g() { f()|0 } return g"); assertAsmTypeFail(USE_ASM+"function f(){} function g() { +f() } return g"); assertAsmTypeFail(USE_ASM+"function f(){} function g() { return f() } return g");
--- a/js/src/jit-test/tests/asm.js/testCloning.js +++ b/js/src/jit-test/tests/asm.js/testCloning.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); setCachingEnabled(true); var code = asmCompile(USE_ASM + "function g() { return 42 } return g"); assertEq(asmLink(code)(), 42); assertEq(asmLink(code)(), 42);
--- a/js/src/jit-test/tests/asm.js/testCompoundPlusMinus.js +++ b/js/src/jit-test/tests/asm.js/testCompoundPlusMinus.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); assertAsmTypeFail(USE_ASM + "function f(i,j,k) { i=i|0;j=+j;k=+k; return (i+(j+k))|0 } return f"); assertAsmTypeFail(USE_ASM + "function f(i,j,k) { i=i|0;j=j|0;k=+k; return +((i+j)+k) } return f"); assertAsmTypeFail('imp', USE_ASM + "var ffi=imp.ffi; function f(i) { i=i|0; return (i+ffi())|0 } return f"); assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j,k) { i=i|0;j=j|0;k=k|0; return (i+j+k)|0 } return f"))(1,2,3), 6); assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j,k) { i=i|0;j=j|0;k=k|0; return (i+j-k)|0 } return f"))(1,2,3), 0);
--- a/js/src/jit-test/tests/asm.js/testControlFlow.js +++ b/js/src/jit-test/tests/asm.js/testControlFlow.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=+j; if (i) return j; return j+1.0 } return f"))(0, 1.2), 1.2+1.0); assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=+j; if (i) return j; return +~~i } return f"))(1,1.4), 1.4); assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; if (i) return j^0; return i^1 } return f"))(1, 1), 1); assertEq(asmLink(asmCompile(USE_ASM + "function f(i,j) { i=i|0;j=j|0; if (i) return j^0; return i|0 } return f"))(1,8), 8); assertEq(asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; if ((i|0) == 0) return 10; else if ((i|0) == 1) return 12; else if ((i|0) == 2) return 14; return 0} return f"))(2), 14); assertEq(asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; if ((i|0) == 0) return 10; else if ((i|0) == 1) return 12; else if ((i|0) == 2) return 14; else return 16; return 0} return f"))(3), 16);
--- a/js/src/jit-test/tests/asm.js/testExpressions.js +++ b/js/src/jit-test/tests/asm.js/testExpressions.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0.0; return (i+j)|0 } return f"); assertAsmTypeFail(USE_ASM + "function f() { var i=0.0,j=0; return (i+j)|0 } return f"); assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0.0; return (i-j)|0 } return f"); assertAsmTypeFail(USE_ASM + "function f() { var i=0.0,j=0; return (i-j)|0 } return f"); assertAsmTypeFail(USE_ASM + "function f() { var i=0,j=0.0; return (i*j)|0 } return f"); assertAsmTypeFail(USE_ASM + "function f() { var i=0.0,j=0; return (i*j)|0 } return f");
--- a/js/src/jit-test/tests/asm.js/testFFI.js +++ b/js/src/jit-test/tests/asm.js/testFFI.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); load(libdir + "asserts.js"); function ffi(a,b,c,d) { return a+b+c+d; } var f = asmLink(asmCompile('global','imp', USE_ASM + 'var ffi=imp.ffi; function g() { return 1 } function f() { var i=0; i=g()|0; return ((ffi(4,5,6,7)|0)+i)|0 } return f'), null, {ffi:ffi});
--- a/js/src/jit-test/tests/asm.js/testFastHeapAccess.js +++ b/js/src/jit-test/tests/asm.js/testFastHeapAccess.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); var code = asmCompile('glob', 'imp', 'b', USE_ASM + HEAP_IMPORTS + 'function f(i,j) {i=i|0;j=j|0; u32[((i<<2)+32 & 0xffff)>>2] = j } return f'); var f = asmLink(code, this, null, BUF_64KB); for (var i = 0; i < 100; i++) f(i, i); var u32 = new Uint32Array(BUF_64KB); for (var i = 0; i < 100; i++)
--- a/js/src/jit-test/tests/asm.js/testFloat32.js +++ b/js/src/jit-test/tests/asm.js/testFloat32.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); const TO_FLOAT32 = "var toF = glob.Math.fround;"; const HEAP32 = "var f32 = new glob.Float32Array(heap);"; const HEAP64 = "var f64 = new glob.Float64Array(heap);" var heap = new ArrayBuffer(BUF_MIN); // Module linking assertAsmLinkAlwaysFail(asmCompile('glob', USE_ASM + TO_FLOAT32 + "function f() {} return f"), null);
--- a/js/src/jit-test/tests/asm.js/testFloatingPoint.js +++ b/js/src/jit-test/tests/asm.js/testFloatingPoint.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); assertEq(asmLink(asmCompile(USE_ASM + "function f() { return 1.1 } return f"))(), 1.1); assertEq(asmLink(asmCompile(USE_ASM + "function f(i) { i=i|0; return +(+(i|0) + .1) } return f"))(1), 1.1); assertEq(asmLink(asmCompile(USE_ASM + "function f(d) { d=+d; return +d } return f"))(1.1), 1.1); assertEq(asmLink(asmCompile(USE_ASM + "function f(d,e) { d=+d;e=+e; return +(d+e) } return f"))(1.0, .1), 1.1); assertEq(asmLink(asmCompile(USE_ASM + "function f(i,e) { i=i|0;e=+e; return +(+~~i+e) } return f"))(1, .1), 1.1); assertEq(asmLink(asmCompile(USE_ASM + "function f(d,i) { d=+d;i=i|0; return +(d + +(i|0)) } return f"))(.1, 1), 1.1);
--- a/js/src/jit-test/tests/asm.js/testFunctionPtr.js +++ b/js/src/jit-test/tests/asm.js/testFunctionPtr.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); assertAsmTypeFail('imp', USE_ASM + "function f() {} var imp=[f]; return f"); assertAsmTypeFail(USE_ASM + "function f() {} var eval=[f]; return f"); assertAsmTypeFail(USE_ASM + "var tbl=0; function f() {} var tbl=[f]; return f"); assertAsmTypeFail(USE_ASM + "function f() {} var tbl; return f"); assertAsmTypeFail(USE_ASM + "function f() {} var tbl=[]; return f"); assertAsmTypeFail(USE_ASM + "function f() {} var tbl=[f,f,f]; return f");
--- a/js/src/jit-test/tests/asm.js/testGlobals.js +++ b/js/src/jit-test/tests/asm.js/testGlobals.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); load(libdir + "asserts.js"); assertAsmTypeFail(USE_ASM + "var i; function f(){} return f"); assertEq(asmLink(asmCompile(USE_ASM + "var i=0; function f(){} return f"))(), undefined); assertEq(asmLink(asmCompile(USE_ASM + "const i=0; function f(){} return f"))(), undefined); assertEq(asmLink(asmCompile(USE_ASM + "var i=42; function f(){ return i|0 } return f"))(), 42); assertEq(asmLink(asmCompile(USE_ASM + "const i=42; function f(){ return i|0 } return f"))(), 42);
--- a/js/src/jit-test/tests/asm.js/testHeapAccess.js +++ b/js/src/jit-test/tests/asm.js/testHeapAccess.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); assertAsmTypeFail('glob', 'imp', 'b', USE_ASM + HEAP_IMPORTS + 'function f() { i32[0>>2] = 4.0; return i32[0>>2]|0; } return f'); assertAsmTypeFail('glob', 'imp', 'b', USE_ASM + HEAP_IMPORTS + 'function f() { f32[0>>2] = 4; return +f32[0>>2]; } return f'); assertAsmTypeFail('glob', 'imp', 'b', USE_ASM + HEAP_IMPORTS + 'function f() { var x=0,y=0; return i8[x+y]|0 } return f'); assertAsmTypeFail('glob', 'imp', 'b', USE_ASM + HEAP_IMPORTS + 'function f() { var x=0,y=0; return u8[x+y]|0 } return f');
--- a/js/src/jit-test/tests/asm.js/testLinkErrorAssert.js +++ b/js/src/jit-test/tests/asm.js/testLinkErrorAssert.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs // This test should not assert. function asmModule(g, foreign, heap) { "use asm"; let HEAP8 = new g.Int8Array(heap); function f() { return 99; } return {f: f};
--- a/js/src/jit-test/tests/asm.js/testLiterals.js +++ b/js/src/jit-test/tests/asm.js/testLiterals.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + 'asm.js'); assertAsmTypeFail(USE_ASM + 'function f(d) { d=+d; var e=0; e=d; return +e } return f'); assertAsmTypeFail(USE_ASM + 'function f(d) { d=+d; var e=1e1; e=d; return +e } return f'); assertAsmTypeFail(USE_ASM + 'function f(d) { d=+d; var e=+0; e=d; return +e } return f'); assertEq(asmLink(asmCompile(USE_ASM + 'function f() { var e=-0; return +e } return f'))(-0), -0); assertEq(asmLink(asmCompile(USE_ASM + 'function f() { var e=-0.0; return +e } return f'))(-0), -0); assertEq(asmLink(asmCompile(USE_ASM + 'function f(d) { d=+d; var e=0.0; e=d; return +e } return f'))(0.1), 0.1);
--- a/js/src/jit-test/tests/asm.js/testMathLib.js +++ b/js/src/jit-test/tests/asm.js/testMathLib.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); function testUnary(f, g) { var numbers = [NaN, Infinity, -Infinity, -10000, -3.4, -0, 0, 3.4, 10000]; for (n of numbers) assertEq(f(n), g(n)); }
--- a/js/src/jit-test/tests/asm.js/testModuleFunctions.js +++ b/js/src/jit-test/tests/asm.js/testModuleFunctions.js @@ -1,9 +1,9 @@ -// |jit-test| test-also-noasmjs + function testUniqueness(asmJSModule) { var f = asmJSModule(); var g = asmJSModule(); assertEq(f === g, false); f.x = 4; assertEq(f.x, 4); assertEq(g.x, undefined); }
--- a/js/src/jit-test/tests/asm.js/testNeuter.js +++ b/js/src/jit-test/tests/asm.js/testNeuter.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); load(libdir + "asserts.js"); if (!isAsmJSCompilationAvailable()) quit(); var m = asmCompile('stdlib', 'foreign', 'buffer', `"use asm";
--- a/js/src/jit-test/tests/asm.js/testParallelCompile.js +++ b/js/src/jit-test/tests/asm.js/testParallelCompile.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); if (!isAsmJSCompilationAvailable()) quit(); var module = "'use asm';\n"; for (var i = 0; i < 100; i++) { module += "function f" + i + "(i) {\n";
--- a/js/src/jit-test/tests/asm.js/testProfiling.js +++ b/js/src/jit-test/tests/asm.js/testProfiling.js @@ -1,11 +1,15 @@ load(libdir + "asm.js"); load(libdir + "asserts.js"); +// Run test only for asm.js +if (!isAsmJSCompilationAvailable()) + quit(); + // Single-step profiling currently only works in the ARM simulator if (!getBuildConfiguration()["arm-simulator"]) quit(); function checkSubSequence(got, expect) { var got_i = 0; EXP: for (var exp_i = 0; exp_i < expect.length; exp_i++) {
--- a/js/src/jit-test/tests/asm.js/testRangeAnalysis.js +++ b/js/src/jit-test/tests/asm.js/testRangeAnalysis.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs // Bug 894781 function m(stdlib) { "use asm"; var abs = stdlib.Math.abs; function f(d) { d = +d;
--- a/js/src/jit-test/tests/asm.js/testSource.js +++ b/js/src/jit-test/tests/asm.js/testSource.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs setCachingEnabled(true); (function() { /* * NO ARGUMENT */ function f0() {
--- a/js/src/jit-test/tests/asm.js/testStackWalking.js +++ b/js/src/jit-test/tests/asm.js/testStackWalking.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); load(libdir + "asserts.js"); function matchStack(stackString, stackArray) { var match = 0; for (name of stackArray) { match = stackString.indexOf(name, match);
--- a/js/src/jit-test/tests/asm.js/testUseAsmWarnings.js +++ b/js/src/jit-test/tests/asm.js/testUseAsmWarnings.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); assertAsmDirectiveFail("'use asm'"); assertAsmDirectiveFail("eval('\"use asm\";');"); assertAsmDirectiveFail("{ eval('\"use asm\";'); }"); assertAsmDirectiveFail("if (Math) { 'use asm'; }"); assertAsmDirectiveFail("function f(){ { 'use asm'; } }"); assertAsmDirectiveFail("function f(){ ; 'use asm'; } }");
--- a/js/src/jit-test/tests/asm.js/testX86ByteStore.js +++ b/js/src/jit-test/tests/asm.js/testX86ByteStore.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-noasmjs load(libdir + "asm.js"); var body = ' "use asm";\ var i8=new global.Int8Array(buffer);\ function g(i,j,k) {\ i=i|0;\ j=j|0;\
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/debug/Object-errorLineNumber-errorColumnNumber.js @@ -0,0 +1,55 @@ +// Debugger.Object.prototype.{errorLineNumber,errorColumnNumber} return the +// line number and column number associated with some error object. + +var g = newGlobal(); +var dbg = new Debugger(); +var gw = dbg.addDebuggee(g); + +var syntaxError = gw.executeInGlobal("\nlet a, a;").throw; +assertEq(syntaxError.errorLineNumber, 2); +assertEq(syntaxError.errorColumnNumber, 7); + +var typeError = gw.executeInGlobal("\n1 + f();").throw; +assertEq(typeError.errorLineNumber, 2); +assertEq(typeError.errorColumnNumber, 1); + +// Custom errors have no line/column numbers . +var customError = gw.executeInGlobal("\nthrow 1;").throw; +assertEq(customError.errorLineNumber, undefined); +assertEq(customError.errorColumnNumber, undefined); + +customError = gw.executeInGlobal("\nthrow { errorLineNumber: 10, errorColumnNumber: 20 };").throw; +assertEq(customError.errorLineNumber, undefined); +assertEq(customError.errorColumnNumber, undefined); + +customError = gw.executeInGlobal("\nthrow { lineNumber: 10, columnNumber: 20 };").throw; +assertEq(customError.errorLineNumber, undefined); +assertEq(customError.errorColumnNumber, undefined); + +// Ensure that the method works across globals. +g.eval(`var g = newGlobal(); + g.eval('var err; \\n' + + 'try {\\n' + + ' f();\\n' + + '} catch (e) {\\n' + + ' err = e;\\n' + + '}'); + var err2 = g.err;`); +var otherGlobalError = gw.executeInGlobal("throw err2").throw; +assertEq(otherGlobalError.errorLineNumber, 3); +assertEq(otherGlobalError.errorColumnNumber, 3); + +// Ensure that non-error objects return undefined. +const Args = [ + "1", + "'blah'", + "({})", + "[]", + "() => 1" +] + +for (let arg of Args) { + let nonError = gw.executeInGlobal(`${arg}`).return; + assertEq(nonError.errorLineNumber, undefined); + assertEq(nonError.errorColumnNumber, undefined); +}
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/gc/bug-1315946.js @@ -0,0 +1,14 @@ +if (!('oomTest' in this)) + quit(); + +// Don't run a full oomTest because it takes ages - a few iterations are +// sufficient to trigger the bug. +let i = 0; + +oomTest(Function(` + if (i < 10) { + i++; + gczeal(15,1); + foo; + } +`));
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/ion/bug1314438.js @@ -0,0 +1,6 @@ + +function g(x) { + return (-1 % x && Math.cos(8) >>> 0); +} +g(2); +assertEq(uneval(g(-1)), "-0");
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/ion/bug1314545.js @@ -0,0 +1,31 @@ +function f() { + Object.prototype[0] = 10; + + var arr = []; + for (var i=3; i<20; i++) { + arr[0] = i; + Object.freeze(arr); + while (!inIon()) {} + } + assertEq(arr[0], 3); +} +f(); + +function g() { + var c = 0; + Object.defineProperty(Object.prototype, 18, {set: function() { c++; }}); + + var arrays = []; + for (var i=0; i<2; i++) + arrays.push([1, 2]); + + for (var i=0; i<20; i++) { + arrays[0][i] = 1; + arrays[1][i] = 2; + if (i === 0) + Object.freeze(arrays[0]); + while (!inIon()) {} + } + assertEq(c, 2); +} +g();
--- a/js/src/jit-test/tests/wasm/backtrace.js +++ b/js/src/jit-test/tests/wasm/backtrace.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); var code = `(module (import $i "env" "test") (func $t (call $i)) (export "test" $t) )`; var mod = wasmEvalText(code, {
--- a/js/src/jit-test/tests/wasm/basic.js +++ b/js/src/jit-test/tests/wasm/basic.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // ---------------------------------------------------------------------------- // exports var o = wasmEvalText('(module)').exports; assertEq(Object.getOwnPropertyNames(o).length, 0);
--- a/js/src/jit-test/tests/wasm/bce.js +++ b/js/src/jit-test/tests/wasm/bce.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); mem='\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'+ '\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'+ '\x00'.repeat(65488) + '\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff' print (mem.lengt)
--- a/js/src/jit-test/tests/wasm/binary.js +++ b/js/src/jit-test/tests/wasm/binary.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); load(libdir + "wasm-binary.js"); const CompileError = WebAssembly.CompileError; const magicError = /failed to match magic number/; const unknownSection = /expected user-defined section/;
--- a/js/src/jit-test/tests/wasm/comments.js +++ b/js/src/jit-test/tests/wasm/comments.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // sanity check assertErrorMessage(() => wasmEvalText(''), SyntaxError, /parsing wasm text/); // single line comment var o = wasmEvalText('(module (func)) ;; end'); var o = wasmEvalText('(module (func)) ;; end\n');
--- a/js/src/jit-test/tests/wasm/compiler-frame-depth.js +++ b/js/src/jit-test/tests/wasm/compiler-frame-depth.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // Ensures that the postorder allows us to have very deep expression trees. var expr = '(get_local 0)'; for (var i = 1000; i --> 0; ) { expr = `(f32.neg ${expr})`;
--- a/js/src/jit-test/tests/wasm/const.js +++ b/js/src/jit-test/tests/wasm/const.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); function testConst(type, str, expect) { if (type === 'i64') wasmFullPassI64(`(module (func (result i64) (i64.const ${str})) (export "run" 0))`, expect); else wasmFullPass(`(module (func (result ${type}) (${type}.const ${str})) (export "run" 0))`, expect); }
--- a/js/src/jit-test/tests/wasm/control-flow.js +++ b/js/src/jit-test/tests/wasm/control-flow.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); const RuntimeError = WebAssembly.RuntimeError; // ---------------------------------------------------------------------------- // if // Condition is an int32
--- a/js/src/jit-test/tests/wasm/conversion.js +++ b/js/src/jit-test/tests/wasm/conversion.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); function testConversion(resultType, opcode, paramType, op, expect) { if (paramType === 'i64') { // i64 cannot be imported, so we use a wrapper function. wasmFullPass(`(module (func (param i64) (result ${resultType}) (${resultType}.${opcode}/i64 (get_local 0))) (export "run" 0))`, expect, {}, createI64(op));
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/wasm/directives.txt @@ -0,0 +1,1 @@ +|jit-test| test-also-wasm-baseline
--- a/js/src/jit-test/tests/wasm/errors.js +++ b/js/src/jit-test/tests/wasm/errors.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); load(libdir + "wasm-binary.js"); const Module = WebAssembly.Module; const Instance = WebAssembly.Instance; const RuntimeError = WebAssembly.RuntimeError; function isWasmFunction(name) {
--- a/js/src/jit-test/tests/wasm/extract-code.js +++ b/js/src/jit-test/tests/wasm/extract-code.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); var module = new WebAssembly.Module(wasmTextToBinary(`(module (func (nop)))`)); var exp = wasmExtractCode(module); assertEq(exp.code instanceof Uint8Array, true); assertEq(Array.isArray(exp.segments), true); var funcs = exp.segments.filter(s => s.kind === 0); assertEq(funcs.length, 1);
--- a/js/src/jit-test/tests/wasm/fac.js +++ b/js/src/jit-test/tests/wasm/fac.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // This is fac-opt from fac.wast in the official testsuite, changed to use // i32 instead of i64. assertEq(wasmEvalText(`(module (func $fac-opt (param i32) (result i32) (local i32) (set_local 1 (i32.const 1))
--- a/js/src/jit-test/tests/wasm/float.js +++ b/js/src/jit-test/tests/wasm/float.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); wasmFullPass('(module (func (result f32) (f32.const -1)) (export "run" 0))', -1); wasmFullPass('(module (func (result f32) (f32.const 1)) (export "run" 0))', 1); wasmFullPass('(module (func (result f64) (f64.const -2)) (export "run" 0))', -2); wasmFullPass('(module (func (result f64) (f64.const 2)) (export "run" 0))', 2); wasmFullPass('(module (func (result f64) (f64.const 4294967296)) (export "run" 0))', 4294967296); wasmFullPass('(module (func (result f32) (f32.const 1.5)) (export "run" 0))', 1.5);
--- a/js/src/jit-test/tests/wasm/full-cycle.js +++ b/js/src/jit-test/tests/wasm/full-cycle.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); wasmFullPass(`(module (func $test (result i32) (param i32) (param i32) (i32.add (get_local 0) (get_local 1))) (func $run (result i32) (call $test (i32.const 1) (i32.const ${Math.pow(2, 31) - 1}))) (export "run" $run) )`, -Math.pow(2, 31));
--- a/js/src/jit-test/tests/wasm/globals.js +++ b/js/src/jit-test/tests/wasm/globals.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); const { Instance, Module } = WebAssembly; // Locally-defined globals assertErrorMessage(() => wasmEvalText(`(module (global))`), SyntaxError, /parsing/); assertErrorMessage(() => wasmEvalText(`(module (global i32))`), SyntaxError, /parsing/); assertErrorMessage(() => wasmEvalText(`(module (global (mut i32)))`), SyntaxError, /parsing/);
--- a/js/src/jit-test/tests/wasm/grow-memory.js +++ b/js/src/jit-test/tests/wasm/grow-memory.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); function linearModule(min, max, ops) { var opsText = ops.map(function (op) { if (op[0] == "CM") { res = `(if i32 (i32.ne (current_memory) (i32.const ${op[1]})) (i32.load offset=10 (i32.const 4294967295)) (i32.const 0))`
--- a/js/src/jit-test/tests/wasm/import-export.js +++ b/js/src/jit-test/tests/wasm/import-export.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + 'wasm.js'); const Module = WebAssembly.Module; const Instance = WebAssembly.Instance; const Memory = WebAssembly.Memory; const Table = WebAssembly.Table; const mem1Page = new Memory({initial:1});
--- a/js/src/jit-test/tests/wasm/integer.js +++ b/js/src/jit-test/tests/wasm/integer.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); assertEq(wasmEvalText('(module (func (result i32) (i32.const -1)) (export "" 0))').exports[""](), -1); assertEq(wasmEvalText('(module (func (result i32) (i32.const -2147483648)) (export "" 0))').exports[""](), -2147483648); assertEq(wasmEvalText('(module (func (result i32) (i32.const 4294967295)) (export "" 0))').exports[""](), -1); function testUnary(type, opcode, op, expect) { var fullPass = wasmFullPass;
--- a/js/src/jit-test/tests/wasm/js-reexport.js +++ b/js/src/jit-test/tests/wasm/js-reexport.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); const Module = WebAssembly.Module; const Instance = WebAssembly.Instance; const Memory = WebAssembly.Memory; const Table = WebAssembly.Table; function accum(...args) {
--- a/js/src/jit-test/tests/wasm/memory-aliasing.js +++ b/js/src/jit-test/tests/wasm/memory-aliasing.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); var i = wasmEvalText( `(module (memory 1) (data (i32.const 0) "\\01\\02\\03\\04\\05\\06\\07\\08") (func $off1 (param $base i32) (result i32) (i32.add (i32.load8_u (get_local $base))
--- a/js/src/jit-test/tests/wasm/memory.js +++ b/js/src/jit-test/tests/wasm/memory.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); const RuntimeError = WebAssembly.RuntimeError; function loadModule(type, ext, offset, align) { return wasmEvalText( `(module (memory 1)
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/wasm/regress/baseline-pop-along-edge.js @@ -0,0 +1,68 @@ +// Bug 1316181 + +load(libdir + "wasm.js"); + +// There are locals with different values here to ensure that the +// get_local at the end picks up the right one even if the stack might +// have become unbalanced by a failure to adjust SP along the branch +// edge. The logic is that we use SP-relative addressing, and if the +// actual SP is not what the compiler thinks it is we will read +// something other than the expected value. + +var o = wasmEvalText( + `(module + (func (result i32) + (local $v0 i32) + (local $v1 i32) + (local $v2 i32) + (local $v3 i32) + (local $v4 i32) + (local $v5 i32) + (local $v6 i32) + (local $v7 i32) + (local $res i32) + (set_local $v0 (i32.const 0xDEADBEEF)) + (set_local $v1 (i32.const 0xFDEADBEE)) + (set_local $v2 (i32.const 0xEFDEADBE)) + (set_local $v3 (i32.const 0xEEFDEADB)) + (set_local $v4 (i32.const 0xBEEFDEAD)) + (set_local $v5 (i32.const 0xDBEEFDEA)) + (set_local $v6 (i32.const 0xADBEEFDE)) + (set_local $v7 (i32.const 0xEADBEEFD)) + (block $b + (set_local $res + (i32.add + (i32.add (i32.const 1) (i32.const 2)) + (i32.add + (i32.add (i32.const 3) (i32.const 4)) + (i32.add + (i32.add (i32.const 5) (i32.const 6)) + (i32.add + (i32.add (i32.const 7) (i32.const 8)) + (i32.add + (i32.add (i32.const 9) (i32.const 10)) + (i32.add + (i32.add (i32.const 11) (i32.const 12)) + (i32.add + (i32.add (i32.const 13) (i32.const 14)) + (i32.add + (i32.add (i32.const 15) (i32.const 16)) + (i32.add + (i32.add (i32.const 17) (i32.const 18)) + (i32.add + (i32.add (i32.const 19) (i32.const 20)) + (i32.add + (i32.add (i32.const 21) (i32.const 22)) + (i32.add + (i32.add (i32.const 23) (i32.const 24)) + (i32.add + (i32.add (i32.const 25) (i32.const 26)) + (i32.add + (i32.add (i32.const 27) (i32.const 28)) + (i32.add + (i32.add (i32.const 29) (i32.const 30)) + (br_if $b (i32.const 31) (i32.const 1))))))))))))))))))) + (return (get_local $v3))) + (export "a" 0))`).exports; + +assertEq(o["a"](), 0xEEFDEADB|0);
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/wasm/regress/directives.txt @@ -0,0 +1,1 @@ +|jit-test| test-also-wasm-baseline
--- a/js/src/jit-test/tests/wasm/regress/misc-control-flow.js +++ b/js/src/jit-test/tests/wasm/regress/misc-control-flow.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); wasmFailValidateText(`(module (func (result i32) (param i32) (loop (if (i32.const 0) (br 0)) (get_local 0))) (export "" 0) )`, /unused values not explicitly dropped by end of block/);
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/wasm/regress/pass-stack-int64.js @@ -0,0 +1,17 @@ +load(libdir + "wasm.js"); + +var params = ''; +var locals = ''; +for (let i = 0; i < 20; i++) { + params += '(param i64) '; + locals += `(get_local ${i}) `; +} + +wasmEvalText(` +(module + (func + ${params} + (call 0 ${locals}) + ) +) +`);
--- a/js/src/jit-test/tests/wasm/regress/regalloc-muli64.js +++ b/js/src/jit-test/tests/wasm/regress/regalloc-muli64.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // Bug 1298808. assertEq(wasmEvalText(`(module (func (result i32) (i32.wrap/i64 (i64.mul
--- a/js/src/jit-test/tests/wasm/regress/reserve-enough.js +++ b/js/src/jit-test/tests/wasm/regress/reserve-enough.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // Bug 1281131 - be sure to reserve enough stack space wasmEvalText( `(module (func $func0 ${loopy(100)}
--- a/js/src/jit-test/tests/wasm/regress/reserve-joinreg.js +++ b/js/src/jit-test/tests/wasm/regress/reserve-joinreg.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // Bug 1280933, excerpted from binary test case provided there. wasmEvalText( `(module (func $func0 (param $arg0 i32) (result i32) (local $var0 i64) (set_local $var0 (i64.extend_u/i32 (get_local $arg0)))
--- a/js/src/jit-test/tests/wasm/regress/select-any.js +++ b/js/src/jit-test/tests/wasm/regress/select-any.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // Bug 1280921 var m1 = wasmEvalText( `(module (type $type0 (func)) (func $func0
--- a/js/src/jit-test/tests/wasm/regress/shift-counts.js +++ b/js/src/jit-test/tests/wasm/regress/shift-counts.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // Bug 1280926, extracted from binary wasmEvalText( `(module (type $type0 (func (result i32))) (export "" $func0)
--- a/js/src/jit-test/tests/wasm/regress/teavm-bugs.js +++ b/js/src/jit-test/tests/wasm/regress/teavm-bugs.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // Register allocation issue with LCompareI64AndBranch. let params = ''; let locals = ''; let tests = '(i64.const 0)'; for (let i = 15; i --> 0;) {
--- a/js/src/jit-test/tests/wasm/regress/too-large-frame.js +++ b/js/src/jit-test/tests/wasm/regress/too-large-frame.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // Bug 1280934, equivalent test case. try { wasmEvalText( `(module
--- a/js/src/jit-test/tests/wasm/resizing.js +++ b/js/src/jit-test/tests/wasm/resizing.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); const Module = WebAssembly.Module; const Instance = WebAssembly.Instance; const Table = WebAssembly.Table; const Memory = WebAssembly.Memory; const RuntimeError = WebAssembly.RuntimeError;
--- a/js/src/jit-test/tests/wasm/spec.js +++ b/js/src/jit-test/tests/wasm/spec.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // This is meant to be a small and dumb interpreter for wast files. Either it // is imported by another script, which needs to define an array of arguments // called importedArgs, or args need to be passed to the command line. // // Possible arguments include: // -d enable debug verbose mode @@ -393,31 +392,43 @@ function exec(e) { i32[0] = res.nan_low; i32[1] = res.nan_high; assert(Number.isNaN(f64[0]) || Number.isNaN(f32[0]), "assert_return_nan test failed."); } return; } - if (exprName === "assert_invalid") { + if (exprName === "assert_invalid" || exprName === "assert_malformed") { let moduleText = e.list[1].toString(); let errMsg = e.list[2]; if (errMsg) { - assert(errMsg.quoted, "assert_invalid second argument must be a string"); + assert(errMsg.quoted, "assert_invalid/malformed second argument must be a string"); errMsg.quoted = false; } + // assert_invalid tests both the decoder *and* the parser itself. + let text; try { - assertEq(WebAssembly.validate(wasmTextToBinary(moduleText)), false, "assert_invalid failed"); + text = wasmTextToBinary(moduleText); } catch(e) { if (/wasm text error/.test(e.toString())) return; - throw e; } + + assertEq(WebAssembly.validate(text), false, "assert_invalid failed"); + + let caught = false; + try { + new WebAssembly.Module(text) + } catch (e) { + caught = true; + debug("Caught", e.toString(), ", expected:", errMsg); + } + assertEq(caught, true); return; } if (exprName === "assert_soft_invalid") { let moduleText = e.list[1].toString(); let errMsg = e.list[2]; if (errMsg) { assert(errMsg.quoted, "assert_soft_invalid second argument must be a string");
--- a/js/src/jit-test/tests/wasm/spec/address.wast.js +++ b/js/src/jit-test/tests/wasm/spec/address.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['address.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/binary.wast.js +++ b/js/src/jit-test/tests/wasm/spec/binary.wast.js @@ -1,4 +1,1 @@ -// |jit-test| test-also-wasm-baseline -// TODO: binary text format. -quit(); var importedArgs = ['binary.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/block.wast.js +++ b/js/src/jit-test/tests/wasm/spec/block.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['block.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/br.wast.js +++ b/js/src/jit-test/tests/wasm/spec/br.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['br.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/br_if.wast.js +++ b/js/src/jit-test/tests/wasm/spec/br_if.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['br_if.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/br_table.wast.js +++ b/js/src/jit-test/tests/wasm/spec/br_table.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['br_table.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/break-drop.wast.js +++ b/js/src/jit-test/tests/wasm/spec/break-drop.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['break-drop.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/call.wast.js +++ b/js/src/jit-test/tests/wasm/spec/call.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['call.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/call_indirect.wast.js +++ b/js/src/jit-test/tests/wasm/spec/call_indirect.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['call_indirect.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/comments.wast.js +++ b/js/src/jit-test/tests/wasm/spec/comments.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['comments.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/conversions.wast.js +++ b/js/src/jit-test/tests/wasm/spec/conversions.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['conversions.wast']; load(scriptdir + '../spec.js');
new file mode 100644 --- /dev/null +++ b/js/src/jit-test/tests/wasm/spec/directives.txt @@ -0,0 +1,1 @@ +|jit-test| test-also-wasm-baseline
--- a/js/src/jit-test/tests/wasm/spec/endianness.wast.js +++ b/js/src/jit-test/tests/wasm/spec/endianness.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['endianness.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/exports.wast.js +++ b/js/src/jit-test/tests/wasm/spec/exports.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['exports.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/f32.wast.js +++ b/js/src/jit-test/tests/wasm/spec/f32.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['f32.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/f32_cmp.wast.js +++ b/js/src/jit-test/tests/wasm/spec/f32_cmp.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['f32_cmp.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/f64.wast.js +++ b/js/src/jit-test/tests/wasm/spec/f64.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['f64.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/f64_cmp.wast.js +++ b/js/src/jit-test/tests/wasm/spec/f64_cmp.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['f64_cmp.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/fac.wast.js +++ b/js/src/jit-test/tests/wasm/spec/fac.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['fac.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/float_exprs.wast.js +++ b/js/src/jit-test/tests/wasm/spec/float_exprs.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['float_exprs.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/float_literals.wast.js +++ b/js/src/jit-test/tests/wasm/spec/float_literals.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['float_literals.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/float_memory.wast.js +++ b/js/src/jit-test/tests/wasm/spec/float_memory.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['float_memory.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/float_misc.wast.js +++ b/js/src/jit-test/tests/wasm/spec/float_misc.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['float_misc.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/forward.wast.js +++ b/js/src/jit-test/tests/wasm/spec/forward.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['forward.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/func.wast.js +++ b/js/src/jit-test/tests/wasm/spec/func.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['func.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/func_ptrs.wast.js +++ b/js/src/jit-test/tests/wasm/spec/func_ptrs.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['func_ptrs.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/get_local.wast.js +++ b/js/src/jit-test/tests/wasm/spec/get_local.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['get_local.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/globals.wast.js +++ b/js/src/jit-test/tests/wasm/spec/globals.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['globals.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/i32.wast.js +++ b/js/src/jit-test/tests/wasm/spec/i32.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['i32.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/i64.wast.js +++ b/js/src/jit-test/tests/wasm/spec/i64.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['i64.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/import_tests.sh +++ b/js/src/jit-test/tests/wasm/spec/import_tests.sh @@ -6,11 +6,10 @@ git clone https://github.com/WebAssembly mv spec/interpreter/test/*.wast ./ rm -rf spec/ # TODO not handled yet rm -f *.fail.wast for i in $(ls *.wast); do - echo "// |jit-test| test-also-wasm-baseline" > $i.js - echo "var importedArgs = ['$i']; load(scriptdir + '../spec.js');" >> $i.js + echo "var importedArgs = ['$i']; load(scriptdir + '../spec.js');" > $i.js done;
--- a/js/src/jit-test/tests/wasm/spec/imports.wast.js +++ b/js/src/jit-test/tests/wasm/spec/imports.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['imports.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/int_exprs.wast.js +++ b/js/src/jit-test/tests/wasm/spec/int_exprs.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['int_exprs.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/int_literals.wast.js +++ b/js/src/jit-test/tests/wasm/spec/int_literals.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['int_literals.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/labels.wast.js +++ b/js/src/jit-test/tests/wasm/spec/labels.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['labels.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/left-to-right.wast.js +++ b/js/src/jit-test/tests/wasm/spec/left-to-right.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['left-to-right.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/linking.wast.js +++ b/js/src/jit-test/tests/wasm/spec/linking.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['linking.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/loop.wast.js +++ b/js/src/jit-test/tests/wasm/spec/loop.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['loop.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/memory.wast.js +++ b/js/src/jit-test/tests/wasm/spec/memory.wast.js @@ -1,4 +1,3 @@ -// |jit-test| test-also-wasm-baseline // TODO initializer expression can reference global module-defined variables? quit(); var importedArgs = ['memory.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/memory_redundancy.wast.js +++ b/js/src/jit-test/tests/wasm/spec/memory_redundancy.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['memory_redundancy.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/memory_trap.wast.js +++ b/js/src/jit-test/tests/wasm/spec/memory_trap.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['memory_trap.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/names.wast.js +++ b/js/src/jit-test/tests/wasm/spec/names.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['names.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/nop.wast.js +++ b/js/src/jit-test/tests/wasm/spec/nop.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['nop.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/resizing.wast.js +++ b/js/src/jit-test/tests/wasm/spec/resizing.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['resizing.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/return.wast.js +++ b/js/src/jit-test/tests/wasm/spec/return.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['return.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/select.wast.js +++ b/js/src/jit-test/tests/wasm/spec/select.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['select.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/set_local.wast.js +++ b/js/src/jit-test/tests/wasm/spec/set_local.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['set_local.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/skip-stack-guard-page.wast.js +++ b/js/src/jit-test/tests/wasm/spec/skip-stack-guard-page.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['skip-stack-guard-page.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/soft-fail.wast.js +++ b/js/src/jit-test/tests/wasm/spec/soft-fail.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['soft-fail.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/stack.wast.js +++ b/js/src/jit-test/tests/wasm/spec/stack.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['stack.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/start.wast.js +++ b/js/src/jit-test/tests/wasm/spec/start.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['start.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/store_retval.wast.js +++ b/js/src/jit-test/tests/wasm/spec/store_retval.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['store_retval.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/switch.wast.js +++ b/js/src/jit-test/tests/wasm/spec/switch.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['switch.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/tee_local.wast.js +++ b/js/src/jit-test/tests/wasm/spec/tee_local.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['tee_local.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/traps.wast.js +++ b/js/src/jit-test/tests/wasm/spec/traps.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['traps.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/typecheck.wast.js +++ b/js/src/jit-test/tests/wasm/spec/typecheck.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['typecheck.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/unreachable.wast.js +++ b/js/src/jit-test/tests/wasm/spec/unreachable.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['unreachable.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/spec/unwind.wast.js +++ b/js/src/jit-test/tests/wasm/spec/unwind.wast.js @@ -1,2 +1,1 @@ -// |jit-test| test-also-wasm-baseline var importedArgs = ['unwind.wast']; load(scriptdir + '../spec.js');
--- a/js/src/jit-test/tests/wasm/stack.js +++ b/js/src/jit-test/tests/wasm/stack.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // Test instructions with no return value interposed between pushes and pops. wasmFullPass(` (module (memory 1) (func (result i32) (local $local f64)
--- a/js/src/jit-test/tests/wasm/start.js +++ b/js/src/jit-test/tests/wasm/start.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); assertErrorMessage(() => wasmEvalText('(module (func) (start 0) (start 0))'), SyntaxError, /wasm text error/); assertErrorMessage(() => wasmEvalText('(module (func) (start $unknown))'), SyntaxError, /label.*not found/); wasmFailValidateText('(module (func) (start 1))', /unknown start function/); wasmFailValidateText('(module (func (param i32)) (start 0))', /must be nullary/); wasmFailValidateText('(module (func (param i32) (param f32)) (start 0))', /must be nullary/);
--- a/js/src/jit-test/tests/wasm/tables.js +++ b/js/src/jit-test/tests/wasm/tables.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + 'wasm.js'); const Module = WebAssembly.Module; const Instance = WebAssembly.Instance; const Table = WebAssembly.Table; const Memory = WebAssembly.Memory; const RuntimeError = WebAssembly.RuntimeError;
--- a/js/src/jit-test/tests/wasm/text.js +++ b/js/src/jit-test/tests/wasm/text.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); var parsingError = /parsing wasm text at/; assertErrorMessage(() => wasmEvalText(''), SyntaxError, parsingError); assertErrorMessage(() => wasmEvalText('('), SyntaxError, parsingError); assertErrorMessage(() => wasmEvalText('(m'), SyntaxError, parsingError); assertErrorMessage(() => wasmEvalText('(module'), SyntaxError, parsingError);
--- a/js/src/jit-test/tests/wasm/to-text-experimental.js +++ b/js/src/jit-test/tests/wasm/to-text-experimental.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); assertErrorMessage(() => wasmBinaryToText(wasmTextToBinary(`(module (func (result i32) (f32.const 13.37)))`), 'experimental'), WebAssembly.CompileError, /type mismatch/); function runTest(code, expected) { var binary = wasmTextToBinary(code); var s = wasmBinaryToText(binary, "experimental"); s = s.replace(/\s+/g, ' ');
--- a/js/src/jit-test/tests/wasm/to-text.js +++ b/js/src/jit-test/tests/wasm/to-text.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); var caught = false; try { wasmBinaryToText(new Int8Array(1)); } catch (e) { caught = true; }
--- a/js/src/jit-test/tests/wasm/unreachable.js +++ b/js/src/jit-test/tests/wasm/unreachable.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); // In unreachable code, the current design is that validation is disabled, // meaning we have to have a special mode in the decoder for decoding code // that won't actually run. wasmFullPass(`(module (func (result i32)
--- a/js/src/jit-test/tests/wasm/validate.js +++ b/js/src/jit-test/tests/wasm/validate.js @@ -1,9 +1,8 @@ -// |jit-test| test-also-wasm-baseline load(libdir + "wasm.js"); const { validate } = WebAssembly; assertErrorMessage(() => validate(), Error, /requires more than 0 arguments/); const argError = /first argument must be an ArrayBuffer or typed array object/; assertErrorMessage(() => validate(null), Error, argError);
--- a/js/src/jit/Ion.cpp +++ b/js/src/jit/Ion.cpp @@ -1899,16 +1899,18 @@ OptimizeMIR(MIRGenerator* mir) if (mir->compilingWasm()) { if (!EliminateBoundsChecks(mir, graph)) return false; gs.spewPass("Redundant Bounds Check Elimination"); AssertGraphCoherency(graph); } + DumpMIRExpressions(graph); + return true; } LIRGraph* GenerateLIR(MIRGenerator* mir) { MIRGraph& graph = mir->graph(); GraphSpewer& gs = mir->graphSpewer();
--- a/js/src/jit/IonAnalysis.cpp +++ b/js/src/jit/IonAnalysis.cpp @@ -4672,8 +4672,40 @@ jit::CreateMIRRootList(IonBuilder& build if (!iter->appendRoots(*roots)) return false; } } builder.setRootList(*roots); return true; } + +static void +DumpDefinition(GenericPrinter& out, MDefinition* def, size_t depth) +{ + MDefinition::PrintOpcodeName(out, def->op()); + + if (depth == 0) + return; + + for (size_t i = 0; i < def->numOperands(); i++) { + out.printf(" ("); + DumpDefinition(out, def->getOperand(i), depth - 1); + out.printf(")"); + } +} + +void +jit::DumpMIRExpressions(MIRGraph& graph) +{ + if (!JitSpewEnabled(JitSpew_MIRExpressions)) + return; + + size_t depth = 2; + + Fprinter& out = JitSpewPrinter(); + for (ReversePostorderIterator block(graph.rpoBegin()); block != graph.rpoEnd(); block++) { + for (MInstructionIterator iter(block->begin()), end(block->end()); iter != end; iter++) { + DumpDefinition(out, *iter, depth); + out.printf("\n"); + } + } +}
--- a/js/src/jit/IonAnalysis.h +++ b/js/src/jit/IonAnalysis.h @@ -191,12 +191,15 @@ MOZ_MUST_USE bool AnalyzeArgumentsUsage(JSContext* cx, JSScript* script); bool DeadIfUnused(const MDefinition* def); bool IsDiscardable(const MDefinition* def); +void +DumpMIRExpressions(MIRGraph& graph); + } // namespace jit } // namespace js #endif /* jit_IonAnalysis_h */
--- a/js/src/jit/IonBuilder.cpp +++ b/js/src/jit/IonBuilder.cpp @@ -10389,21 +10389,25 @@ IonBuilder::setElemTryDense(bool* emitte // Don't generate a fast path if there have been bounds check failures // and this access might be on a sparse property. if (ElementAccessHasExtraIndexedProperty(this, object) && failedBoundsCheck_) { trackOptimizationOutcome(TrackedOutcome::ProtoIndexedProps); return true; } // Emit dense setelem variant. - if (!jsop_setelem_dense(conversion, object, index, value, unboxedType, writeHole)) - return false; + if (!jsop_setelem_dense(conversion, object, index, value, unboxedType, writeHole, emitted)) + return false; + + if (!*emitted) { + trackOptimizationOutcome(TrackedOutcome::NonWritableProperty); + return true; + } trackOptimizationSuccess(); - *emitted = true; return true; } bool IonBuilder::setElemTryArguments(bool* emitted, MDefinition* object, MDefinition* index, MDefinition* value) { MOZ_ASSERT(*emitted == false); @@ -10475,29 +10479,40 @@ IonBuilder::setElemTryCache(bool* emitte trackOptimizationSuccess(); *emitted = true; return true; } bool IonBuilder::jsop_setelem_dense(TemporaryTypeSet::DoubleConversion conversion, MDefinition* obj, MDefinition* id, MDefinition* value, - JSValueType unboxedType, bool writeHole) -{ + JSValueType unboxedType, bool writeHole, bool* emitted) +{ + MOZ_ASSERT(*emitted == false); + MIRType elementType = MIRType::None; if (unboxedType == JSVAL_TYPE_MAGIC) elementType = DenseNativeElementType(constraints(), obj); bool packed = ElementAccessIsPacked(constraints(), obj); // Writes which are on holes in the object do not have to bail out if they // cannot hit another indexed property on the object or its prototypes. bool hasNoExtraIndexedProperty = !ElementAccessHasExtraIndexedProperty(this, obj); bool mayBeFrozen = ElementAccessMightBeFrozen(constraints(), obj); + if (mayBeFrozen && !hasNoExtraIndexedProperty) { + // FallibleStoreElement does not know how to deal with extra indexed + // properties on the prototype. This case should be rare so we fall back + // to an IC. + return true; + } + + *emitted = true; + // Ensure id is an integer. MInstruction* idInt32 = MToInt32::New(alloc(), id); current->add(idInt32); id = idInt32; if (NeedsPostBarrier(value)) current->add(MPostWriteElementBarrier::New(alloc(), obj, value, id)); @@ -10535,25 +10550,28 @@ IonBuilder::jsop_setelem_dense(Temporary } // Use MStoreElementHole if this SETELEM has written to out-of-bounds // indexes in the past. Otherwise, use MStoreElement so that we can hoist // the initialized length and bounds check. // If an object may have been frozen, no previous expectation hold and we // fallback to MFallibleStoreElement. MInstruction* store; - MStoreElementCommon *common = nullptr; + MStoreElementCommon* common = nullptr; if (writeHole && hasNoExtraIndexedProperty && !mayBeFrozen) { MStoreElementHole* ins = MStoreElementHole::New(alloc(), obj, elements, id, newValue, unboxedType); store = ins; common = ins; current->add(ins); current->push(value); - } else if (hasNoExtraIndexedProperty && mayBeFrozen) { + } else if (mayBeFrozen) { + MOZ_ASSERT(hasNoExtraIndexedProperty, + "FallibleStoreElement codegen assumes no extra indexed properties"); + bool strict = IsStrictSetPC(pc); MFallibleStoreElement* ins = MFallibleStoreElement::New(alloc(), obj, elements, id, newValue, unboxedType, strict); store = ins; common = ins; current->add(ins); current->push(value);
--- a/js/src/jit/IonBuilder.h +++ b/js/src/jit/IonBuilder.h @@ -732,17 +732,17 @@ class IonBuilder MOZ_MUST_USE bool jsop_getelem_dense(MDefinition* obj, MDefinition* index, JSValueType unboxedType); MOZ_MUST_USE bool jsop_getelem_typed(MDefinition* obj, MDefinition* index, ScalarTypeDescr::Type arrayType); MOZ_MUST_USE bool jsop_setelem(); MOZ_MUST_USE bool jsop_setelem_dense(TemporaryTypeSet::DoubleConversion conversion, MDefinition* object, MDefinition* index, MDefinition* value, JSValueType unboxedType, - bool writeHole); + bool writeHole, bool* emitted); MOZ_MUST_USE bool jsop_setelem_typed(ScalarTypeDescr::Type arrayType, MDefinition* object, MDefinition* index, MDefinition* value); MOZ_MUST_USE bool jsop_length(); MOZ_MUST_USE bool jsop_length_fastPath(); MOZ_MUST_USE bool jsop_arguments(); MOZ_MUST_USE bool jsop_arguments_getelem(); MOZ_MUST_USE bool jsop_runonce();
--- a/js/src/jit/JitSpewer.cpp +++ b/js/src/jit/JitSpewer.cpp @@ -410,56 +410,57 @@ jit::CheckLogging() if (!env) return; if (strstr(env, "help")) { fflush(nullptr); printf( "\n" "usage: IONFLAGS=option,option,option,... where options can be:\n" "\n" - " aborts Compilation abort messages\n" - " scripts Compiled scripts\n" - " mir MIR information\n" - " prune Prune unused branches\n" - " escape Escape analysis\n" - " alias Alias analysis\n" - " alias-sum Alias analysis: shows summaries for every block\n" - " gvn Global Value Numbering\n" - " licm Loop invariant code motion\n" - " flac Fold linear arithmetic constants\n" - " eaa Effective address analysis\n" - " sincos Replace sin/cos by sincos\n" - " sink Sink transformation\n" - " regalloc Register allocation\n" - " inline Inlining\n" - " snapshots Snapshot information\n" - " codegen Native code generation\n" - " bailouts Bailouts\n" - " caches Inline caches\n" - " osi Invalidation\n" - " safepoints Safepoints\n" - " pools Literal Pools (ARM only for now)\n" - " cacheflush Instruction Cache flushes (ARM only for now)\n" - " range Range Analysis\n" - " unroll Loop unrolling\n" - " logs C1 and JSON visualization logging\n" - " logs-sync Same as logs, but flushes between each pass (sync. compiled functions only).\n" - " profiling Profiling-related information\n" - " trackopts Optimization tracking information\n" - " all Everything\n" + " aborts Compilation abort messages\n" + " scripts Compiled scripts\n" + " mir MIR information\n" + " prune Prune unused branches\n" + " escape Escape analysis\n" + " alias Alias analysis\n" + " alias-sum Alias analysis: shows summaries for every block\n" + " gvn Global Value Numbering\n" + " licm Loop invariant code motion\n" + " flac Fold linear arithmetic constants\n" + " eaa Effective address analysis\n" + " sincos Replace sin/cos by sincos\n" + " sink Sink transformation\n" + " regalloc Register allocation\n" + " inline Inlining\n" + " snapshots Snapshot information\n" + " codegen Native code generation\n" + " bailouts Bailouts\n" + " caches Inline caches\n" + " osi Invalidation\n" + " safepoints Safepoints\n" + " pools Literal Pools (ARM only for now)\n" + " cacheflush Instruction Cache flushes (ARM only for now)\n" + " range Range Analysis\n" + " unroll Loop unrolling\n" + " logs C1 and JSON visualization logging\n" + " logs-sync Same as logs, but flushes between each pass (sync. compiled functions only).\n" + " profiling Profiling-related information\n" + " trackopts Optimization tracking information\n" + " dump-mir-expr Dump the MIR expressions\n" + " all Everything\n" "\n" - " bl-aborts Baseline compiler abort messages\n" - " bl-scripts Baseline script-compilation\n" - " bl-op Baseline compiler detailed op-specific messages\n" - " bl-ic Baseline inline-cache messages\n" - " bl-ic-fb Baseline IC fallback stub messages\n" - " bl-osr Baseline IC OSR messages\n" - " bl-bails Baseline bailouts\n" - " bl-dbg-osr Baseline debug mode on stack recompile messages\n" - " bl-all All baseline spew\n" + " bl-aborts Baseline compiler abort messages\n" + " bl-scripts Baseline script-compilation\n" + " bl-op Baseline compiler detailed op-specific messages\n" + " bl-ic Baseline inline-cache messages\n" + " bl-ic-fb Baseline IC fallback stub messages\n" + " bl-osr Baseline IC OSR messages\n" + " bl-bails Baseline bailouts\n" + " bl-dbg-osr Baseline debug mode on stack recompile messages\n" + " bl-all All baseline spew\n" "\n" ); exit(0); /*NOTREACHED*/ } if (ContainsFlag(env, "aborts")) EnableChannel(JitSpew_IonAbort); if (ContainsFlag(env, "prune")) @@ -513,16 +514,18 @@ jit::CheckLogging() if (ContainsFlag(env, "logs")) EnableIonDebugAsyncLogging(); if (ContainsFlag(env, "logs-sync")) EnableIonDebugSyncLogging(); if (ContainsFlag(env, "profiling")) EnableChannel(JitSpew_Profiling); if (ContainsFlag(env, "trackopts")) EnableChannel(JitSpew_OptimizationTracking); + if (ContainsFlag(env, "dump-mir-expr")) + EnableChannel(JitSpew_MIRExpressions); if (ContainsFlag(env, "all")) LoggingBits = uint64_t(-1); if (ContainsFlag(env, "bl-aborts")) EnableChannel(JitSpew_BaselineAbort); if (ContainsFlag(env, "bl-scripts")) EnableChannel(JitSpew_BaselineScripts); if (ContainsFlag(env, "bl-op"))
--- a/js/src/jit/JitSpewer.h +++ b/js/src/jit/JitSpewer.h @@ -59,16 +59,18 @@ namespace jit { /* Debug info about Pools*/ \ _(Pools) \ /* Profiling-related information */ \ _(Profiling) \ /* Information of tracked opt strats */ \ _(OptimizationTracking) \ /* Debug info about the I$ */ \ _(CacheFlush) \ + /* Output a list of MIR expressions */ \ + _(MIRExpressions) \ \ /* BASELINE COMPILER SPEW */ \ \ /* Aborting Script Compilation. */ \ _(BaselineAbort) \ /* Script Compilation. */ \ _(BaselineScripts) \ /* Detailed op-specific spew. */ \
--- a/js/src/jit/LIR.cpp +++ b/js/src/jit/LIR.cpp @@ -343,46 +343,49 @@ LNode::printName(GenericPrinter& out) bool LAllocation::aliases(const LAllocation& other) const { if (isFloatReg() && other.isFloatReg()) return toFloatReg()->reg().aliases(other.toFloatReg()->reg()); return *this == other; } -static const char * const TypeChars[] = +static const char* +typeName(LDefinition::Type type) { - "g", // GENERAL - "i", // INT32 - "i64", // INT64 - "o", // OBJECT - "s", // SLOTS - "f", // FLOAT32 - "d", // DOUBLE - "simd128int", // SIMD128INT - "simd128float", // SIMD128FLOAT - "sincos", // SINCOS + switch (type) { + case LDefinition::GENERAL: return "g"; + case LDefinition::INT32: return "i"; + case LDefinition::OBJECT: return "o"; + case LDefinition::SLOTS: return "s"; + case LDefinition::FLOAT32: return "f"; + case LDefinition::DOUBLE: return "d"; + case LDefinition::SIMD128INT: return "simd128int"; + case LDefinition::SIMD128FLOAT: return "simd128float"; + case LDefinition::SINCOS: return "sincos"; #ifdef JS_NUNBOX32 - "t", // TYPE - "p" // PAYLOAD -#elif JS_PUNBOX64 - "x" // BOX + case LDefinition::TYPE: return "t"; + case LDefinition::PAYLOAD: return "p"; +#else + case LDefinition::BOX: return "x"; #endif -}; + } + MOZ_CRASH("Invalid type"); +} UniqueChars LDefinition::toString() const { AutoEnterOOMUnsafeRegion oomUnsafe; char* buf; if (isBogusTemp()) { buf = JS_smprintf("bogus"); } else { - buf = JS_smprintf("v%u<%s>", virtualRegister(), TypeChars[type()]); + buf = JS_smprintf("v%u<%s>", virtualRegister(), typeName(type())); if (buf) { if (policy() == LDefinition::FIXED) buf = JS_sprintf_append(buf, ":%s", output()->toString().get()); else if (policy() == LDefinition::MUST_REUSE_INPUT) buf = JS_sprintf_append(buf, ":tied(%u)", getReusedInput()); } } @@ -604,15 +607,15 @@ LMoveGroup::addAfter(LAllocation from, L void LMoveGroup::printOperands(GenericPrinter& out) { for (size_t i = 0; i < numMoves(); i++) { const LMove& move = getMove(i); out.printf(" [%s -> %s", move.from().toString().get(), move.to().toString().get()); #ifdef DEBUG - out.printf(", %s", TypeChars[move.type()]); + out.printf(", %s", typeName(move.type())); #endif out.printf("]"); if (i != numMoves() - 1) out.printf(","); } }
--- a/js/src/jit/LIR.h +++ b/js/src/jit/LIR.h @@ -185,17 +185,16 @@ class LAllocation : public TempObject HashNumber hash() const { return bits_; } UniqueChars toString() const; bool aliases(const LAllocation& other) const; void dump() const; - }; class LUse : public LAllocation { static const uint32_t POLICY_BITS = 3; static const uint32_t POLICY_SHIFT = 0; static const uint32_t POLICY_MASK = (1 << POLICY_BITS) - 1; static const uint32_t REG_BITS = 6;
--- a/js/src/jit/Lowering.cpp +++ b/js/src/jit/Lowering.cpp @@ -4277,17 +4277,17 @@ LIRGenerator::visitWasmReturnVoid(MWasmR add(lir); } void LIRGenerator::visitWasmStackArg(MWasmStackArg* ins) { if (ins->arg()->type() == MIRType::Int64) { - add(new(alloc()) LWasmStackArgI64(useInt64OrConstantAtStart(ins->arg())), ins); + add(new(alloc()) LWasmStackArgI64(useInt64RegisterOrConstantAtStart(ins->arg())), ins); } else if (IsFloatingPointType(ins->arg()->type()) || IsSimdType(ins->arg()->type())) { MOZ_ASSERT(!ins->arg()->isEmittedAtUses()); add(new(alloc()) LWasmStackArg(useRegisterAtStart(ins->arg())), ins); } else { add(new(alloc()) LWasmStackArg(useRegisterOrConstantAtStart(ins->arg())), ins); } }
--- a/js/src/jit/MIR.cpp +++ b/js/src/jit/MIR.cpp @@ -2385,16 +2385,18 @@ MPhi::foldsTernary(TempAllocator& alloc) { return nullptr; } // If testArg is an int32 type we can: // - fold testArg ? testArg : 0 to testArg // - fold testArg ? 0 : testArg to 0 if (testArg->type() == MIRType::Int32 && c->numberToDouble() == 0) { + testArg->setGuardRangeBailoutsUnchecked(); + // When folding to the constant we need to hoist it. if (trueDef == c && !c->block()->dominates(block())) c->block()->moveBefore(pred->lastIns(), c); return trueDef; } // If testArg is an double type we can: // - fold testArg ? testArg : 0.0 to MNaNToZero(testArg) @@ -2916,16 +2918,19 @@ CanProduceNegativeZero(MDefinition* def) default: return true; } } static inline bool NeedNegativeZeroCheck(MDefinition* def) { + if (def->isGuardRangeBailouts()) + return true; + // Test if all uses have the same semantics for -0 and 0 for (MUseIterator use = def->usesBegin(); use != def->usesEnd(); use++) { if (use->consumer()->isResumePoint()) continue; MDefinition* use_def = use->consumer()->toDefinition(); switch (use_def->op()) { case MDefinition::Op_Add: { @@ -4382,18 +4387,17 @@ MCompare::tryFoldEqualOperands(bool* res compareType_ == Compare_String || compareType_ == Compare_StrictString || compareType_ == Compare_Object || compareType_ == Compare_Bitwise); if (isDoubleComparison() || isFloat32Comparison()) { if (!operandsAreNeverNaN()) return false; } - if (DeadIfUnused(lhs())) - lhs()->setGuardRangeBailouts(); + lhs()->setGuardRangeBailoutsUnchecked(); *result = (jsop() == JSOP_STRICTEQ); return true; } bool MCompare::tryFoldTypeOf(bool* result) {
--- a/js/src/jit/RangeAnalysis.cpp +++ b/js/src/jit/RangeAnalysis.cpp @@ -3535,18 +3535,17 @@ RangeAnalysis::prepareForUCE(bool* shoul // If the false-branch is unreachable, then the test condition must be true. // If the true-branch is unreachable, then the test condition must be false. MOZ_ASSERT(block == test->ifTrue() || block == test->ifFalse()); bool value = block == test->ifFalse(); MConstant* constant = MConstant::New(alloc().fallible(), BooleanValue(value)); if (!constant) return false; - if (DeadIfUnused(condition)) - condition->setGuardRangeBailoutsUnchecked(); + condition->setGuardRangeBailoutsUnchecked(); test->block()->insertBefore(test, constant); test->replaceOperand(0, constant); JitSpew(JitSpew_Range, "Update condition of %d to reflect unreachable branches.", test->id()); *shouldRemoveDeadCode = true; @@ -3572,23 +3571,24 @@ bool RangeAnalysis::tryRemovingGuards() // Flag all fallible instructions which were indirectly used in the // computation of the condition, such that we do not ignore // bailout-paths which are used to shrink the input range of the // operands of the condition. for (size_t i = 0; i < guards.length(); i++) { MDefinition* guard = guards[i]; -#ifdef DEBUG - // There is no need to mark an instructions if there is - // already a more restrictive flag on it. + // If this ins is a guard even without guardRangeBailouts, + // there is no reason in trying to hoist the guardRangeBailouts check. guard->setNotGuardRangeBailouts(); - MOZ_ASSERT(DeadIfUnused(guard)); + if (!DeadIfUnused(guard)) { + guard->setGuardRangeBailouts(); + continue; + } guard->setGuardRangeBailouts(); -#endif if (!guard->isPhi()) { if (!guard->range()) continue; // Filter the range of the instruction based on its MIRType. Range typeFilteredRange(guard); @@ -3609,21 +3609,16 @@ bool RangeAnalysis::tryRemovingGuards() MDefinition* operand = guard->getOperand(op); // Already marked. if (operand->isInWorklist()) continue; MOZ_ASSERT(!operand->isGuardRangeBailouts()); - // No need to mark as a guard, since it is has already an even more - // restrictive flag set. - if (!DeadIfUnused(operand)) - continue; - operand->setInWorklist(); operand->setGuardRangeBailouts(); if (!guards.append(operand)) return false; } } for (size_t i = 0; i < guards.length(); i++) {
--- a/js/src/jit/ValueNumbering.cpp +++ b/js/src/jit/ValueNumbering.cpp @@ -792,16 +792,19 @@ ValueNumberer::visitDefinition(MDefiniti MOZ_ASSERT(!sim->isDiscarded()); ReplaceAllUsesWith(def, sim); // The node's foldsTo said |def| can be replaced by |rep|. If |def| is a // guard, then either |rep| is also a guard, or a guard isn't actually // needed, so we can clear |def|'s guard flag and let it be discarded. def->setNotGuardUnchecked(); + if (def->isGuardRangeBailouts()) + sim->setGuardRangeBailoutsUnchecked(); + if (DeadIfUnused(def)) { if (!discardDefsRecursively(def)) return false; // If that ended up discarding |sim|, then we're done here. if (sim->isDiscarded()) return true; }
--- a/js/src/jit/arm/Assembler-arm.cpp +++ b/js/src/jit/arm/Assembler-arm.cpp @@ -585,42 +585,32 @@ InstMOV::IsTHIS(const Instruction& i) return InstALU::IsTHIS(i) && InstALU::AsTHIS(i)->checkOp1(r0) && InstALU::AsTHIS(i)->checkOp(OpMov); } Op2Reg Operand2::toOp2Reg() const { return *(Op2Reg*)this; } -O2RegImmShift -Op2Reg::toO2RegImmShift() const { - return *(O2RegImmShift*)this; -} - -O2RegRegShift -Op2Reg::toO2RegRegShift() const { - return *(O2RegRegShift*)this; -} - Imm16::Imm16(Instruction& inst) - : lower(inst.encode() & 0xfff), - upper(inst.encode() >> 16), - invalid(0xfff) + : lower_(inst.encode() & 0xfff), + upper_(inst.encode() >> 16), + invalid_(0xfff) { } Imm16::Imm16(uint32_t imm) - : lower(imm & 0xfff), pad(0), - upper((imm >> 12) & 0xf), - invalid(0) + : lower_(imm & 0xfff), pad_(0), + upper_((imm >> 12) & 0xf), + invalid_(0) { MOZ_ASSERT(decode() == imm); } Imm16::Imm16() - : invalid(0xfff) + : invalid_(0xfff) { } void jit::PatchJump(CodeLocationJump& jump_, CodeLocationLabel label, ReprotectCode reprotect) { // We need to determine if this jump can fit into the standard 24+2 bit // address or if we need a larger branch (or just need to use our pool // entry). @@ -930,20 +920,20 @@ Assembler::copyPreBarrierTable(uint8_t* memcpy(dest, preBarriers_.buffer(), preBarriers_.length()); } void Assembler::trace(JSTracer* trc) { for (size_t i = 0; i < jumps_.length(); i++) { RelativePatch& rp = jumps_[i]; - if (rp.kind == Relocation::JITCODE) { - JitCode* code = JitCode::FromExecutable((uint8_t*)rp.target); + if (rp.kind() == Relocation::JITCODE) { + JitCode* code = JitCode::FromExecutable((uint8_t*)rp.target()); TraceManuallyBarrieredEdge(trc, &code, "masmrel32"); - MOZ_ASSERT(code == JitCode::FromExecutable((uint8_t*)rp.target)); + MOZ_ASSERT(code == JitCode::FromExecutable((uint8_t*)rp.target())); } } if (dataRelocations_.length()) { CompactBufferReader reader(dataRelocations_); ::TraceDataRelocations(trc, &m_buffer, reader); } } @@ -1288,34 +1278,34 @@ jit::asr(Register r, Register amt) } static js::jit::DoubleEncoder doubleEncoder; /* static */ const js::jit::VFPImm js::jit::VFPImm::One(0x3FF00000); js::jit::VFPImm::VFPImm(uint32_t top) { - data = -1; + data_ = -1; datastore::Imm8VFPImmData tmp; if (doubleEncoder.lookup(top, &tmp)) - data = tmp.encode(); + data_ = tmp.encode(); } -BOffImm::BOffImm(Instruction& inst) - : data(inst.encode() & 0x00ffffff) +BOffImm::BOffImm(const Instruction& inst) + : data_(inst.encode() & 0x00ffffff) { } Instruction* BOffImm::getDest(Instruction* src) const { // TODO: It is probably worthwhile to verify that src is actually a branch. // NOTE: This does not explicitly shift the offset of the destination left by 2, // since it is indexing into an array of instruction sized objects. - return &src[(((int32_t)data << 8) >> 8) + 2]; + return &src[((int32_t(data_) << 8) >> 8) + 2]; } const js::jit::DoubleEncoder::DoubleEntry js::jit::DoubleEncoder::table[256] = { #include "jit/arm/DoubleEntryTable.tbl" }; // VFPRegister implementation VFPRegister
--- a/js/src/jit/arm/Assembler-arm.h +++ b/js/src/jit/arm/Assembler-arm.h @@ -267,24 +267,24 @@ uint32_t VN(VFPRegister vr); uint32_t VM(VFPRegister vr); // For being passed into the generic vfp instruction generator when there is an // instruction that only takes two registers. static constexpr VFPRegister NoVFPRegister(VFPRegister::Double, 0, false, true); struct ImmTag : public Imm32 { - ImmTag(JSValueTag mask) + explicit ImmTag(JSValueTag mask) : Imm32(int32_t(mask)) { } }; struct ImmType : public ImmTag { - ImmType(JSValueType type) + explicit ImmType(JSValueType type) : ImmTag(JSVAL_TYPE_TO_TAG(type)) { } }; enum Index { Offset = 0 << 21 | 1<<24, PreIndex = 1 << 21 | 1 << 24, PostIndex = 0 << 21 | 0 << 24 @@ -309,26 +309,16 @@ enum IsImmEDTR_ { enum ShiftType { LSL = 0, // << 5 LSR = 1, // << 5 ASR = 2, // << 5 ROR = 3, // << 5 RRX = ROR // RRX is encoded as ROR with a 0 offset. }; -// The actual codes that get set by instructions and the codes that are checked -// by the conditions below. -struct ConditionCodes -{ - bool Zero : 1; - bool Overflow : 1; - bool Carry : 1; - bool Minus : 1; -}; - // Modes for STM/LDM. Names are the suffixes applied to the instruction. enum DTMMode { A = 0 << 24, // empty / after B = 1 << 24, // full / before D = 0 << 23, // decrement I = 1 << 23, // increment DA = D | A, DB = D | B, @@ -444,112 +434,111 @@ static const ValueOperand softfpReturnOp // storage. We also wanted to avoid passing around raw integers at all since // they are error prone. class Op2Reg; class O2RegImmShift; class O2RegRegShift; namespace datastore { -struct Reg +class Reg { // The "second register". - uint32_t RM : 4; + uint32_t rm_ : 4; // Do we get another register for shifting. - uint32_t RRS : 1; - ShiftType Type : 2; + bool rrs_ : 1; + ShiftType type_ : 2; // We'd like this to be a more sensible encoding, but that would need to be // a struct and that would not pack :( - uint32_t ShiftAmount : 5; - uint32_t pad : 20; + uint32_t shiftAmount_ : 5; + uint32_t pad_ : 20; - Reg(uint32_t rm, ShiftType type, uint32_t rsr, uint32_t shiftamount) - : RM(rm), RRS(rsr), Type(type), ShiftAmount(shiftamount), pad(0) + public: + Reg(uint32_t rm, ShiftType type, uint32_t rsr, uint32_t shiftAmount) + : rm_(rm), rrs_(rsr), type_(type), shiftAmount_(shiftAmount), pad_(0) { } - explicit Reg(const Op2Reg& op) { memcpy(this, &op, sizeof(*this)); } + uint32_t shiftAmount() const { + return shiftAmount_; + } + uint32_t encode() const { - return RM | RRS << 4 | Type << 5 | ShiftAmount << 7; + return rm_ | (rrs_ << 4) | (type_ << 5) | (shiftAmount_ << 7); } }; // Op2 has a mode labelled "<imm8m>", which is arm's magical immediate encoding. // Some instructions actually get 8 bits of data, which is called Imm8Data // below. These should have edit distance > 1, but this is how it is for now. -struct Imm8mData +class Imm8mData { - private: - uint32_t data : 8; - uint32_t rot : 4; + uint32_t data_ : 8; + uint32_t rot_ : 4; + uint32_t buff_ : 19; + // Throw in an extra bit that will be 1 if we can't encode this properly. // if we can encode it properly, a simple "|" will still suffice to meld it // into the instruction. - uint32_t buff : 19; - - public: - uint32_t invalid : 1; + bool invalid_ : 1; public: - uint32_t encode() const { - MOZ_ASSERT(!invalid); - return data | rot << 8; - }; - // Default constructor makes an invalid immediate. Imm8mData() - : data(0xff), rot(0xf), buff(0), invalid(1) + : data_(0xff), rot_(0xf), buff_(0), invalid_(true) { } - Imm8mData(uint32_t data_, uint32_t rot_) - : data(data_), rot(rot_), buff(0), invalid(0) + Imm8mData(uint32_t data, uint32_t rot) + : data_(data), rot_(rot), buff_(0), invalid_(false) { MOZ_ASSERT(data == data_); MOZ_ASSERT(rot == rot_); } + + bool invalid() const { return invalid_; } + + uint32_t encode() const { + MOZ_ASSERT(!invalid_); + return data_ | (rot_ << 8); + }; }; -struct Imm8Data +class Imm8Data { - private: - uint32_t imm4L : 4; - uint32_t pad : 4; - uint32_t imm4H : 4; + uint32_t imm4L_ : 4; + uint32_t pad_ : 4; + uint32_t imm4H_ : 4; public: - Imm8Data(uint32_t imm) - : imm4L(imm & 0xf), imm4H(imm >> 4) + explicit Imm8Data(uint32_t imm) + : imm4L_(imm & 0xf), imm4H_(imm >> 4) { MOZ_ASSERT(imm <= 0xff); } - public: uint32_t encode() const { - return imm4L | (imm4H << 8); + return imm4L_ | (imm4H_ << 8); }; }; // VLDR/VSTR take an 8 bit offset, which is implicitly left shifted by 2. -struct Imm8VFPOffData +class Imm8VFPOffData { - private: - uint32_t data; + uint32_t data_; public: - Imm8VFPOffData(uint32_t imm) - : data (imm) + explicit Imm8VFPOffData(uint32_t imm) + : data_(imm) { MOZ_ASSERT((imm & ~(0xff)) == 0); } - - public: uint32_t encode() const { - return data; + return data_; }; }; // ARM can magically encode 256 very special immediates to be moved into a // register. struct Imm8VFPImmData { // This structure's members are public and it has no constructor to @@ -568,204 +557,182 @@ struct Imm8VFPImmData uint32_t encode() const { // This assert is an attempting at ensuring that we don't create random // instances of this structure and then asking to encode() it. MOZ_ASSERT(isInvalid == 0); return imm4L | (imm4H << 16); }; }; -struct Imm12Data +class Imm12Data { - uint32_t data : 12; + uint32_t data_ : 12; - Imm12Data(uint32_t imm) - : data(imm) + public: + explicit Imm12Data(uint32_t imm) + : data_(imm) { - MOZ_ASSERT(data == imm); + MOZ_ASSERT(data_ == imm); } uint32_t encode() const { - return data; + return data_; } }; -struct RIS +class RIS { - uint32_t ShiftAmount : 5; + uint32_t shiftAmount_ : 5; - RIS(uint32_t imm) - : ShiftAmount(imm) + public: + explicit RIS(uint32_t imm) + : shiftAmount_(imm) { - MOZ_ASSERT(ShiftAmount == imm); + MOZ_ASSERT(shiftAmount_ == imm); } explicit RIS(Reg r) - : ShiftAmount(r.ShiftAmount) + : shiftAmount_(r.shiftAmount()) { } uint32_t encode() const { - return ShiftAmount; + return shiftAmount_; } }; -struct RRS +class RRS { - uint32_t MustZero : 1; + bool mustZero_ : 1; // The register that holds the shift amount. - uint32_t RS : 4; + uint32_t rs_ : 4; - RRS(uint32_t rs) - : RS(rs) + public: + explicit RRS(uint32_t rs) + : rs_(rs) { - MOZ_ASSERT(rs == RS); + MOZ_ASSERT(rs_ == rs); } uint32_t encode() const { - return RS << 1; + return rs_ << 1; } }; } // namespace datastore class MacroAssemblerARM; class Operand; + class Operand2 { friend class Operand; friend class MacroAssemblerARM; friend class InstALU; - public: - uint32_t oper : 31; - uint32_t invalid : 1; + uint32_t oper_ : 31; + bool invalid_ : 1; protected: explicit Operand2(datastore::Imm8mData base) - : oper(base.invalid ? -1 : (base.encode() | (uint32_t)IsImmOp2)), - invalid(base.invalid) + : oper_(base.invalid() ? -1 : (base.encode() | uint32_t(IsImmOp2))), + invalid_(base.invalid()) { } explicit Operand2(datastore::Reg base) - : oper(base.encode() | (uint32_t)IsNotImmOp2) + : oper_(base.encode() | uint32_t(IsNotImmOp2)), + invalid_(false) { } private: - explicit Operand2(int blob) - : oper(blob) + explicit Operand2(uint32_t blob) + : oper_(blob), + invalid_(false) { } public: bool isO2Reg() const { - return !(oper & IsImmOp2); + return !(oper_ & IsImmOp2); } Op2Reg toOp2Reg() const; bool isImm8() const { - return oper & IsImmOp2; + return oper_ & IsImmOp2; + } + + bool invalid() const { + return invalid_; } uint32_t encode() const { - return oper; + return oper_; } }; class Imm8 : public Operand2 { public: explicit Imm8(uint32_t imm) : Operand2(EncodeImm(imm)) { } - public: static datastore::Imm8mData EncodeImm(uint32_t imm) { // RotateLeft below may not be called with a shift of zero. if (imm <= 0xFF) return datastore::Imm8mData(imm, 0); // An encodable integer has a maximum of 8 contiguous set bits, // with an optional wrapped left rotation to even bit positions. for (int rot = 1; rot < 16; rot++) { - uint32_t rotimm = mozilla::RotateLeft(imm, rot*2); + uint32_t rotimm = mozilla::RotateLeft(imm, rot * 2); if (rotimm <= 0xFF) return datastore::Imm8mData(rotimm, rot); } return datastore::Imm8mData(); } // Pair template? struct TwoImm8mData { - datastore::Imm8mData fst, snd; + datastore::Imm8mData fst_, snd_; - TwoImm8mData() - : fst(), snd() + TwoImm8mData() = default; + + TwoImm8mData(datastore::Imm8mData fst, datastore::Imm8mData snd) + : fst_(fst), snd_(snd) { } - TwoImm8mData(datastore::Imm8mData _fst, datastore::Imm8mData _snd) - : fst(_fst), snd(_snd) - { } + datastore::Imm8mData fst() const { return fst_; } + datastore::Imm8mData snd() const { return snd_; } }; static TwoImm8mData EncodeTwoImms(uint32_t); }; class Op2Reg : public Operand2 { public: explicit Op2Reg(Register rm, ShiftType type, datastore::RIS shiftImm) : Operand2(datastore::Reg(rm.code(), type, 0, shiftImm.encode())) { } explicit Op2Reg(Register rm, ShiftType type, datastore::RRS shiftReg) : Operand2(datastore::Reg(rm.code(), type, 1, shiftReg.encode())) { } - - public: - bool isO2RegImmShift() const { - datastore::Reg r(*this); - return !r.RRS; - } - O2RegImmShift toO2RegImmShift() const; - - bool isO2RegRegShift() const { - datastore::Reg r(*this); - return r.RRS; - } - O2RegRegShift toO2RegRegShift() const; +}; - bool checkType(ShiftType type) const { - datastore::Reg r(*this); - return r.Type == type; - } - bool checkRM(Register rm) const { - datastore::Reg r(*this); - return r.RM == rm.code(); - } - bool getRM(Register* rm) const { - datastore::Reg r(*this); - *rm = Register::FromCode(r.RM); - return true; - } -}; +static_assert(sizeof(Op2Reg) == sizeof(datastore::Reg), + "datastore::Reg(const Op2Reg&) constructor relies on Reg/Op2Reg having same size"); class O2RegImmShift : public Op2Reg { public: explicit O2RegImmShift(Register rn, ShiftType type, uint32_t shift) : Op2Reg(rn, type, datastore::RIS(shift)) { } - - public: - int getShift() const { - datastore::Reg r(*this); - datastore::RIS ris(r); - return ris.ShiftAmount; - } }; class O2RegRegShift : public Op2Reg { public: explicit O2RegRegShift(Register rn, ShiftType type, Register rs) : Op2Reg(rn, type, datastore::RRS(rs.code())) { } @@ -785,45 +752,46 @@ O2RegRegShift ror(Register r, Register a // An offset from a register to be used for ldr/str. This should include the // sign bit, since ARM has "signed-magnitude" offsets. That is it encodes an // unsigned offset, then the instruction specifies if the offset is positive or // negative. The +/- bit is necessary if the instruction set wants to be able to // have a negative register offset e.g. ldr pc, [r1,-r2]; class DtrOff { - uint32_t data; + uint32_t data_; protected: explicit DtrOff(datastore::Imm12Data immdata, IsUp_ iu) - : data(immdata.encode() | (uint32_t)IsImmDTR | ((uint32_t)iu)) + : data_(immdata.encode() | uint32_t(IsImmDTR) | uint32_t(iu)) { } explicit DtrOff(datastore::Reg reg, IsUp_ iu = IsUp) - : data(reg.encode() | (uint32_t) IsNotImmDTR | iu) + : data_(reg.encode() | uint32_t(IsNotImmDTR) | iu) { } public: - uint32_t encode() const { return data; } + uint32_t encode() const { return data_; } }; class DtrOffImm : public DtrOff { public: explicit DtrOffImm(int32_t imm) : DtrOff(datastore::Imm12Data(mozilla::Abs(imm)), imm >= 0 ? IsUp : IsDown) { MOZ_ASSERT(mozilla::Abs(imm) < 4096); } }; class DtrOffReg : public DtrOff { // These are designed to be called by a constructor of a subclass. - // Constructing the necessary RIS/RRS structures are annoying. + // Constructing the necessary RIS/RRS structures is annoying. + protected: explicit DtrOffReg(Register rn, ShiftType type, datastore::RIS shiftImm, IsUp_ iu = IsUp) : DtrOff(datastore::Reg(rn.code(), type, 0, shiftImm.encode()), iu) { } explicit DtrOffReg(Register rn, ShiftType type, datastore::RRS shiftReg, IsUp_ iu = IsUp) : DtrOff(datastore::Reg(rn.code(), type, 1, shiftReg.encode()), iu) { } @@ -846,56 +814,50 @@ class DtrRegRegShift : public DtrOffReg }; // We will frequently want to bundle a register with its offset so that we have // an "operand" to a load instruction. class DTRAddr { friend class Operand; - uint32_t data; + uint32_t data_; public: explicit DTRAddr(Register reg, DtrOff dtr) - : data(dtr.encode() | (reg.code() << 16)) + : data_(dtr.encode() | (reg.code() << 16)) { } - private: - explicit DTRAddr(uint32_t blob) - : data(blob) - { } - - public: uint32_t encode() const { - return data; + return data_; } Register getBase() const { - return Register::FromCode((data >> 16) &0xf); + return Register::FromCode((data_ >> 16) & 0xf); } }; // Offsets for the extended data transfer instructions: // ldrsh, ldrd, ldrsb, etc. class EDtrOff { - uint32_t data; + uint32_t data_; protected: explicit EDtrOff(datastore::Imm8Data imm8, IsUp_ iu = IsUp) - : data(imm8.encode() | IsImmEDTR | (uint32_t)iu) + : data_(imm8.encode() | IsImmEDTR | uint32_t(iu)) { } explicit EDtrOff(Register rm, IsUp_ iu = IsUp) - : data(rm.code() | IsNotImmEDTR | iu) + : data_(rm.code() | IsNotImmEDTR | iu) { } public: uint32_t encode() const { - return data; + return data_; } }; class EDtrOffImm : public EDtrOff { public: explicit EDtrOffImm(int32_t imm) : EDtrOff(datastore::Imm8Data(mozilla::Abs(imm)), (imm >= 0) ? IsUp : IsDown) @@ -911,47 +873,47 @@ class EDtrOffReg : public EDtrOff public: explicit EDtrOffReg(Register rm) : EDtrOff(rm) { } }; class EDtrAddr { - uint32_t data; + uint32_t data_; public: explicit EDtrAddr(Register r, EDtrOff off) - : data(RN(r) | off.encode()) + : data_(RN(r) | off.encode()) { } uint32_t encode() const { - return data; + return data_; } #ifdef DEBUG Register maybeOffsetRegister() const { - if (data & IsImmEDTR) + if (data_ & IsImmEDTR) return InvalidReg; - return Register::FromCode(data & 0xf); + return Register::FromCode(data_ & 0xf); } #endif }; class VFPOff { - uint32_t data; + uint32_t data_; protected: explicit VFPOff(datastore::Imm8VFPOffData imm, IsUp_ isup) - : data(imm.encode() | (uint32_t)isup) + : data_(imm.encode() | uint32_t(isup)) { } public: uint32_t encode() const { - return data; + return data_; } }; class VFPOffImm : public VFPOff { public: explicit VFPOffImm(int32_t imm) : VFPOff(datastore::Imm8VFPOffData(mozilla::Abs(imm) / 4), imm < 0 ? IsDown : IsUp) @@ -959,206 +921,197 @@ class VFPOffImm : public VFPOff MOZ_ASSERT(mozilla::Abs(imm) <= 255 * 4); } }; class VFPAddr { friend class Operand; - uint32_t data; + uint32_t data_; public: explicit VFPAddr(Register base, VFPOff off) - : data(RN(base) | off.encode()) + : data_(RN(base) | off.encode()) { } - protected: - VFPAddr(uint32_t blob) - : data(blob) - { } - - public: uint32_t encode() const { - return data; + return data_; } }; class VFPImm { - uint32_t data; + uint32_t data_; public: explicit VFPImm(uint32_t topWordOfDouble); - public: static const VFPImm One; uint32_t encode() const { - return data; + return data_; } bool isValid() const { - return data != -1U; + return data_ != -1U; } }; // A BOffImm is an immediate that is used for branches. Namely, it is the offset // that will be encoded in the branch instruction. This is the only sane way of // constructing a branch. class BOffImm { friend class InstBranchImm; - uint32_t data; + uint32_t data_; public: explicit BOffImm(int offset) - : data ((offset - 8) >> 2 & 0x00ffffff) + : data_((offset - 8) >> 2 & 0x00ffffff) { MOZ_ASSERT((offset & 0x3) == 0); if (!IsInRange(offset)) MOZ_CRASH("BOffImm offset out of range"); } explicit BOffImm() - : data(INVALID) + : data_(INVALID) { } private: - BOffImm(Instruction& inst); + explicit BOffImm(const Instruction& inst); public: - static const int INVALID = 0x00800000; + static const uint32_t INVALID = 0x00800000; uint32_t encode() const { - return data; + return data_; } int32_t decode() const { - return ((((int32_t)data) << 8) >> 6) + 8; + return ((int32_t(data_) << 8) >> 6) + 8; } static bool IsInRange(int offset) { if ((offset - 8) < -33554432) return false; if ((offset - 8) > 33554428) return false; return true; } bool isInvalid() const { - return data == uint32_t(INVALID); + return data_ == INVALID; } Instruction* getDest(Instruction* src) const; }; class Imm16 { - uint32_t lower : 12; - uint32_t pad : 4; - uint32_t upper : 4; - uint32_t invalid : 12; + uint32_t lower_ : 12; + uint32_t pad_ : 4; + uint32_t upper_ : 4; + uint32_t invalid_ : 12; public: explicit Imm16(); explicit Imm16(uint32_t imm); explicit Imm16(Instruction& inst); uint32_t encode() const { - return lower | upper << 16; + return lower_ | (upper_ << 16); } uint32_t decode() const { - return lower | upper << 12; + return lower_ | (upper_ << 12); } - bool isInvalid () const { - return invalid; + bool isInvalid() const { + return invalid_; } }; // I would preffer that these do not exist, since there are essentially no // instructions that would ever take more than one of these, however, the MIR // wants to only have one type of arguments to functions, so bugger. class Operand { // The encoding of registers is the same for OP2, DTR and EDTR yet the type // system doesn't let us express this, so choices must be made. public: - enum Tag_ { + enum class Tag : uint8_t { OP2, MEM, FOP }; private: - Tag_ Tag : 3; - uint32_t reg : 5; - int32_t offset; + Tag tag_ : 8; + uint32_t reg_ : 5; + int32_t offset_; public: - explicit Operand(Register reg_) - : Tag(OP2), reg(reg_.code()) + explicit Operand(Register reg) + : tag_(Tag::OP2), reg_(reg.code()) { } explicit Operand(FloatRegister freg) - : Tag(FOP), reg(freg.code()) + : tag_(Tag::FOP), reg_(freg.code()) { } explicit Operand(Register base, Imm32 off) - : Tag(MEM), reg(base.code()), offset(off.value) + : tag_(Tag::MEM), reg_(base.code()), offset_(off.value) { } explicit Operand(Register base, int32_t off) - : Tag(MEM), reg(base.code()), offset(off) + : tag_(Tag::MEM), reg_(base.code()), offset_(off) { } explicit Operand(const Address& addr) - : Tag(MEM), reg(addr.base.code()), offset(addr.offset) + : tag_(Tag::MEM), reg_(addr.base.code()), offset_(addr.offset) { } public: - Tag_ getTag() const { - return Tag; + Tag tag() const { + return tag_; } Operand2 toOp2() const { - MOZ_ASSERT(Tag == OP2); - return O2Reg(Register::FromCode(reg)); + MOZ_ASSERT(tag_ == Tag::OP2); + return O2Reg(Register::FromCode(reg_)); } Register toReg() const { - MOZ_ASSERT(Tag == OP2); - return Register::FromCode(reg); + MOZ_ASSERT(tag_ == Tag::OP2); + return Register::FromCode(reg_); } - void toAddr(Register* r, Imm32* dest) const { - MOZ_ASSERT(Tag == MEM); - *r = Register::FromCode(reg); - *dest = Imm32(offset); - } Address toAddress() const { - MOZ_ASSERT(Tag == MEM); - return Address(Register::FromCode(reg), offset); + MOZ_ASSERT(tag_ == Tag::MEM); + return Address(Register::FromCode(reg_), offset_); } int32_t disp() const { - MOZ_ASSERT(Tag == MEM); - return offset; + MOZ_ASSERT(tag_ == Tag::MEM); + return offset_; } int32_t base() const { - MOZ_ASSERT(Tag == MEM); - return reg; + MOZ_ASSERT(tag_ == Tag::MEM); + return reg_; } Register baseReg() const { - return Register::FromCode(reg); + MOZ_ASSERT(tag_ == Tag::MEM); + return Register::FromCode(reg_); } DTRAddr toDTRAddr() const { - return DTRAddr(baseReg(), DtrOffImm(offset)); + MOZ_ASSERT(tag_ == Tag::MEM); + return DTRAddr(baseReg(), DtrOffImm(offset_)); } VFPAddr toVFPAddr() const { - return VFPAddr(baseReg(), VFPOffImm(offset)); + MOZ_ASSERT(tag_ == Tag::MEM); + return VFPAddr(baseReg(), VFPOffImm(offset_)); } }; inline Imm32 Imm64::firstHalf() const { return low(); } @@ -1313,21 +1266,25 @@ class Assembler : public AssemblerShared static uint32_t AsmPoolMaxOffset; static uint32_t GetPoolMaxOffset(); protected: // Structure for fixing up pc-relative loads/jumps when a the machine code // gets moved (executable copy, gc, etc.). struct RelativePatch { - void* target; - Relocation::Kind kind; + void* target_; + Relocation::Kind kind_; + + public: RelativePatch(void* target, Relocation::Kind kind) - : target(target), kind(kind) + : target_(target), kind_(kind) { } + void* target() const { return target_; } + Relocation::Kind kind() const { return kind_; } }; // TODO: this should actually be a pool-like object. It is currently a big // hack, and probably shouldn't exist. js::Vector<RelativePatch, 8, SystemAllocPolicy> jumps_; CompactBufferWriter jumpRelocations_; CompactBufferWriter dataRelocations_; @@ -2253,17 +2210,17 @@ class InstMovT : public InstMovWT static InstMovT* AsTHIS (const Instruction& i); }; class InstALU : public Instruction { static const int32_t ALUMask = 0xc << 24; public: - InstALU (Register rd, Register rn, Operand2 op2, ALUOp op, SBit s, Assembler::Condition c) + InstALU(Register rd, Register rn, Operand2 op2, ALUOp op, SBit s, Assembler::Condition c) : Instruction(maybeRD(rd) | maybeRN(rn) | op2.encode() | op | s, c) { } static bool IsTHIS (const Instruction& i); static InstALU* AsTHIS (const Instruction& i); void extractOp(ALUOp* ret); bool checkOp(ALUOp op); @@ -2416,18 +2373,16 @@ GetDoubleArgStackDisp(uint32_t usedIntAr } uint32_t doubleSlots = usedFloatArgs - NumFloatArgRegs; doubleSlots *= 2; return (intSlots + doubleSlots + *padding) * sizeof(intptr_t); } #endif - - class DoubleEncoder { struct DoubleEntry { uint32_t dblTop; datastore::Imm8VFPImmData data; };
--- a/js/src/jit/arm/MacroAssembler-arm-inl.h +++ b/js/src/jit/arm/MacroAssembler-arm-inl.h @@ -2116,17 +2116,17 @@ MacroAssembler::wasmPatchBoundsCheck(uin InstCMP* cmp = inst->as<InstCMP>(); Register index; cmp->extractOp1(&index); MOZ_ASSERT(cmp->extractOp2().isImm8()); Imm8 imm8 = Imm8(limit); - MOZ_RELEASE_ASSERT(!imm8.invalid); + MOZ_RELEASE_ASSERT(!imm8.invalid()); *inst = InstALU(InvalidReg, index, imm8, OpCmp, SetCC, Always); // Don't call Auto Flush Cache; the wasm caller has done this for us. } //}}} check_macroassembler_style // ===============================================================
--- a/js/src/jit/arm/MacroAssembler-arm.cpp +++ b/js/src/jit/arm/MacroAssembler-arm.cpp @@ -237,61 +237,60 @@ bool MacroAssemblerARM::alu_dbl(Register src1, Imm32 imm, Register dest, ALUOp op, SBit s, Condition c) { if ((s == SetCC && ! condsAreSafe(op)) || !can_dbl(op)) return false; ALUOp interop = getDestVariant(op); Imm8::TwoImm8mData both = Imm8::EncodeTwoImms(imm.value); - if (both.fst.invalid) + if (both.fst().invalid()) return false; // For the most part, there is no good reason to set the condition codes for // the first instruction. We can do better things if the second instruction // doesn't have a dest, such as check for overflow by doing first operation // don't do second operation if first operation overflowed. This preserves // the overflow condition code. Unfortunately, it is horribly brittle. - as_alu(dest, src1, Operand2(both.fst), interop, LeaveCC, c); - as_alu(dest, dest, Operand2(both.snd), op, s, c); + as_alu(dest, src1, Operand2(both.fst()), interop, LeaveCC, c); + as_alu(dest, dest, Operand2(both.snd()), op, s, c); return true; } void MacroAssemblerARM::ma_alu(Register src1, Imm32 imm, Register dest, AutoRegisterScope& scratch, ALUOp op, SBit s, Condition c) { // ma_mov should be used for moves. MOZ_ASSERT(op != OpMov); MOZ_ASSERT(op != OpMvn); MOZ_ASSERT(src1 != scratch); // As it turns out, if you ask for a compare-like instruction you *probably* // want it to set condition codes. - if (dest == InvalidReg) - MOZ_ASSERT(s == SetCC); + MOZ_ASSERT_IF(dest == InvalidReg, s == SetCC); // The operator gives us the ability to determine how this can be used. Imm8 imm8 = Imm8(imm.value); // One instruction: If we can encode it using an imm8m, then do so. - if (!imm8.invalid) { + if (!imm8.invalid()) { as_alu(dest, src1, imm8, op, s, c); return; } // One instruction, negated: Imm32 negImm = imm; Register negDest; ALUOp negOp = ALUNeg(op, dest, scratch, &negImm, &negDest); Imm8 negImm8 = Imm8(negImm.value); // 'add r1, r2, -15' can be replaced with 'sub r1, r2, 15'. // The dest can be replaced (InvalidReg => scratch). // This is useful if we wish to negate tst. tst has an invalid (aka not // used) dest, but its negation bic requires a dest. - if (negOp != OpInvalid && !negImm8.invalid) { + if (negOp != OpInvalid && !negImm8.invalid()) { as_alu(negDest, src1, negImm8, negOp, s, c); return; } // Start by attempting to generate a two instruction form. Some things // cannot be made into two-inst forms correctly. Namely, adds dest, src, // 0xffff. Since we want the condition codes (and don't know which ones // will be checked), we need to assume that the overflow flag will be @@ -306,19 +305,19 @@ MacroAssemblerARM::ma_alu(Register src1, return; ma_mov(imm, scratch, c); as_alu(dest, src1, O2Reg(scratch), op, s, c); } void MacroAssemblerARM::ma_alu(Register src1, Operand op2, Register dest, ALUOp op, - SBit s, Assembler::Condition c) -{ - MOZ_ASSERT(op2.getTag() == Operand::OP2); + SBit s, Assembler::Condition c) +{ + MOZ_ASSERT(op2.tag() == Operand::Tag::OP2); as_alu(dest, src1, op2.toOp2(), op, s, c); } void MacroAssemblerARM::ma_alu(Register src1, Operand2 op2, Register dest, ALUOp op, SBit s, Condition c) { as_alu(dest, src1, op2, op, s, c); } @@ -384,24 +383,24 @@ MacroAssemblerARM::ma_mov(Register src, as_mov(dest, O2Reg(src), s, c); } void MacroAssemblerARM::ma_mov(Imm32 imm, Register dest, Assembler::Condition c) { // Try mov with Imm8 operand. Imm8 imm8 = Imm8(imm.value); - if (!imm8.invalid) { + if (!imm8.invalid()) { as_alu(dest, InvalidReg, imm8, OpMov, LeaveCC, c); return; } // Try mvn with Imm8 operand. Imm8 negImm8 = Imm8(~imm.value); - if (!negImm8.invalid) { + if (!negImm8.invalid()) { as_alu(dest, InvalidReg, negImm8, OpMvn, LeaveCC, c); return; } // Try movw/movt. if (HasMOVWT()) { // ARMv7 supports movw/movt. movw zero-extends its 16 bit argument, // so we can set the register this way. movt leaves the bottom 16 @@ -769,17 +768,17 @@ MacroAssemblerARM::ma_cmp(Register src1, ma_alu(src1, imm, InvalidReg, scratch, OpCmp, SetCC, c); } void MacroAssemblerARM::ma_cmp(Register src1, ImmTag tag, Condition c) { // ImmTag comparisons can always be done without use of a scratch register. Imm8 negtag = Imm8(-tag.value); - MOZ_ASSERT(!negtag.invalid); + MOZ_ASSERT(!negtag.invalid()); as_cmn(src1, negtag, c); } void MacroAssemblerARM::ma_cmp(Register src1, ImmWord ptr, AutoRegisterScope& scratch, Condition c) { ma_cmp(src1, Imm32(ptr.value), scratch, c); } @@ -790,21 +789,21 @@ MacroAssemblerARM::ma_cmp(Register src1, ma_mov(ptr, scratch); ma_cmp(src1, scratch, c); } void MacroAssemblerARM::ma_cmp(Register src1, Operand op, AutoRegisterScope& scratch, AutoRegisterScope& scratch2, Condition c) { - switch (op.getTag()) { - case Operand::OP2: + switch (op.tag()) { + case Operand::Tag::OP2: as_cmp(src1, op.toOp2(), c); break; - case Operand::MEM: + case Operand::Tag::MEM: ma_ldr(op.toAddress(), scratch, scratch2); as_cmp(src1, O2Reg(scratch), c); break; default: MOZ_CRASH("trying to compare FP and integer registers"); } } @@ -1204,43 +1203,43 @@ MacroAssemblerARM::ma_dataTransferN(Load // At this point, both off - bottom and off + neg_bottom will be // reasonable-ish quantities. // // Note a neg_bottom of 0x1000 can not be encoded as an immediate // negative offset in the instruction and this occurs when bottom is // zero, so this case is guarded against below. if (off < 0) { Operand2 sub_off = Imm8(-(off - bottom)); // sub_off = bottom - off - if (!sub_off.invalid) { + if (!sub_off.invalid()) { // - sub_off = off - bottom as_sub(scratch, rn, sub_off, LeaveCC, cc); return as_dtr(ls, size, Offset, rt, DTRAddr(scratch, DtrOffImm(bottom)), cc); } // sub_off = -neg_bottom - off sub_off = Imm8(-(off + neg_bottom)); - if (!sub_off.invalid && bottom != 0) { + if (!sub_off.invalid() && bottom != 0) { // Guarded against by: bottom != 0 MOZ_ASSERT(neg_bottom < 0x1000); // - sub_off = neg_bottom + off as_sub(scratch, rn, sub_off, LeaveCC, cc); return as_dtr(ls, size, Offset, rt, DTRAddr(scratch, DtrOffImm(-neg_bottom)), cc); } } else { // sub_off = off - bottom Operand2 sub_off = Imm8(off - bottom); - if (!sub_off.invalid) { + if (!sub_off.invalid()) { // sub_off = off - bottom as_add(scratch, rn, sub_off, LeaveCC, cc); return as_dtr(ls, size, Offset, rt, DTRAddr(scratch, DtrOffImm(bottom)), cc); } // sub_off = neg_bottom + off sub_off = Imm8(off + neg_bottom); - if (!sub_off.invalid && bottom != 0) { + if (!sub_off.invalid() && bottom != 0) { // Guarded against by: bottom != 0 MOZ_ASSERT(neg_bottom < 0x1000); // sub_off = neg_bottom + off as_add(scratch, rn, sub_off, LeaveCC, cc); return as_dtr(ls, size, Offset, rt, DTRAddr(scratch, DtrOffImm(-neg_bottom)), cc); } } @@ -1259,47 +1258,47 @@ MacroAssemblerARM::ma_dataTransferN(Load // reasonable-ish quantities. // // Note a neg_bottom of 0x100 can not be encoded as an immediate // negative offset in the instruction and this occurs when bottom is // zero, so this case is guarded against below. if (off < 0) { // sub_off = bottom - off Operand2 sub_off = Imm8(-(off - bottom)); - if (!sub_off.invalid) { + if (!sub_off.invalid()) { // - sub_off = off - bottom as_sub(scratch, rn, sub_off, LeaveCC, cc); return as_extdtr(ls, size, IsSigned, Offset, rt, EDtrAddr(scratch, EDtrOffImm(bottom)), cc); } // sub_off = -neg_bottom - off sub_off = Imm8(-(off + neg_bottom)); - if (!sub_off.invalid && bottom != 0) { + if (!sub_off.invalid() && bottom != 0) { // Guarded against by: bottom != 0 MOZ_ASSERT(neg_bottom < 0x100); // - sub_off = neg_bottom + off as_sub(scratch, rn, sub_off, LeaveCC, cc); return as_extdtr(ls, size, IsSigned, Offset, rt, EDtrAddr(scratch, EDtrOffImm(-neg_bottom)), cc); } } else { // sub_off = off - bottom Operand2 sub_off = Imm8(off - bottom); - if (!sub_off.invalid) { + if (!sub_off.invalid()) { // sub_off = off - bottom as_add(scratch, rn, sub_off, LeaveCC, cc); return as_extdtr(ls, size, IsSigned, Offset, rt, EDtrAddr(scratch, EDtrOffImm(bottom)), cc); } // sub_off = neg_bottom + off sub_off = Imm8(off + neg_bottom); - if (!sub_off.invalid && bottom != 0) { + if (!sub_off.invalid() && bottom != 0) { // Guarded against by: bottom != 0 MOZ_ASSERT(neg_bottom < 0x100); // sub_off = neg_bottom + off as_add(scratch, rn, sub_off, LeaveCC, cc); return as_extdtr(ls, size, IsSigned, Offset, rt, EDtrAddr(scratch, EDtrOffImm(-neg_bottom)), cc); } @@ -1720,41 +1719,41 @@ MacroAssemblerARM::ma_vdtr(LoadStore ls, // reasonable-ish quantities. // // Note a neg_bottom of 0x400 can not be encoded as an immediate negative // offset in the instruction and this occurs when bottom is zero, so this // case is guarded against below. if (off < 0) { // sub_off = bottom - off Operand2 sub_off = Imm8(-(off - bottom)); - if (!sub_off.invalid) { + if (!sub_off.invalid()) { // - sub_off = off - bottom as_sub(scratch, base, sub_off, LeaveCC, cc); return as_vdtr(ls, rt, VFPAddr(scratch, VFPOffImm(bottom)), cc); } // sub_off = -neg_bottom - off sub_off = Imm8(-(off + neg_bottom)); - if (!sub_off.invalid && bottom != 0) { + if (!sub_off.invalid() && bottom != 0) { // Guarded against by: bottom != 0 MOZ_ASSERT(neg_bottom < 0x400); // - sub_off = neg_bottom + off as_sub(scratch, base, sub_off, LeaveCC, cc); return as_vdtr(ls, rt, VFPAddr(scratch, VFPOffImm(-neg_bottom)), cc); } } else { // sub_off = off - bottom Operand2 sub_off = Imm8(off - bottom); - if (!sub_off.invalid) { + if (!sub_off.invalid()) { // sub_off = off - bottom as_add(scratch, base, sub_off, LeaveCC, cc); return as_vdtr(ls, rt, VFPAddr(scratch, VFPOffImm(bottom)), cc); } // sub_off = neg_bottom + off sub_off = Imm8(off + neg_bottom); - if (!sub_off.invalid && bottom != 0) { + if (!sub_off.invalid() && bottom != 0) { // Guarded against by: bottom != 0 MOZ_ASSERT(neg_bottom < 0x400); // sub_off = neg_bottom + off as_add(scratch, base, sub_off, LeaveCC, cc); return as_vdtr(ls, rt, VFPAddr(scratch, VFPOffImm(-neg_bottom)), cc); } }
--- a/js/src/jit/mips-shared/Assembler-mips-shared.h +++ b/js/src/jit/mips-shared/Assembler-mips-shared.h @@ -489,17 +489,17 @@ class BOffImm16 explicit BOffImm16(int offset) : data ((offset - 4) >> 2 & Imm16Mask) { MOZ_ASSERT((offset & 0x3) == 0); MOZ_ASSERT(IsInRange(offset)); } static bool IsInRange(int offset) { - if ((offset - 4) < (INT16_MIN << 2)) + if ((offset - 4) < int(unsigned(INT16_MIN) << 2)) return false; if ((offset - 4) > (INT16_MAX << 2)) return false; return true; } static const uint32_t INVALID = 0x00020000; BOffImm16() : data(INVALID) @@ -631,17 +631,17 @@ class GSImm13 } int32_t decodeSigned() { return value; } uint32_t decodeUnsigned() { return value; } static bool IsInRange(int32_t imm) { - return imm >= (-256 << 4) && imm <= (255 << 4); + return imm >= int32_t(uint32_t(-256) << 4) && imm <= (255 << 4); } }; class Operand { public: enum Tag { REG,
--- a/js/src/jit/mips32/Simulator-mips32.cpp +++ b/js/src/jit/mips32/Simulator-mips32.cpp @@ -1611,130 +1611,130 @@ Simulator::get_pc() const // executed in the simulator. Since the host is typically IA32 we will not // get the correct MIPS-like behaviour on unaligned accesses. int Simulator::readW(uint32_t addr, SimInstruction* instr) { if (addr < 0x400) { // This has to be a NULL-dereference, drop into debugger. - printf("Memory read from bad address: 0x%08x, pc=0x%08x\n", + printf("Memory read from bad address: 0x%08x, pc=0x%08" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } if ((addr & kPointerAlignmentMask) == 0) { intptr_t* ptr = reinterpret_cast<intptr_t*>(addr); return *ptr; } - printf("Unaligned read at 0x%08x, pc=0x%08x\n", + printf("Unaligned read at 0x%08x, pc=0x%08" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); return 0; } void Simulator::writeW(uint32_t addr, int value, SimInstruction* instr) { if (addr < 0x400) { // This has to be a NULL-dereference, drop into debugger. - printf("Memory write to bad address: 0x%08x, pc=0x%08x\n", + printf("Memory write to bad address: 0x%08x, pc=0x%08" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } if ((addr & kPointerAlignmentMask) == 0) { intptr_t* ptr = reinterpret_cast<intptr_t*>(addr); *ptr = value; return; } - printf("Unaligned write at 0x%08x, pc=0x%08x\n", + printf("Unaligned write at 0x%08x, pc=0x%08" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } double Simulator::readD(uint32_t addr, SimInstruction* instr) { if ((addr & kDoubleAlignmentMask) == 0) { double* ptr = reinterpret_cast<double*>(addr); return *ptr; } - printf("Unaligned (double) read at 0x%08x, pc=0x%08x\n", + printf("Unaligned (double) read at 0x%08x, pc=0x%08" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); return 0; } void Simulator::writeD(uint32_t addr, double value, SimInstruction* instr) { if ((addr & kDoubleAlignmentMask) == 0) { double* ptr = reinterpret_cast<double*>(addr); *ptr = value; return; } - printf("Unaligned (double) write at 0x%08x, pc=0x%08x\n", + printf("Unaligned (double) write at 0x%08x, pc=0x%08" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } uint16_t Simulator::readHU(uint32_t addr, SimInstruction* instr) { if ((addr & 1) == 0) { uint16_t* ptr = reinterpret_cast<uint16_t*>(addr); return *ptr; } - printf("Unaligned unsigned halfword read at 0x%08x, pc=0x%08x\n", + printf("Unaligned unsigned halfword read at 0x%08x, pc=0x%08" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); return 0; } int16_t Simulator::readH(uint32_t addr, SimInstruction* instr) { if ((addr & 1) == 0) { int16_t* ptr = reinterpret_cast<int16_t*>(addr); return *ptr; } - printf("Unaligned signed halfword read at 0x%08x, pc=0x%08x\n", + printf("Unaligned signed halfword read at 0x%08x, pc=0x%08" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); return 0; } void Simulator::writeH(uint32_t addr, uint16_t value, SimInstruction* instr) { if ((addr & 1) == 0) { uint16_t* ptr = reinterpret_cast<uint16_t*>(addr); *ptr = value; return; } - printf("Unaligned unsigned halfword write at 0x%08x, pc=0x%08x\n", + printf("Unaligned unsigned halfword write at 0x%08x, pc=0x%08" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } void Simulator::writeH(uint32_t addr, int16_t value, SimInstruction* instr) { if ((addr & 1) == 0) { int16_t* ptr = reinterpret_cast<int16_t*>(addr); *ptr = value; return; } - printf("Unaligned halfword write at 0x%08x, pc=0x%08x\n", + printf("Unaligned halfword write at 0x%08x, pc=0x%08" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } uint32_t Simulator::readBU(uint32_t addr) { @@ -1789,17 +1789,17 @@ Simulator::overRecursedWithExtra(uint32_ uintptr_t newsp = getRegister(sp) - extra; return newsp <= stackLimit(); } // Unsupported instructions use format to print an error and stop execution. void Simulator::format(SimInstruction* instr, const char* format) { - printf("Simulator found unsupported instruction:\n 0x%08x: %s\n", + printf("Simulator found unsupported instruction:\n 0x%08" PRIxPTR ": %s\n", reinterpret_cast<intptr_t>(instr), format); MOZ_CRASH(); } // Note: With the code below we assume that all runtime calls return a 64 bits // result. If they don't, the v1 result register contains a bogus value, which // is fine because it is caller-saved. typedef int64_t (*Prototype_General0)();
--- a/js/src/jit/mips64/MacroAssembler-mips64-inl.h +++ b/js/src/jit/mips64/MacroAssembler-mips64-inl.h @@ -405,16 +405,18 @@ MacroAssembler::rotateRight64(Register c template <typename T1, typename T2> void MacroAssembler::cmpPtrSet(Condition cond, T1 lhs, T2 rhs, Register dest) { ma_cmp_set(dest, lhs, rhs, cond); } +// Also see below for specializations of cmpPtrSet. + template <typename T1, typename T2> void MacroAssembler::cmp32Set(Condition cond, T1 lhs, T2 rhs, Register dest) { ma_cmp_set(dest, lhs, rhs, cond); } // =============================================================== @@ -706,16 +708,47 @@ MacroAssembler::wasmPatchBoundsCheck(uin { // Replace with new value Assembler::UpdateLoad64Value((Instruction*) patchAt, limit); } //}}} check_macroassembler_style // =============================================================== +// The specializations for cmpPtrSet are outside the braces because check_macroassembler_style can't yet +// deal with specializations. + +template<> +inline void +MacroAssembler::cmpPtrSet(Assembler::Condition cond, Address lhs, ImmPtr rhs, + Register dest) +{ + loadPtr(lhs, ScratchRegister); + movePtr(rhs, SecondScratchReg); + cmpPtrSet(cond, ScratchRegister, SecondScratchReg, dest); +} + +template<> +inline void +MacroAssembler::cmpPtrSet(Assembler::Condition cond, Register lhs, Address rhs, + Register dest) +{ + loadPtr(rhs, ScratchRegister); + cmpPtrSet(cond, lhs, ScratchRegister, dest); +} + +template<> +inline void +MacroAssembler::cmp32Set(Assembler::Condition cond, Register lhs, Address rhs, + Register dest) +{ + load32(rhs, ScratchRegister); + cmp32Set(cond, lhs, ScratchRegister, dest); +} + void MacroAssemblerMIPS64Compat::incrementInt32Value(const Address& addr) { asMasm().add32(Imm32(1), addr); } void MacroAssemblerMIPS64Compat::computeEffectiveAddress(const BaseIndex& address, Register dest)
--- a/js/src/jit/mips64/MacroAssembler-mips64.cpp +++ b/js/src/jit/mips64/MacroAssembler-mips64.cpp @@ -1977,41 +1977,16 @@ MacroAssemblerMIPS64Compat::ensureDouble bind(&isDouble); unboxDouble(source, dest); bind(&done); } void -MacroAssemblerMIPS64Compat::cmpPtrSet(Assembler::Condition cond, Address lhs, ImmPtr rhs, - Register dest) -{ - loadPtr(lhs, ScratchRegister); - movePtr(rhs, SecondScratchReg); - cmpPtrSet(cond, ScratchRegister, SecondScratchReg, dest); -} - -void -MacroAssemblerMIPS64Compat::cmpPtrSet(Assembler::Condition cond, Register lhs, Address rhs, - Register dest) -{ - loadPtr(rhs, ScratchRegister); - cmpPtrSet(cond, lhs, ScratchRegister, dest); -} - -void -MacroAssemblerMIPS64Compat::cmp32Set(Assembler::Condition cond, Register lhs, Address rhs, - Register dest) -{ - load32(rhs, ScratchRegister); - cmp32Set(cond, lhs, ScratchRegister, dest); -} - -void MacroAssemblerMIPS64Compat::checkStackAlignment() { #ifdef DEBUG Label aligned; as_andi(ScratchRegister, sp, ABIStackAlignment - 1); ma_b(ScratchRegister, zero, &aligned, Equal, ShortJump); as_break(BREAK_STACK_UNALIGNED); bind(&aligned);
--- a/js/src/jit/mips64/Simulator-mips64.cpp +++ b/js/src/jit/mips64/Simulator-mips64.cpp @@ -26,16 +26,17 @@ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "jit/mips64/Simulator-mips64.h" #include "mozilla/Casting.h" #include "mozilla/FloatingPoint.h" +#include "mozilla/IntegerPrintfMacros.h" #include "mozilla/Likely.h" #include "mozilla/MathAlgorithms.h" #include <float.h> #include "jit/mips64/Assembler-mips64.h" #include "threading/LockGuard.h" #include "vm/Runtime.h" @@ -567,18 +568,18 @@ Simulator::Create(JSContext* cx) return nullptr; } if (getenv("MIPS_SIM_ICACHE_CHECKS")) Simulator::ICacheCheckingEnabled = true; int64_t stopAt; char* stopAtStr = getenv("MIPS_SIM_STOP_AT"); - if (stopAtStr && sscanf(stopAtStr, "%ld", &stopAt) == 1) { - fprintf(stderr, "\nStopping simulation at icount %ld\n", stopAt); + if (stopAtStr && sscanf(stopAtStr, "%" PRIi64, &stopAt) == 1) { + fprintf(stderr, "\nStopping simulation at icount %" PRIi64 "\n", stopAt); Simulator::StopSimAt = stopAt; } return sim; } void Simulator::Destroy(Simulator* sim) @@ -680,18 +681,18 @@ MipsDebugger::getValue(const char* desc, { Register reg = Register::FromName(desc); if (reg != InvalidReg) { *value = getRegisterValue(reg.code()); return true; } if (strncmp(desc, "0x", 2) == 0) - return sscanf(desc, "%lx", reinterpret_cast<uint64_t*>(value)) == 1; - return sscanf(desc, "%li", value) == 1; + return sscanf(desc, "%" PRIu64, reinterpret_cast<uint64_t*>(value)) == 1; + return sscanf(desc, "%" PRIi64, value) == 1; } bool MipsDebugger::setBreakpoint(SimInstruction* breakpc) { // Check if a breakpoint can be set. If not return without any side-effects. if (sim_->break_pc_ != nullptr) return false; @@ -731,40 +732,40 @@ MipsDebugger::redoBreakpoints() } void MipsDebugger::printAllRegs() { int64_t value; for (uint32_t i = 0; i < Registers::Total; i++) { value = getRegisterValue(i); - printf("%3s: 0x%016lx %20ld ", Registers::GetName(i), value, value); + printf("%3s: 0x%016" PRIx64 " %20" PRIi64 " ", Registers::GetName(i), value, value); if (i % 2) printf("\n"); } printf("\n"); value = getRegisterValue(Simulator::LO); - printf(" LO: 0x%016lx %20ld ", value, value); + printf(" LO: 0x%016" PRIx64 " %20" PRIi64 " ", value, value); value = getRegisterValue(Simulator::HI); - printf(" HI: 0x%016lx %20ld\n", value, value); + printf(" HI: 0x%016" PRIx64 " %20" PRIi64 "\n", value, value); value = getRegisterValue(Simulator::pc); - printf(" pc: 0x%016lx\n", value); + printf(" pc: 0x%016" PRIx64 "\n", value); } void MipsDebugger::printAllRegsIncludingFPU() { printAllRegs(); printf("\n\n"); // f0, f1, f2, ... f31. for (uint32_t i = 0; i < FloatRegisters::TotalPhys; i++) { - printf("%3s: 0x%016lx\tflt: %-8.4g\tdbl: %-16.4g\n", + printf("%3s: 0x%016" PRIi64 "\tflt: %-8.4g\tdbl: %-16.4g\n", FloatRegisters::GetName(i), getFPURegisterValueLong(i), getFPURegisterValueFloat(i), getFPURegisterValueDouble(i)); } } static char* @@ -902,19 +903,19 @@ MipsDebugger::debug() printAllRegs(); } else if (strcmp(arg1, "allf") == 0) { printAllRegsIncludingFPU(); } else { Register reg = Register::FromName(arg1); FloatRegisters::Encoding fReg = FloatRegisters::FromName(arg1); if (reg != InvalidReg) { value = getRegisterValue(reg.code()); - printf("%s: 0x%016lx %20ld \n", arg1, value, value); + printf("%s: 0x%016" PRIi64 " %20" PRIi64 " \n", arg1, value, value); } else if (fReg != FloatRegisters::Invalid) { - printf("%3s: 0x%016lx\tflt: %-8.4g\tdbl: %-16.4g\n", + printf("%3s: 0x%016" PRIi64 "\tflt: %-8.4g\tdbl: %-16.4g\n", FloatRegisters::GetName(fReg), getFPURegisterValueLong(fReg), getFPURegisterValueFloat(fReg), getFPURegisterValueDouble(fReg)); } else { printf("%s unrecognized\n", arg1); } } @@ -944,17 +945,17 @@ MipsDebugger::debug() } else { if (!getValue(argv[next_arg], &words)) { words = 10; } } end = cur + words; while (cur < end) { - printf(" %p: 0x%016lx %20ld", cur, *cur, *cur); + printf(" %p: 0x%016" PRIx64 " %20" PRIi64, cur, *cur, *cur); printf("\n"); cur++; } } else if ((strcmp(cmd, "disasm") == 0) || (strcmp(cmd, "dpc") == 0) || (strcmp(cmd, "di") == 0)) { uint8_t* cur = nullptr; @@ -1633,197 +1634,197 @@ Simulator::writeB(uint64_t addr, int8_t uint16_t Simulator::readHU(uint64_t addr, SimInstruction* instr) { if ((addr & 1) == 0) { uint16_t* ptr = reinterpret_cast<uint16_t*>(addr); return *ptr; } - printf("Unaligned unsigned halfword read at 0x%016lx, pc=0x%016lx\n", + printf("Unaligned unsigned halfword read at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); return 0; } int16_t Simulator::readH(uint64_t addr, SimInstruction* instr) { if ((addr & 1) == 0) { int16_t* ptr = reinterpret_cast<int16_t*>(addr); return *ptr; } - printf("Unaligned signed halfword read at 0x%016lx, pc=0x%016lx\n", + printf("Unaligned signed halfword read at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); return 0; } void Simulator::writeH(uint64_t addr, uint16_t value, SimInstruction* instr) { if ((addr & 1) == 0) { uint16_t* ptr = reinterpret_cast<uint16_t*>(addr); *ptr = value; return; } - printf("Unaligned unsigned halfword write at 0x%016lx, pc=0x%016lx\n", + printf("Unaligned unsigned halfword write at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } void Simulator::writeH(uint64_t addr, int16_t value, SimInstruction* instr) { if ((addr & 1) == 0) { int16_t* ptr = reinterpret_cast<int16_t*>(addr); *ptr = value; return; } - printf("Unaligned halfword write at 0x%016lx, pc=0x%016lx\n", + printf("Unaligned halfword write at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } uint32_t Simulator::readWU(uint64_t addr, SimInstruction* instr) { if (addr < 0x400) { // This has to be a NULL-dereference, drop into debugger. - printf("Memory read from bad address: 0x%016lx, pc=0x%016lx\n", + printf("Memory read from bad address: 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } if ((addr & 3) == 0) { uint32_t* ptr = reinterpret_cast<uint32_t*>(addr); return *ptr; } - printf("Unaligned read at 0x%016lx, pc=0x%016lx\n", + printf("Unaligned read at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); return 0; } int32_t Simulator::readW(uint64_t addr, SimInstruction* instr) { if (addr < 0x400) { // This has to be a NULL-dereference, drop into debugger. - printf("Memory read from bad address: 0x%016lx, pc=0x%016lx\n", + printf("Memory read from bad address: 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } if ((addr & 3) == 0) { int32_t* ptr = reinterpret_cast<int32_t*>(addr); return *ptr; } - printf("Unaligned read at 0x%016lx, pc=0x%016lx\n", + printf("Unaligned read at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); return 0; } void Simulator::writeW(uint64_t addr, uint32_t value, SimInstruction* instr) { if (addr < 0x400) { // This has to be a NULL-dereference, drop into debugger. - printf("Memory write to bad address: 0x%016lx, pc=0x%016lx\n", + printf("Memory write to bad address: 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } if ((addr & 3) == 0) { uint32_t* ptr = reinterpret_cast<uint32_t*>(addr); *ptr = value; return; } - printf("Unaligned write at 0x%016lx, pc=0x%016lx\n", + printf("Unaligned write at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } void Simulator::writeW(uint64_t addr, int32_t value, SimInstruction* instr) { if (addr < 0x400) { // This has to be a NULL-dereference, drop into debugger. - printf("Memory write to bad address: 0x%016lx, pc=0x%016lx\n", + printf("Memory write to bad address: 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } if ((addr & 3) == 0) { int32_t* ptr = reinterpret_cast<int32_t*>(addr); *ptr = value; return; } - printf("Unaligned write at 0x%016lx, pc=0x%016lx\n", + printf("Unaligned write at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } int64_t Simulator::readDW(uint64_t addr, SimInstruction* instr) { if (addr < 0x400) { // This has to be a NULL-dereference, drop into debugger. - printf("Memory read from bad address: 0x%016lx, pc=0x%016lx\n", + printf("Memory read from bad address: 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } if ((addr & kPointerAlignmentMask) == 0) { int64_t* ptr = reinterpret_cast<int64_t*>(addr); return* ptr; } - printf("Unaligned read at 0x%016lx, pc=0x%016lx\n", + printf("Unaligned read at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); return 0; } void Simulator::writeDW(uint64_t addr, int64_t value, SimInstruction* instr) { if (addr < 0x400) { // This has to be a NULL-dereference, drop into debugger. - printf("Memory write to bad address: 0x%016lx, pc=0x%016lx\n", + printf("Memory write to bad address: 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } if ((addr & kPointerAlignmentMask) == 0) { int64_t* ptr = reinterpret_cast<int64_t*>(addr); *ptr = value; return; } - printf("Unaligned write at 0x%016lx, pc=0x%016lx\n", + printf("Unaligned write at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } double Simulator::readD(uint64_t addr, SimInstruction* instr) { if ((addr & kDoubleAlignmentMask) == 0) { double* ptr = reinterpret_cast<double*>(addr); return *ptr; } - printf("Unaligned (double) read at 0x%016lx, pc=0x%016lx\n", + printf("Unaligned (double) read at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); return 0; } void Simulator::writeD(uint64_t addr, double value, SimInstruction* instr) { if ((addr & kDoubleAlignmentMask) == 0) { double* ptr = reinterpret_cast<double*>(addr); *ptr = value; return; } - printf("Unaligned (double) write at 0x%016lx, pc=0x%016lx\n", + printf("Unaligned (double) write at 0x%016" PRIx64 ", pc=0x%016" PRIxPTR "\n", addr, reinterpret_cast<intptr_t>(instr)); MOZ_CRASH(); } uintptr_t Simulator::stackLimit() const { return stackLimit_; @@ -2116,17 +2117,17 @@ Simulator::isWatchpoint(uint32_t code) return (code <= kMaxWatchpointCode); } void Simulator::printWatchpoint(uint32_t code) { MipsDebugger dbg(this); ++break_count_; - printf("\n---- break %d marker: %20ld (instr count: %20ld) ----\n", + printf("\n---- break %d marker: %20" PRIi64 " (instr count: %20" PRIi64 ") ----\n", code, break_count_, icount_); dbg.printAllRegs(); // Print registers and continue running. } void Simulator::handleStop(uint32_t code, SimInstruction* instr) { // Stop if it is enabled, otherwise go on jumping over the stop
--- a/js/src/jit/mips64/Trampoline-mips64.cpp +++ b/js/src/jit/mips64/Trampoline-mips64.cpp @@ -458,17 +458,17 @@ JitRuntime::generateArgumentsRectifier(J // arguments to push to the stack. Then we push a JitFrameLayout. We // compute the padding expressed in the number of extra |undefined| values // to push on the stack. static_assert(sizeof(JitFrameLayout) % JitStackAlignment == 0, "No need to consider the JitFrameLayout for aligning the stack"); static_assert(JitStackAlignment % sizeof(Value) == 0, "Ensure that we can pad the stack by pushing extra UndefinedValue"); - MOZ_ASSERT(IsPowerOfTwo(JitStackValueAlignment)); + MOZ_ASSERT(mozilla::IsPowerOfTwo(JitStackValueAlignment)); masm.add32(Imm32(JitStackValueAlignment - 1 /* for padding */ + 1 /* for |this| */), numArgsReg); masm.add32(t2, numArgsReg); masm.and32(Imm32(~(JitStackValueAlignment - 1)), numArgsReg); // Load the number of |undefined|s to push into t1. masm.as_dsubu(t1, numArgsReg, s3); // Caller:
--- a/js/src/jit/shared/Lowering-shared-inl.h +++ b/js/src/jit/shared/Lowering-shared-inl.h @@ -834,12 +834,25 @@ LIRGeneratorShared::useInt64OrConstant(M return LInt64Allocation(LAllocation(mir->toConstant()), LAllocation()); #else return LInt64Allocation(LAllocation(mir->toConstant())); #endif } return useInt64(mir, useAtStart); } +LInt64Allocation +LIRGeneratorShared::useInt64RegisterOrConstant(MDefinition* mir, bool useAtStart) +{ + if (mir->isConstant()) { +#if defined(JS_NUNBOX32) + return LInt64Allocation(LAllocation(mir->toConstant()), LAllocation()); +#else + return LInt64Allocation(LAllocation(mir->toConstant())); +#endif + } + return useInt64Register(mir, useAtStart); +} + } // namespace jit } // namespace js #endif /* jit_shared_Lowering_shared_inl_h */
--- a/js/src/jit/shared/Lowering-shared.h +++ b/js/src/jit/shared/Lowering-shared.h @@ -183,21 +183,25 @@ class LIRGeneratorShared : public MDefin inline LBoxAllocation useBoxOrTypedOrConstant(MDefinition* mir, bool useConstant); // Returns an int64 allocation for an Int64-typed instruction. inline LInt64Allocation useInt64(MDefinition* mir, LUse::Policy policy, bool useAtStart); inline LInt64Allocation useInt64(MDefinition* mir, bool useAtStart = false); inline LInt64Allocation useInt64AtStart(MDefinition* mir); inline LInt64Allocation useInt64OrConstant(MDefinition* mir, bool useAtStart = false); inline LInt64Allocation useInt64Register(MDefinition* mir, bool useAtStart = false); + inline LInt64Allocation useInt64RegisterOrConstant(MDefinition* mir, bool useAtStart = false); inline LInt64Allocation useInt64Fixed(MDefinition* mir, Register64 regs, bool useAtStart = false); LInt64Allocation useInt64RegisterAtStart(MDefinition* mir) { return useInt64Register(mir, /* useAtStart = */ true); } + LInt64Allocation useInt64RegisterOrConstantAtStart(MDefinition* mir) { + return useInt64RegisterOrConstant(mir, /* useAtStart = */ true); + } LInt64Allocation useInt64OrConstantAtStart(MDefinition* mir) { return useInt64OrConstant(mir, /* useAtStart = */ true); } // Rather than defining a new virtual register, sets |ins| to have the same // virtual register as |as|. inline void redefine(MDefinition* ins, MDefinition* as);
--- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -3888,17 +3888,17 @@ JS::CompileOptions::CompileOptions(JSCon { this->version = (version != JSVERSION_UNKNOWN) ? version : cx->findVersion(); strictOption = cx->options().strictMode(); extraWarningsOption = cx->compartment()->behaviors().extraWarnings(cx); werrorOption = cx->options().werror(); if (!cx->options().asmJS()) asmJSOption = AsmJSOption::Disabled; - else if (cx->compartment()->debuggerObservesWasm()) + else if (cx->compartment()->debuggerObservesAsmJS()) asmJSOption = AsmJSOption::DisabledByDebugger; else asmJSOption = AsmJSOption::Enabled; throwOnAsmJSValidationFailureOption = cx->options().throwOnAsmJSValidationFailure(); } static bool Compile(JSContext* cx, const ReadOnlyCompileOptions& options, ScopeKind scopeKind,
--- a/js/src/jscompartment.cpp +++ b/js/src/jscompartment.cpp @@ -1083,17 +1083,17 @@ JSCompartment::ensureDelazifyScriptsForD } void JSCompartment::updateDebuggerObservesFlag(unsigned flag) { MOZ_ASSERT(isDebuggee()); MOZ_ASSERT(flag == DebuggerObservesAllExecution || flag == DebuggerObservesCoverage || - flag == DebuggerObservesWasm); + flag == DebuggerObservesAsmJS); GlobalObject* global = zone()->runtimeFromMainThread()->gc.isForegroundSweeping() ? unsafeUnbarrieredMaybeGlobal() : maybeGlobal(); const GlobalObject::DebuggerVector* v = global->getDebuggers(); for (auto p = v->begin(); p != v->end(); p++) { Debugger* dbg = *p; if (flag == DebuggerObservesAllExecution ? dbg->observesAllExecution() :
--- a/js/src/jscompartment.h +++ b/js/src/jscompartment.h @@ -551,28 +551,28 @@ struct JSCompartment * slot for the former, or a special slot for the latter. */ JSObject* gcIncomingGrayPointers; private: enum { IsDebuggee = 1 << 0, DebuggerObservesAllExecution = 1 << 1, - DebuggerObservesWasm = 1 << 2, + DebuggerObservesAsmJS = 1 << 2, DebuggerObservesCoverage = 1 << 3, DebuggerNeedsDelazification = 1 << 4 }; unsigned debugModeBits; friend class AutoRestoreCompartmentDebugMode; static const unsigned DebuggerObservesMask = IsDebuggee | DebuggerObservesAllExecution | DebuggerObservesCoverage | - DebuggerObservesWasm; + DebuggerObservesAsmJS; void updateDebuggerObservesFlag(unsigned flag); bool getNonWrapperObjectForCurrentCompartment(JSContext* cx, js::MutableHandleObject obj); bool getOrCreateWrapper(JSContext* cx, js::HandleObject existing, js::MutableHandleObject obj); public: JSCompartment(JS::Zone* zone, const JS::CompartmentOptions& options); @@ -704,17 +704,17 @@ struct JSCompartment // invariants of JSCompartment's debug mode bits, JSScript::isDebuggee, // InterpreterFrame::isDebuggee, and BaselineFrame::isDebuggee are // enumerated below. // // 1. When a compartment's isDebuggee() == true, relazification and lazy // parsing are disabled. // // Whether AOT wasm is disabled is togglable by the Debugger API. By - // default it is disabled. See debuggerObservesWasm below. + // default it is disabled. See debuggerObservesAsmJS below. // // 2. When a compartment's debuggerObservesAllExecution() == true, all of // the compartment's scripts are considered debuggee scripts. // // 3. A script is considered a debuggee script either when, per above, its // compartment is observing all execution, or if it has breakpoints set. // // 4. A debuggee script always pushes a debuggee frame. @@ -753,22 +753,22 @@ struct JSCompartment } // True if this compartment's global is a debuggee of some Debugger object // whose allowUnobservedAsmJS flag is false. // // Note that since AOT wasm functions cannot bail out, this flag really // means "observe wasm from this point forward". We cannot make // already-compiled wasm code observable to Debugger. - bool debuggerObservesWasm() const { - static const unsigned Mask = IsDebuggee | DebuggerObservesWasm; + bool debuggerObservesAsmJS() const { + static const unsigned Mask = IsDebuggee | DebuggerObservesAsmJS; return (debugModeBits & Mask) == Mask; } - void updateDebuggerObservesWasm() { - updateDebuggerObservesFlag(DebuggerObservesWasm); + void updateDebuggerObservesAsmJS() { + updateDebuggerObservesFlag(DebuggerObservesAsmJS); } // True if this compartment's global is a debuggee of some Debugger object // whose collectCoverageInfo flag is true. bool debuggerObservesCoverage() const { static const unsigned Mask = DebuggerObservesCoverage; return (debugModeBits & Mask) == Mask; }
--- a/js/src/jsscript.h +++ b/js/src/jsscript.h @@ -1898,27 +1898,28 @@ class LazyScript : public gc::TenuredCel // Add padding so LazyScript is gc::Cell aligned. Make padding protected // instead of private to suppress -Wunused-private-field compiler warnings. protected: #if JS_BITS_PER_WORD == 32 uint32_t padding; #endif private: + static const uint32_t NumClosedOverBindingsBits = 21; + static const uint32_t NumInnerFunctionsBits = 20; + struct PackedView { // Assorted bits that should really be in ScriptSourceObject. uint32_t version : 8; uint32_t shouldDeclareArguments : 1; uint32_t hasThisBinding : 1; uint32_t isAsync : 1; - // The number of bits should match to NumClosedOverBindingsLimit. - uint32_t numClosedOverBindings : 21; - // The number of bits should match to NumInnerFunctionsLimit. - uint32_t numInnerFunctions : 20; + uint32_t numClosedOverBindings : NumClosedOverBindingsBits; + uint32_t numInnerFunctions : NumInnerFunctionsBits; uint32_t generatorKindBits : 2; // N.B. These are booleans but need to be uint32_t to pack correctly on MSVC. // If you add another boolean here, make sure to initialze it in // LazyScript::CreateRaw(). uint32_t strict : 1; uint32_t bindingsAccessedDynamically : 1; @@ -1948,18 +1949,18 @@ class LazyScript : public gc::TenuredCel // Create a LazyScript without initializing the closedOverBindings and the // innerFunctions. To be GC-safe, the caller must initialize both vectors // with valid atoms and functions. static LazyScript* CreateRaw(ExclusiveContext* cx, HandleFunction fun, uint64_t packedData, uint32_t begin, uint32_t end, uint32_t lineno, uint32_t column); public: - static const uint32_t NumClosedOverBindingsLimit = 1 << 21; - static const uint32_t NumInnerFunctionsLimit = 1 << 20; + static const uint32_t NumClosedOverBindingsLimit = 1 << NumClosedOverBindingsBits; + static const uint32_t NumInnerFunctionsLimit = 1 << NumInnerFunctionsBits; // Create a LazyScript and initialize closedOverBindings and innerFunctions // with the provided vectors. static LazyScript* Create(ExclusiveContext* cx, HandleFunction fun, const frontend::AtomVector& closedOverBindings, Handle<GCVector<JSFunction*, 8>> innerFunctions, JSVersion version, uint32_t begin, uint32_t end, uint32_t lineno, uint32_t column);
--- a/js/src/old-configure.in +++ b/js/src/old-configure.in @@ -150,30 +150,31 @@ case "$target" in *-mingw*) if test "$GCC" != "yes"; then # Check to see if we are really running in a msvc environemnt _WIN32_MSVC=1 # Make sure compilers are valid CFLAGS="$CFLAGS -TC -nologo" CXXFLAGS="$CXXFLAGS -TP -nologo" + if test -z "$CLANG_CL"; then + CFLAGS="$CFLAGS -utf-8" + CXXFLAGS="$CXXFLAGS -utf-8" + fi # MSVC warning C4345 warns of newly conformant behavior as of VS2003. # MSVC warning C4351 warns of newly conformant behavior as of VS2005. # MSVC warning C4800 warns when a value is implicitly cast to bool, # because this also forces narrowing to a single byte, which can be a # perf hit. But this matters so little in practice (and often we want # that behavior) that it's better to turn it off. # _CRT_SECURE_NO_WARNINGS disables warnings about using MSVC-specific # secure CRT functions. - # MSVC warning C4819 warns some UTF-8 characters (e.g. copyright sign) - # on non-Western system locales even if it is in a comment. # MSVC warning wd4595 warns non-member operator new or delete functions # may not be declared inline, as of VS2015 Update 2. - CFLAGS="$CFLAGS -wd4819" - CXXFLAGS="$CXXFLAGS -wd4345 -wd4351 -wd4800 -wd4819 -wd4595 -D_CRT_SECURE_NO_WARNINGS" + CXXFLAGS="$CXXFLAGS -wd4345 -wd4351 -wd4800 -wd4595 -D_CRT_SECURE_NO_WARNINGS" AC_LANG_SAVE AC_LANG_C AC_TRY_COMPILE([#include <stdio.h>], [ printf("Hello World\n"); ],, AC_MSG_ERROR([\$(CC) test failed. You must have MS VC++ in your path to build.]) ) AC_LANG_CPLUSPLUS AC_TRY_COMPILE([#include <new.h>],
--- a/js/src/tests/ecma_5/String/string-space-trim.js +++ b/js/src/tests/ecma_5/String/string-space-trim.js @@ -1,16 +1,16 @@ /* Generated by make_unicode.py DO NOT MODIFY */ -/* Unicode version: 6.2.0 */ +/* Unicode version: 9.0.0 */ /* * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ -var onlySpace = String.fromCharCode(0x9, 0xa, 0xb, 0xc, 0xd, 0x20, 0xa0, 0x1680, 0x180e, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x2028, 0x2029, 0x202f, 0x205f, 0x3000, 0xfeff); +var onlySpace = String.fromCharCode(0x9, 0xa, 0xb, 0xc, 0xd, 0x20, 0xa0, 0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200a, 0x2028, 0x2029, 0x202f, 0x205f, 0x3000, 0xfeff); assertEq(onlySpace.trim(), ""); assertEq((onlySpace + 'aaaa').trim(), 'aaaa'); assertEq(('aaaa' + onlySpace).trim(), 'aaaa'); assertEq((onlySpace + 'aaaa' + onlySpace).trim(), 'aaaa'); if (typeof reportCompare === "function") reportCompare(true, true);
--- a/js/src/tests/ecma_5/String/string-upper-lower-mapping.js +++ b/js/src/tests/ecma_5/String/string-upper-lower-mapping.js @@ -1,10 +1,10 @@ /* Generated by make_unicode.py DO NOT MODIFY */ -/* Unicode version: 6.2.0 */ +/* Unicode version: 9.0.0 */ /* * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ var mapping = [ [0x0, 0x0], /* <control> (NULL) */ [0x1, 0x1], /* <control> (START OF HEADING) */ @@ -605,33 +605,33 @@ var mapping = [ [0x186, 0x254], /* LATIN SMALL LETTER OPEN O */ [0x255, 0x255], /* LATIN SMALL LETTER C WITH CURL (LATIN SMALL LETTER C CURL) */ [0x189, 0x256], /* LATIN SMALL LETTER D WITH TAIL (LATIN SMALL LETTER D RETROFLEX HOOK) */ [0x18a, 0x257], /* LATIN SMALL LETTER D WITH HOOK (LATIN SMALL LETTER D HOOK) */ [0x258, 0x258], /* LATIN SMALL LETTER REVERSED E */ [0x18f, 0x259], /* LATIN SMALL LETTER SCHWA */ [0x25a, 0x25a], /* LATIN SMALL LETTER SCHWA WITH HOOK (LATIN SMALL LETTER SCHWA HOOK) */ [0x190, 0x25b], /* LATIN SMALL LETTER OPEN E (LATIN SMALL LETTER EPSILON) */ - [0x25c, 0x25c], /* LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON) */ + [0xa7ab, 0x25c], /* LATIN SMALL LETTER REVERSED OPEN E (LATIN SMALL LETTER REVERSED EPSILON) */ [0x25d, 0x25d], /* LATIN SMALL LETTER REVERSED OPEN E WITH HOOK (LATIN SMALL LETTER REVERSED EPSILON HOOK) */ [0x25e, 0x25e], /* LATIN SMALL LETTER CLOSED REVERSED OPEN E (LATIN SMALL LETTER CLOSED REVERSED EPSILON) */ [0x25f, 0x25f], /* LATIN SMALL LETTER DOTLESS J WITH STROKE (LATIN SMALL LETTER DOTLESS J BAR) */ [0x193, 0x260], /* LATIN SMALL LETTER G WITH HOOK (LATIN SMALL LETTER G HOOK) */ - [0x261, 0x261], /* LATIN SMALL LETTER SCRIPT G */ + [0xa7ac, 0x261], /* LATIN SMALL LETTER SCRIPT G */ [0x262, 0x262], /* LATIN LETTER SMALL CAPITAL G */ [0x194, 0x263], /* LATIN SMALL LETTER GAMMA */ [0x264, 0x264], /* LATIN SMALL LETTER RAMS HORN (LATIN SMALL LETTER BABY GAMMA) */ [0xa78d, 0x265], /* LATIN SMALL LETTER TURNED H */ [0xa7aa, 0x266], /* LATIN SMALL LETTER H WITH HOOK (LATIN SMALL LETTER H HOOK) */ [0x267, 0x267], /* LATIN SMALL LETTER HENG WITH HOOK (LATIN SMALL LETTER HENG HOOK) */ [0x197, 0x268], /* LATIN SMALL LETTER I WITH STROKE (LATIN SMALL LETTER BARRED I) */ [0x196, 0x269], /* LATIN SMALL LETTER IOTA */ - [0x26a, 0x26a], /* LATIN LETTER SMALL CAPITAL I */ + [0xa7ae, 0x26a], /* LATIN LETTER SMALL CAPITAL I */ [0x2c62, 0x26b], /* LATIN SMALL LETTER L WITH MIDDLE TILDE */ - [0x26c, 0x26c], /* LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT) */ + [0xa7ad, 0x26c], /* LATIN SMALL LETTER L WITH BELT (LATIN SMALL LETTER L BELT) */ [0x26d, 0x26d], /* LATIN SMALL LETTER L WITH RETROFLEX HOOK (LATIN SMALL LETTER L RETROFLEX HOOK) */ [0x26e, 0x26e], /* LATIN SMALL LETTER LEZH (LATIN SMALL LETTER L YOGH) */ [0x19c, 0x26f], /* LATIN SMALL LETTER TURNED M */ [0x270, 0x270], /* LATIN SMALL LETTER TURNED M WITH LONG LEG */ [0x2c6e, 0x271], /* LATIN SMALL LETTER M WITH HOOK (LATIN SMALL LETTER M HOOK) */ [0x19d, 0x272], /* LATIN SMALL LETTER N WITH LEFT HOOK (LATIN SMALL LETTER N HOOK) */ [0x273, 0x273], /* LATIN SMALL LETTER N WITH RETROFLEX HOOK (LATIN SMALL LETTER N RETROFLEX HOOK) */ [0x274, 0x274], /* LATIN LETTER SMALL CAPITAL N */ @@ -648,17 +648,17 @@ var mapping = [ [0x27f, 0x27f], /* LATIN SMALL LETTER REVERSED R WITH FISHHOOK (LATIN SMALL LETTER REVERSED FISHHOOK R) */ [0x1a6, 0x280], /* LATIN LETTER SMALL CAPITAL R */ [0x281, 0x281], /* LATIN LETTER SMALL CAPITAL INVERTED R */ [0x282, 0x282], /* LATIN SMALL LETTER S WITH HOOK (LATIN SMALL LETTER S HOOK) */ [0x1a9, 0x283], /* LATIN SMALL LETTER ESH */ [0x284, 0x284], /* LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK (LATIN SMALL LETTER DOTLESS J BAR HOOK) */ [0x285, 0x285], /* LATIN SMALL LETTER SQUAT REVERSED ESH */ [0x286, 0x286], /* LATIN SMALL LETTER ESH WITH CURL (LATIN SMALL LETTER ESH CURL) */ - [0x287, 0x287], /* LATIN SMALL LETTER TURNED T */ + [0xa7b1, 0x287], /* LATIN SMALL LETTER TURNED T */ [0x1ae, 0x288], /* LATIN SMALL LETTER T WITH RETROFLEX HOOK (LATIN SMALL LETTER T RETROFLEX HOOK) */ [0x244, 0x289], /* LATIN SMALL LETTER U BAR */ [0x1b1, 0x28a], /* LATIN SMALL LETTER UPSILON */ [0x1b2, 0x28b], /* LATIN SMALL LETTER V WITH HOOK (LATIN SMALL LETTER SCRIPT V) */ [0x245, 0x28c], /* LATIN SMALL LETTER TURNED V */ [0x28d, 0x28d], /* LATIN SMALL LETTER TURNED W */ [0x28e, 0x28e], /* LATIN SMALL LETTER TURNED Y */ [0x28f, 0x28f], /* LATIN LETTER SMALL CAPITAL Y */ @@ -670,18 +670,18 @@ var mapping = [ [0x295, 0x295], /* LATIN LETTER PHARYNGEAL VOICED FRICATIVE (LATIN LETTER REVERSED GLOTTAL STOP) */ [0x296, 0x296], /* LATIN LETTER INVERTED GLOTTAL STOP */ [0x297, 0x297], /* LATIN LETTER STRETCHED C */ [0x298, 0x298], /* LATIN LETTER BILABIAL CLICK (LATIN LETTER BULLSEYE) */ [0x299, 0x299], /* LATIN LETTER SMALL CAPITAL B */ [0x29a, 0x29a], /* LATIN SMALL LETTER CLOSED OPEN E (LATIN SMALL LETTER CLOSED EPSILON) */ [0x29b, 0x29b], /* LATIN LETTER SMALL CAPITAL G WITH HOOK (LATIN LETTER SMALL CAPITAL G HOOK) */ [0x29c, 0x29c], /* LATIN LETTER SMALL CAPITAL H */ - [0x29d, 0x29d], /* LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J) */ - [0x29e, 0x29e], /* LATIN SMALL LETTER TURNED K */ + [0xa7b2, 0x29d], /* LATIN SMALL LETTER J WITH CROSSED-TAIL (LATIN SMALL LETTER CROSSED-TAIL J) */ + [0xa7b0, 0x29e], /* LATIN SMALL LETTER TURNED K */ [0x29f, 0x29f], /* LATIN LETTER SMALL CAPITAL L */ [0x2a0, 0x2a0], /* LATIN SMALL LETTER Q WITH HOOK (LATIN SMALL LETTER Q HOOK) */ [0x2a1, 0x2a1], /* LATIN LETTER GLOTTAL STOP WITH STROKE (LATIN LETTER GLOTTAL STOP BAR) */ [0x2a2, 0x2a2], /* LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE (LATIN LETTER REVERSED GLOTTAL STOP BAR) */ [0x2a3, 0x2a3], /* LATIN SMALL LETTER DZ DIGRAPH (LATIN SMALL LETTER D Z) */ [0x2a4, 0x2a4], /* LATIN SMALL LETTER DEZH DIGRAPH (LATIN SMALL LETTER D YOGH) */ [0x2a5, 0x2a5], /* LATIN SMALL LETTER DZ DIGRAPH WITH CURL (LATIN SMALL LETTER D Z CURL) */ [0x2a6, 0x2a6], /* LATIN SMALL LETTER TS DIGRAPH (LATIN SMALL LETTER T S) */ @@ -896,17 +896,17 @@ var mapping = [ [0x376, 0x377], /* GREEK SMALL LETTER PAMPHYLIAN DIGAMMA */ [0x378, 0x378], [0x379, 0x379], [0x37a, 0x37a], /* GREEK YPOGEGRAMMENI (GREEK SPACING IOTA BELOW) */ [0x3fd, 0x37b], /* GREEK SMALL REVERSED LUNATE SIGMA SYMBOL */ [0x3fe, 0x37c], /* GREEK SMALL DOTTED LUNATE SIGMA SYMBOL */ [0x3ff, 0x37d], /* GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL */ [0x37e, 0x37e], /* GREEK QUESTION MARK */ - [0x37f, 0x37f], + [0x37f, 0x3f3], /* GREEK CAPITAL LETTER YOT */ [0x380, 0x380], [0x381, 0x381], [0x382, 0x382], [0x383, 0x383], [0x384, 0x384], /* GREEK TONOS (GREEK SPACING TONOS) */ [0x385, 0x385], /* GREEK DIALYTIKA TONOS (GREEK SPACING DIAERESIS TONOS) */ [0x386, 0x3ac], /* GREEK CAPITAL LETTER ALPHA WITH TONOS (GREEK CAPITAL LETTER ALPHA TONOS) */ [0x387, 0x387], /* GREEK ANO TELEIA */ @@ -1012,17 +1012,17 @@ var mapping = [ [0x3ea, 0x3eb], /* COPTIC SMALL LETTER GANGIA (GREEK SMALL LETTER GANGIA) */ [0x3ec, 0x3ed], /* COPTIC CAPITAL LETTER SHIMA (GREEK CAPITAL LETTER SHIMA) */ [0x3ec, 0x3ed], /* COPTIC SMALL LETTER SHIMA (GREEK SMALL LETTER SHIMA) */ [0x3ee, 0x3ef], /* COPTIC CAPITAL LETTER DEI (GREEK CAPITAL LETTER DEI) */ [0x3ee, 0x3ef], /* COPTIC SMALL LETTER DEI (GREEK SMALL LETTER DEI) */ [0x39a, 0x3f0], /* GREEK KAPPA SYMBOL (GREEK SMALL LETTER SCRIPT KAPPA) */ [0x3a1, 0x3f1], /* GREEK RHO SYMBOL (GREEK SMALL LETTER TAILED RHO) */ [0x3f9, 0x3f2], /* GREEK LUNATE SIGMA SYMBOL (GREEK SMALL LETTER LUNATE SIGMA) */ - [0x3f3, 0x3f3], /* GREEK LETTER YOT */ + [0x37f, 0x3f3], /* GREEK LETTER YOT */ [0x3f4, 0x3b8], /* GREEK CAPITAL THETA SYMBOL */ [0x395, 0x3f5], /* GREEK LUNATE EPSILON SYMBOL */ [0x3f6, 0x3f6], /* GREEK REVERSED LUNATE EPSILON SYMBOL */ [0x3f7, 0x3f8], /* GREEK CAPITAL LETTER SHO */ [0x3f7, 0x3f8], /* GREEK SMALL LETTER SHO */ [0x3f9, 0x3f2], /* GREEK CAPITAL LUNATE SIGMA SYMBOL */ [0x3fa, 0x3fb], /* GREEK CAPITAL LETTER SAN */ [0x3fa, 0x3fb], /* GREEK SMALL LETTER SAN */ @@ -1321,24 +1321,24 @@ var mapping = [ [0x520, 0x521], /* CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK */ [0x520, 0x521], /* CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK */ [0x522, 0x523], /* CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK */ [0x522, 0x523], /* CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK */ [0x524, 0x525], /* CYRILLIC CAPITAL LETTER PE WITH DESCENDER */ [0x524, 0x525], /* CYRILLIC SMALL LETTER PE WITH DESCENDER */ [0x526, 0x527], /* CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER */ [0x526, 0x527], /* CYRILLIC SMALL LETTER SHHA WITH DESCENDER */ - [0x528, 0x528], - [0x529, 0x529], - [0x52a, 0x52a], - [0x52b, 0x52b], - [0x52c, 0x52c], - [0x52d, 0x52d], - [0x52e, 0x52e], - [0x52f, 0x52f], + [0x528, 0x529], /* CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK */ + [0x528, 0x529], /* CYRILLIC SMALL LETTER EN WITH LEFT HOOK */ + [0x52a, 0x52b], /* CYRILLIC CAPITAL LETTER DZZHE */ + [0x52a, 0x52b], /* CYRILLIC SMALL LETTER DZZHE */ + [0x52c, 0x52d], /* CYRILLIC CAPITAL LETTER DCHE */ + [0x52c, 0x52d], /* CYRILLIC SMALL LETTER DCHE */ + [0x52e, 0x52f], /* CYRILLIC CAPITAL LETTER EL WITH DESCENDER */ + [0x52e, 0x52f], /* CYRILLIC SMALL LETTER EL WITH DESCENDER */ [0x530, 0x530], [0x531, 0x561], /* ARMENIAN CAPITAL LETTER AYB */ [0x532, 0x562], /* ARMENIAN CAPITAL LETTER BEN */ [0x533, 0x563], /* ARMENIAN CAPITAL LETTER GIM */ [0x534, 0x564], /* ARMENIAN CAPITAL LETTER DA */ [0x535, 0x565], /* ARMENIAN CAPITAL LETTER ECH */ [0x536, 0x566], /* ARMENIAN CAPITAL LETTER ZA */ [0x537, 0x567], /* ARMENIAN CAPITAL LETTER EH */ @@ -1422,18 +1422,18 @@ var mapping = [ [0x555, 0x585], /* ARMENIAN SMALL LETTER OH */ [0x556, 0x586], /* ARMENIAN SMALL LETTER FEH */ [0x587, 0x587], /* ARMENIAN SMALL LIGATURE ECH YIWN */ [0x588, 0x588], [0x589, 0x589], /* ARMENIAN FULL STOP (ARMENIAN PERIOD) */ [0x58a, 0x58a], /* ARMENIAN HYPHEN */ [0x58b, 0x58b], [0x58c, 0x58c], - [0x58d, 0x58d], - [0x58e, 0x58e], + [0x58d, 0x58d], /* RIGHT-FACING ARMENIAN ETERNITY SIGN */ + [0x58e, 0x58e], /* LEFT-FACING ARMENIAN ETERNITY SIGN */ [0x58f, 0x58f], /* ARMENIAN DRAM SIGN */ [0x590, 0x590], [0x591, 0x591], /* HEBREW ACCENT ETNAHTA */ [0x592, 0x592], /* HEBREW ACCENT SEGOL */ [0x593, 0x593], /* HEBREW ACCENT SHALSHELET */ [0x594, 0x594], /* HEBREW ACCENT ZAQEF QATAN */ [0x595, 0x595], /* HEBREW ACCENT ZAQEF GADOL */ [0x596, 0x596], /* HEBREW ACCENT TIPEHA */ @@ -1542,17 +1542,17 @@ var mapping = [ [0x5fd, 0x5fd], [0x5fe, 0x5fe], [0x5ff, 0x5ff], [0x600, 0x600], /* ARABIC NUMBER SIGN */ [0x601, 0x601], /* ARABIC SIGN SANAH */ [0x602, 0x602], /* ARABIC FOOTNOTE MARKER */ [0x603, 0x603], /* ARABIC SIGN SAFHA */ [0x604, 0x604], /* ARABIC SIGN SAMVAT */ - [0x605, 0x605], + [0x605, 0x605], /* ARABIC NUMBER MARK ABOVE */ [0x606, 0x606], /* ARABIC-INDIC CUBE ROOT */ [0x607, 0x607], /* ARABIC-INDIC FOURTH ROOT */ [0x608, 0x608], /* ARABIC RAY */ [0x609, 0x609], /* ARABIC-INDIC PER MILLE SIGN */ [0x60a, 0x60a], /* ARABIC-INDIC PER TEN THOUSAND SIGN */ [0x60b, 0x60b], /* AFGHANI SIGN */ [0x60c, 0x60c], /* ARABIC COMMA */ [0x60d, 0x60d], /* ARABIC DATE SEPARATOR */ @@ -1565,17 +1565,17 @@ var mapping = [ [0x614, 0x614], /* ARABIC SIGN TAKHALLUS */ [0x615, 0x615], /* ARABIC SMALL HIGH TAH */ [0x616, 0x616], /* ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH */ [0x617, 0x617], /* ARABIC SMALL HIGH ZAIN */ [0x618, 0x618], /* ARABIC SMALL FATHA */ [0x619, 0x619], /* ARABIC SMALL DAMMA */ [0x61a, 0x61a], /* ARABIC SMALL KASRA */ [0x61b, 0x61b], /* ARABIC SEMICOLON */ - [0x61c, 0x61c], + [0x61c, 0x61c], /* ARABIC LETTER MARK */ [0x61d, 0x61d], [0x61e, 0x61e], /* ARABIC TRIPLE DOT PUNCTUATION MARK */ [0x61f, 0x61f], /* ARABIC QUESTION MARK */ [0x620, 0x620], /* ARABIC LETTER KASHMIRI YEH */ [0x621, 0x621], /* ARABIC LETTER HAMZA (ARABIC LETTER HAMZAH) */ [0x622, 0x622], /* ARABIC LETTER ALEF WITH MADDA ABOVE (ARABIC LETTER MADDAH ON ALEF) */ [0x623, 0x623], /* ARABIC LETTER ALEF WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON ALEF) */ [0x624, 0x624], /* ARABIC LETTER WAW WITH HAMZA ABOVE (ARABIC LETTER HAMZAH ON WAW) */ @@ -2210,45 +2210,45 @@ var mapping = [ [0x899, 0x899], [0x89a, 0x89a], [0x89b, 0x89b], [0x89c, 0x89c], [0x89d, 0x89d], [0x89e, 0x89e], [0x89f, 0x89f], [0x8a0, 0x8a0], /* ARABIC LETTER BEH WITH SMALL V BELOW */ - [0x8a1, 0x8a1], + [0x8a1, 0x8a1], /* ARABIC LETTER BEH WITH HAMZA ABOVE */ [0x8a2, 0x8a2], /* ARABIC LETTER JEEM WITH TWO DOTS ABOVE */ [0x8a3, 0x8a3], /* ARABIC LETTER TAH WITH TWO DOTS ABOVE */ [0x8a4, 0x8a4], /* ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE */ [0x8a5, 0x8a5], /* ARABIC LETTER QAF WITH DOT BELOW */ [0x8a6, 0x8a6], /* ARABIC LETTER LAM WITH DOUBLE BAR */ [0x8a7, 0x8a7], /* ARABIC LETTER MEEM WITH THREE DOTS ABOVE */ [0x8a8, 0x8a8], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE */ [0x8a9, 0x8a9], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE */ [0x8aa, 0x8aa], /* ARABIC LETTER REH WITH LOOP */ [0x8ab, 0x8ab], /* ARABIC LETTER WAW WITH DOT WITHIN */ [0x8ac, 0x8ac], /* ARABIC LETTER ROHINGYA YEH */ - [0x8ad, 0x8ad], - [0x8ae, 0x8ae], - [0x8af, 0x8af], - [0x8b0, 0x8b0], - [0x8b1, 0x8b1], - [0x8b2, 0x8b2], - [0x8b3, 0x8b3], - [0x8b4, 0x8b4], + [0x8ad, 0x8ad], /* ARABIC LETTER LOW ALEF */ + [0x8ae, 0x8ae], /* ARABIC LETTER DAL WITH THREE DOTS BELOW */ + [0x8af, 0x8af], /* ARABIC LETTER SAD WITH THREE DOTS BELOW */ + [0x8b0, 0x8b0], /* ARABIC LETTER GAF WITH INVERTED STROKE */ + [0x8b1, 0x8b1], /* ARABIC LETTER STRAIGHT WAW */ + [0x8b2, 0x8b2], /* ARABIC LETTER ZAIN WITH INVERTED V ABOVE */ + [0x8b3, 0x8b3], /* ARABIC LETTER AIN WITH THREE DOTS BELOW */ + [0x8b4, 0x8b4], /* ARABIC LETTER KAF WITH DOT BELOW */ [0x8b5, 0x8b5], - [0x8b6, 0x8b6], - [0x8b7, 0x8b7], - [0x8b8, 0x8b8], - [0x8b9, 0x8b9], - [0x8ba, 0x8ba], - [0x8bb, 0x8bb], - [0x8bc, 0x8bc], - [0x8bd, 0x8bd], + [0x8b6, 0x8b6], /* ARABIC LETTER BEH WITH SMALL MEEM ABOVE */ + [0x8b7, 0x8b7], /* ARABIC LETTER PEH WITH SMALL MEEM ABOVE */ + [0x8b8, 0x8b8], /* ARABIC LETTER TEH WITH SMALL TEH ABOVE */ + [0x8b9, 0x8b9], /* ARABIC LETTER REH WITH SMALL NOON ABOVE */ + [0x8ba, 0x8ba], /* ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE */ + [0x8bb, 0x8bb], /* ARABIC LETTER AFRICAN FEH */ + [0x8bc, 0x8bc], /* ARABIC LETTER AFRICAN QAF */ + [0x8bd, 0x8bd], /* ARABIC LETTER AFRICAN NOON */ [0x8be, 0x8be], [0x8bf, 0x8bf], [0x8c0, 0x8c0], [0x8c1, 0x8c1], [0x8c2, 0x8c2], [0x8c3, 0x8c3], [0x8c4, 0x8c4], [0x8c5, 0x8c5], @@ -2261,32 +2261,32 @@ var mapping = [ [0x8cc, 0x8cc], [0x8cd, 0x8cd], [0x8ce, 0x8ce], [0x8cf, 0x8cf], [0x8d0, 0x8d0], [0x8d1, 0x8d1], [0x8d2, 0x8d2], [0x8d3, 0x8d3], - [0x8d4, 0x8d4], - [0x8d5, 0x8d5], - [0x8d6, 0x8d6], - [0x8d7, 0x8d7], - [0x8d8, 0x8d8], - [0x8d9, 0x8d9], - [0x8da, 0x8da], - [0x8db, 0x8db], - [0x8dc, 0x8dc], - [0x8dd, 0x8dd], - [0x8de, 0x8de], - [0x8df, 0x8df], - [0x8e0, 0x8e0], - [0x8e1, 0x8e1], - [0x8e2, 0x8e2], - [0x8e3, 0x8e3], + [0x8d4, 0x8d4], /* ARABIC SMALL HIGH WORD AR-RUB */ + [0x8d5, 0x8d5], /* ARABIC SMALL HIGH SAD */ + [0x8d6, 0x8d6], /* ARABIC SMALL HIGH AIN */ + [0x8d7, 0x8d7], /* ARABIC SMALL HIGH QAF */ + [0x8d8, 0x8d8], /* ARABIC SMALL HIGH NOON WITH KASRA */ + [0x8d9, 0x8d9], /* ARABIC SMALL LOW NOON WITH KASRA */ + [0x8da, 0x8da], /* ARABIC SMALL HIGH WORD ATH-THALATHA */ + [0x8db, 0x8db], /* ARABIC SMALL HIGH WORD AS-SAJDA */ + [0x8dc, 0x8dc], /* ARABIC SMALL HIGH WORD AN-NISF */ + [0x8dd, 0x8dd], /* ARABIC SMALL HIGH WORD SAKTA */ + [0x8de, 0x8de], /* ARABIC SMALL HIGH WORD QIF */ + [0x8df, 0x8df], /* ARABIC SMALL HIGH WORD WAQFA */ + [0x8e0, 0x8e0], /* ARABIC SMALL HIGH FOOTNOTE MARKER */ + [0x8e1, 0x8e1], /* ARABIC SMALL HIGH SIGN SAFHA */ + [0x8e2, 0x8e2], /* ARABIC DISPUTED END OF AYAH */ + [0x8e3, 0x8e3], /* ARABIC TURNED DAMMA BELOW */ [0x8e4, 0x8e4], /* ARABIC CURLY FATHA */ [0x8e5, 0x8e5], /* ARABIC CURLY DAMMA */ [0x8e6, 0x8e6], /* ARABIC CURLY KASRA */ [0x8e7, 0x8e7], /* ARABIC CURLY FATHATAN */ [0x8e8, 0x8e8], /* ARABIC CURLY DAMMATAN */ [0x8e9, 0x8e9], /* ARABIC CURLY KASRATAN */ [0x8ea, 0x8ea], /* ARABIC TONE ONE DOT ABOVE */ [0x8eb, 0x8eb], /* ARABIC TONE TWO DOTS ABOVE */ @@ -2304,17 +2304,17 @@ var mapping = [ [0x8f7, 0x8f7], /* ARABIC LEFT ARROWHEAD ABOVE */ [0x8f8, 0x8f8], /* ARABIC RIGHT ARROWHEAD ABOVE */ [0x8f9, 0x8f9], /* ARABIC LEFT ARROWHEAD BELOW */ [0x8fa, 0x8fa], /* ARABIC RIGHT ARROWHEAD BELOW */ [0x8fb, 0x8fb], /* ARABIC DOUBLE RIGHT ARROWHEAD ABOVE */ [0x8fc, 0x8fc], /* ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT */ [0x8fd, 0x8fd], /* ARABIC RIGHT ARROWHEAD ABOVE WITH DOT */ [0x8fe, 0x8fe], /* ARABIC DAMMA WITH DOT */ - [0x8ff, 0x8ff], + [0x8ff, 0x8ff], /* ARABIC MARK SIDEWAYS NOON GHUNNA */ [0x900, 0x900], /* DEVANAGARI SIGN INVERTED CANDRABINDU */ [0x901, 0x901], /* DEVANAGARI SIGN CANDRABINDU */ [0x902, 0x902], /* DEVANAGARI SIGN ANUSVARA */ [0x903, 0x903], /* DEVANAGARI SIGN VISARGA */ [0x904, 0x904], /* DEVANAGARI LETTER SHORT A */ [0x905, 0x905], /* DEVANAGARI LETTER A */ [0x906, 0x906], /* DEVANAGARI LETTER AA */ [0x907, 0x907], /* DEVANAGARI LETTER I */ @@ -2425,25 +2425,25 @@ var mapping = [ [0x970, 0x970], /* DEVANAGARI ABBREVIATION SIGN */ [0x971, 0x971], /* DEVANAGARI SIGN HIGH SPACING DOT */ [0x972, 0x972], /* DEVANAGARI LETTER CANDRA A */ [0x973, 0x973], /* DEVANAGARI LETTER OE */ [0x974, 0x974], /* DEVANAGARI LETTER OOE */ [0x975, 0x975], /* DEVANAGARI LETTER AW */ [0x976, 0x976], /* DEVANAGARI LETTER UE */ [0x977, 0x977], /* DEVANAGARI LETTER UUE */ - [0x978, 0x978], + [0x978, 0x978], /* DEVANAGARI LETTER MARWARI DDA */ [0x979, 0x979], /* DEVANAGARI LETTER ZHA */ [0x97a, 0x97a], /* DEVANAGARI LETTER HEAVY YA */ [0x97b, 0x97b], /* DEVANAGARI LETTER GGA */ [0x97c, 0x97c], /* DEVANAGARI LETTER JJA */ [0x97d, 0x97d], /* DEVANAGARI LETTER GLOTTAL STOP */ [0x97e, 0x97e], /* DEVANAGARI LETTER DDDA */ [0x97f, 0x97f], /* DEVANAGARI LETTER BBA */ - [0x980, 0x980], + [0x980, 0x980], /* BENGALI ANJI */ [0x981, 0x981], /* BENGALI SIGN CANDRABINDU */ [0x982, 0x982], /* BENGALI SIGN ANUSVARA */ [0x983, 0x983], /* BENGALI SIGN VISARGA */ [0x984, 0x984], [0x985, 0x985], /* BENGALI LETTER A */ [0x986, 0x986], /* BENGALI LETTER AA */ [0x987, 0x987], /* BENGALI LETTER I */ [0x988, 0x988], /* BENGALI LETTER II */ @@ -2810,17 +2810,17 @@ var mapping = [ [0xaf1, 0xaf1], /* GUJARATI RUPEE SIGN */ [0xaf2, 0xaf2], [0xaf3, 0xaf3], [0xaf4, 0xaf4], [0xaf5, 0xaf5], [0xaf6, 0xaf6], [0xaf7, 0xaf7], [0xaf8, 0xaf8], - [0xaf9, 0xaf9], + [0xaf9, 0xaf9], /* GUJARATI LETTER ZHA */ [0xafa, 0xafa], [0xafb, 0xafb], [0xafc, 0xafc], [0xafd, 0xafd], [0xafe, 0xafe], [0xaff, 0xaff], [0xb00, 0xb00], [0xb01, 0xb01], /* ORIYA SIGN CANDRABINDU */ @@ -3073,17 +3073,17 @@ var mapping = [ [0xbf8, 0xbf8], /* TAMIL AS ABOVE SIGN */ [0xbf9, 0xbf9], /* TAMIL RUPEE SIGN */ [0xbfa, 0xbfa], /* TAMIL NUMBER SIGN */ [0xbfb, 0xbfb], [0xbfc, 0xbfc], [0xbfd, 0xbfd], [0xbfe, 0xbfe], [0xbff, 0xbff], - [0xc00, 0xc00], + [0xc00, 0xc00], /* TELUGU SIGN COMBINING CANDRABINDU ABOVE */ [0xc01, 0xc01], /* TELUGU SIGN CANDRABINDU */ [0xc02, 0xc02], /* TELUGU SIGN ANUSVARA */ [0xc03, 0xc03], /* TELUGU SIGN VISARGA */ [0xc04, 0xc04], [0xc05, 0xc05], /* TELUGU LETTER A */ [0xc06, 0xc06], /* TELUGU LETTER AA */ [0xc07, 0xc07], /* TELUGU LETTER I */ [0xc08, 0xc08], /* TELUGU LETTER II */ @@ -3125,17 +3125,17 @@ var mapping = [ [0xc2c, 0xc2c], /* TELUGU LETTER BA */ [0xc2d, 0xc2d], /* TELUGU LETTER BHA */ [0xc2e, 0xc2e], /* TELUGU LETTER MA */ [0xc2f, 0xc2f], /* TELUGU LETTER YA */ [0xc30, 0xc30], /* TELUGU LETTER RA */ [0xc31, 0xc31], /* TELUGU LETTER RRA */ [0xc32, 0xc32], /* TELUGU LETTER LA */ [0xc33, 0xc33], /* TELUGU LETTER LLA */ - [0xc34, 0xc34], + [0xc34, 0xc34], /* TELUGU LETTER LLLA */ [0xc35, 0xc35], /* TELUGU LETTER VA */ [0xc36, 0xc36], /* TELUGU LETTER SHA */ [0xc37, 0xc37], /* TELUGU LETTER SSA */ [0xc38, 0xc38], /* TELUGU LETTER SA */ [0xc39, 0xc39], /* TELUGU LETTER HA */ [0xc3a, 0xc3a], [0xc3b, 0xc3b], [0xc3c, 0xc3c], @@ -3163,17 +3163,17 @@ var mapping = [ [0xc52, 0xc52], [0xc53, 0xc53], [0xc54, 0xc54], [0xc55, 0xc55], /* TELUGU LENGTH MARK */ [0xc56, 0xc56], /* TELUGU AI LENGTH MARK */ [0xc57, 0xc57], [0xc58, 0xc58], /* TELUGU LETTER TSA */ [0xc59, 0xc59], /* TELUGU LETTER DZA */ - [0xc5a, 0xc5a], + [0xc5a, 0xc5a], /* TELUGU LETTER RRRA */ [0xc5b, 0xc5b], [0xc5c, 0xc5c], [0xc5d, 0xc5d], [0xc5e, 0xc5e], [0xc5f, 0xc5f], [0xc60, 0xc60], /* TELUGU LETTER VOCALIC RR */ [0xc61, 0xc61], /* TELUGU LETTER VOCALIC LL */ [0xc62, 0xc62], /* TELUGU VOWEL SIGN VOCALIC L */ @@ -3201,18 +3201,18 @@ var mapping = [ [0xc78, 0xc78], /* TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR */ [0xc79, 0xc79], /* TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR */ [0xc7a, 0xc7a], /* TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR */ [0xc7b, 0xc7b], /* TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR */ [0xc7c, 0xc7c], /* TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR */ [0xc7d, 0xc7d], /* TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR */ [0xc7e, 0xc7e], /* TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR */ [0xc7f, 0xc7f], /* TELUGU SIGN TUUMU */ - [0xc80, 0xc80], - [0xc81, 0xc81], + [0xc80, 0xc80], /* KANNADA SIGN SPACING CANDRABINDU */ + [0xc81, 0xc81], /* KANNADA SIGN CANDRABINDU */ [0xc82, 0xc82], /* KANNADA SIGN ANUSVARA */ [0xc83, 0xc83], /* KANNADA SIGN VISARGA */ [0xc84, 0xc84], [0xc85, 0xc85], /* KANNADA LETTER A */ [0xc86, 0xc86], /* KANNADA LETTER AA */ [0xc87, 0xc87], /* KANNADA LETTER I */ [0xc88, 0xc88], /* KANNADA LETTER II */ [0xc89, 0xc89], /* KANNADA LETTER U */ @@ -3330,17 +3330,17 @@ var mapping = [ [0xcf9, 0xcf9], [0xcfa, 0xcfa], [0xcfb, 0xcfb], [0xcfc, 0xcfc], [0xcfd, 0xcfd], [0xcfe, 0xcfe], [0xcff, 0xcff], [0xd00, 0xd00], - [0xd01, 0xd01], + [0xd01, 0xd01], /* MALAYALAM SIGN CANDRABINDU */ [0xd02, 0xd02], /* MALAYALAM SIGN ANUSVARA */ [0xd03, 0xd03], /* MALAYALAM SIGN VISARGA */ [0xd04, 0xd04], [0xd05, 0xd05], /* MALAYALAM LETTER A */ [0xd06, 0xd06], /* MALAYALAM LETTER AA */ [0xd07, 0xd07], /* MALAYALAM LETTER I */ [0xd08, 0xd08], /* MALAYALAM LETTER II */ [0xd09, 0xd09], /* MALAYALAM LETTER U */ @@ -3408,33 +3408,33 @@ var mapping = [ [0xd47, 0xd47], /* MALAYALAM VOWEL SIGN EE */ [0xd48, 0xd48], /* MALAYALAM VOWEL SIGN AI */ [0xd49, 0xd49], [0xd4a, 0xd4a], /* MALAYALAM VOWEL SIGN O */ [0xd4b, 0xd4b], /* MALAYALAM VOWEL SIGN OO */ [0xd4c, 0xd4c], /* MALAYALAM VOWEL SIGN AU */ [0xd4d, 0xd4d], /* MALAYALAM SIGN VIRAMA */ [0xd4e, 0xd4e], /* MALAYALAM LETTER DOT REPH */ - [0xd4f, 0xd4f], + [0xd4f, 0xd4f], /* MALAYALAM SIGN PARA */ [0xd50, 0xd50], [0xd51, 0xd51], [0xd52, 0xd52], [0xd53, 0xd53], - [0xd54, 0xd54], - [0xd55, 0xd55], - [0xd56, 0xd56], + [0xd54, 0xd54], /* MALAYALAM LETTER CHILLU M */ + [0xd55, 0xd55], /* MALAYALAM LETTER CHILLU Y */ + [0xd56, 0xd56], /* MALAYALAM LETTER CHILLU LLL */ [0xd57, 0xd57], /* MALAYALAM AU LENGTH MARK */ - [0xd58, 0xd58], - [0xd59, 0xd59], - [0xd5a, 0xd5a], - [0xd5b, 0xd5b], - [0xd5c, 0xd5c], - [0xd5d, 0xd5d], - [0xd5e, 0xd5e], - [0xd5f, 0xd5f], + [0xd58, 0xd58], /* MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH */ + [0xd59, 0xd59], /* MALAYALAM FRACTION ONE FORTIETH */ + [0xd5a, 0xd5a], /* MALAYALAM FRACTION THREE EIGHTIETHS */ + [0xd5b, 0xd5b], /* MALAYALAM FRACTION ONE TWENTIETH */ + [0xd5c, 0xd5c], /* MALAYALAM FRACTION ONE TENTH */ + [0xd5d, 0xd5d], /* MALAYALAM FRACTION THREE TWENTIETHS */ + [0xd5e, 0xd5e], /* MALAYALAM FRACTION ONE FIFTH */ + [0xd5f, 0xd5f], /* MALAYALAM LETTER ARCHAIC II */ [0xd60, 0xd60], /* MALAYALAM LETTER VOCALIC RR */ [0xd61, 0xd61], /* MALAYALAM LETTER VOCALIC LL */ [0xd62, 0xd62], /* MALAYALAM VOWEL SIGN VOCALIC L */ [0xd63, 0xd63], /* MALAYALAM VOWEL SIGN VOCALIC LL */ [0xd64, 0xd64], [0xd65, 0xd65], [0xd66, 0xd66], /* MALAYALAM DIGIT ZERO */ [0xd67, 0xd67], /* MALAYALAM DIGIT ONE */ @@ -3447,19 +3447,19 @@ var mapping = [ [0xd6e, 0xd6e], /* MALAYALAM DIGIT EIGHT */ [0xd6f, 0xd6f], /* MALAYALAM DIGIT NINE */ [0xd70, 0xd70], /* MALAYALAM NUMBER TEN */ [0xd71, 0xd71], /* MALAYALAM NUMBER ONE HUNDRED */ [0xd72, 0xd72], /* MALAYALAM NUMBER ONE THOUSAND */ [0xd73, 0xd73], /* MALAYALAM FRACTION ONE QUARTER */ [0xd74, 0xd74], /* MALAYALAM FRACTION ONE HALF */ [0xd75, 0xd75], /* MALAYALAM FRACTION THREE QUARTERS */ - [0xd76, 0xd76], - [0xd77, 0xd77], - [0xd78, 0xd78], + [0xd76, 0xd76], /* MALAYALAM FRACTION ONE SIXTEENTH */ + [0xd77, 0xd77], /* MALAYALAM FRACTION ONE EIGHTH */ + [0xd78, 0xd78], /* MALAYALAM FRACTION THREE SIXTEENTHS */ [0xd79, 0xd79], /* MALAYALAM DATE MARK */ [0xd7a, 0xd7a], /* MALAYALAM LETTER CHILLU NN */ [0xd7b, 0xd7b], /* MALAYALAM LETTER CHILLU N */ [0xd7c, 0xd7c], /* MALAYALAM LETTER CHILLU RR */ [0xd7d, 0xd7d], /* MALAYALAM LETTER CHILLU L */ [0xd7e, 0xd7e], /* MALAYALAM LETTER CHILLU LL */ [0xd7f, 0xd7f], /* MALAYALAM LETTER CHILLU K */ [0xd80, 0xd80], @@ -3559,26 +3559,26 @@ var mapping = [ [0xdde, 0xdde], /* SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA */ [0xddf, 0xddf], /* SINHALA VOWEL SIGN GAYANUKITTA */ [0xde0, 0xde0], [0xde1, 0xde1], [0xde2, 0xde2], [0xde3, 0xde3], [0xde4, 0xde4], [0xde5, 0xde5], - [0xde6, 0xde6], - [0xde7, 0xde7], - [0xde8, 0xde8], - [0xde9, 0xde9], - [0xdea, 0xdea], - [0xdeb, 0xdeb], - [0xdec, 0xdec], - [0xded, 0xded], - [0xdee, 0xdee], - [0xdef, 0xdef], + [0xde6, 0xde6], /* SINHALA LITH DIGIT ZERO */ + [0xde7, 0xde7], /* SINHALA LITH DIGIT ONE */ + [0xde8, 0xde8], /* SINHALA LITH DIGIT TWO */ + [0xde9, 0xde9], /* SINHALA LITH DIGIT THREE */ + [0xdea, 0xdea], /* SINHALA LITH DIGIT FOUR */ + [0xdeb, 0xdeb], /* SINHALA LITH DIGIT FIVE */ + [0xdec, 0xdec], /* SINHALA LITH DIGIT SIX */ + [0xded, 0xded], /* SINHALA LITH DIGIT SEVEN */ + [0xdee, 0xdee], /* SINHALA LITH DIGIT EIGHT */ + [0xdef, 0xdef], /* SINHALA LITH DIGIT NINE */ [0xdf0, 0xdf0], [0xdf1, 0xdf1], [0xdf2, 0xdf2], /* SINHALA VOWEL SIGN DIGA GAETTA-PILLA */ [0xdf3, 0xdf3], /* SINHALA VOWEL SIGN DIGA GAYANUKITTA */ [0xdf4, 0xdf4], /* SINHALA PUNCTUATION KUNDDALIYA */ [0xdf5, 0xdf5], [0xdf6, 0xdf6], [0xdf7, 0xdf7], @@ -5025,110 +5025,110 @@ var mapping = [ [0x1398, 0x1398], /* ETHIOPIC TONAL MARK DERET-HIDET */ [0x1399, 0x1399], /* ETHIOPIC TONAL MARK KURT */ [0x139a, 0x139a], [0x139b, 0x139b], [0x139c, 0x139c], [0x139d, 0x139d], [0x139e, 0x139e], [0x139f, 0x139f], - [0x13a0, 0x13a0], /* CHEROKEE LETTER A */ - [0x13a1, 0x13a1], /* CHEROKEE LETTER E */ - [0x13a2, 0x13a2], /* CHEROKEE LETTER I */ - [0x13a3, 0x13a3], /* CHEROKEE LETTER O */ - [0x13a4, 0x13a4], /* CHEROKEE LETTER U */ - [0x13a5, 0x13a5], /* CHEROKEE LETTER V */ - [0x13a6, 0x13a6], /* CHEROKEE LETTER GA */ - [0x13a7, 0x13a7], /* CHEROKEE LETTER KA */ - [0x13a8, 0x13a8], /* CHEROKEE LETTER GE */ - [0x13a9, 0x13a9], /* CHEROKEE LETTER GI */ - [0x13aa, 0x13aa], /* CHEROKEE LETTER GO */ - [0x13ab, 0x13ab], /* CHEROKEE LETTER GU */ - [0x13ac, 0x13ac], /* CHEROKEE LETTER GV */ - [0x13ad, 0x13ad], /* CHEROKEE LETTER HA */ - [0x13ae, 0x13ae], /* CHEROKEE LETTER HE */ - [0x13af, 0x13af], /* CHEROKEE LETTER HI */ - [0x13b0, 0x13b0], /* CHEROKEE LETTER HO */ - [0x13b1, 0x13b1], /* CHEROKEE LETTER HU */ - [0x13b2, 0x13b2], /* CHEROKEE LETTER HV */ - [0x13b3, 0x13b3], /* CHEROKEE LETTER LA */ - [0x13b4, 0x13b4], /* CHEROKEE LETTER LE */ - [0x13b5, 0x13b5], /* CHEROKEE LETTER LI */ - [0x13b6, 0x13b6], /* CHEROKEE LETTER LO */ - [0x13b7, 0x13b7], /* CHEROKEE LETTER LU */ - [0x13b8, 0x13b8], /* CHEROKEE LETTER LV */ - [0x13b9, 0x13b9], /* CHEROKEE LETTER MA */ - [0x13ba, 0x13ba], /* CHEROKEE LETTER ME */ - [0x13bb, 0x13bb], /* CHEROKEE LETTER MI */ - [0x13bc, 0x13bc], /* CHEROKEE LETTER MO */ - [0x13bd, 0x13bd], /* CHEROKEE LETTER MU */ - [0x13be, 0x13be], /* CHEROKEE LETTER NA */ - [0x13bf, 0x13bf], /* CHEROKEE LETTER HNA */ - [0x13c0, 0x13c0], /* CHEROKEE LETTER NAH */ - [0x13c1, 0x13c1], /* CHEROKEE LETTER NE */ - [0x13c2, 0x13c2], /* CHEROKEE LETTER NI */ - [0x13c3, 0x13c3], /* CHEROKEE LETTER NO */ - [0x13c4, 0x13c4], /* CHEROKEE LETTER NU */ - [0x13c5, 0x13c5], /* CHEROKEE LETTER NV */ - [0x13c6, 0x13c6], /* CHEROKEE LETTER QUA */ - [0x13c7, 0x13c7], /* CHEROKEE LETTER QUE */ - [0x13c8, 0x13c8], /* CHEROKEE LETTER QUI */ - [0x13c9, 0x13c9], /* CHEROKEE LETTER QUO */ - [0x13ca, 0x13ca], /* CHEROKEE LETTER QUU */ - [0x13cb, 0x13cb], /* CHEROKEE LETTER QUV */ - [0x13cc, 0x13cc], /* CHEROKEE LETTER SA */ - [0x13cd, 0x13cd], /* CHEROKEE LETTER S */ - [0x13ce, 0x13ce], /* CHEROKEE LETTER SE */ - [0x13cf, 0x13cf], /* CHEROKEE LETTER SI */ - [0x13d0, 0x13d0], /* CHEROKEE LETTER SO */ - [0x13d1, 0x13d1], /* CHEROKEE LETTER SU */ - [0x13d2, 0x13d2], /* CHEROKEE LETTER SV */ - [0x13d3, 0x13d3], /* CHEROKEE LETTER DA */ - [0x13d4, 0x13d4], /* CHEROKEE LETTER TA */ - [0x13d5, 0x13d5], /* CHEROKEE LETTER DE */ - [0x13d6, 0x13d6], /* CHEROKEE LETTER TE */ - [0x13d7, 0x13d7], /* CHEROKEE LETTER DI */ - [0x13d8, 0x13d8], /* CHEROKEE LETTER TI */ - [0x13d9, 0x13d9], /* CHEROKEE LETTER DO */ - [0x13da, 0x13da], /* CHEROKEE LETTER DU */ - [0x13db, 0x13db], /* CHEROKEE LETTER DV */ - [0x13dc, 0x13dc], /* CHEROKEE LETTER DLA */ - [0x13dd, 0x13dd], /* CHEROKEE LETTER TLA */ - [0x13de, 0x13de], /* CHEROKEE LETTER TLE */ - [0x13df, 0x13df], /* CHEROKEE LETTER TLI */ - [0x13e0, 0x13e0], /* CHEROKEE LETTER TLO */ - [0x13e1, 0x13e1], /* CHEROKEE LETTER TLU */ - [0x13e2, 0x13e2], /* CHEROKEE LETTER TLV */ - [0x13e3, 0x13e3], /* CHEROKEE LETTER TSA */ - [0x13e4, 0x13e4], /* CHEROKEE LETTER TSE */ - [0x13e5, 0x13e5], /* CHEROKEE LETTER TSI */ - [0x13e6, 0x13e6], /* CHEROKEE LETTER TSO */ - [0x13e7, 0x13e7], /* CHEROKEE LETTER TSU */ - [0x13e8, 0x13e8], /* CHEROKEE LETTER TSV */ - [0x13e9, 0x13e9], /* CHEROKEE LETTER WA */ - [0x13ea, 0x13ea], /* CHEROKEE LETTER WE */ - [0x13eb, 0x13eb], /* CHEROKEE LETTER WI */ - [0x13ec, 0x13ec], /* CHEROKEE LETTER WO */ - [0x13ed, 0x13ed], /* CHEROKEE LETTER WU */ - [0x13ee, 0x13ee], /* CHEROKEE LETTER WV */ - [0x13ef, 0x13ef], /* CHEROKEE LETTER YA */ - [0x13f0, 0x13f0], /* CHEROKEE LETTER YE */ - [0x13f1, 0x13f1], /* CHEROKEE LETTER YI */ - [0x13f2, 0x13f2], /* CHEROKEE LETTER YO */ - [0x13f3, 0x13f3], /* CHEROKEE LETTER YU */ - [0x13f4, 0x13f4], /* CHEROKEE LETTER YV */ - [0x13f5, 0x13f5], + [0x13a0, 0xab70], /* CHEROKEE LETTER A */ + [0x13a1, 0xab71], /* CHEROKEE LETTER E */ + [0x13a2, 0xab72], /* CHEROKEE LETTER I */ + [0x13a3, 0xab73], /* CHEROKEE LETTER O */ + [0x13a4, 0xab74], /* CHEROKEE LETTER U */ + [0x13a5, 0xab75], /* CHEROKEE LETTER V */ + [0x13a6, 0xab76], /* CHEROKEE LETTER GA */ + [0x13a7, 0xab77], /* CHEROKEE LETTER KA */ + [0x13a8, 0xab78], /* CHEROKEE LETTER GE */ + [0x13a9, 0xab79], /* CHEROKEE LETTER GI */ + [0x13aa, 0xab7a], /* CHEROKEE LETTER GO */ + [0x13ab, 0xab7b], /* CHEROKEE LETTER GU */ + [0x13ac, 0xab7c], /* CHEROKEE LETTER GV */ + [0x13ad, 0xab7d], /* CHEROKEE LETTER HA */ + [0x13ae, 0xab7e], /* CHEROKEE LETTER HE */ + [0x13af, 0xab7f], /* CHEROKEE LETTER HI */ + [0x13b0, 0xab80], /* CHEROKEE LETTER HO */ + [0x13b1, 0xab81], /* CHEROKEE LETTER HU */ + [0x13b2, 0xab82], /* CHEROKEE LETTER HV */ + [0x13b3, 0xab83], /* CHEROKEE LETTER LA */ + [0x13b4, 0xab84], /* CHEROKEE LETTER LE */ + [0x13b5, 0xab85], /* CHEROKEE LETTER LI */ + [0x13b6, 0xab86], /* CHEROKEE LETTER LO */ + [0x13b7, 0xab87], /* CHEROKEE LETTER LU */ + [0x13b8, 0xab88], /* CHEROKEE LETTER LV */ + [0x13b9, 0xab89], /* CHEROKEE LETTER MA */ + [0x13ba, 0xab8a], /* CHEROKEE LETTER ME */ + [0x13bb, 0xab8b], /* CHEROKEE LETTER MI */ + [0x13bc, 0xab8c], /* CHEROKEE LETTER MO */ + [0x13bd, 0xab8d], /* CHEROKEE LETTER MU */ + [0x13be, 0xab8e], /* CHEROKEE LETTER NA */ + [0x13bf, 0xab8f], /* CHEROKEE LETTER HNA */ + [0x13c0, 0xab90], /* CHEROKEE LETTER NAH */ + [0x13c1, 0xab91], /* CHEROKEE LETTER NE */ + [0x13c2, 0xab92], /* CHEROKEE LETTER NI */ + [0x13c3, 0xab93], /* CHEROKEE LETTER NO */ + [0x13c4, 0xab94], /* CHEROKEE LETTER NU */ + [0x13c5, 0xab95], /* CHEROKEE LETTER NV */ + [0x13c6, 0xab96], /* CHEROKEE LETTER QUA */ + [0x13c7, 0xab97], /* CHEROKEE LETTER QUE */ + [0x13c8, 0xab98], /* CHEROKEE LETTER QUI */ + [0x13c9, 0xab99], /* CHEROKEE LETTER QUO */ + [0x13ca, 0xab9a], /* CHEROKEE LETTER QUU */ + [0x13cb, 0xab9b], /* CHEROKEE LETTER QUV */ + [0x13cc, 0xab9c], /* CHEROKEE LETTER SA */ + [0x13cd, 0xab9d], /* CHEROKEE LETTER S */ + [0x13ce, 0xab9e], /* CHEROKEE LETTER SE */ + [0x13cf, 0xab9f], /* CHEROKEE LETTER SI */ + [0x13d0, 0xaba0], /* CHEROKEE LETTER SO */ + [0x13d1, 0xaba1], /* CHEROKEE LETTER SU */ + [0x13d2, 0xaba2], /* CHEROKEE LETTER SV */ + [0x13d3, 0xaba3], /* CHEROKEE LETTER DA */ + [0x13d4, 0xaba4], /* CHEROKEE LETTER TA */ + [0x13d5, 0xaba5], /* CHEROKEE LETTER DE */ + [0x13d6, 0xaba6], /* CHEROKEE LETTER TE */ + [0x13d7, 0xaba7], /* CHEROKEE LETTER DI */ + [0x13d8, 0xaba8], /* CHEROKEE LETTER TI */ + [0x13d9, 0xaba9], /* CHEROKEE LETTER DO */ + [0x13da, 0xabaa], /* CHEROKEE LETTER DU */ + [0x13db, 0xabab], /* CHEROKEE LETTER DV */ + [0x13dc, 0xabac], /* CHEROKEE LETTER DLA */ + [0x13dd, 0xabad], /* CHEROKEE LETTER TLA */ + [0x13de, 0xabae], /* CHEROKEE LETTER TLE */ + [0x13df, 0xabaf], /* CHEROKEE LETTER TLI */ + [0x13e0, 0xabb0], /* CHEROKEE LETTER TLO */ + [0x13e1, 0xabb1], /* CHEROKEE LETTER TLU */ + [0x13e2, 0xabb2], /* CHEROKEE LETTER TLV */ + [0x13e3, 0xabb3], /* CHEROKEE LETTER TSA */ + [0x13e4, 0xabb4], /* CHEROKEE LETTER TSE */ + [0x13e5, 0xabb5], /* CHEROKEE LETTER TSI */ + [0x13e6, 0xabb6], /* CHEROKEE LETTER TSO */ + [0x13e7, 0xabb7], /* CHEROKEE LETTER TSU */ + [0x13e8, 0xabb8], /* CHEROKEE LETTER TSV */ + [0x13e9, 0xabb9], /* CHEROKEE LETTER WA */ + [0x13ea, 0xabba], /* CHEROKEE LETTER WE */ + [0x13eb, 0xabbb], /* CHEROKEE LETTER WI */ + [0x13ec, 0xabbc], /* CHEROKEE LETTER WO */ + [0x13ed, 0xabbd], /* CHEROKEE LETTER WU */ + [0x13ee, 0xabbe], /* CHEROKEE LETTER WV */ + [0x13ef, 0xabbf], /* CHEROKEE LETTER YA */ + [0x13f0, 0x13f8], /* CHEROKEE LETTER YE */ + [0x13f1, 0x13f9], /* CHEROKEE LETTER YI */ + [0x13f2, 0x13fa], /* CHEROKEE LETTER YO */ + [0x13f3, 0x13fb], /* CHEROKEE LETTER YU */ + [0x13f4, 0x13fc], /* CHEROKEE LETTER YV */ + [0x13f5, 0x13fd], /* CHEROKEE LETTER MV */ [0x13f6, 0x13f6], [0x13f7, 0x13f7], - [0x13f8, 0x13f8], - [0x13f9, 0x13f9], - [0x13fa, 0x13fa], - [0x13fb, 0x13fb], - [0x13fc, 0x13fc], - [0x13fd, 0x13fd], + [0x13f0, 0x13f8], /* CHEROKEE SMALL LETTER YE */ + [0x13f1, 0x13f9], /* CHEROKEE SMALL LETTER YI */ + [0x13f2, 0x13fa], /* CHEROKEE SMALL LETTER YO */ + [0x13f3, 0x13fb], /* CHEROKEE SMALL LETTER YU */ + [0x13f4, 0x13fc], /* CHEROKEE SMALL LETTER YV */ + [0x13f5, 0x13fd], /* CHEROKEE SMALL LETTER MV */ [0x13fe, 0x13fe], [0x13ff, 0x13ff], [0x1400, 0x1400], /* CANADIAN SYLLABICS HYPHEN */ [0x1401, 0x1401], /* CANADIAN SYLLABICS E */ [0x1402, 0x1402], /* CANADIAN SYLLABICS AAI */ [0x1403, 0x1403], /* CANADIAN SYLLABICS I */ [0x1404, 0x1404], /* CANADIAN SYLLABICS II */ [0x1405, 0x1405], /* CANADIAN SYLLABICS O */ @@ -5874,24 +5874,24 @@ var mapping = [ [0x16e9, 0x16e9], /* RUNIC LETTER Q */ [0x16ea, 0x16ea], /* RUNIC LETTER X */ [0x16eb, 0x16eb], /* RUNIC SINGLE PUNCTUATION */ [0x16ec, 0x16ec], /* RUNIC MULTIPLE PUNCTUATION */ [0x16ed, 0x16ed], /* RUNIC CROSS PUNCTUATION */ [0x16ee, 0x16ee], /* RUNIC ARLAUG SYMBOL */ [0x16ef, 0x16ef], /* RUNIC TVIMADUR SYMBOL */ [0x16f0, 0x16f0], /* RUNIC BELGTHOR SYMBOL */ - [0x16f1, 0x16f1], - [0x16f2, 0x16f2], - [0x16f3, 0x16f3], - [0x16f4, 0x16f4], - [0x16f5, 0x16f5], - [0x16f6, 0x16f6], - [0x16f7, 0x16f7], - [0x16f8, 0x16f8], + [0x16f1, 0x16f1], /* RUNIC LETTER K */ + [0x16f2, 0x16f2], /* RUNIC LETTER SH */ + [0x16f3, 0x16f3], /* RUNIC LETTER OO */ + [0x16f4, 0x16f4], /* RUNIC LETTER FRANKS CASKET OS */ + [0x16f5, 0x16f5], /* RUNIC LETTER FRANKS CASKET IS */ + [0x16f6, 0x16f6], /* RUNIC LETTER FRANKS CASKET EH */ + [0x16f7, 0x16f7], /* RUNIC LETTER FRANKS CASKET AC */ + [0x16f8, 0x16f8], /* RUNIC LETTER FRANKS CASKET AESC */ [0x16f9, 0x16f9], [0x16fa, 0x16fa], [0x16fb, 0x16fb], [0x16fc, 0x16fc], [0x16fd, 0x16fd], [0x16fe, 0x16fe], [0x16ff, 0x16ff], [0x1700, 0x1700], /* TAGALOG LETTER A */ @@ -6430,18 +6430,18 @@ var mapping = [ [0x1915, 0x1915], /* LIMBU LETTER YA */ [0x1916, 0x1916], /* LIMBU LETTER RA */ [0x1917, 0x1917], /* LIMBU LETTER LA */ [0x1918, 0x1918], /* LIMBU LETTER WA */ [0x1919, 0x1919], /* LIMBU LETTER SHA */ [0x191a, 0x191a], /* LIMBU LETTER SSA */ [0x191b, 0x191b], /* LIMBU LETTER SA */ [0x191c, 0x191c], /* LIMBU LETTER HA */ - [0x191d, 0x191d], - [0x191e, 0x191e], + [0x191d, 0x191d], /* LIMBU LETTER GYAN */ + [0x191e, 0x191e], /* LIMBU LETTER TRA */ [0x191f, 0x191f], [0x1920, 0x1920], /* LIMBU VOWEL SIGN A */ [0x1921, 0x1921], /* LIMBU VOWEL SIGN I */ [0x1922, 0x1922], /* LIMBU VOWEL SIGN U */ [0x1923, 0x1923], /* LIMBU VOWEL SIGN EE */ [0x1924, 0x1924], /* LIMBU VOWEL SIGN AI */ [0x1925, 0x1925], /* LIMBU VOWEL SIGN OO */ [0x1926, 0x1926], /* LIMBU VOWEL SIGN AU */ @@ -6833,31 +6833,31 @@ var mapping = [ [0x1aa8, 0x1aa8], /* TAI THAM SIGN KAAN */ [0x1aa9, 0x1aa9], /* TAI THAM SIGN KAANKUU */ [0x1aaa, 0x1aaa], /* TAI THAM SIGN SATKAAN */ [0x1aab, 0x1aab], /* TAI THAM SIGN SATKAANKUU */ [0x1aac, 0x1aac], /* TAI THAM SIGN HANG */ [0x1aad, 0x1aad], /* TAI THAM SIGN CAANG */ [0x1aae, 0x1aae], [0x1aaf, 0x1aaf], - [0x1ab0, 0x1ab0], - [0x1ab1, 0x1ab1], - [0x1ab2, 0x1ab2], - [0x1ab3, 0x1ab3], - [0x1ab4, 0x1ab4], - [0x1ab5, 0x1ab5], - [0x1ab6, 0x1ab6], - [0x1ab7, 0x1ab7], - [0x1ab8, 0x1ab8], - [0x1ab9, 0x1ab9], - [0x1aba, 0x1aba], - [0x1abb, 0x1abb], - [0x1abc, 0x1abc], - [0x1abd, 0x1abd], - [0x1abe, 0x1abe], + [0x1ab0, 0x1ab0], /* COMBINING DOUBLED CIRCUMFLEX ACCENT */ + [0x1ab1, 0x1ab1], /* COMBINING DIAERESIS-RING */ + [0x1ab2, 0x1ab2], /* COMBINING INFINITY */ + [0x1ab3, 0x1ab3], /* COMBINING DOWNWARDS ARROW */ + [0x1ab4, 0x1ab4], /* COMBINING TRIPLE DOT */ + [0x1ab5, 0x1ab5], /* COMBINING X-X BELOW */ + [0x1ab6, 0x1ab6], /* COMBINING WIGGLY LINE BELOW */ + [0x1ab7, 0x1ab7], /* COMBINING OPEN MARK BELOW */ + [0x1ab8, 0x1ab8], /* COMBINING DOUBLE OPEN MARK BELOW */ + [0x1ab9, 0x1ab9], /* COMBINING LIGHT CENTRALIZATION STROKE BELOW */ + [0x1aba, 0x1aba], /* COMBINING STRONG CENTRALIZATION STROKE BELOW */ + [0x1abb, 0x1abb], /* COMBINING PARENTHESES ABOVE */ + [0x1abc, 0x1abc], /* COMBINING DOUBLE PARENTHESES ABOVE */ + [0x1abd, 0x1abd], /* COMBINING PARENTHESES BELOW */ + [0x1abe, 0x1abe], /* COMBINING PARENTHESES OVERLAY */ [0x1abf, 0x1abf], [0x1ac0, 0x1ac0], [0x1ac1, 0x1ac1], [0x1ac2, 0x1ac2], [0x1ac3, 0x1ac3], [0x1ac4, 0x1ac4], [0x1ac5, 0x1ac5], [0x1ac6, 0x1ac6], @@ -7297,25 +7297,25 @@ var mapping = [ [0x1c78, 0x1c78], /* OL CHIKI MU TTUDDAG */ [0x1c79, 0x1c79], /* OL CHIKI GAAHLAA TTUDDAAG */ [0x1c7a, 0x1c7a], /* OL CHIKI MU-GAAHLAA TTUDDAAG */ [0x1c7b, 0x1c7b], /* OL CHIKI RELAA */ [0x1c7c, 0x1c7c], /* OL CHIKI PHAARKAA */ [0x1c7d, 0x1c7d], /* OL CHIKI AHAD */ [0x1c7e, 0x1c7e], /* OL CHIKI PUNCTUATION MUCAAD */ [0x1c7f, 0x1c7f], /* OL CHIKI PUNCTUATION DOUBLE MUCAAD */ - [0x1c80, 0x1c80], - [0x1c81, 0x1c81], - [0x1c82, 0x1c82], - [0x1c83, 0x1c83], - [0x1c84, 0x1c84], - [0x1c85, 0x1c85], - [0x1c86, 0x1c86], - [0x1c87, 0x1c87], - [0x1c88, 0x1c88], + [0x412, 0x1c80], /* CYRILLIC SMALL LETTER ROUNDED VE */ + [0x414, 0x1c81], /* CYRILLIC SMALL LETTER LONG-LEGGED DE */ + [0x41e, 0x1c82], /* CYRILLIC SMALL LETTER NARROW O */ + [0x421, 0x1c83], /* CYRILLIC SMALL LETTER WIDE ES */ + [0x422, 0x1c84], /* CYRILLIC SMALL LETTER TALL TE */ + [0x422, 0x1c85], /* CYRILLIC SMALL LETTER THREE-LEGGED TE */ + [0x42a, 0x1c86], /* CYRILLIC SMALL LETTER TALL HARD SIGN */ + [0x462, 0x1c87], /* CYRILLIC SMALL LETTER TALL YAT */ + [0xa64a, 0x1c88], /* CYRILLIC SMALL LETTER UNBLENDED UK */ [0x1c89, 0x1c89], [0x1c8a, 0x1c8a], [0x1c8b, 0x1c8b], [0x1c8c, 0x1c8c], [0x1c8d, 0x1c8d], [0x1c8e, 0x1c8e], [0x1c8f, 0x1c8f], [0x1c90, 0x1c90], @@ -7417,18 +7417,18 @@ var mapping = [ [0x1cf0, 0x1cf0], /* VEDIC SIGN RTHANG LONG ANUSVARA */ [0x1cf1, 0x1cf1], /* VEDIC SIGN ANUSVARA UBHAYATO MUKHA */ [0x1cf2, 0x1cf2], /* VEDIC SIGN ARDHAVISARGA */ [0x1cf3, 0x1cf3], /* VEDIC SIGN ROTATED ARDHAVISARGA */ [0x1cf4, 0x1cf4], /* VEDIC TONE CANDRA ABOVE */ [0x1cf5, 0x1cf5], /* VEDIC SIGN JIHVAMULIYA */ [0x1cf6, 0x1cf6], /* VEDIC SIGN UPADHMANIYA */ [0x1cf7, 0x1cf7], - [0x1cf8, 0x1cf8], - [0x1cf9, 0x1cf9], + [0x1cf8, 0x1cf8], /* VEDIC TONE RING ABOVE */ + [0x1cf9, 0x1cf9], /* VEDIC TONE DOUBLE RING ABOVE */ [0x1cfa, 0x1cfa], [0x1cfb, 0x1cfb], [0x1cfc, 0x1cfc], [0x1cfd, 0x1cfd], [0x1cfe, 0x1cfe], [0x1cff, 0x1cff], [0x1d00, 0x1d00], /* LATIN LETTER SMALL CAPITAL A */ [0x1d01, 0x1d01], /* LATIN LETTER SMALL CAPITAL AE */ @@ -7656,37 +7656,37 @@ var mapping = [ [0x1ddf, 0x1ddf], /* COMBINING LATIN LETTER SMALL CAPITAL M */ [0x1de0, 0x1de0], /* COMBINING LATIN SMALL LETTER N */ [0x1de1, 0x1de1], /* COMBINING LATIN LETTER SMALL CAPITAL N */ [0x1de2, 0x1de2], /* COMBINING LATIN LETTER SMALL CAPITAL R */ [0x1de3, 0x1de3], /* COMBINING LATIN SMALL LETTER R ROTUNDA */ [0x1de4, 0x1de4], /* COMBINING LATIN SMALL LETTER S */ [0x1de5, 0x1de5], /* COMBINING LATIN SMALL LETTER LONG S */ [0x1de6, 0x1de6], /* COMBINING LATIN SMALL LETTER Z */ - [0x1de7, 0x1de7], - [0x1de8, 0x1de8], - [0x1de9, 0x1de9], - [0x1dea, 0x1dea], - [0x1deb, 0x1deb], - [0x1dec, 0x1dec], - [0x1ded, 0x1ded], - [0x1dee, 0x1dee], - [0x1def, 0x1def], - [0x1df0, 0x1df0], - [0x1df1, 0x1df1], - [0x1df2, 0x1df2], - [0x1df3, 0x1df3], - [0x1df4, 0x1df4], - [0x1df5, 0x1df5], + [0x1de7, 0x1de7], /* COMBINING LATIN SMALL LETTER ALPHA */ + [0x1de8, 0x1de8], /* COMBINING LATIN SMALL LETTER B */ + [0x1de9, 0x1de9], /* COMBINING LATIN SMALL LETTER BETA */ + [0x1dea, 0x1dea], /* COMBINING LATIN SMALL LETTER SCHWA */ + [0x1deb, 0x1deb], /* COMBINING LATIN SMALL LETTER F */ + [0x1dec, 0x1dec], /* COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE */ + [0x1ded, 0x1ded], /* COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE */ + [0x1dee, 0x1dee], /* COMBINING LATIN SMALL LETTER P */ + [0x1def, 0x1def], /* COMBINING LATIN SMALL LETTER ESH */ + [0x1df0, 0x1df0], /* COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE */ + [0x1df1, 0x1df1], /* COMBINING LATIN SMALL LETTER W */ + [0x1df2, 0x1df2], /* COMBINING LATIN SMALL LETTER A WITH DIAERESIS */ + [0x1df3, 0x1df3], /* COMBINING LATIN SMALL LETTER O WITH DIAERESIS */ + [0x1df4, 0x1df4], /* COMBINING LATIN SMALL LETTER U WITH DIAERESIS */ + [0x1df5, 0x1df5], /* COMBINING UP TACK ABOVE */ [0x1df6, 0x1df6], [0x1df7, 0x1df7], [0x1df8, 0x1df8], [0x1df9, 0x1df9], [0x1dfa, 0x1dfa], - [0x1dfb, 0x1dfb], + [0x1dfb, 0x1dfb], /* COMBINING DELETION MARK */ [0x1dfc, 0x1dfc], /* COMBINING DOUBLE INVERTED BREVE BELOW */ [0x1dfd, 0x1dfd], /* COMBINING ALMOST EQUAL TO BELOW */ [0x1dfe, 0x1dfe], /* COMBINING LEFT ARROWHEAD ABOVE */ [0x1dff, 0x1dff], /* COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW */ [0x1e00, 0x1e01], /* LATIN CAPITAL LETTER A WITH RING BELOW */ [0x1e00, 0x1e01], /* LATIN SMALL LETTER A WITH RING BELOW */ [0x1e02, 0x1e03], /* LATIN CAPITAL LETTER B WITH DOT ABOVE */ [0x1e02, 0x1e03], /* LATIN SMALL LETTER B WITH DOT ABOVE */ @@ -8295,20 +8295,20 @@ var mapping = [ [0x205e, 0x205e], /* VERTICAL FOUR DOTS */ [0x205f, 0x205f], /* MEDIUM MATHEMATICAL SPACE */ [0x2060, 0x2060], /* WORD JOINER */ [0x2061, 0x2061], /* FUNCTION APPLICATION */ [0x2062, 0x2062], /* INVISIBLE TIMES */ [0x2063, 0x2063], /* INVISIBLE SEPARATOR */ [0x2064, 0x2064], /* INVISIBLE PLUS */ [0x2065, 0x2065], - [0x2066, 0x2066], - [0x2067, 0x2067], - [0x2068, 0x2068], - [0x2069, 0x2069], + [0x2066, 0x2066], /* LEFT-TO-RIGHT ISOLATE */ + [0x2067, 0x2067], /* RIGHT-TO-LEFT ISOLATE */ + [0x2068, 0x2068], /* FIRST STRONG ISOLATE */ + [0x2069, 0x2069], /* POP DIRECTIONAL ISOLATE */ [0x206a, 0x206a], /* INHIBIT SYMMETRIC SWAPPING */ [0x206b, 0x206b], /* ACTIVATE SYMMETRIC SWAPPING */ [0x206c, 0x206c], /* INHIBIT ARABIC FORM SHAPING */ [0x206d, 0x206d], /* ACTIVATE ARABIC FORM SHAPING */ [0x206e, 0x206e], /* NATIONAL DIGIT SHAPES */ [0x206f, 0x206f], /* NOMINAL DIGIT SHAPES */ [0x2070, 0x2070], /* SUPERSCRIPT ZERO (SUPERSCRIPT DIGIT ZERO) */ [0x2071, 0x2071], /* SUPERSCRIPT LATIN SMALL LETTER I */ @@ -8380,20 +8380,20 @@ var mapping = [ [0x20b3, 0x20b3], /* AUSTRAL SIGN */ [0x20b4, 0x20b4], /* HRYVNIA SIGN */ [0x20b5, 0x20b5], /* CEDI SIGN */ [0x20b6, 0x20b6], /* LIVRE TOURNOIS SIGN */ [0x20b7, 0x20b7], /* SPESMILO SIGN */ [0x20b8, 0x20b8], /* TENGE SIGN */ [0x20b9, 0x20b9], /* INDIAN RUPEE SIGN */ [0x20ba, 0x20ba], /* TURKISH LIRA SIGN */ - [0x20bb, 0x20bb], - [0x20bc, 0x20bc], - [0x20bd, 0x20bd], - [0x20be, 0x20be], + [0x20bb, 0x20bb], /* NORDIC MARK SIGN */ + [0x20bc, 0x20bc], /* MANAT SIGN */ + [0x20bd, 0x20bd], /* RUBLE SIGN */ + [0x20be, 0x20be], /* LARI SIGN */ [0x20bf, 0x20bf], [0x20c0, 0x20c0], [0x20c1, 0x20c1], [0x20c2, 0x20c2], [0x20c3, 0x20c3], [0x20c4, 0x20c4], [0x20c5, 0x20c5], [0x20c6, 0x20c6], @@ -8587,18 +8587,18 @@ var mapping = [ [0x2182, 0x2182], /* ROMAN NUMERAL TEN THOUSAND */ [0x2183, 0x2184], /* ROMAN NUMERAL REVERSED ONE HUNDRED */ [0x2183, 0x2184], /* LATIN SMALL LETTER REVERSED C */ [0x2185, 0x2185], /* ROMAN NUMERAL SIX LATE FORM */ [0x2186, 0x2186], /* ROMAN NUMERAL FIFTY EARLY FORM */ [0x2187, 0x2187], /* ROMAN NUMERAL FIFTY THOUSAND */ [0x2188, 0x2188], /* ROMAN NUMERAL ONE HUNDRED THOUSAND */ [0x2189, 0x2189], /* VULGAR FRACTION ZERO THIRDS */ - [0x218a, 0x218a], - [0x218b, 0x218b], + [0x218a, 0x218a], /* TURNED DIGIT TWO */ + [0x218b, 0x218b], /* TURNED DIGIT THREE */ [0x218c, 0x218c], [0x218d, 0x218d], [0x218e, 0x218e], [0x218f, 0x218f], [0x2190, 0x2190], /* LEFTWARDS ARROW (LEFT ARROW) */ [0x2191, 0x2191], /* UPWARDS ARROW (UP ARROW) */ [0x2192, 0x2192], /* RIGHTWARDS ARROW (RIGHT ARROW) */ [0x2193, 0x2193], /* DOWNWARDS ARROW (DOWN ARROW) */ @@ -9205,27 +9205,27 @@ var mapping = [ [0x23ec, 0x23ec], /* BLACK DOWN-POINTING DOUBLE TRIANGLE */ [0x23ed, 0x23ed], /* BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR */ [0x23ee, 0x23ee], /* BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR */ [0x23ef, 0x23ef], /* BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR */ [0x23f0, 0x23f0], /* ALARM CLOCK */ [0x23f1, 0x23f1], /* STOPWATCH */ [0x23f2, 0x23f2], /* TIMER CLOCK */ [0x23f3, 0x23f3], /* HOURGLASS WITH FLOWING SAND */ - [0x23f4, 0x23f4], - [0x23f5, 0x23f5], - [0x23f6, 0x23f6], - [0x23f7, 0x23f7], - [0x23f8, 0x23f8], - [0x23f9, 0x23f9], - [0x23fa, 0x23fa], - [0x23fb, 0x23fb], - [0x23fc, 0x23fc], - [0x23fd, 0x23fd], - [0x23fe, 0x23fe], + [0x23f4, 0x23f4], /* BLACK MEDIUM LEFT-POINTING TRIANGLE */ + [0x23f5, 0x23f5], /* BLACK MEDIUM RIGHT-POINTING TRIANGLE */ + [0x23f6, 0x23f6], /* BLACK MEDIUM UP-POINTING TRIANGLE */ + [0x23f7, 0x23f7], /* BLACK MEDIUM DOWN-POINTING TRIANGLE */ + [0x23f8, 0x23f8], /* DOUBLE VERTICAL BAR */ + [0x23f9, 0x23f9], /* BLACK SQUARE FOR STOP */ + [0x23fa, 0x23fa], /* BLACK CIRCLE FOR RECORD */ + [0x23fb, 0x23fb], /* POWER SYMBOL */ + [0x23fc, 0x23fc], /* POWER ON-OFF SYMBOL */ + [0x23fd, 0x23fd], /* POWER ON SYMBOL */ + [0x23fe, 0x23fe], /* POWER SLEEP SYMBOL */ [0x23ff, 0x23ff], [0x2400, 0x2400], /* SYMBOL FOR NULL (GRAPHIC FOR NULL) */ [0x2401, 0x2401], /* SYMBOL FOR START OF HEADING (GRAPHIC FOR START OF HEADING) */ [0x2402, 0x2402], /* SYMBOL FOR START OF TEXT (GRAPHIC FOR START OF TEXT) */ [0x2403, 0x2403], /* SYMBOL FOR END OF TEXT (GRAPHIC FOR END OF TEXT) */ [0x2404, 0x2404], /* SYMBOL FOR END OF TRANSMISSION (GRAPHIC FOR END OF TRANSMISSION) */ [0x2405, 0x2405], /* SYMBOL FOR ENQUIRY (GRAPHIC FOR ENQUIRY) */ [0x2406, 0x2406], /* SYMBOL FOR ACKNOWLEDGE (GRAPHIC FOR ACKNOWLEDGE) */ @@ -9985,17 +9985,17 @@ var mapping = [ [0x26f8, 0x26f8], /* ICE SKATE */ [0x26f9, 0x26f9], /* PERSON WITH BALL */ [0x26fa, 0x26fa], /* TENT */ [0x26fb, 0x26fb], /* JAPANESE BANK SYMBOL */ [0x26fc, 0x26fc], /* HEADSTONE GRAVEYARD SYMBOL */ [0x26fd, 0x26fd], /* FUEL PUMP */ [0x26fe, 0x26fe], /* CUP ON BLACK SQUARE */ [0x26ff, 0x26ff], /* WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE */ - [0x2700, 0x2700], + [0x2700, 0x2700], /* BLACK SAFETY SCISSORS */ [0x2701, 0x2701], /* UPPER BLADE SCISSORS */ [0x2702, 0x2702], /* BLACK SCISSORS */ [0x2703, 0x2703], /* LOWER BLADE SCISSORS */ [0x2704, 0x2704], /* WHITE SCISSORS */ [0x2705, 0x2705], /* WHITE HEAVY CHECK MARK */ [0x2706, 0x2706], /* TELEPHONE LOCATION SIGN */ [0x2707, 0x2707], /* TAPE DRIVE */ [0x2708, 0x2708], /* AIRPLANE */ @@ -11086,149 +11086,149 @@ var mapping = [ [0x2b45, 0x2b45], /* LEFTWARDS QUADRUPLE ARROW */ [0x2b46, 0x2b46], /* RIGHTWARDS QUADRUPLE ARROW */ [0x2b47, 0x2b47], /* REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW */ [0x2b48, 0x2b48], /* RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO */ [0x2b49, 0x2b49], /* TILDE OPERATOR ABOVE LEFTWARDS ARROW */ [0x2b4a, 0x2b4a], /* LEFTWARDS ARROW ABOVE ALMOST EQUAL TO */ [0x2b4b, 0x2b4b], /* LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR */ [0x2b4c, 0x2b4c], /* RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR */ - [0x2b4d, 0x2b4d], - [0x2b4e, 0x2b4e], - [0x2b4f, 0x2b4f], + [0x2b4d, 0x2b4d], /* DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW */ + [0x2b4e, 0x2b4e], /* SHORT SLANTED NORTH ARROW */ + [0x2b4f, 0x2b4f], /* SHORT BACKSLANTED SOUTH ARROW */ [0x2b50, 0x2b50], /* WHITE MEDIUM STAR */ [0x2b51, 0x2b51], /* BLACK SMALL STAR */ [0x2b52, 0x2b52], /* WHITE SMALL STAR */ [0x2b53, 0x2b53], /* BLACK RIGHT-POINTING PENTAGON */ [0x2b54, 0x2b54], /* WHITE RIGHT-POINTING PENTAGON */ [0x2b55, 0x2b55], /* HEAVY LARGE CIRCLE */ [0x2b56, 0x2b56], /* HEAVY OVAL WITH OVAL INSIDE */ [0x2b57, 0x2b57], /* HEAVY CIRCLE WITH CIRCLE INSIDE */ [0x2b58, 0x2b58], /* HEAVY CIRCLE */ [0x2b59, 0x2b59], /* HEAVY CIRCLED SALTIRE */ - [0x2b5a, 0x2b5a], - [0x2b5b, 0x2b5b], - [0x2b5c, 0x2b5c], - [0x2b5d, 0x2b5d], - [0x2b5e, 0x2b5e], - [0x2b5f, 0x2b5f], - [0x2b60, 0x2b60], - [0x2b61, 0x2b61], - [0x2b62, 0x2b62], - [0x2b63, 0x2b63], - [0x2b64, 0x2b64], - [0x2b65, 0x2b65], - [0x2b66, 0x2b66], - [0x2b67, 0x2b67], - [0x2b68, 0x2b68], - [0x2b69, 0x2b69], - [0x2b6a, 0x2b6a], - [0x2b6b, 0x2b6b], - [0x2b6c, 0x2b6c], - [0x2b6d, 0x2b6d], - [0x2b6e, 0x2b6e], - [0x2b6f, 0x2b6f], - [0x2b70, 0x2b70], - [0x2b71, 0x2b71], - [0x2b72, 0x2b72], - [0x2b73, 0x2b73], + [0x2b5a, 0x2b5a], /* SLANTED NORTH ARROW WITH HOOKED HEAD */ + [0x2b5b, 0x2b5b], /* BACKSLANTED SOUTH ARROW WITH HOOKED TAIL */ + [0x2b5c, 0x2b5c], /* SLANTED NORTH ARROW WITH HORIZONTAL TAIL */ + [0x2b5d, 0x2b5d], /* BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL */ + [0x2b5e, 0x2b5e], /* BENT ARROW POINTING DOWNWARDS THEN NORTH EAST */ + [0x2b5f, 0x2b5f], /* SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST */ + [0x2b60, 0x2b60], /* LEFTWARDS TRIANGLE-HEADED ARROW */ + [0x2b61, 0x2b61], /* UPWARDS TRIANGLE-HEADED ARROW */ + [0x2b62, 0x2b62], /* RIGHTWARDS TRIANGLE-HEADED ARROW */ + [0x2b63, 0x2b63], /* DOWNWARDS TRIANGLE-HEADED ARROW */ + [0x2b64, 0x2b64], /* LEFT RIGHT TRIANGLE-HEADED ARROW */ + [0x2b65, 0x2b65], /* UP DOWN TRIANGLE-HEADED ARROW */ + [0x2b66, 0x2b66], /* NORTH WEST TRIANGLE-HEADED ARROW */ + [0x2b67, 0x2b67], /* NORTH EAST TRIANGLE-HEADED ARROW */ + [0x2b68, 0x2b68], /* SOUTH EAST TRIANGLE-HEADED ARROW */ + [0x2b69, 0x2b69], /* SOUTH WEST TRIANGLE-HEADED ARROW */ + [0x2b6a, 0x2b6a], /* LEFTWARDS TRIANGLE-HEADED DASHED ARROW */ + [0x2b6b, 0x2b6b], /* UPWARDS TRIANGLE-HEADED DASHED ARROW */ + [0x2b6c, 0x2b6c], /* RIGHTWARDS TRIANGLE-HEADED DASHED ARROW */ + [0x2b6d, 0x2b6d], /* DOWNWARDS TRIANGLE-HEADED DASHED ARROW */ + [0x2b6e, 0x2b6e], /* CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW */ + [0x2b6f, 0x2b6f], /* ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW */ + [0x2b70, 0x2b70], /* LEFTWARDS TRIANGLE-HEADED ARROW TO BAR */ + [0x2b71, 0x2b71], /* UPWARDS TRIANGLE-HEADED ARROW TO BAR */ + [0x2b72, 0x2b72], /* RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR */ + [0x2b73, 0x2b73], /* DOWNWARDS TRIANGLE-HEADED ARROW TO BAR */ [0x2b74, 0x2b74], [0x2b75, 0x2b75], - [0x2b76, 0x2b76], - [0x2b77, 0x2b77], - [0x2b78, 0x2b78], - [0x2b79, 0x2b79], - [0x2b7a, 0x2b7a], - [0x2b7b, 0x2b7b], - [0x2b7c, 0x2b7c], - [0x2b7d, 0x2b7d], - [0x2b7e, 0x2b7e], - [0x2b7f, 0x2b7f], - [0x2b80, 0x2b80], - [0x2b81, 0x2b81], - [0x2b82, 0x2b82], - [0x2b83, 0x2b83], - [0x2b84, 0x2b84], - [0x2b85, 0x2b85], - [0x2b86, 0x2b86], - [0x2b87, 0x2b87], - [0x2b88, 0x2b88], - [0x2b89, 0x2b89], - [0x2b8a, 0x2b8a], - [0x2b8b, 0x2b8b], - [0x2b8c, 0x2b8c], - [0x2b8d, 0x2b8d], - [0x2b8e, 0x2b8e], - [0x2b8f, 0x2b8f], - [0x2b90, 0x2b90], - [0x2b91, 0x2b91], - [0x2b92, 0x2b92], - [0x2b93, 0x2b93], - [0x2b94, 0x2b94], - [0x2b95, 0x2b95], + [0x2b76, 0x2b76], /* NORTH WEST TRIANGLE-HEADED ARROW TO BAR */ + [0x2b77, 0x2b77], /* NORTH EAST TRIANGLE-HEADED ARROW TO BAR */ + [0x2b78, 0x2b78], /* SOUTH EAST TRIANGLE-HEADED ARROW TO BAR */ + [0x2b79, 0x2b79], /* SOUTH WEST TRIANGLE-HEADED ARROW TO BAR */ + [0x2b7a, 0x2b7a], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */ + [0x2b7b, 0x2b7b], /* UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */ + [0x2b7c, 0x2b7c], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */ + [0x2b7d, 0x2b7d], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE */ + [0x2b7e, 0x2b7e], /* HORIZONTAL TAB KEY */ + [0x2b7f, 0x2b7f], /* VERTICAL TAB KEY */ + [0x2b80, 0x2b80], /* LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW */ + [0x2b81, 0x2b81], /* UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW */ + [0x2b82, 0x2b82], /* RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW */ + [0x2b83, 0x2b83], /* DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW */ + [0x2b84, 0x2b84], /* LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS */ + [0x2b85, 0x2b85], /* UPWARDS TRIANGLE-HEADED PAIRED ARROWS */ + [0x2b86, 0x2b86], /* RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS */ + [0x2b87, 0x2b87], /* DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS */ + [0x2b88, 0x2b88], /* LEFTWARDS BLACK CIRCLED WHITE ARROW */ + [0x2b89, 0x2b89], /* UPWARDS BLACK CIRCLED WHITE ARROW */ + [0x2b8a, 0x2b8a], /* RIGHTWARDS BLACK CIRCLED WHITE ARROW */ + [0x2b8b, 0x2b8b], /* DOWNWARDS BLACK CIRCLED WHITE ARROW */ + [0x2b8c, 0x2b8c], /* ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW */ + [0x2b8d, 0x2b8d], /* ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW */ + [0x2b8e, 0x2b8e], /* ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW */ + [0x2b8f, 0x2b8f], /* ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW */ + [0x2b90, 0x2b90], /* RETURN LEFT */ + [0x2b91, 0x2b91], /* RETURN RIGHT */ + [0x2b92, 0x2b92], /* NEWLINE LEFT */ + [0x2b93, 0x2b93], /* NEWLINE RIGHT */ + [0x2b94, 0x2b94], /* FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE */ + [0x2b95, 0x2b95], /* RIGHTWARDS BLACK ARROW */ [0x2b96, 0x2b96], [0x2b97, 0x2b97], - [0x2b98, 0x2b98], - [0x2b99, 0x2b99], - [0x2b9a, 0x2b9a], - [0x2b9b, 0x2b9b], - [0x2b9c, 0x2b9c], - [0x2b9d, 0x2b9d], - [0x2b9e, 0x2b9e], - [0x2b9f, 0x2b9f], - [0x2ba0, 0x2ba0], - [0x2ba1, 0x2ba1], - [0x2ba2, 0x2ba2], - [0x2ba3, 0x2ba3], - [0x2ba4, 0x2ba4], - [0x2ba5, 0x2ba5], - [0x2ba6, 0x2ba6], - [0x2ba7, 0x2ba7], - [0x2ba8, 0x2ba8], - [0x2ba9, 0x2ba9], - [0x2baa, 0x2baa], - [0x2bab, 0x2bab], - [0x2bac, 0x2bac], - [0x2bad, 0x2bad], - [0x2bae, 0x2bae], - [0x2baf, 0x2baf], - [0x2bb0, 0x2bb0], - [0x2bb1, 0x2bb1], - [0x2bb2, 0x2bb2], - [0x2bb3, 0x2bb3], - [0x2bb4, 0x2bb4], - [0x2bb5, 0x2bb5], - [0x2bb6, 0x2bb6], - [0x2bb7, 0x2bb7], - [0x2bb8, 0x2bb8], - [0x2bb9, 0x2bb9], + [0x2b98, 0x2b98], /* THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD */ + [0x2b99, 0x2b99], /* THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD */ + [0x2b9a, 0x2b9a], /* THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD */ + [0x2b9b, 0x2b9b], /* THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD */ + [0x2b9c, 0x2b9c], /* BLACK LEFTWARDS EQUILATERAL ARROWHEAD */ + [0x2b9d, 0x2b9d], /* BLACK UPWARDS EQUILATERAL ARROWHEAD */ + [0x2b9e, 0x2b9e], /* BLACK RIGHTWARDS EQUILATERAL ARROWHEAD */ + [0x2b9f, 0x2b9f], /* BLACK DOWNWARDS EQUILATERAL ARROWHEAD */ + [0x2ba0, 0x2ba0], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS */ + [0x2ba1, 0x2ba1], /* DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS */ + [0x2ba2, 0x2ba2], /* UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS */ + [0x2ba3, 0x2ba3], /* UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS */ + [0x2ba4, 0x2ba4], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS */ + [0x2ba5, 0x2ba5], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS */ + [0x2ba6, 0x2ba6], /* LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS */ + [0x2ba7, 0x2ba7], /* RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS */ + [0x2ba8, 0x2ba8], /* BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW */ + [0x2ba9, 0x2ba9], /* BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW */ + [0x2baa, 0x2baa], /* BLACK CURVED UPWARDS AND LEFTWARDS ARROW */ + [0x2bab, 0x2bab], /* BLACK CURVED UPWARDS AND RIGHTWARDS ARROW */ + [0x2bac, 0x2bac], /* BLACK CURVED LEFTWARDS AND UPWARDS ARROW */ + [0x2bad, 0x2bad], /* BLACK CURVED RIGHTWARDS AND UPWARDS ARROW */ + [0x2bae, 0x2bae], /* BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW */ + [0x2baf, 0x2baf], /* BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW */ + [0x2bb0, 0x2bb0], /* RIBBON ARROW DOWN LEFT */ + [0x2bb1, 0x2bb1], /* RIBBON ARROW DOWN RIGHT */ + [0x2bb2, 0x2bb2], /* RIBBON ARROW UP LEFT */ + [0x2bb3, 0x2bb3], /* RIBBON ARROW UP RIGHT */ + [0x2bb4, 0x2bb4], /* RIBBON ARROW LEFT UP */ + [0x2bb5, 0x2bb5], /* RIBBON ARROW RIGHT UP */ + [0x2bb6, 0x2bb6], /* RIBBON ARROW LEFT DOWN */ + [0x2bb7, 0x2bb7], /* RIBBON ARROW RIGHT DOWN */ + [0x2bb8, 0x2bb8], /* UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR */ + [0x2bb9, 0x2bb9], /* UP ARROWHEAD IN A RECTANGLE BOX */ [0x2bba, 0x2bba], [0x2bbb, 0x2bbb], [0x2bbc, 0x2bbc], - [0x2bbd, 0x2bbd], - [0x2bbe, 0x2bbe], - [0x2bbf, 0x2bbf], - [0x2bc0, 0x2bc0], - [0x2bc1, 0x2bc1], - [0x2bc2, 0x2bc2], - [0x2bc3, 0x2bc3], - [0x2bc4, 0x2bc4], - [0x2bc5, 0x2bc5], - [0x2bc6, 0x2bc6], - [0x2bc7, 0x2bc7], - [0x2bc8, 0x2bc8], + [0x2bbd, 0x2bbd], /* BALLOT BOX WITH LIGHT X */ + [0x2bbe, 0x2bbe], /* CIRCLED X */ + [0x2bbf, 0x2bbf], /* CIRCLED BOLD X */ + [0x2bc0, 0x2bc0], /* BLACK SQUARE CENTRED */ + [0x2bc1, 0x2bc1], /* BLACK DIAMOND CENTRED */ + [0x2bc2, 0x2bc2], /* TURNED BLACK PENTAGON */ + [0x2bc3, 0x2bc3], /* HORIZONTAL BLACK OCTAGON */ + [0x2bc4, 0x2bc4], /* BLACK OCTAGON */ + [0x2bc5, 0x2bc5], /* BLACK MEDIUM UP-POINTING TRIANGLE CENTRED */ + [0x2bc6, 0x2bc6], /* BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED */ + [0x2bc7, 0x2bc7], /* BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED */ + [0x2bc8, 0x2bc8], /* BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED */ [0x2bc9, 0x2bc9], - [0x2bca, 0x2bca], - [0x2bcb, 0x2bcb], - [0x2bcc, 0x2bcc], - [0x2bcd, 0x2bcd], - [0x2bce, 0x2bce], - [0x2bcf, 0x2bcf], - [0x2bd0, 0x2bd0], - [0x2bd1, 0x2bd1], + [0x2bca, 0x2bca], /* TOP HALF BLACK CIRCLE */ + [0x2bcb, 0x2bcb], /* BOTTOM HALF BLACK CIRCLE */ + [0x2bcc, 0x2bcc], /* LIGHT FOUR POINTED BLACK CUSP */ + [0x2bcd, 0x2bcd], /* ROTATED LIGHT FOUR POINTED BLACK CUSP */ + [0x2bce, 0x2bce], /* WHITE FOUR POINTED CUSP */ + [0x2bcf, 0x2bcf], /* ROTATED WHITE FOUR POINTED CUSP */ + [0x2bd0, 0x2bd0], /* SQUARE POSITION INDICATOR */ + [0x2bd1, 0x2bd1], /* UNCERTAINTY SIGN */ [0x2bd2, 0x2bd2], [0x2bd3, 0x2bd3], [0x2bd4, 0x2bd4], [0x2bd5, 0x2bd5], [0x2bd6, 0x2bd6], [0x2bd7, 0x2bd7], [0x2bd8, 0x2bd8], [0x2bd9, 0x2bd9], @@ -11245,20 +11245,20 @@ var mapping = [ [0x2be4, 0x2be4], [0x2be5, 0x2be5], [0x2be6, 0x2be6], [0x2be7, 0x2be7], [0x2be8, 0x2be8], [0x2be9, 0x2be9], [0x2bea, 0x2bea], [0x2beb, 0x2beb], - [0x2bec, 0x2bec], - [0x2bed, 0x2bed], - [0x2bee, 0x2bee], - [0x2bef, 0x2bef], + [0x2bec, 0x2bec], /* LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */ + [0x2bed, 0x2bed], /* UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */ + [0x2bee, 0x2bee], /* RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */ + [0x2bef, 0x2bef], /* DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS */ [0x2bf0, 0x2bf0], [0x2bf1, 0x2bf1], [0x2bf2, 0x2bf2], [0x2bf3, 0x2bf3], [0x2bf4, 0x2bf4], [0x2bf5, 0x2bf5], [0x2bf6, 0x2bf6], [0x2bf7, 0x2bf7], @@ -11837,25 +11837,25 @@ var mapping = [ [0x2e34, 0x2e34], /* RAISED COMMA */ [0x2e35, 0x2e35], /* TURNED SEMICOLON */ [0x2e36, 0x2e36], /* DAGGER WITH LEFT GUARD */ [0x2e37, 0x2e37], /* DAGGER WITH RIGHT GUARD */ [0x2e38, 0x2e38], /* TURNED DAGGER */ [0x2e39, 0x2e39], /* TOP HALF SECTION SIGN */ [0x2e3a, 0x2e3a], /* TWO-EM DASH */ [0x2e3b, 0x2e3b], /* THREE-EM DASH */ - [0x2e3c, 0x2e3c], - [0x2e3d, 0x2e3d], - [0x2e3e, 0x2e3e], - [0x2e3f, 0x2e3f], - [0x2e40, 0x2e40], - [0x2e41, 0x2e41], - [0x2e42, 0x2e42], - [0x2e43, 0x2e43], - [0x2e44, 0x2e44], + [0x2e3c, 0x2e3c], /* STENOGRAPHIC FULL STOP */ + [0x2e3d, 0x2e3d], /* VERTICAL SIX DOTS */ + [0x2e3e, 0x2e3e], /* WIGGLY VERTICAL LINE */ + [0x2e3f, 0x2e3f], /* CAPITULUM */ + [0x2e40, 0x2e40], /* DOUBLE HYPHEN */ + [0x2e41, 0x2e41], /* REVERSED COMMA */ + [0x2e42, 0x2e42], /* DOUBLE LOW-REVERSED-9 QUOTATION MARK */ + [0x2e43, 0x2e43], /* DASH WITH LEFT UPTURN */ + [0x2e44, 0x2e44], /* DOUBLE SUSPENSION MARK */ [0x2e45, 0x2e45], [0x2e46, 0x2e46], [0x2e47, 0x2e47], [0x2e48, 0x2e48], [0x2e49, 0x2e49], [0x2e4a, 0x2e4a], [0x2e4b, 0x2e4b], [0x2e4c, 0x2e4c], @@ -40910,25 +40910,25 @@ var mapping = [ [0x9fc5, 0x9fc5], /* CJK Ideograph */ [0x9fc6, 0x9fc6], /* CJK Ideograph */ [0x9fc7, 0x9fc7], /* CJK Ideograph */ [0x9fc8, 0x9fc8], /* CJK Ideograph */ [0x9fc9, 0x9fc9], /* CJK Ideograph */ [0x9fca, 0x9fca], /* CJK Ideograph */ [0x9fcb, 0x9fcb], /* CJK Ideograph */ [0x9fcc, 0x9fcc], /* CJK Ideograph */ - [0x9fcd, 0x9fcd], - [0x9fce, 0x9fce], - [0x9fcf, 0x9fcf], - [0x9fd0, 0x9fd0], - [0x9fd1, 0x9fd1], - [0x9fd2, 0x9fd2], - [0x9fd3, 0x9fd3], - [0x9fd4, 0x9fd4], - [0x9fd5, 0x9fd5], + [0x9fcd, 0x9fcd], /* CJK Ideograph */ + [0x9fce, 0x9fce], /* CJK Ideograph */ + [0x9fcf, 0x9fcf], /* CJK Ideograph */ + [0x9fd0, 0x9fd0], /* CJK Ideograph */ + [0x9fd1, 0x9fd1], /* CJK Ideograph */ + [0x9fd2, 0x9fd2], /* CJK Ideograph */ + [0x9fd3, 0x9fd3], /* CJK Ideograph */ + [0x9fd4, 0x9fd4], /* CJK Ideograph */ + [0x9fd5, 0x9fd5], /* CJK Ideograph */ [0x9fd6, 0x9fd6], [0x9fd7, 0x9fd7], [0x9fd8, 0x9fd8], [0x9fd9, 0x9fd9], [0x9fda, 0x9fda], [0x9fdb, 0x9fdb], [0x9fdc, 0x9fdc], [0x9fdd, 0x9fdd], @@ -42649,23 +42649,23 @@ var mapping = [ [0xa690, 0xa691], /* CYRILLIC CAPITAL LETTER TSSE */ [0xa690, 0xa691], /* CYRILLIC SMALL LETTER TSSE */ [0xa692, 0xa693], /* CYRILLIC CAPITAL LETTER TCHE */ [0xa692, 0xa693], /* CYRILLIC SMALL LETTER TCHE */ [0xa694, 0xa695], /* CYRILLIC CAPITAL LETTER HWE */ [0xa694, 0xa695], /* CYRILLIC SMALL LETTER HWE */ [0xa696, 0xa697], /* CYRILLIC CAPITAL LETTER SHWE */ [0xa696, 0xa697], /* CYRILLIC SMALL LETTER SHWE */ - [0xa698, 0xa698], - [0xa699, 0xa699], - [0xa69a, 0xa69a], - [0xa69b, 0xa69b], - [0xa69c, 0xa69c], - [0xa69d, 0xa69d], - [0xa69e, 0xa69e], + [0xa698, 0xa699], /* CYRILLIC CAPITAL LETTER DOUBLE O */ + [0xa698, 0xa699], /* CYRILLIC SMALL LETTER DOUBLE O */ + [0xa69a, 0xa69b], /* CYRILLIC CAPITAL LETTER CROSSED O */ + [0xa69a, 0xa69b], /* CYRILLIC SMALL LETTER CROSSED O */ + [0xa69c, 0xa69c], /* MODIFIER LETTER CYRILLIC HARD SIGN */ + [0xa69d, 0xa69d], /* MODIFIER LETTER CYRILLIC SOFT SIGN */ + [0xa69e, 0xa69e], /* COMBINING CYRILLIC LETTER EF */ [0xa69f, 0xa69f], /* COMBINING CYRILLIC LETTER IOTIFIED E */ [0xa6a0, 0xa6a0], /* BAMUM LETTER A */ [0xa6a1, 0xa6a1], /* BAMUM LETTER KA */ [0xa6a2, 0xa6a2], /* BAMUM LETTER U */ [0xa6a3, 0xa6a3], /* BAMUM LETTER KU */ [0xa6a4, 0xa6a4], /* BAMUM LETTER EE */ [0xa6a5, 0xa6a5], /* BAMUM LETTER REE */ [0xa6a6, 0xa6a6], /* BAMUM LETTER TAE */ @@ -42896,57 +42896,57 @@ var mapping = [ [0xa786, 0xa787], /* LATIN SMALL LETTER INSULAR T */ [0xa788, 0xa788], /* MODIFIER LETTER LOW CIRCUMFLEX ACCENT */ [0xa789, 0xa789], /* MODIFIER LETTER COLON */ [0xa78a, 0xa78a], /* MODIFIER LETTER SHORT EQUALS SIGN */ [0xa78b, 0xa78c], /* LATIN CAPITAL LETTER SALTILLO */ [0xa78b, 0xa78c], /* LATIN SMALL LETTER SALTILLO */ [0xa78d, 0x265], /* LATIN CAPITAL LETTER TURNED H */ [0xa78e, 0xa78e], /* LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT */ - [0xa78f, 0xa78f], + [0xa78f, 0xa78f], /* LATIN LETTER SINOLOGICAL DOT */ [0xa790, 0xa791], /* LATIN CAPITAL LETTER N WITH DESCENDER */ [0xa790, 0xa791], /* LATIN SMALL LETTER N WITH DESCENDER */ [0xa792, 0xa793], /* LATIN CAPITAL LETTER C WITH BAR */ [0xa792, 0xa793], /* LATIN SMALL LETTER C WITH BAR */ - [0xa794, 0xa794], - [0xa795, 0xa795], - [0xa796, 0xa796], - [0xa797, 0xa797], - [0xa798, 0xa798], - [0xa799, 0xa799], - [0xa79a, 0xa79a], - [0xa79b, 0xa79b], - [0xa79c, 0xa79c], - [0xa79d, 0xa79d], - [0xa79e, 0xa79e], - [0xa79f, 0xa79f], + [0xa794, 0xa794], /* LATIN SMALL LETTER C WITH PALATAL HOOK */ + [0xa795, 0xa795], /* LATIN SMALL LETTER H WITH PALATAL HOOK */ + [0xa796, 0xa797], /* LATIN CAPITAL LETTER B WITH FLOURISH */ + [0xa796, 0xa797], /* LATIN SMALL LETTER B WITH FLOURISH */ + [0xa798, 0xa799], /* LATIN CAPITAL LETTER F WITH STROKE */ + [0xa798, 0xa799], /* LATIN SMALL LETTER F WITH STROKE */ + [0xa79a, 0xa79b], /* LATIN CAPITAL LETTER VOLAPUK AE */ + [0xa79a, 0xa79b], /* LATIN SMALL LETTER VOLAPUK AE */ + [0xa79c, 0xa79d], /* LATIN CAPITAL LETTER VOLAPUK OE */ + [0xa79c, 0xa79d], /* LATIN SMALL LETTER VOLAPUK OE */ + [0xa79e, 0xa79f], /* LATIN CAPITAL LETTER VOLAPUK UE */ + [0xa79e, 0xa79f], /* LATIN SMALL LETTER VOLAPUK UE */ [0xa7a0, 0xa7a1], /* LATIN CAPITAL LETTER G WITH OBLIQUE STROKE */ [0xa7a0, 0xa7a1], /* LATIN SMALL LETTER G WITH OBLIQUE STROKE */ [0xa7a2, 0xa7a3], /* LATIN CAPITAL LETTER K WITH OBLIQUE STROKE */ [0xa7a2, 0xa7a3], /* LATIN SMALL LETTER K WITH OBLIQUE STROKE */ [0xa7a4, 0xa7a5], /* LATIN CAPITAL LETTER N WITH OBLIQUE STROKE */ [0xa7a4, 0xa7a5], /* LATIN SMALL LETTER N WITH OBLIQUE STROKE */ [0xa7a6, 0xa7a7], /* LATIN CAPITAL LETTER R WITH OBLIQUE STROKE */ [0xa7a6, 0xa7a7], /* LATIN SMALL LETTER R WITH OBLIQUE STROKE */ [0xa7a8, 0xa7a9], /* LATIN CAPITAL LETTER S WITH OBLIQUE STROKE */ [0xa7a8, 0xa7a9], /* LATIN SMALL LETTER S WITH OBLIQUE STROKE */ [0xa7aa, 0x266], /* LATIN CAPITAL LETTER H WITH HOOK */ - [0xa7ab, 0xa7ab], - [0xa7ac, 0xa7ac], - [0xa7ad, 0xa7ad], - [0xa7ae, 0xa7ae], + [0xa7ab, 0x25c], /* LATIN CAPITAL LETTER REVERSED OPEN E */ + [0xa7ac, 0x261], /* LATIN CAPITAL LETTER SCRIPT G */ + [0xa7ad, 0x26c], /* LATIN CAPITAL LETTER L WITH BELT */ + [0xa7ae, 0x26a], /* LATIN CAPITAL LETTER SMALL CAPITAL I */ [0xa7af, 0xa7af], - [0xa7b0, 0xa7b0], - [0xa7b1, 0xa7b1], - [0xa7b2, 0xa7b2], - [0xa7b3, 0xa7b3], - [0xa7b4, 0xa7b4], - [0xa7b5, 0xa7b5], - [0xa7b6, 0xa7b6], - [0xa7b7, 0xa7b7], + [0xa7b0, 0x29e], /* LATIN CAPITAL LETTER TURNED K */ + [0xa7b1, 0x287], /* LATIN CAPITAL LETTER TURNED T */ + [0xa7b2, 0x29d], /* LATIN CAPITAL LETTER J WITH CROSSED-TAIL */ + [0xa7b3, 0xab53], /* LATIN CAPITAL LETTER CHI */ + [0xa7b4, 0xa7b5], /* LATIN CAPITAL LETTER BETA */ + [0xa7b4, 0xa7b5], /* LATIN SMALL LETTER BETA */ + [0xa7b6, 0xa7b7], /* LATIN CAPITAL LETTER OMEGA */ + [0xa7b6, 0xa7b7], /* LATIN SMALL LETTER OMEGA */ [0xa7b8, 0xa7b8], [0xa7b9, 0xa7b9], [0xa7ba, 0xa7ba], [0xa7bb, 0xa7bb], [0xa7bc, 0xa7bc], [0xa7bd, 0xa7bd], [0xa7be, 0xa7be], [0xa7bf, 0xa7bf], @@ -43000,17 +43000,17 @@ var mapping = [ [0xa7ef, 0xa7ef], [0xa7f0, 0xa7f0], [0xa7f1, 0xa7f1], [0xa7f2, 0xa7f2], [0xa7f3, 0xa7f3], [0xa7f4, 0xa7f4], [0xa7f5, 0xa7f5], [0xa7f6, 0xa7f6], - [0xa7f7, 0xa7f7], + [0xa7f7, 0xa7f7], /* LATIN EPIGRAPHIC LETTER SIDEWAYS I */ [0xa7f8, 0xa7f8], /* MODIFIER LETTER CAPITAL H WITH STROKE */ [0xa7f9, 0xa7f9], /* MODIFIER LETTER SMALL LIGATURE OE */ [0xa7fa, 0xa7fa], /* LATIN LETTER SMALL CAPITAL TURNED M */ [0xa7fb, 0xa7fb], /* LATIN EPIGRAPHIC LETTER REVERSED F */ [0xa7fc, 0xa7fc], /* LATIN EPIGRAPHIC LETTER REVERSED P */ [0xa7fd, 0xa7fd], /* LATIN EPIGRAPHIC LETTER INVERTED M */ [0xa7fe, 0xa7fe], /* LATIN EPIGRAPHIC LETTER I LONGA */ [0xa7ff, 0xa7ff], /* LATIN EPIGRAPHIC LETTER ARCHAIC M */ @@ -43206,17 +43206,17 @@ var mapping = [ [0xa8bd, 0xa8bd], /* SAURASHTRA VOWEL SIGN VOCALIC LL */ [0xa8be, 0xa8be], /* SAURASHTRA VOWEL SIGN E */ [0xa8bf, 0xa8bf], /* SAURASHTRA VOWEL SIGN EE */ [0xa8c0, 0xa8c0], /* SAURASHTRA VOWEL SIGN AI */ [0xa8c1, 0xa8c1], /* SAURASHTRA VOWEL SIGN O */ [0xa8c2, 0xa8c2], /* SAURASHTRA VOWEL SIGN OO */ [0xa8c3, 0xa8c3], /* SAURASHTRA VOWEL SIGN AU */ [0xa8c4, 0xa8c4], /* SAURASHTRA SIGN VIRAMA */ - [0xa8c5, 0xa8c5], + [0xa8c5, 0xa8c5], /* SAURASHTRA SIGN CANDRABINDU */ [0xa8c6, 0xa8c6], [0xa8c7, 0xa8c7], [0xa8c8, 0xa8c8], [0xa8c9, 0xa8c9], [0xa8ca, 0xa8ca], [0xa8cb, 0xa8cb], [0xa8cc, 0xa8cc], [0xa8cd, 0xa8cd], @@ -43261,18 +43261,18 @@ var mapping = [ [0xa8f4, 0xa8f4], /* DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA */ [0xa8f5, 0xa8f5], /* DEVANAGARI SIGN CANDRABINDU TWO */ [0xa8f6, 0xa8f6], /* DEVANAGARI SIGN CANDRABINDU THREE */ [0xa8f7, 0xa8f7], /* DEVANAGARI SIGN CANDRABINDU AVAGRAHA */ [0xa8f8, 0xa8f8], /* DEVANAGARI SIGN PUSHPIKA */ [0xa8f9, 0xa8f9], /* DEVANAGARI GAP FILLER */ [0xa8fa, 0xa8fa], /* DEVANAGARI CARET */ [0xa8fb, 0xa8fb], /* DEVANAGARI HEADSTROKE */ - [0xa8fc, 0xa8fc], - [0xa8fd, 0xa8fd], + [0xa8fc, 0xa8fc], /* DEVANAGARI SIGN SIDDHAM */ + [0xa8fd, 0xa8fd], /* DEVANAGARI JAIN OM */ [0xa8fe, 0xa8fe], [0xa8ff, 0xa8ff], [0xa900, 0xa900], /* KAYAH LI DIGIT ZERO */ [0xa901, 0xa901], /* KAYAH LI DIGIT ONE */ [0xa902, 0xa902], /* KAYAH LI DIGIT TWO */ [0xa903, 0xa903], /* KAYAH LI DIGIT THREE */ [0xa904, 0xa904], /* KAYAH LI DIGIT FOUR */ [0xa905, 0xa905], /* KAYAH LI DIGIT FIVE */ @@ -43489,47 +43489,47 @@ var mapping = [ [0xa9d8, 0xa9d8], /* JAVANESE DIGIT EIGHT */ [0xa9d9, 0xa9d9], /* JAVANESE DIGIT NINE */ [0xa9da, 0xa9da], [0xa9db, 0xa9db], [0xa9dc, 0xa9dc], [0xa9dd, 0xa9dd], [0xa9de, 0xa9de], /* JAVANESE PADA TIRTA TUMETES */ [0xa9df, 0xa9df], /* JAVANESE PADA ISEN-ISEN */ - [0xa9e0, 0xa9e0], - [0xa9e1, 0xa9e1], - [0xa9e2, 0xa9e2], - [0xa9e3, 0xa9e3], - [0xa9e4, 0xa9e4], - [0xa9e5, 0xa9e5], - [0xa9e6, 0xa9e6], - [0xa9e7, 0xa9e7], - [0xa9e8, 0xa9e8], - [0xa9e9, 0xa9e9], - [0xa9ea, 0xa9ea], - [0xa9eb, 0xa9eb], - [0xa9ec, 0xa9ec], - [0xa9ed, 0xa9ed], - [0xa9ee, 0xa9ee], - [0xa9ef, 0xa9ef], - [0xa9f0, 0xa9f0], - [0xa9f1, 0xa9f1], - [0xa9f2, 0xa9f2], - [0xa9f3, 0xa9f3], - [0xa9f4, 0xa9f4], - [0xa9f5, 0xa9f5], - [0xa9f6, 0xa9f6], - [0xa9f7, 0xa9f7], - [0xa9f8, 0xa9f8], - [0xa9f9, 0xa9f9], - [0xa9fa, 0xa9fa], - [0xa9fb, 0xa9fb], - [0xa9fc, 0xa9fc], - [0xa9fd, 0xa9fd], - [0xa9fe, 0xa9fe], + [0xa9e0, 0xa9e0], /* MYANMAR LETTER SHAN GHA */ + [0xa9e1, 0xa9e1], /* MYANMAR LETTER SHAN CHA */ + [0xa9e2, 0xa9e2], /* MYANMAR LETTER SHAN JHA */ + [0xa9e3, 0xa9e3], /* MYANMAR LETTER SHAN NNA */ + [0xa9e4, 0xa9e4], /* MYANMAR LETTER SHAN BHA */ + [0xa9e5, 0xa9e5], /* MYANMAR SIGN SHAN SAW */ + [0xa9e6, 0xa9e6], /* MYANMAR MODIFIER LETTER SHAN REDUPLICATION */ + [0xa9e7, 0xa9e7], /* MYANMAR LETTER TAI LAING NYA */ + [0xa9e8, 0xa9e8], /* MYANMAR LETTER TAI LAING FA */ + [0xa9e9, 0xa9e9], /* MYANMAR LETTER TAI LAING GA */ + [0xa9ea, 0xa9ea], /* MYANMAR LETTER TAI LAING GHA */ + [0xa9eb, 0xa9eb], /* MYANMAR LETTER TAI LAING JA */ + [0xa9ec, 0xa9ec], /* MYANMAR LETTER TAI LAING JHA */ + [0xa9ed, 0xa9ed], /* MYANMAR LETTER TAI LAING DDA */ + [0xa9ee, 0xa9ee], /* MYANMAR LETTER TAI LAING DDHA */ + [0xa9ef, 0xa9ef], /* MYANMAR LETTER TAI LAING NNA */ + [0xa9f0, 0xa9f0], /* MYANMAR TAI LAING DIGIT ZERO */ + [0xa9f1, 0xa9f1], /* MYANMAR TAI LAING DIGIT ONE */ + [0xa9f2, 0xa9f2], /* MYANMAR TAI LAING DIGIT TWO */ + [0xa9f3, 0xa9f3], /* MYANMAR TAI LAING DIGIT THREE */ + [0xa9f4, 0xa9f4], /* MYANMAR TAI LAING DIGIT FOUR */ + [0xa9f5, 0xa9f5], /* MYANMAR TAI LAING DIGIT FIVE */ + [0xa9f6, 0xa9f6], /* MYANMAR TAI LAING DIGIT SIX */ + [0xa9f7, 0xa9f7], /* MYANMAR TAI LAING DIGIT SEVEN */ + [0xa9f8, 0xa9f8], /* MYANMAR TAI LAING DIGIT EIGHT */ + [0xa9f9, 0xa9f9], /* MYANMAR TAI LAING DIGIT NINE */ + [0xa9fa, 0xa9fa], /* MYANMAR LETTER TAI LAING LLA */ + [0xa9fb, 0xa9fb], /* MYANMAR LETTER TAI LAING DA */ + [0xa9fc, 0xa9fc], /* MYANMAR LETTER TAI LAING DHA */ + [0xa9fd, 0xa9fd], /* MYANMAR LETTER TAI LAING BA */ + [0xa9fe, 0xa9fe], /* MYANMAR LETTER TAI LAING BHA */ [0xa9ff, 0xa9ff], [0xaa00, 0xaa00], /* CHAM LETTER A */ [0xaa01, 0xaa01], /* CHAM LETTER I */ [0xaa02, 0xaa02], /* CHAM LETTER U */ [0xaa03, 0xaa03], /* CHAM LETTER E */ [0xaa04, 0xaa04], /* CHAM LETTER AI */ [0xaa05, 0xaa05], /* CHAM LETTER O */ [0xaa06, 0xaa06], /* CHAM LETTER KA */ @@ -43645,20 +43645,20 @@ var mapping = [ [0xaa74, 0xaa74], /* MYANMAR LOGOGRAM KHAMTI OAY */ [0xaa75, 0xaa75], /* MYANMAR LOGOGRAM KHAMTI QN */ [0xaa76, 0xaa76], /* MYANMAR LOGOGRAM KHAMTI HM */ [0xaa77, 0xaa77], /* MYANMAR SYMBOL AITON EXCLAMATION */ [0xaa78, 0xaa78], /* MYANMAR SYMBOL AITON ONE */ [0xaa79, 0xaa79], /* MYANMAR SYMBOL AITON TWO */ [0xaa7a, 0xaa7a], /* MYANMAR LETTER AITON RA */ [0xaa7b, 0xaa7b], /* MYANMAR SIGN PAO KAREN TONE */ - [0xaa7c, 0xaa7c], - [0xaa7d, 0xaa7d], - [0xaa7e, 0xaa7e], - [0xaa7f, 0xaa7f], + [0xaa7c, 0xaa7c], /* MYANMAR SIGN TAI LAING TONE-2 */ + [0xaa7d, 0xaa7d], /* MYANMAR SIGN TAI LAING TONE-5 */ + [0xaa7e, 0xaa7e], /* MYANMAR LETTER SHWE PALAUNG CHA */ + [0xaa7f, 0xaa7f], /* MYANMAR LETTER SHWE PALAUNG SHA */ [0xaa80, 0xaa80], /* TAI VIET LETTER LOW KO */ [0xaa81, 0xaa81], /* TAI VIET LETTER HIGH KO */ [0xaa82, 0xaa82], /* TAI VIET LETTER LOW KHO */ [0xaa83, 0xaa83], /* TAI VIET LETTER HIGH KHO */ [0xaa84, 0xaa84], /* TAI VIET LETTER LOW KHHO */ [0xaa85, 0xaa85], /* TAI VIET LETTER HIGH KHHO */ [0xaa86, 0xaa86], /* TAI VIET LETTER LOW GO */ [0xaa87, 0xaa87], /* TAI VIET LETTER HIGH GO */ @@ -43825,160 +43825,160 @@ var mapping = [ [0xab28, 0xab28], /* ETHIOPIC SYLLABLE BBA */ [0xab29, 0xab29], /* ETHIOPIC SYLLABLE BBU */ [0xab2a, 0xab2a], /* ETHIOPIC SYLLABLE BBI */ [0xab2b, 0xab2b], /* ETHIOPIC SYLLABLE BBAA */ [0xab2c, 0xab2c], /* ETHIOPIC SYLLABLE BBEE */ [0xab2d, 0xab2d], /* ETHIOPIC SYLLABLE BBE */ [0xab2e, 0xab2e], /* ETHIOPIC SYLLABLE BBO */ [0xab2f, 0xab2f], - [0xab30, 0xab30], - [0xab31, 0xab31], - [0xab32, 0xab32], - [0xab33, 0xab33], - [0xab34, 0xab34], - [0xab35, 0xab35], - [0xab36, 0xab36], - [0xab37, 0xab37], - [0xab38, 0xab38], - [0xab39, 0xab39], - [0xab3a, 0xab3a], - [0xab3b, 0xab3b], - [0xab3c, 0xab3c], - [0xab3d, 0xab3d], - [0xab3e, 0xab3e], - [0xab3f, 0xab3f], - [0xab40, 0xab40], - [0xab41, 0xab41], - [0xab42, 0xab42], - [0xab43, 0xab43], - [0xab44, 0xab44], - [0xab45, 0xab45], - [0xab46, 0xab46], - [0xab47, 0xab47], - [0xab48, 0xab48], - [0xab49, 0xab49], - [0xab4a, 0xab4a], - [0xab4b, 0xab4b], - [0xab4c, 0xab4c], - [0xab4d, 0xab4d], - [0xab4e, 0xab4e], - [0xab4f, 0xab4f], - [0xab50, 0xab50], - [0xab51, 0xab51], - [0xab52, 0xab52], - [0xab53, 0xab53], - [0xab54, 0xab54], - [0xab55, 0xab55], - [0xab56, 0xab56], - [0xab57, 0xab57], - [0xab58, 0xab58], - [0xab59, 0xab59], - [0xab5a, 0xab5a], - [0xab5b, 0xab5b], - [0xab5c, 0xab5c], - [0xab5d, 0xab5d], - [0xab5e, 0xab5e], - [0xab5f, 0xab5f], - [0xab60, 0xab60], - [0xab61, 0xab61], - [0xab62, 0xab62], - [0xab63, 0xab63], - [0xab64, 0xab64], - [0xab65, 0xab65], + [0xab30, 0xab30], /* LATIN SMALL LETTER BARRED ALPHA */ + [0xab31, 0xab31], /* LATIN SMALL LETTER A REVERSED-SCHWA */ + [0xab32, 0xab32], /* LATIN SMALL LETTER BLACKLETTER E */ + [0xab33, 0xab33], /* LATIN SMALL LETTER BARRED E */ + [0xab34, 0xab34], /* LATIN SMALL LETTER E WITH FLOURISH */ + [0xab35, 0xab35], /* LATIN SMALL LETTER LENIS F */ + [0xab36, 0xab36], /* LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL */ + [0xab37, 0xab37], /* LATIN SMALL LETTER L WITH INVERTED LAZY S */ + [0xab38, 0xab38], /* LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE */ + [0xab39, 0xab39], /* LATIN SMALL LETTER L WITH MIDDLE RING */ + [0xab3a, 0xab3a], /* LATIN SMALL LETTER M WITH CROSSED-TAIL */ + [0xab3b, 0xab3b], /* LATIN SMALL LETTER N WITH CROSSED-TAIL */ + [0xab3c, 0xab3c], /* LATIN SMALL LETTER ENG WITH CROSSED-TAIL */ + [0xab3d, 0xab3d], /* LATIN SMALL LETTER BLACKLETTER O */ + [0xab3e, 0xab3e], /* LATIN SMALL LETTER BLACKLETTER O WITH STROKE */ + [0xab3f, 0xab3f], /* LATIN SMALL LETTER OPEN O WITH STROKE */ + [0xab40, 0xab40], /* LATIN SMALL LETTER INVERTED OE */ + [0xab41, 0xab41], /* LATIN SMALL LETTER TURNED OE WITH STROKE */ + [0xab42, 0xab42], /* LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE */ + [0xab43, 0xab43], /* LATIN SMALL LETTER TURNED O OPEN-O */ + [0xab44, 0xab44], /* LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE */ + [0xab45, 0xab45], /* LATIN SMALL LETTER STIRRUP R */ + [0xab46, 0xab46], /* LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG */ + [0xab47, 0xab47], /* LATIN SMALL LETTER R WITHOUT HANDLE */ + [0xab48, 0xab48], /* LATIN SMALL LETTER DOUBLE R */ + [0xab49, 0xab49], /* LATIN SMALL LETTER R WITH CROSSED-TAIL */ + [0xab4a, 0xab4a], /* LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL */ + [0xab4b, 0xab4b], /* LATIN SMALL LETTER SCRIPT R */ + [0xab4c, 0xab4c], /* LATIN SMALL LETTER SCRIPT R WITH RING */ + [0xab4d, 0xab4d], /* LATIN SMALL LETTER BASELINE ESH */ + [0xab4e, 0xab4e], /* LATIN SMALL LETTER U WITH SHORT RIGHT LEG */ + [0xab4f, 0xab4f], /* LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG */ + [0xab50, 0xab50], /* LATIN SMALL LETTER UI */ + [0xab51, 0xab51], /* LATIN SMALL LETTER TURNED UI */ + [0xab52, 0xab52], /* LATIN SMALL LETTER U WITH LEFT HOOK */ + [0xa7b3, 0xab53], /* LATIN SMALL LETTER CHI */ + [0xab54, 0xab54], /* LATIN SMALL LETTER CHI WITH LOW RIGHT RING */ + [0xab55, 0xab55], /* LATIN SMALL LETTER CHI WITH LOW LEFT SERIF */ + [0xab56, 0xab56], /* LATIN SMALL LETTER X WITH LOW RIGHT RING */ + [0xab57, 0xab57], /* LATIN SMALL LETTER X WITH LONG LEFT LEG */ + [0xab58, 0xab58], /* LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING */ + [0xab59, 0xab59], /* LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF */ + [0xab5a, 0xab5a], /* LATIN SMALL LETTER Y WITH SHORT RIGHT LEG */ + [0xab5b, 0xab5b], /* MODIFIER BREVE WITH INVERTED BREVE */ + [0xab5c, 0xab5c], /* MODIFIER LETTER SMALL HENG */ + [0xab5d, 0xab5d], /* MODIFIER LETTER SMALL L WITH INVERTED LAZY S */ + [0xab5e, 0xab5e], /* MODIFIER LETTER SMALL L WITH MIDDLE TILDE */ + [0xab5f, 0xab5f], /* MODIFIER LETTER SMALL U WITH LEFT HOOK */ + [0xab60, 0xab60], /* LATIN SMALL LETTER SAKHA YAT */ + [0xab61, 0xab61], /* LATIN SMALL LETTER IOTIFIED E */ + [0xab62, 0xab62], /* LATIN SMALL LETTER OPEN OE */ + [0xab63, 0xab63], /* LATIN SMALL LETTER UO */ + [0xab64, 0xab64], /* LATIN SMALL LETTER INVERTED ALPHA */ + [0xab65, 0xab65], /* GREEK LETTER SMALL CAPITAL OMEGA */ [0xab66, 0xab66], [0xab67, 0xab67], [0xab68, 0xab68], [0xab69, 0xab69], [0xab6a, 0xab6a], [0xab6b, 0xab6b], [0xab6c, 0xab6c], [0xab6d, 0xab6d], [0xab6e, 0xab6e], [0xab6f, 0xab6f], - [0xab70, 0xab70], - [0xab71, 0xab71], - [0xab72, 0xab72], - [0xab73, 0xab73], - [0xab74, 0xab74], - [0xab75, 0xab75], - [0xab76, 0xab76], - [0xab77, 0xab77], - [0xab78, 0xab78], - [0xab79, 0xab79], - [0xab7a, 0xab7a], - [0xab7b, 0xab7b], - [0xab7c, 0xab7c], - [0xab7d, 0xab7d], - [0xab7e, 0xab7e], - [0xab7f, 0xab7f], - [0xab80, 0xab80], - [0xab81, 0xab81], - [0xab82, 0xab82], - [0xab83, 0xab83], - [0xab84, 0xab84], - [0xab85, 0xab85], - [0xab86, 0xab86], - [0xab87, 0xab87], - [0xab88, 0xab88], - [0xab89, 0xab89], - [0xab8a, 0xab8a], - [0xab8b, 0xab8b], - [0xab8c, 0xab8c], - [0xab8d, 0xab8d], - [0xab8e, 0xab8e], - [0xab8f, 0xab8f], - [0xab90, 0xab90], - [0xab91, 0xab91], - [0xab92, 0xab92], - [0xab93, 0xab93], - [0xab94, 0xab94], - [0xab95, 0xab95], - [0xab96, 0xab96], - [0xab97, 0xab97], - [0xab98, 0xab98], - [0xab99, 0xab99], - [0xab9a, 0xab9a], - [0xab9b, 0xab9b], - [0xab9c, 0xab9c], - [0xab9d, 0xab9d], - [0xab9e, 0xab9e], - [0xab9f, 0xab9f], - [0xaba0, 0xaba0], - [0xaba1, 0xaba1], - [0xaba2, 0xaba2], - [0xaba3, 0xaba3], - [0xaba4, 0xaba4], - [0xaba5, 0xaba5], - [0xaba6, 0xaba6], - [0xaba7, 0xaba7], - [0xaba8, 0xaba8], - [0xaba9, 0xaba9], - [0xabaa, 0xabaa], - [0xabab, 0xabab], - [0xabac, 0xabac], - [0xabad, 0xabad], - [0xabae, 0xabae], - [0xabaf, 0xabaf], - [0xabb0, 0xabb0], - [0xabb1, 0xabb1], - [0xabb2, 0xabb2], - [0xabb3, 0xabb3], - [0xabb4, 0xabb4], - [0xabb5, 0xabb5], - [0xabb6, 0xabb6], - [0xabb7, 0xabb7], - [0xabb8, 0xabb8], - [0xabb9, 0xabb9], - [0xabba, 0xabba], - [0xabbb, 0xabbb], - [0xabbc, 0xabbc], - [0xabbd, 0xabbd], - [0xabbe, 0xabbe], - [0xabbf, 0xabbf], + [0x13a0, 0xab70], /* CHEROKEE SMALL LETTER A */ + [0x13a1, 0xab71], /* CHEROKEE SMALL LETTER E */ + [0x13a2, 0xab72], /* CHEROKEE SMALL LETTER I */ + [0x13a3, 0xab73], /* CHEROKEE SMALL LETTER O */ + [0x13a4, 0xab74], /* CHEROKEE SMALL LETTER U */ + [0x13a5, 0xab75], /* CHEROKEE SMALL LETTER V */ + [0x13a6, 0xab76], /* CHEROKEE SMALL LETTER GA */ + [0x13a7, 0xab77], /* CHEROKEE SMALL LETTER KA */ + [0x13a8, 0xab78], /* CHEROKEE SMALL LETTER GE */ + [0x13a9, 0xab79], /* CHEROKEE SMALL LETTER GI */ + [0x13aa, 0xab7a], /* CHEROKEE SMALL LETTER GO */ + [0x13ab, 0xab7b], /* CHEROKEE SMALL LETTER GU */ + [0x13ac, 0xab7c], /* CHEROKEE SMALL LETTER GV */ + [0x13ad, 0xab7d], /* CHEROKEE SMALL LETTER HA */ + [0x13ae, 0xab7e], /* CHEROKEE SMALL LETTER HE */ + [0x13af, 0xab7f], /* CHEROKEE SMALL LETTER HI */ + [0x13b0, 0xab80], /* CHEROKEE SMALL LETTER HO */ + [0x13b1, 0xab81], /* CHEROKEE SMALL LETTER HU */ + [0x13b2, 0xab82], /* CHEROKEE SMALL LETTER HV */ + [0x13b3, 0xab83], /* CHEROKEE SMALL LETTER LA */ + [0x13b4, 0xab84], /* CHEROKEE SMALL LETTER LE */ + [0x13b5, 0xab85], /* CHEROKEE SMALL LETTER LI */ + [0x13b6, 0xab86], /* CHEROKEE SMALL LETTER LO */ + [0x13b7, 0xab87], /* CHEROKEE SMALL LETTER LU */ + [0x13b8, 0xab88], /* CHEROKEE SMALL LETTER LV */ + [0x13b9, 0xab89], /* CHEROKEE SMALL LETTER MA */ + [0x13ba, 0xab8a], /* CHEROKEE SMALL LETTER ME */ + [0x13bb, 0xab8b], /* CHEROKEE SMALL LETTER MI */ + [0x13bc, 0xab8c], /* CHEROKEE SMALL LETTER MO */ + [0x13bd, 0xab8d], /* CHEROKEE SMALL LETTER MU */ + [0x13be, 0xab8e], /* CHEROKEE SMALL LETTER NA */ + [0x13bf, 0xab8f], /* CHEROKEE SMALL LETTER HNA */ + [0x13c0, 0xab90], /* CHEROKEE SMALL LETTER NAH */ + [0x13c1, 0xab91], /* CHEROKEE SMALL LETTER NE */ + [0x13c2, 0xab92], /* CHEROKEE SMALL LETTER NI */ + [0x13c3, 0xab93], /* CHEROKEE SMALL LETTER NO */ + [0x13c4, 0xab94], /* CHEROKEE SMALL LETTER NU */ + [0x13c5, 0xab95], /* CHEROKEE SMALL LETTER NV */ + [0x13c6, 0xab96], /* CHEROKEE SMALL LETTER QUA */ + [0x13c7, 0xab97], /* CHEROKEE SMALL LETTER QUE */ + [0x13c8, 0xab98], /* CHEROKEE SMALL LETTER QUI */ + [0x13c9, 0xab99], /* CHEROKEE SMALL LETTER QUO */ + [0x13ca, 0xab9a], /* CHEROKEE SMALL LETTER QUU */ + [0x13cb, 0xab9b], /* CHEROKEE SMALL LETTER QUV */ + [0x13cc, 0xab9c], /* CHEROKEE SMALL LETTER SA */ + [0x13cd, 0xab9d], /* CHEROKEE SMALL LETTER S */ + [0x13ce, 0xab9e], /* CHEROKEE SMALL LETTER SE */ + [0x13cf, 0xab9f], /* CHEROKEE SMALL LETTER SI */ + [0x13d0, 0xaba0], /* CHEROKEE SMALL LETTER SO */ + [0x13d1, 0xaba1], /* CHEROKEE SMALL LETTER SU */ + [0x13d2, 0xaba2], /* CHEROKEE SMALL LETTER SV */ + [0x13d3, 0xaba3], /* CHEROKEE SMALL LETTER DA */ + [0x13d4, 0xaba4], /* CHEROKEE SMALL LETTER TA */ + [0x13d5, 0xaba5], /* CHEROKEE SMALL LETTER DE */ + [0x13d6, 0xaba6], /* CHEROKEE SMALL LETTER TE */ + [0x13d7, 0xaba7], /* CHEROKEE SMALL LETTER DI */ + [0x13d8, 0xaba8], /* CHEROKEE SMALL LETTER TI */ + [0x13d9, 0xaba9], /* CHEROKEE SMALL LETTER DO */ + [0x13da, 0xabaa], /* CHEROKEE SMALL LETTER DU */ + [0x13db, 0xabab], /* CHEROKEE SMALL LETTER DV */ + [0x13dc, 0xabac], /* CHEROKEE SMALL LETTER DLA */ + [0x13dd, 0xabad], /* CHEROKEE SMALL LETTER TLA */ + [0x13de, 0xabae], /* CHEROKEE SMALL LETTER TLE */ + [0x13df, 0xabaf], /* CHEROKEE SMALL LETTER TLI */ + [0x13e0, 0xabb0], /* CHEROKEE SMALL LETTER TLO */ + [0x13e1, 0xabb1], /* CHEROKEE SMALL LETTER TLU */ + [0x13e2, 0xabb2], /* CHEROKEE SMALL LETTER TLV */ + [0x13e3, 0xabb3], /* CHEROKEE SMALL LETTER TSA */ + [0x13e4, 0xabb4], /* CHEROKEE SMALL LETTER TSE */ + [0x13e5, 0xabb5], /* CHEROKEE SMALL LETTER TSI */ + [0x13e6, 0xabb6], /* CHEROKEE SMALL LETTER TSO */ + [0x13e7, 0xabb7], /* CHEROKEE SMALL LETTER TSU */ + [0x13e8, 0xabb8], /* CHEROKEE SMALL LETTER TSV */ + [0x13e9, 0xabb9], /* CHEROKEE SMALL LETTER WA */ + [0x13ea, 0xabba], /* CHEROKEE SMALL LETTER WE */ + [0x13eb, 0xabbb], /* CHEROKEE SMALL LETTER WI */ + [0x13ec, 0xabbc], /* CHEROKEE SMALL LETTER WO */ + [0x13ed, 0xabbd], /* CHEROKEE SMALL LETTER WU */ + [0x13ee, 0xabbe], /* CHEROKEE SMALL LETTER WV */ + [0x13ef, 0xabbf], /* CHEROKEE SMALL LETTER YA */ [0xabc0, 0xabc0], /* MEETEI MAYEK LETTER KOK */ [0xabc1, 0xabc1], /* MEETEI MAYEK LETTER SAM */ [0xabc2, 0xabc2], /* MEETEI MAYEK LETTER LAI */ [0xabc3, 0xabc3], /* MEETEI MAYEK LETTER MIT */ [0xabc4, 0xabc4], /* MEETEI MAYEK LETTER PA */ [0xabc5, 0xabc5], /* MEETEI MAYEK LETTER NA */ [0xabc6, 0xabc6], /* MEETEI MAYEK LETTER CHIL */ [0xabc7, 0xabc7], /* MEETEI MAYEK LETTER TIL */ @@ -65064,25 +65064,25 @@ var mapping = [ [0xfe1f, 0xfe1f], [0xfe20, 0xfe20], /* COMBINING LIGATURE LEFT HALF */ [0xfe21, 0xfe21], /* COMBINING LIGATURE RIGHT HALF */ [0xfe22, 0xfe22], /* COMBINING DOUBLE TILDE LEFT HALF */ [0xfe23, 0xfe23], /* COMBINING DOUBLE TILDE RIGHT HALF */ [0xfe24, 0xfe24], /* COMBINING MACRON LEFT HALF */ [0xfe25, 0xfe25], /* COMBINING MACRON RIGHT HALF */ [0xfe26, 0xfe26], /* COMBINING CONJOINING MACRON */ - [0xfe27, 0xfe27], - [0xfe28, 0xfe28], - [0xfe29, 0xfe29], - [0xfe2a, 0xfe2a], - [0xfe2b, 0xfe2b], - [0xfe2c, 0xfe2c], - [0xfe2d, 0xfe2d], - [0xfe2e, 0xfe2e], - [0xfe2f, 0xfe2f], + [0xfe27, 0xfe27], /* COMBINING LIGATURE LEFT HALF BELOW */ + [0xfe28, 0xfe28], /* COMBINING LIGATURE RIGHT HALF BELOW */ + [0xfe29, 0xfe29], /* COMBINING TILDE LEFT HALF BELOW */ + [0xfe2a, 0xfe2a], /* COMBINING TILDE RIGHT HALF BELOW */ + [0xfe2b, 0xfe2b], /* COMBINING MACRON LEFT HALF BELOW */ + [0xfe2c, 0xfe2c], /* COMBINING MACRON RIGHT HALF BELOW */ + [0xfe2d, 0xfe2d], /* COMBINING CONJOINING MACRON BELOW */ + [0xfe2e, 0xfe2e], /* COMBINING CYRILLIC TITLO LEFT HALF */ + [0xfe2f, 0xfe2f], /* COMBINING CYRILLIC TITLO RIGHT HALF */ [0xfe30, 0xfe30], /* PRESENTATION FORM FOR VERTICAL TWO DOT LEADER (GLYPH FOR VERTICAL TWO DOT LEADER) */ [0xfe31, 0xfe31], /* PRESENTATION FORM FOR VERTICAL EM DASH (GLYPH FOR VERTICAL EM DASH) */ [0xfe32, 0xfe32], /* PRESENTATION FORM FOR VERTICAL EN DASH (GLYPH FOR VERTICAL EN DASH) */ [0xfe33, 0xfe33], /* PRESENTATION FORM FOR VERTICAL LOW LINE (GLYPH FOR VERTICAL SPACING UNDERSCORE) */ [0xfe34, 0xfe34], /* PRESENTATION FORM FOR VERTICAL WAVY LOW LINE (GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE) */ [0xfe35, 0xfe35], /* PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS (GLYPH FOR VERTICAL OPENING PARENTHESIS) */ [0xfe36, 0xfe36], /* PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS (GLYPH FOR VERTICAL CLOSING PARENTHESIS) */ [0xfe37, 0xfe37], /* PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET (GLYPH FOR VERTICAL OPENING CURLY BRACKET) */
--- a/js/src/tests/ecma_6/RegExp/unicode-ignoreCase.js +++ b/js/src/tests/ecma_6/RegExp/unicode-ignoreCase.js @@ -1,10 +1,10 @@ /* Generated by make_unicode.py DO NOT MODIFY */ -/* Unicode version: 8.0.0 */ +/* Unicode version: 9.0.0 */ /* * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ var BUGNUMBER = 1135377; var summary = "Implement RegExp unicode flag -- ignoreCase flag."; @@ -458,16 +458,17 @@ test(0x25b,0x190); test(0x25c,0xa7ab); test(0x260,0x193); test(0x261,0xa7ac); test(0x263,0x194); test(0x265,0xa78d); test(0x266,0xa7aa); test(0x268,0x197); test(0x269,0x196); +test(0x26a,0xa7ae); test(0x26b,0x2c62); test(0x26c,0xa7ad); test(0x26f,0x19c); test(0x271,0x2c6e); test(0x272,0x19d); test(0x275,0x19f); test(0x27d,0x2c64); test(0x280,0x1a6); @@ -616,73 +617,73 @@ test(0x409,0x459); test(0x40a,0x45a); test(0x40b,0x45b); test(0x40c,0x45c); test(0x40d,0x45d); test(0x40e,0x45e); test(0x40f,0x45f); test(0x410,0x430); test(0x411,0x431); -test(0x412,0x432); +test(0x412,0x432,0x1c80); test(0x413,0x433); -test(0x414,0x434); +test(0x414,0x434,0x1c81); test(0x415,0x435); test(0x416,0x436); test(0x417,0x437); test(0x418,0x438); test(0x419,0x439); test(0x41a,0x43a); test(0x41b,0x43b); test(0x41c,0x43c); test(0x41d,0x43d); -test(0x41e,0x43e); +test(0x41e,0x43e,0x1c82); test(0x41f,0x43f); test(0x420,0x440); -test(0x421,0x441); -test(0x422,0x442); +test(0x421,0x441,0x1c83); +test(0x422,0x442,0x1c84,0x1c85); test(0x423,0x443); test(0x424,0x444); test(0x425,0x445); test(0x426,0x446); test(0x427,0x447); test(0x428,0x448); test(0x429,0x449); -test(0x42a,0x44a); +test(0x42a,0x44a,0x1c86); test(0x42b,0x44b); test(0x42c,0x44c); test(0x42d,0x44d); test(0x42e,0x44e); test(0x42f,0x44f); test(0x430,0x410); test(0x431,0x411); -test(0x432,0x412); +test(0x432,0x412,0x1c80); test(0x433,0x413); -test(0x434,0x414); +test(0x434,0x414,0x1c81); test(0x435,0x415); test(0x436,0x416); test(0x437,0x417); test(0x438,0x418); test(0x439,0x419); test(0x43a,0x41a); test(0x43b,0x41b); test(0x43c,0x41c); test(0x43d,0x41d); -test(0x43e,0x41e); +test(0x43e,0x41e,0x1c82); test(0x43f,0x41f); test(0x440,0x420); -test(0x441,0x421); -test(0x442,0x422); +test(0x441,0x421,0x1c83); +test(0x442,0x422,0x1c84,0x1c85); test(0x443,0x423); test(0x444,0x424); test(0x445,0x425); test(0x446,0x426); test(0x447,0x427); test(0x448,0x428); test(0x449,0x429); -test(0x44a,0x42a); +test(0x44a,0x42a,0x1c86); test(0x44b,0x42b); test(0x44c,0x42c); test(0x44d,0x42d); test(0x44e,0x42e); test(0x44f,0x42f); test(0x450,0x400); test(0x451,0x401); test(0x452,0x402); @@ -696,18 +697,18 @@ test(0x459,0x409); test(0x45a,0x40a); test(0x45b,0x40b); test(0x45c,0x40c); test(0x45d,0x40d); test(0x45e,0x40e); test(0x45f,0x40f); test(0x460,0x461); test(0x461,0x460); -test(0x462,0x463); -test(0x463,0x462); +test(0x462,0x463,0x1c87); +test(0x463,0x462,0x1c87); test(0x464,0x465); test(0x465,0x464); test(0x466,0x467); test(0x467,0x466); test(0x468,0x469); test(0x469,0x468); test(0x46a,0x46b); test(0x46b,0x46a); @@ -1102,16 +1103,25 @@ test(0x13f3,0x13fb); test(0x13f4,0x13fc); test(0x13f5,0x13fd); test(0x13f8,0x13f0); test(0x13f9,0x13f1); test(0x13fa,0x13f2); test(0x13fb,0x13f3); test(0x13fc,0x13f4); test(0x13fd,0x13f5); +test(0x1c80,0x432,0x412); +test(0x1c81,0x434,0x414); +test(0x1c82,0x43e,0x41e); +test(0x1c83,0x441,0x421); +test(0x1c84,0x442,0x422,0x1c85); +test(0x1c85,0x442,0x422,0x1c84); +test(0x1c86,0x44a,0x42a); +test(0x1c87,0x463,0x462); +test(0x1c88,0xa64b,0xa64a); test(0x1d79,0xa77d); test(0x1d7d,0x2c63); test(0x1e00,0x1e01); test(0x1e01,0x1e00); test(0x1e02,0x1e03); test(0x1e03,0x1e02); test(0x1e04,0x1e05); test(0x1e05,0x1e04); @@ -1909,18 +1919,18 @@ test(0xa641,0xa640); test(0xa642,0xa643); test(0xa643,0xa642); test(0xa644,0xa645); test(0xa645,0xa644); test(0xa646,0xa647); test(0xa647,0xa646); test(0xa648,0xa649); test(0xa649,0xa648); -test(0xa64a,0xa64b); -test(0xa64b,0xa64a); +test(0xa64a,0xa64b,0x1c88); +test(0xa64b,0x1c88,0xa64a); test(0xa64c,0xa64d); test(0xa64d,0xa64c); test(0xa64e,0xa64f); test(0xa64f,0xa64e); test(0xa650,0xa651); test(0xa651,0xa650); test(0xa652,0xa653); test(0xa653,0xa652); @@ -2095,16 +2105,17 @@ test(0xa7a5,0xa7a4); test(0xa7a6,0xa7a7); test(0xa7a7,0xa7a6); test(0xa7a8,0xa7a9); test(0xa7a9,0xa7a8); test(0xa7aa,0x266); test(0xa7ab,0x25c); test(0xa7ac,0x261); test(0xa7ad,0x26c); +test(0xa7ae,0x26a); test(0xa7b0,0x29e); test(0xa7b1,0x287); test(0xa7b2,0x29d); test(0xa7b3,0xab53); test(0xa7b4,0xa7b5); test(0xa7b5,0xa7b4); test(0xa7b6,0xa7b7); test(0xa7b7,0xa7b6); @@ -2316,16 +2327,88 @@ test(0x10447,0x1041f); test(0x10448,0x10420); test(0x10449,0x10421); test(0x1044a,0x10422); test(0x1044b,0x10423); test(0x1044c,0x10424); test(0x1044d,0x10425); test(0x1044e,0x10426); test(0x1044f,0x10427); +test(0x104b0,0x104d8); +test(0x104b1,0x104d9); +test(0x104b2,0x104da); +test(0x104b3,0x104db); +test(0x104b4,0x104dc); +test(0x104b5,0x104dd); +test(0x104b6,0x104de); +test(0x104b7,0x104df); +test(0x104b8,0x104e0); +test(0x104b9,0x104e1); +test(0x104ba,0x104e2); +test(0x104bb,0x104e3); +test(0x104bc,0x104e4); +test(0x104bd,0x104e5); +test(0x104be,0x104e6); +test(0x104bf,0x104e7); +test(0x104c0,0x104e8); +test(0x104c1,0x104e9); +test(0x104c2,0x104ea); +test(0x104c3,0x104eb); +test(0x104c4,0x104ec); +test(0x104c5,0x104ed); +test(0x104c6,0x104ee); +test(0x104c7,0x104ef); +test(0x104c8,0x104f0); +test(0x104c9,0x104f1); +test(0x104ca,0x104f2); +test(0x104cb,0x104f3); +test(0x104cc,0x104f4); +test(0x104cd,0x104f5); +test(0x104ce,0x104f6); +test(0x104cf,0x104f7); +test(0x104d0,0x104f8); +test(0x104d1,0x104f9); +test(0x104d2,0x104fa); +test(0x104d3,0x104fb); +test(0x104d8,0x104b0); +test(0x104d9,0x104b1); +test(0x104da,0x104b2); +test(0x104db,0x104b3); +test(0x104dc,0x104b4); +test(0x104dd,0x104b5); +test(0x104de,0x104b6); +test(0x104df,0x104b7); +test(0x104e0,0x104b8); +test(0x104e1,0x104b9); +test(0x104e2,0x104ba); +test(0x104e3,0x104bb); +test(0x104e4,0x104bc); +test(0x104e5,0x104bd); +test(0x104e6,0x104be); +test(0x104e7,0x104bf); +test(0x104e8,0x104c0); +test(0x104e9,0x104c1); +test(0x104ea,0x104c2); +test(0x104eb,0x104c3); +test(0x104ec,0x104c4); +test(0x104ed,0x104c5); +test(0x104ee,0x104c6); +test(0x104ef,0x104c7); +test(0x104f0,0x104c8); +test(0x104f1,0x104c9); +test(0x104f2,0x104ca); +test(0x104f3,0x104cb); +test(0x104f4,0x104cc); +test(0x104f5,0x104cd); +test(0x104f6,0x104ce); +test(0x104f7,0x104cf); +test(0x104f8,0x104d0); +test(0x104f9,0x104d1); +test(0x104fa,0x104d2); +test(0x104fb,0x104d3); test(0x10c80,0x10cc0); test(0x10c81,0x10cc1); test(0x10c82,0x10cc2); test(0x10c83,0x10cc3); test(0x10c84,0x10cc4); test(0x10c85,0x10cc5); test(0x10c86,0x10cc6); test(0x10c87,0x10cc7); @@ -2482,11 +2565,79 @@ test(0x118d7,0x118b7); test(0x118d8,0x118b8); test(0x118d9,0x118b9); test(0x118da,0x118ba); test(0x118db,0x118bb); test(0x118dc,0x118bc); test(0x118dd,0x118bd); test(0x118de,0x118be); test(0x118df,0x118bf); +test(0x1e900,0x1e922); +test(0x1e901,0x1e923); +test(0x1e902,0x1e924); +test(0x1e903,0x1e925); +test(0x1e904,0x1e926); +test(0x1e905,0x1e927); +test(0x1e906,0x1e928); +test(0x1e907,0x1e929); +test(0x1e908,0x1e92a); +test(0x1e909,0x1e92b); +test(0x1e90a,0x1e92c); +test(0x1e90b,0x1e92d); +test(0x1e90c,0x1e92e); +test(0x1e90d,0x1e92f); +test(0x1e90e,0x1e930); +test(0x1e90f,0x1e931); +test(0x1e910,0x1e932); +test(0x1e911,0x1e933); +test(0x1e912,0x1e934); +test(0x1e913,0x1e935); +test(0x1e914,0x1e936); +test(0x1e915,0x1e937); +test(0x1e916,0x1e938); +test(0x1e917,0x1e939); +test(0x1e918,0x1e93a); +test(0x1e919,0x1e93b); +test(0x1e91a,0x1e93c); +test(0x1e91b,0x1e93d); +test(0x1e91c,0x1e93e); +test(0x1e91d,0x1e93f); +test(0x1e91e,0x1e940); +test(0x1e91f,0x1e941); +test(0x1e920,0x1e942); +test(0x1e921,0x1e943); +test(0x1e922,0x1e900); +test(0x1e923,0x1e901); +test(0x1e924,0x1e902); +test(0x1e925,0x1e903); +test(0x1e926,0x1e904); +test(0x1e927,0x1e905); +test(0x1e928,0x1e906); +test(0x1e929,0x1e907); +test(0x1e92a,0x1e908); +test(0x1e92b,0x1e909); +test(0x1e92c,0x1e90a); +test(0x1e92d,0x1e90b); +test(0x1e92e,0x1e90c); +test(0x1e92f,0x1e90d); +test(0x1e930,0x1e90e); +test(0x1e931,0x1e90f); +test(0x1e932,0x1e910); +test(0x1e933,0x1e911); +test(0x1e934,0x1e912); +test(0x1e935,0x1e913); +test(0x1e936,0x1e914); +test(0x1e937,0x1e915); +test(0x1e938,0x1e916); +test(0x1e939,0x1e917); +test(0x1e93a,0x1e918); +test(0x1e93b,0x1e919); +test(0x1e93c,0x1e91a); +test(0x1e93d,0x1e91b); +test(0x1e93e,0x1e91c); +test(0x1e93f,0x1e91d); +test(0x1e940,0x1e91e); +test(0x1e941,0x1e91f); +test(0x1e942,0x1e920); +test(0x1e943,0x1e921); if (typeof reportCompare === "function") reportCompare(true, true);
--- a/js/src/tests/ecma_6/String/string-code-point-upper-lower-mapping.js +++ b/js/src/tests/ecma_6/String/string-code-point-upper-lower-mapping.js @@ -1,10 +1,10 @@ /* Generated by make_unicode.py DO NOT MODIFY */ -/* Unicode version: 6.2.0 */ +/* Unicode version: 9.0.0 */ /* * Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ assertEq(String.fromCodePoint(0x10428).toUpperCase().codePointAt(0), 0x10400); assertEq(String.fromCodePoint(0x10429).toUpperCase().codePointAt(0), 0x10401); assertEq(String.fromCodePoint(0x1042a).toUpperCase().codePointAt(0), 0x10402); @@ -40,16 +40,169 @@ assertEq(String.fromCodePoint(0x10447).t assertEq(String.fromCodePoint(0x10448).toUpperCase().codePointAt(0), 0x10420); assertEq(String.fromCodePoint(0x10449).toUpperCase().codePointAt(0), 0x10421); assertEq(String.fromCodePoint(0x1044a).toUpperCase().codePointAt(0), 0x10422); assertEq(String.fromCodePoint(0x1044b).toUpperCase().codePointAt(0), 0x10423); assertEq(String.fromCodePoint(0x1044c).toUpperCase().codePointAt(0), 0x10424); assertEq(String.fromCodePoint(0x1044d).toUpperCase().codePointAt(0), 0x10425); assertEq(String.fromCodePoint(0x1044e).toUpperCase().codePointAt(0), 0x10426); assertEq(String.fromCodePoint(0x1044f).toUpperCase().codePointAt(0), 0x10427); +assertEq(String.fromCodePoint(0x104d8).toUpperCase().codePointAt(0), 0x104b0); +assertEq(String.fromCodePoint(0x104d9).toUpperCase().codePointAt(0), 0x104b1); +assertEq(String.fromCodePoint(0x104da).toUpperCase().codePointAt(0), 0x104b2); +assertEq(String.fromCodePoint(0x104db).toUpperCase().codePointAt(0), 0x104b3); +assertEq(String.fromCodePoint(0x104dc).toUpperCase().codePointAt(0), 0x104b4); +assertEq(String.fromCodePoint(0x104dd).toUpperCase().codePointAt(0), 0x104b5); +assertEq(String.fromCodePoint(0x104de).toUpperCase().codePointAt(0), 0x104b6); +assertEq(String.fromCodePoint(0x104df).toUpperCase().codePointAt(0), 0x104b7); +assertEq(String.fromCodePoint(0x104e0).toUpperCase().codePointAt(0), 0x104b8); +assertEq(String.fromCodePoint(0x104e1).toUpperCase().codePointAt(0), 0x104b9); +assertEq(String.fromCodePoint(0x104e2).toUpperCase().codePointAt(0), 0x104ba); +assertEq(String.fromCodePoint(0x104e3).toUpperCase().codePointAt(0), 0x104bb); +assertEq(String.fromCodePoint(0x104e4).toUpperCase().codePointAt(0), 0x104bc); +assertEq(String.fromCodePoint(0x104e5).toUpperCase().codePointAt(0), 0x104bd); +assertEq(String.fromCodePoint(0x104e6).toUpperCase().codePointAt(0), 0x104be); +assertEq(String.fromCodePoint(0x104e7).toUpperCase().codePointAt(0), 0x104bf); +assertEq(String.fromCodePoint(0x104e8).toUpperCase().codePointAt(0), 0x104c0); +assertEq(String.fromCodePoint(0x104e9).toUpperCase().codePointAt(0), 0x104c1); +assertEq(String.fromCodePoint(0x104ea).toUpperCase().codePointAt(0), 0x104c2); +assertEq(String.fromCodePoint(0x104eb).toUpperCase().codePointAt(0), 0x104c3); +assertEq(String.fromCodePoint(0x104ec).toUpperCase().codePointAt(0), 0x104c4); +assertEq(String.fromCodePoint(0x104ed).toUpperCase().codePointAt(0), 0x104c5); +assertEq(String.fromCodePoint(0x104ee).toUpperCase().codePointAt(0), 0x104c6); +assertEq(String.fromCodePoint(0x104ef).toUpperCase().codePointAt(0), 0x104c7); +assertEq(String.fromCodePoint(0x104f0).toUpperCase().codePointAt(0), 0x104c8); +assertEq(String.fromCodePoint(0x104f1).toUpperCase().codePointAt(0), 0x104c9); +assertEq(String.fromCodePoint(0x104f2).toUpperCase().codePointAt(0), 0x104ca); +assertEq(String.fromCodePoint(0x104f3).toUpperCase().codePointAt(0), 0x104cb); +assertEq(String.fromCodePoint(0x104f4).toUpperCase().codePointAt(0), 0x104cc); +assertEq(String.fromCodePoint(0x104f5).toUpperCase().codePointAt(0), 0x104cd); +assertEq(String.fromCodePoint(0x104f6).toUpperCase().codePointAt(0), 0x104ce); +assertEq(String.fromCodePoint(0x104f7).toUpperCase().codePointAt(0), 0x104cf); +assertEq(String.fromCodePoint(0x104f8).toUpperCase().codePointAt(0), 0x104d0); +assertEq(String.fromCodePoint(0x104f9).toUpperCase().codePointAt(0), 0x104d1); +assertEq(String.fromCodePoint(0x104fa).toUpperCase().codePointAt(0), 0x104d2); +assertEq(String.fromCodePoint(0x104fb).toUpperCase().codePointAt(0), 0x104d3); +assertEq(String.fromCodePoint(0x10cc0).toUpperCase().codePointAt(0), 0x10c80); +assertEq(String.fromCodePoint(0x10cc1).toUpperCase().codePointAt(0), 0x10c81); +assertEq(String.fromCodePoint(0x10cc2).toUpperCase().codePointAt(0), 0x10c82); +assertEq(String.fromCodePoint(0x10cc3).toUpperCase().codePointAt(0), 0x10c83); +assertEq(String.fromCodePoint(0x10cc4).toUpperCase().codePointAt(0), 0x10c84); +assertEq(String.fromCodePoint(0x10cc5).toUpperCase().codePointAt(0), 0x10c85); +assertEq(String.fromCodePoint(0x10cc6).toUpperCase().codePointAt(0), 0x10c86); +assertEq(String.fromCodePoint(0x10cc7).toUpperCase().codePointAt(0), 0x10c87); +assertEq(String.fromCodePoint(0x10cc8).toUpperCase().codePointAt(0), 0x10c88); +assertEq(String.fromCodePoint(0x10cc9).toUpperCase().codePointAt(0), 0x10c89); +assertEq(String.fromCodePoint(0x10cca).toUpperCase().codePointAt(0), 0x10c8a); +assertEq(String.fromCodePoint(0x10ccb).toUpperCase().codePointAt(0), 0x10c8b); +assertEq(String.fromCodePoint(0x10ccc).toUpperCase().codePointAt(0), 0x10c8c); +assertEq(String.fromCodePoint(0x10ccd).toUpperCase().codePointAt(0), 0x10c8d); +assertEq(String.fromCodePoint(0x10cce).toUpperCase().codePointAt(0), 0x10c8e); +assertEq(String.fromCodePoint(0x10ccf).toUpperCase().codePointAt(0), 0x10c8f); +assertEq(String.fromCodePoint(0x10cd0).toUpperCase().codePointAt(0), 0x10c90); +assertEq(String.fromCodePoint(0x10cd1).toUpperCase().codePointAt(0), 0x10c91); +assertEq(String.fromCodePoint(0x10cd2).toUpperCase().codePointAt(0), 0x10c92); +assertEq(String.fromCodePoint(0x10cd3).toUpperCase().codePointAt(0), 0x10c93); +assertEq(String.fromCodePoint(0x10cd4).toUpperCase().codePointAt(0), 0x10c94); +assertEq(String.fromCodePoint(0x10cd5).toUpperCase().codePointAt(0), 0x10c95); +assertEq(String.fromCodePoint(0x10cd6).toUpperCase().codePointAt(0), 0x10c96); +assertEq(String.fromCodePoint(0x10cd7).toUpperCase().codePointAt(0), 0x10c97); +assertEq(String.fromCodePoint(0x10cd8).toUpperCase().codePointAt(0), 0x10c98); +assertEq(String.fromCodePoint(0x10cd9).toUpperCase().codePointAt(0), 0x10c99); +assertEq(String.fromCodePoint(0x10cda).toUpperCase().codePointAt(0), 0x10c9a); +assertEq(String.fromCodePoint(0x10cdb).toUpperCase().codePointAt(0), 0x10c9b); +assertEq(String.fromCodePoint(0x10cdc).toUpperCase().codePointAt(0), 0x10c9c); +assertEq(String.fromCodePoint(0x10cdd).toUpperCase().codePointAt(0), 0x10c9d); +assertEq(String.fromCodePoint(0x10cde).toUpperCase().codePointAt(0), 0x10c9e); +assertEq(String.fromCodePoint(0x10cdf).toUpperCase().codePointAt(0), 0x10c9f); +assertEq(String.fromCodePoint(0x10ce0).toUpperCase().codePointAt(0), 0x10ca0); +assertEq(String.fromCodePoint(0x10ce1).toUpperCase().codePointAt(0), 0x10ca1); +assertEq(String.fromCodePoint(0x10ce2).toUpperCase().codePointAt(0), 0x10ca2); +assertEq(String.fromCodePoint(0x10ce3).toUpperCase().codePointAt(0), 0x10ca3); +assertEq(String.fromCodePoint(0x10ce4).toUpperCase().codePointAt(0), 0x10ca4); +assertEq(String.fromCodePoint(0x10ce5).toUpperCase().codePointAt(0), 0x10ca5); +assertEq(String.fromCodePoint(0x10ce6).toUpperCase().codePointAt(0), 0x10ca6); +assertEq(String.fromCodePoint(0x10ce7).toUpperCase().codePointAt(0), 0x10ca7); +assertEq(String.fromCodePoint(0x10ce8).toUpperCase().codePointAt(0), 0x10ca8); +assertEq(String.fromCodePoint(0x10ce9).toUpperCase().codePointAt(0), 0x10ca9); +assertEq(String.fromCodePoint(0x10cea).toUpperCase().codePointAt(0), 0x10caa); +assertEq(String.fromCodePoint(0x10ceb).toUpperCase().codePointAt(0), 0x10cab); +assertEq(String.fromCodePoint(0x10cec).toUpperCase().codePointAt(0), 0x10cac); +assertEq(String.fromCodePoint(0x10ced).toUpperCase().codePointAt(0), 0x10cad); +assertEq(String.fromCodePoint(0x10cee).toUpperCase().codePointAt(0), 0x10cae); +assertEq(String.fromCodePoint(0x10cef).toUpperCase().codePointAt(0), 0x10caf); +assertEq(String.fromCodePoint(0x10cf0).toUpperCase().codePointAt(0), 0x10cb0); +assertEq(String.fromCodePoint(0x10cf1).toUpperCase().codePointAt(0), 0x10cb1); +assertEq(String.fromCodePoint(0x10cf2).toUpperCase().codePointAt(0), 0x10cb2); +assertEq(String.fromCodePoint(0x118c0).toUpperCase().codePointAt(0), 0x118a0); +assertEq(String.fromCodePoint(0x118c1).toUpperCase().codePointAt(0), 0x118a1); +assertEq(String.fromCodePoint(0x118c2).toUpperCase().codePointAt(0), 0x118a2); +assertEq(String.fromCodePoint(0x118c3).toUpperCase().codePointAt(0), 0x118a3); +assertEq(String.fromCodePoint(0x118c4).toUpperCase().codePointAt(0), 0x118a4); +assertEq(String.fromCodePoint(0x118c5).toUpperCase().codePointAt(0), 0x118a5); +assertEq(String.fromCodePoint(0x118c6).toUpperCase().codePointAt(0), 0x118a6); +assertEq(String.fromCodePoint(0x118c7).toUpperCase().codePointAt(0), 0x118a7); +assertEq(String.fromCodePoint(0x118c8).toUpperCase().codePointAt(0), 0x118a8); +assertEq(String.fromCodePoint(0x118c9).toUpperCase().codePointAt(0), 0x118a9); +assertEq(String.fromCodePoint(0x118ca).toUpperCase().codePointAt(0), 0x118aa); +assertEq(String.fromCodePoint(0x118cb).toUpperCase().codePointAt(0), 0x118ab); +assertEq(String.fromCodePoint(0x118cc).toUpperCase().codePointAt(0), 0x118ac); +assertEq(String.fromCodePoint(0x118cd).toUpperCase().codePointAt(0), 0x118ad); +assertEq(String.fromCodePoint(0x118ce).toUpperCase().codePointAt(0), 0x118ae); +assertEq(String.fromCodePoint(0x118cf).toUpperCase().codePointAt(0), 0x118af); +assertEq(String.fromCodePoint(0x118d0).toUpperCase().codePointAt(0), 0x118b0); +assertEq(String.fromCodePoint(0x118d1).toUpperCase().codePointAt(0), 0x118b1); +assertEq(String.fromCodePoint(0x118d2).toUpperCase().codePointAt(0), 0x118b2); +assertEq(String.fromCodePoint(0x118d3).toUpperCase().codePointAt(0), 0x118b3); +assertEq(String.fromCodePoint(0x118d4).toUpperCase().codePointAt(0), 0x118b4); +assertEq(String.fromCodePoint(0x118d5).toUpperCase().codePointAt(0), 0x118b5); +assertEq(String.fromCodePoint(0x118d6).toUpperCase().codePointAt(0), 0x118b6); +assertEq(String.fromCodePoint(0x118d7).toUpperCase().codePointAt(0), 0x118b7); +assertEq(String.fromCodePoint(0x118d8).toUpperCase().codePointAt(0), 0x118b8); +assertEq(String.fromCodePoint(0x118d9).toUpperCase().codePointAt(0), 0x118b9); +assertEq(String.fromCodePoint(0x118da).toUpperCase().codePointAt(0), 0x118ba); +assertEq(String.fromCodePoint(0x118db).toUpperCase().codePointAt(0), 0x118bb); +assertEq(String.fromCodePoint(0x118dc).toUpperCase().codePointAt(0), 0x118bc); +assertEq(String.fromCodePoint(0x118dd).toUpperCase().codePointAt(0), 0x118bd); +assertEq(String.fromCodePoint(0x118de).toUpperCase().codePointAt(0), 0x118be); +assertEq(String.fromCodePoint(0x118df).toUpperCase().codePointAt(0), 0x118bf); +assertEq(String.fromCodePoint(0x1e922).toUpperCase().codePointAt(0), 0x1e900); +assertEq(String.fromCodePoint(0x1e923).toUpperCase().codePointAt(0), 0x1e901); +assertEq(String.fromCodePoint(0x1e924).toUpperCase().codePointAt(0), 0x1e902); +assertEq(String.fromCodePoint(0x1e925).toUpperCase().codePointAt(0), 0x1e903); +assertEq(String.fromCodePoint(0x1e926).toUpperCase().codePointAt(0), 0x1e904); +assertEq(String.fromCodePoint(0x1e927).toUpperCase().codePointAt(0), 0x1e905); +assertEq(String.fromCodePoint(0x1e928).toUpperCase().codePointAt(0), 0x1e906); +assertEq(String.fromCodePoint(0x1e929).toUpperCase().codePointAt(0), 0x1e907); +assertEq(String.fromCodePoint(0x1e92a).toUpperCase().codePointAt(0), 0x1e908); +assertEq(String.fromCodePoint(0x1e92b).toUpperCase().codePointAt(0), 0x1e909); +assertEq(String.fromCodePoint(0x1e92c).toUpperCase().codePointAt(0), 0x1e90a); +assertEq(String.fromCodePoint(0x1e92d).toUpperCase().codePointAt(0), 0x1e90b); +assertEq(String.fromCodePoint(0x1e92e).toUpperCase().codePointAt(0), 0x1e90c); +assertEq(String.fromCodePoint(0x1e92f).toUpperCase().codePointAt(0), 0x1e90d); +assertEq(String.fromCodePoint(0x1e930).toUpperCase().codePointAt(0), 0x1e90e); +assertEq(String.fromCodePoint(0x1e931).toUpperCase().codePointAt(0), 0x1e90f); +assertEq(String.fromCodePoint(0x1e932).toUpperCase().codePointAt(0), 0x1e910); +assertEq(String.fromCodePoint(0x1e933).toUpperCase().codePointAt(0), 0x1e911); +assertEq(String.fromCodePoint(0x1e934).toUpperCase().codePointAt(0), 0x1e912); +assertEq(String.fromCodePoint(0x1e935).toUpperCase().codePointAt(0), 0x1e913); +assertEq(String.fromCodePoint(0x1e936).toUpperCase().codePointAt(0), 0x1e914); +assertEq(String.fromCodePoint(0x1e937).toUpperCase().codePointAt(0), 0x1e915); +assertEq(String.fromCodePoint(0x1e938).toUpperCase().codePointAt(0), 0x1e916); +assertEq(String.fromCodePoint(0x1e939).toUpperCase().codePointAt(0), 0x1e917); +assertEq(String.fromCodePoint(0x1e93a).toUpperCase().codePointAt(0), 0x1e918); +assertEq(String.fromCodePoint(0x1e93b).toUpperCase().codePointAt(0), 0x1e919); +assertEq(String.fromCodePoint(0x1e93c).toUpperCase().codePointAt(0), 0x1e91a); +assertEq(String.fromCodePoint(0x1e93d).toUpperCase().codePointAt(0), 0x1e91b); +assertEq(String.fromCodePoint(0x1e93e).toUpperCase().codePointAt(0), 0x1e91c); +assertEq(String.fromCodePoint(0x1e93f).toUpperCase().codePointAt(0), 0x1e91d); +assertEq(String.fromCodePoint(0x1e940).toUpperCase().codePointAt(0), 0x1e91e); +assertEq(String.fromCodePoint(0x1e941).toUpperCase().codePointAt(0), 0x1e91f); +assertEq(String.fromCodePoint(0x1e942).toUpperCase().codePointAt(0), 0x1e920); +assertEq(String.fromCodePoint(0x1e943).toUpperCase().codePointAt(0), 0x1e921); assertEq(String.fromCodePoint(0x10400).toLowerCase().codePointAt(0), 0x10428); assertEq(String.fromCodePoint(0x10401).toLowerCase().codePointAt(0), 0x10429); assertEq(String.fromCodePoint(0x10402).toLowerCase().codePointAt(0), 0x1042a); assertEq(String.fromCodePoint(0x10403).toLowerCase().codePointAt(0), 0x1042b); assertEq(String.fromCodePoint(0x10404).toLowerCase().codePointAt(0), 0x1042c); assertEq(String.fromCodePoint(0x10405).toLowerCase().codePointAt(0), 0x1042d); assertEq(String.fromCodePoint(0x10406).toLowerCase().codePointAt(0), 0x1042e); assertEq(String.fromCodePoint(0x10407).toLowerCase().codePointAt(0), 0x1042f); @@ -80,11 +233,164 @@ assertEq(String.fromCodePoint(0x1041f).t assertEq(String.fromCodePoint(0x10420).toLowerCase().codePointAt(0), 0x10448); assertEq(String.fromCodePoint(0x10421).toLowerCase().codePointAt(0), 0x10449); assertEq(String.fromCodePoint(0x10422).toLowerCase().codePointAt(0), 0x1044a); assertEq(String.fromCodePoint(0x10423).toLowerCase().codePointAt(0), 0x1044b); assertEq(String.fromCodePoint(0x10424).toLowerCase().codePointAt(0), 0x1044c); assertEq(String.fromCodePoint(0x10425).toLowerCase().codePointAt(0), 0x1044d); assertEq(String.fromCodePoint(0x10426).toLowerCase().codePointAt(0), 0x1044e); assertEq(String.fromCodePoint(0x10427).toLowerCase().codePointAt(0), 0x1044f); +assertEq(String.fromCodePoint(0x104b0).toLowerCase().codePointAt(0), 0x104d8); +assertEq(String.fromCodePoint(0x104b1).toLowerCase().codePointAt(0), 0x104d9); +assertEq(String.fromCodePoint(0x104b2).toLowerCase().codePointAt(0), 0x104da); +assertEq(String.fromCodePoint(0x104b3).toLowerCase().codePointAt(0), 0x104db); +assertEq(String.fromCodePoint(0x104b4).toLowerCase().codePointAt(0), 0x104dc); +assertEq(String.fromCodePoint(0x104b5).toLowerCase().codePointAt(0), 0x104dd); +assertEq(String.fromCodePoint(0x104b6).toLowerCase().codePointAt(0), 0x104de); +assertEq(String.fromCodePoint(0x104b7).toLowerCase().codePointAt(0), 0x104df); +assertEq(String.fromCodePoint(0x104b8).toLowerCase().codePointAt(0), 0x104e0); +assertEq(String.fromCodePoint(0x104b9).toLowerCase().codePointAt(0), 0x104e1); +assertEq(String.fromCodePoint(0x104ba).toLowerCase().codePointAt(0), 0x104e2); +assertEq(String.fromCodePoint(0x104bb).toLowerCase().codePointAt(0), 0x104e3); +assertEq(String.fromCodePoint(0x104bc).toLowerCase().codePointAt(0), 0x104e4); +assertEq(String.fromCodePoint(0x104bd).toLowerCase().codePointAt(0), 0x104e5); +assertEq(String.fromCodePoint(0x104be).toLowerCase().codePointAt(0), 0x104e6); +assertEq(String.fromCodePoint(0x104bf).toLowerCase().codePointAt(0), 0x104e7); +assertEq(String.fromCodePoint(0x104c0).toLowerCase().codePointAt(0), 0x104e8); +assertEq(String.fromCodePoint(0x104c1).toLowerCase().codePointAt(0), 0x104e9); +assertEq(String.fromCodePoint(0x104c2).toLowerCase().codePointAt(0), 0x104ea); +assertEq(String.fromCodePoint(0x104c3).toLowerCase().codePointAt(0), 0x104eb); +assertEq(String.fromCodePoint(0x104c4).toLowerCase().codePointAt(0), 0x104ec); +assertEq(String.fromCodePoint(0x104c5).toLowerCase().codePointAt(0), 0x104ed); +assertEq(String.fromCodePoint(0x104c6).toLowerCase().codePointAt(0), 0x104ee); +assertEq(String.fromCodePoint(0x104c7).toLowerCase().codePointAt(0), 0x104ef); +assertEq(String.fromCodePoint(0x104c8).toLowerCase().codePointAt(0), 0x104f0); +assertEq(String.fromCodePoint(0x104c9).toLowerCase().codePointAt(0), 0x104f1); +assertEq(String.fromCodePoint(0x104ca).toLowerCase().codePointAt(0), 0x104f2); +assertEq(String.fromCodePoint(0x104cb).toLowerCase().codePointAt(0), 0x104f3); +assertEq(String.fromCodePoint(0x104cc).toLowerCase().codePointAt(0), 0x104f4); +assertEq(String.fromCodePoint(0x104cd).toLowerCase().codePointAt(0), 0x104f5); +assertEq(String.fromCodePoint(0x104ce).toLowerCase().codePointAt(0), 0x104f6); +assertEq(String.fromCodePoint(0x104cf).toLowerCase().codePointAt(0), 0x104f7); +assertEq(String.fromCodePoint(0x104d0).toLowerCase().codePointAt(0), 0x104f8); +assertEq(String.fromCodePoint(0x104d1).toLowerCase().codePointAt(0), 0x104f9); +assertEq(String.fromCodePoint(0x104d2).toLowerCase().codePointAt(0), 0x104fa); +assertEq(String.fromCodePoint(0x104d3).toLowerCase().codePointAt(0), 0x104fb); +assertEq(String.fromCodePoint(0x10c80).toLowerCase().codePointAt(0), 0x10cc0); +assertEq(String.fromCodePoint(0x10c81).toLowerCase().codePointAt(0), 0x10cc1); +assertEq(String.fromCodePoint(0x10c82).toLowerCase().codePointAt(0), 0x10cc2); +assertEq(String.fromCodePoint(0x10c83).toLowerCase().codePointAt(0), 0x10cc3); +assertEq(String.fromCodePoint(0x10c84).toLowerCase().codePointAt(0), 0x10cc4); +assertEq(String.fromCodePoint(0x10c85).toLowerCase().codePointAt(0), 0x10cc5); +assertEq(String.fromCodePoint(0x10c86).toLowerCase().codePointAt(0), 0x10cc6); +assertEq(String.fromCodePoint(0x10c87).toLowerCase().codePointAt(0), 0x10cc7); +assertEq(String.fromCodePoint(0x10c88).toLowerCase().codePointAt(0), 0x10cc8); +assertEq(String.fromCodePoint(0x10c89).toLowerCase().codePointAt(0), 0x10cc9); +assertEq(String.fromCodePoint(0x10c8a).toLowerCase().codePointAt(0), 0x10cca); +assertEq(String.fromCodePoint(0x10c8b).toLowerCase().codePointAt(0), 0x10ccb); +assertEq(String.fromCodePoint(0x10c8c).toLowerCase().codePointAt(0), 0x10ccc); +assertEq(String.fromCodePoint(0x10c8d).toLowerCase().codePointAt(0), 0x10ccd); +assertEq(String.fromCodePoint(0x10c8e).toLowerCase().codePointAt(0), 0x10cce); +assertEq(String.fromCodePoint(0x10c8f).toLowerCase().codePointAt(0), 0x10ccf); +assertEq(String.fromCodePoint(0x10c90).toLowerCase().codePointAt(0), 0x10cd0); +assertEq(String.fromCodePoint(0x10c91).toLowerCase().codePointAt(0), 0x10cd1); +assertEq(String.fromCodePoint(0x10c92).toLowerCase().codePointAt(0), 0x10cd2); +assertEq(String.fromCodePoint(0x10c93).toLowerCase().codePointAt(0), 0x10cd3); +assertEq(String.fromCodePoint(0x10c94).toLowerCase().codePointAt(0), 0x10cd4); +assertEq(String.fromCodePoint(0x10c95).toLowerCase().codePointAt(0), 0x10cd5); +assertEq(String.fromCodePoint(0x10c96).toLowerCase().codePointAt(0), 0x10cd6); +assertEq(String.fromCodePoint(0x10c97).toLowerCase().codePointAt(0), 0x10cd7); +assertEq(String.fromCodePoint(0x10c98).toLowerCase().codePointAt(0), 0x10cd8); +assertEq(String.fromCodePoint(0x10c99).toLowerCase().codePointAt(0), 0x10cd9); +assertEq(String.fromCodePoint(0x10c9a).toLowerCase().codePointAt(0), 0x10cda); +assertEq(String.fromCodePoint(0x10c9b).toLowerCase().codePointAt(0), 0x10cdb); +assertEq(String.fromCodePoint(0x10c9c).toLowerCase().codePointAt(0), 0x10cdc); +assertEq(String.fromCodePoint(0x10c9d).toLowerCase().codePointAt(0), 0x10cdd); +assertEq(String.fromCodePoint(0x10c9e).toLowerCase().codePointAt(0), 0x10cde); +assertEq(String.fromCodePoint(0x10c9f).toLowerCase().codePointAt(0), 0x10cdf); +assertEq(String.fromCodePoint(0x10ca0).toLowerCase().codePointAt(0), 0x10ce0); +assertEq(String.fromCodePoint(0x10ca1).toLowerCase().codePointAt(0), 0x10ce1); +assertEq(String.fromCodePoint(0x10ca2).toLowerCase().codePointAt(0), 0x10ce2); +assertEq(String.fromCodePoint(0x10ca3).toLowerCase().codePointAt(0), 0x10ce3); +assertEq(String.fromCodePoint(0x10ca4).toLowerCase().codePointAt(0), 0x10ce4); +assertEq(String.fromCodePoint(0x10ca5).toLowerCase().codePointAt(0), 0x10ce5); +assertEq(String.fromCodePoint(0x10ca6).toLowerCase().codePointAt(0), 0x10ce6); +assertEq(String.fromCodePoint(0x10ca7).toLowerCase().codePointAt(0), 0x10ce7); +assertEq(String.fromCodePoint(0x10ca8).toLowerCase().codePointAt(0), 0x10ce8); +assertEq(String.fromCodePoint(0x10ca9).toLowerCase().codePointAt(0), 0x10ce9); +assertEq(String.fromCodePoint(0x10caa).toLowerCase().codePointAt(0), 0x10cea); +assertEq(String.fromCodePoint(0x10cab).toLowerCase().codePointAt(0), 0x10ceb); +assertEq(String.fromCodePoint(0x10cac).toLowerCase().codePointAt(0), 0x10cec); +assertEq(String.fromCodePoint(0x10cad).toLowerCase().codePointAt(0), 0x10ced); +assertEq(String.fromCodePoint(0x10cae).toLowerCase().codePointAt(0), 0x10cee); +assertEq(String.fromCodePoint(0x10caf).toLowerCase().codePointAt(0), 0x10cef); +assertEq(String.fromCodePoint(0x10cb0).toLowerCase().codePointAt(0), 0x10cf0); +assertEq(String.fromCodePoint(0x10cb1).toLowerCase().codePointAt(0), 0x10cf1); +assertEq(String.fromCodePoint(0x10cb2).toLowerCase().codePointAt(0), 0x10cf2); +assertEq(String.fromCodePoint(0x118a0).toLowerCase().codePointAt(0), 0x118c0); +assertEq(String.fromCodePoint(0x118a1).toLowerCase().codePointAt(0), 0x118c1); +assertEq(String.fromCodePoint(0x118a2).toLowerCase().codePointAt(0), 0x118c2); +assertEq(String.fromCodePoint(0x118a3).toLowerCase().codePointAt(0), 0x118c3); +assertEq(String.fromCodePoint(0x118a4).toLowerCase().codePointAt(0), 0x118c4); +assertEq(String.fromCodePoint(0x118a5).toLowerCase().codePointAt(0), 0x118c5); +assertEq(String.fromCodePoint(0x118a6).toLowerCase().codePointAt(0), 0x118c6); +assertEq(String.fromCodePoint(0x118a7).toLowerCase().codePointAt(0), 0x118c7); +assertEq(String.fromCodePoint(0x118a8).toLowerCase().codePointAt(0), 0x118c8); +assertEq(String.fromCodePoint(0x118a9).toLowerCase().codePointAt(0), 0x118c9); +assertEq(String.fromCodePoint(0x118aa).toLowerCase().codePointAt(0), 0x118ca); +assertEq(String.fromCodePoint(0x118ab).toLowerCase().codePointAt(0), 0x118cb); +assertEq(String.fromCodePoint(0x118ac).toLowerCase().codePointAt(0), 0x118cc); +assertEq(String.fromCodePoint(0x118ad).toLowerCase().codePointAt(0), 0x118cd); +assertEq(String.fromCodePoint(0x118ae).toLowerCase().codePointAt(0), 0x118ce); +assertEq(String.fromCodePoint(0x118af).toLowerCase().codePointAt(0), 0x118cf); +assertEq(String.fromCodePoint(0x118b0).toLowerCase().codePointAt(0), 0x118d0); +assertEq(String.fromCodePoint(0x118b1).toLowerCase().codePointAt(0), 0x118d1); +assertEq(String.fromCodePoint(0x118b2).toLowerCase().codePointAt(0), 0x118d2); +assertEq(String.fromCodePoint(0x118b3).toLowerCase().codePointAt(0), 0x118d3); +assertEq(String.fromCodePoint(0x118b4).toLowerCase().codePointAt(0), 0x118d4); +assertEq(String.fromCodePoint(0x118b5).toLowerCase().codePointAt(0), 0x118d5); +assertEq(String.fromCodePoint(0x118b6).toLowerCase().codePointAt(0), 0x118d6); +assertEq(String.fromCodePoint(0x118b7).toLowerCase().codePointAt(0), 0x118d7); +assertEq(String.fromCodePoint(0x118b8).toLowerCase().codePointAt(0), 0x118d8); +assertEq(String.fromCodePoint(0x118b9).toLowerCase().codePointAt(0), 0x118d9); +assertEq(String.fromCodePoint(0x118ba).toLowerCase().codePointAt(0), 0x118da); +assertEq(String.fromCodePoint(0x118bb).toLowerCase().codePointAt(0), 0x118db); +assertEq(String.fromCodePoint(0x118bc).toLowerCase().codePointAt(0), 0x118dc); +assertEq(String.fromCodePoint(0x118bd).toLowerCase().codePointAt(0), 0x118dd); +assertEq(String.fromCodePoint(0x118be).toLowerCase().codePointAt(0), 0x118de); +assertEq(String.fromCodePoint(0x118bf).toLowerCase().codePointAt(0), 0x118df); +assertEq(String.fromCodePoint(0x1e900).toLowerCase().codePointAt(0), 0x1e922); +assertEq(String.fromCodePoint(0x1e901).toLowerCase().codePointAt(0), 0x1e923); +assertEq(String.fromCodePoint(0x1e902).toLowerCase().codePointAt(0), 0x1e924); +assertEq(String.fromCodePoint(0x1e903).toLowerCase().codePointAt(0), 0x1e925); +assertEq(String.fromCodePoint(0x1e904).toLowerCase().codePointAt(0), 0x1e926); +assertEq(String.fromCodePoint(0x1e905).toLowerCase().codePointAt(0), 0x1e927); +assertEq(String.fromCodePoint(0x1e906).toLowerCase().codePointAt(0), 0x1e928); +assertEq(String.fromCodePoint(0x1e907).toLowerCase().codePointAt(0), 0x1e929); +assertEq(String.fromCodePoint(0x1e908).toLowerCase().codePointAt(0), 0x1e92a); +assertEq(String.fromCodePoint(0x1e909).toLowerCase().codePointAt(0), 0x1e92b); +assertEq(String.fromCodePoint(0x1e90a).toLowerCase().codePointAt(0), 0x1e92c); +assertEq(String.fromCodePoint(0x1e90b).toLowerCase().codePointAt(0), 0x1e92d); +assertEq(String.fromCodePoint(0x1e90c).toLowerCase().codePointAt(0), 0x1e92e); +assertEq(String.fromCodePoint(0x1e90d).toLowerCase().codePointAt(0), 0x1e92f); +assertEq(String.fromCodePoint(0x1e90e).toLowerCase().codePointAt(0), 0x1e930); +assertEq(String.fromCodePoint(0x1e90f).toLowerCase().codePointAt(0), 0x1e931); +assertEq(String.fromCodePoint(0x1e910).toLowerCase().codePointAt(0), 0x1e932); +assertEq(String.fromCodePoint(0x1e911).toLowerCase().codePointAt(0), 0x1e933); +assertEq(String.fromCodePoint(0x1e912).toLowerCase().codePointAt(0), 0x1e934); +assertEq(String.fromCodePoint(0x1e913).toLowerCase().codePointAt(0), 0x1e935); +assertEq(String.fromCodePoint(0x1e914).toLowerCase().codePointAt(0), 0x1e936); +assertEq(String.fromCodePoint(0x1e915).toLowerCase().codePointAt(0), 0x1e937); +assertEq(String.fromCodePoint(0x1e916).toLowerCase().codePointAt(0), 0x1e938); +assertEq(String.fromCodePoint(0x1e917).toLowerCase().codePointAt(0), 0x1e939); +assertEq(String.fromCodePoint(0x1e918).toLowerCase().codePointAt(0), 0x1e93a); +assertEq(String.fromCodePoint(0x1e919).toLowerCase().codePointAt(0), 0x1e93b); +assertEq(String.fromCodePoint(0x1e91a).toLowerCase().codePointAt(0), 0x1e93c); +assertEq(String.fromCodePoint(0x1e91b).toLowerCase().codePointAt(0), 0x1e93d); +assertEq(String.fromCodePoint(0x1e91c).toLowerCase().codePointAt(0), 0x1e93e); +assertEq(String.fromCodePoint(0x1e91d).toLowerCase().codePointAt(0), 0x1e93f); +assertEq(String.fromCodePoint(0x1e91e).toLowerCase().codePointAt(0), 0x1e940); +assertEq(String.fromCodePoint(0x1e91f).toLowerCase().codePointAt(0), 0x1e941); +assertEq(String.fromCodePoint(0x1e920).toLowerCase().codePointAt(0), 0x1e942); +assertEq(String.fromCodePoint(0x1e921).toLowerCase().codePointAt(0), 0x1e943); if (typeof reportCompare === "function") reportCompare(true, true);
--- a/js/src/tests/ecma_6/Syntax/identifiers-with-extended-unicode-escape.js +++ b/js/src/tests/ecma_6/Syntax/identifiers-with-extended-unicode-escape.js @@ -45,31 +45,24 @@ const idStartSupplemental = [ 0x10300, // OLD ITALIC LETTER A, Gc=Lo 0x10400, // DESERET CAPITAL LETTER LONG I, Gc=Lu 0x10430, // DESERET SMALL LETTER SHORT A, Gc=Ll 0x16B40, // PAHAWH HMONG SIGN VOS SEEV, Gc=Lm ]; // From PropList.txt (Unicode 9): const otherIdStart = [ - // Enable the following lines when Bug 1282724 is fixed. - // 0x1885, // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn - // 0x1886, // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn + 0x1885, // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn + 0x1886, // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn 0x2118, // SCRIPT CAPITAL P, Gc=Sm 0x212E, // ESTIMATED SYMBOL, Gc=So 0x309B, // KATAKANA-HIRAGANA VOICED SOUND MARK, Gc=Sk 0x309C, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK, Gc=Sk ]; -// Remove this list when we support Unicode 9 (Bug 1282724). -const otherIdStart_Unicode9 = [ - 0x1885, // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn - 0x1886, // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn -]; - // From DerivedCoreProperties.txt (Unicode 9): // Derived Property: ID_Continue // Characters that can continue an identifier. // Generated from: // ID_Start // + Mn + Mc + Nd + Pc // + Other_ID_Continue // - Pattern_Syntax @@ -100,17 +93,17 @@ const otherIdContinue = [ 0x136D, // ETHIOPIC DIGIT FIVE, Gc=No 0x136E, // ETHIOPIC DIGIT SIX, Gc=No 0x136F, // ETHIOPIC DIGIT SEVEN, Gc=No 0x1370, // ETHIOPIC DIGIT EIGHT, Gc=No 0x1371, // ETHIOPIC DIGIT NINE, Gc=No 0x19DA, // NEW TAI LUE THAM DIGIT ONE, Gc=No ]; -for (let ident of [...idStart, ...otherIdStart, ...otherIdStart_Unicode9]) { +for (let ident of [...idStart, ...otherIdStart]) { for (let count of leadingZeros) { let zeros = "0".repeat(count); eval(` let \\u{${zeros}${ident.toString(16)}} = 123; assertEq(${String.fromCodePoint(ident)}, 123); `); } } @@ -123,17 +116,17 @@ for (let ident of [...idStartSupplementa } for (let ident of [...idContinue, ...idContinueSupplemental, ...otherIdContinue]) { for (let zeros of leadingZeros) { assertThrowsInstanceOf(() => eval(`\\u{${zeros}${ident.toString(16)}}`), SyntaxError); } } -for (let ident of [...idStart, ...otherIdStart, ...otherIdStart_Unicode9, ...idContinue, ...otherIdContinue]) { +for (let ident of [...idStart, ...otherIdStart, ...idContinue, ...otherIdContinue]) { for (let zeros of leadingZeros) { eval(` let A\\u{${zeros}${ident.toString(16)}} = 123; assertEq(${String.fromCodePoint(0x41, ident)}, 123); `); } }
--- a/js/src/tests/ecma_6/Syntax/unicode_other_id_start.js +++ b/js/src/tests/ecma_6/Syntax/unicode_other_id_start.js @@ -1,47 +1,40 @@ /* 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/. */ // From PropList.txt (Unicode 9): const otherIdStart = [ - // Enable the following lines when Bug 1282724 is fixed. - // 0x1885, // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn - // 0x1886, // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn + 0x1885, // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn + 0x1886, // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn 0x2118, // SCRIPT CAPITAL P, Gc=Sm 0x212E, // ESTIMATED SYMBOL, Gc=So 0x309B, // KATAKANA-HIRAGANA VOICED SOUND MARK, Gc=Sk 0x309C, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK, Gc=Sk ]; -// Remove this list when we support Unicode 9 (Bug 1282724). -const otherIdStart_Unicode9 = [ - 0x1885, // MONGOLIAN LETTER ALI GALI BALUDA, Gc=Mn - 0x1886, // MONGOLIAN LETTER ALI GALI THREE BALUDA, Gc=Mn -]; - // Leading character in identifier. -for (let ident of [...otherIdStart, ...otherIdStart_Unicode9]) { +for (let ident of otherIdStart) { eval(` let ${String.fromCodePoint(ident)} = 123; assertEq(${String.fromCodePoint(ident)}, 123); `); eval(` let \\u${ident.toString(16).padStart(4, "0")} = 123; assertEq(${String.fromCodePoint(ident)}, 123); `); eval(` let \\u{${ident.toString(16)}} = 123; assertEq(${String.fromCodePoint(ident)}, 123); `); } // Not leading character in identifier. -for (let ident of [...otherIdStart, ...otherIdStart_Unicode9]) { +for (let ident of otherIdStart) { eval(` let A${String.fromCodePoint(ident)} = 123; assertEq(${String.fromCodePoint(0x41, ident)}, 123); `); eval(` let A\\u${ident.toString(16).padStart(4, "0")} = 123; assertEq(${String.fromCodePoint(0x41, ident)}, 123); `);
--- a/js/src/tests/jstests.list +++ b/js/src/tests/jstests.list @@ -34,16 +34,23 @@ skip script test262/intl402/ch12/12.2/12 skip script test262/ch13/13.2/13.2-15-1.js skip script test262/ch11/11.4/11.4.1/11.4.1-5-a-28-s.js # ECMA-402 1st ed. required |timeZoneName: undefined|, but newer versions have # changed it to being the default time zone, cf. the NOTE in # Intl.DateTimeFormat.prototype.resolvedOptions(). skip script test262/intl402/ch12/12.3/12.3.3.js +# ECMA-262 6th ed. used Unicode 5.1, but we're now supporting Unicode 9.0. +# Disable tests which require Unicode 5.1 semantics, or more specific disable +# tests which expect that U+180E is a white space character. +skip script test262/ch09/9.3/9.3.1/S9.3.1_A2.js +skip script test262/ch09/9.3/9.3.1/S9.3.1_A3_T2.js +skip script test262/ch09/9.3/9.3.1/S9.3.1_A3_T1.js + ####################################################################### # Tests disabled due to jstest limitations wrt imported test262 tests # ####################################################################### # These tests are disabled because jstest doesn't understand @negative (without # a pattern) yet. skip script test262/ch07/7.2/S7.2_A5_T1.js skip script test262/ch07/7.2/S7.2_A5_T2.js
--- a/js/src/tests/lib/jittests.py +++ b/js/src/tests/lib/jittests.py @@ -164,25 +164,50 @@ class JitTest: variants = variants + [ opts + join_opts for opts in variants ]; # For each list of jit flags, make a copy of the test. return [self.copy_and_extend_jitflags(v) for v in variants] COOKIE = '|jit-test|' CacheDir = JS_CACHE_DIR + Directives = {} + + @classmethod + def find_directives(cls, file_name): + meta = '' + line = open(file_name).readline() + i = line.find(cls.COOKIE) + if i != -1: + meta = ';' + line[i + len(cls.COOKIE):].strip('\n') + return meta @classmethod def from_file(cls, path, options): test = cls(path) - line = open(path).readline() - i = line.find(cls.COOKIE) - if i != -1: - meta = line[i + len(cls.COOKIE):].strip('\n') + # If directives.txt exists in the test's directory then it may + # contain metainformation that will be catenated with + # whatever's in the test file. The form of the directive in + # the directive file is the same as in the test file. Only + # the first line is considered, just as for the test file. + + dir_meta = '' + dir_name = os.path.dirname(path) + if dir_name in cls.Directives: + dir_meta = cls.Directives[dir_name] + else: + meta_file_name = os.path.join(dir_name, "directives.txt") + if os.path.exists(meta_file_name): + dir_meta = cls.find_directives(meta_file_name) + cls.Directives[dir_name] = dir_meta + + meta = cls.find_directives(path) + if meta != '' or dir_meta != '': + meta = meta + dir_meta parts = meta.split(';') for part in parts: part = part.strip() if not part: continue name, _, value = part.partition(':') if value: value = value.strip() @@ -215,20 +240,16 @@ class JitTest: test.allow_overrecursed = True elif name == 'valgrind': test.valgrind = options.valgrind elif name == 'tz-pacific': test.tz_pacific = True elif name == 'test-also-noasmjs': if options.can_test_also_noasmjs: test.test_also.append(['--no-asmjs']) - # test-also-noasmjs is a sure indicator that the file contains asm.js code; - # in that case we want to test the wasm baseline compiler too, as asm.js - # is translated to wasm - test.test_also.append(['--wasm-always-baseline']) elif name == 'test-also-wasm-baseline': if options.can_test_also_wasm_baseline: test.test_also.append(['--wasm-always-baseline']) elif name.startswith('test-also='): test.test_also.append([name[len('test-also='):]]) elif name.startswith('test-join='): test.test_join.append([name[len('test-join='):]]) elif name == 'module':
--- a/js/src/vm/CaseFolding.txt +++ b/js/src/vm/CaseFolding.txt @@ -1,15 +1,16 @@ -# CaseFolding-8.0.0.txt -# Date: 2015-01-13, 18:16:36 GMT [MD] +# CaseFolding-9.0.0.txt +# Date: 2016-03-02, 18:54:54 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2015 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # # Case Folding Properties # # This file is a supplement to the UnicodeData file. # It provides a case folding mapping generated from the Unicode Character Database. # If all characters are mapped according to the full mapping below, then # case differences (according to UnicodeData.txt and SpecialCasing.txt) # are eliminated. @@ -588,16 +589,25 @@ 10C5; C; 2D25; # GEORGIAN CAPITAL LETTER 10C7; C; 2D27; # GEORGIAN CAPITAL LETTER YN 10CD; C; 2D2D; # GEORGIAN CAPITAL LETTER AEN 13F8; C; 13F0; # CHEROKEE SMALL LETTER YE 13F9; C; 13F1; # CHEROKEE SMALL LETTER YI 13FA; C; 13F2; # CHEROKEE SMALL LETTER YO 13FB; C; 13F3; # CHEROKEE SMALL LETTER YU 13FC; C; 13F4; # CHEROKEE SMALL LETTER YV 13FD; C; 13F5; # CHEROKEE SMALL LETTER MV +1C80; C; 0432; # CYRILLIC SMALL LETTER ROUNDED VE +1C81; C; 0434; # CYRILLIC SMALL LETTER LONG-LEGGED DE +1C82; C; 043E; # CYRILLIC SMALL LETTER NARROW O +1C83; C; 0441; # CYRILLIC SMALL LETTER WIDE ES +1C84; C; 0442; # CYRILLIC SMALL LETTER TALL TE +1C85; C; 0442; # CYRILLIC SMALL LETTER THREE-LEGGED TE +1C86; C; 044A; # CYRILLIC SMALL LETTER TALL HARD SIGN +1C87; C; 0463; # CYRILLIC SMALL LETTER TALL YAT +1C88; C; A64B; # CYRILLIC SMALL LETTER UNBLENDED UK 1E00; C; 1E01; # LATIN CAPITAL LETTER A WITH RING BELOW 1E02; C; 1E03; # LATIN CAPITAL LETTER B WITH DOT ABOVE 1E04; C; 1E05; # LATIN CAPITAL LETTER B WITH DOT BELOW 1E06; C; 1E07; # LATIN CAPITAL LETTER B WITH LINE BELOW 1E08; C; 1E09; # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE 1E0A; C; 1E0B; # LATIN CAPITAL LETTER D WITH DOT ABOVE 1E0C; C; 1E0D; # LATIN CAPITAL LETTER D WITH DOT BELOW 1E0E; C; 1E0F; # LATIN CAPITAL LETTER D WITH LINE BELOW @@ -1158,16 +1168,17 @@ A7A0; C; A7A1; # LATIN CAPITAL LETTER G A7A2; C; A7A3; # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE A7A4; C; A7A5; # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE A7A6; C; A7A7; # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE A7A8; C; A7A9; # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE A7AA; C; 0266; # LATIN CAPITAL LETTER H WITH HOOK A7AB; C; 025C; # LATIN CAPITAL LETTER REVERSED OPEN E A7AC; C; 0261; # LATIN CAPITAL LETTER SCRIPT G A7AD; C; 026C; # LATIN CAPITAL LETTER L WITH BELT +A7AE; C; 026A; # LATIN CAPITAL LETTER SMALL CAPITAL I A7B0; C; 029E; # LATIN CAPITAL LETTER TURNED K A7B1; C; 0287; # LATIN CAPITAL LETTER TURNED T A7B2; C; 029D; # LATIN CAPITAL LETTER J WITH CROSSED-TAIL A7B3; C; AB53; # LATIN CAPITAL LETTER CHI A7B4; C; A7B5; # LATIN CAPITAL LETTER BETA A7B6; C; A7B7; # LATIN CAPITAL LETTER OMEGA AB70; C; 13A0; # CHEROKEE SMALL LETTER A AB71; C; 13A1; # CHEROKEE SMALL LETTER E @@ -1322,16 +1333,52 @@ 1041F; C; 10447; # DESERET CAPITAL LETTE 10420; C; 10448; # DESERET CAPITAL LETTER ZHEE 10421; C; 10449; # DESERET CAPITAL LETTER ER 10422; C; 1044A; # DESERET CAPITAL LETTER EL 10423; C; 1044B; # DESERET CAPITAL LETTER EM 10424; C; 1044C; # DESERET CAPITAL LETTER EN 10425; C; 1044D; # DESERET CAPITAL LETTER ENG 10426; C; 1044E; # DESERET CAPITAL LETTER OI 10427; C; 1044F; # DESERET CAPITAL LETTER EW +104B0; C; 104D8; # OSAGE CAPITAL LETTER A +104B1; C; 104D9; # OSAGE CAPITAL LETTER AI +104B2; C; 104DA; # OSAGE CAPITAL LETTER AIN +104B3; C; 104DB; # OSAGE CAPITAL LETTER AH +104B4; C; 104DC; # OSAGE CAPITAL LETTER BRA +104B5; C; 104DD; # OSAGE CAPITAL LETTER CHA +104B6; C; 104DE; # OSAGE CAPITAL LETTER EHCHA +104B7; C; 104DF; # OSAGE CAPITAL LETTER E +104B8; C; 104E0; # OSAGE CAPITAL LETTER EIN +104B9; C; 104E1; # OSAGE CAPITAL LETTER HA +104BA; C; 104E2; # OSAGE CAPITAL LETTER HYA +104BB; C; 104E3; # OSAGE CAPITAL LETTER I +104BC; C; 104E4; # OSAGE CAPITAL LETTER KA +104BD; C; 104E5; # OSAGE CAPITAL LETTER EHKA +104BE; C; 104E6; # OSAGE CAPITAL LETTER KYA +104BF; C; 104E7; # OSAGE CAPITAL LETTER LA +104C0; C; 104E8; # OSAGE CAPITAL LETTER MA +104C1; C; 104E9; # OSAGE CAPITAL LETTER NA +104C2; C; 104EA; # OSAGE CAPITAL LETTER O +104C3; C; 104EB; # OSAGE CAPITAL LETTER OIN +104C4; C; 104EC; # OSAGE CAPITAL LETTER PA +104C5; C; 104ED; # OSAGE CAPITAL LETTER EHPA +104C6; C; 104EE; # OSAGE CAPITAL LETTER SA +104C7; C; 104EF; # OSAGE CAPITAL LETTER SHA +104C8; C; 104F0; # OSAGE CAPITAL LETTER TA +104C9; C; 104F1; # OSAGE CAPITAL LETTER EHTA +104CA; C; 104F2; # OSAGE CAPITAL LETTER TSA +104CB; C; 104F3; # OSAGE CAPITAL LETTER EHTSA +104CC; C; 104F4; # OSAGE CAPITAL LETTER TSHA +104CD; C; 104F5; # OSAGE CAPITAL LETTER DHA +104CE; C; 104F6; # OSAGE CAPITAL LETTER U +104CF; C; 104F7; # OSAGE CAPITAL LETTER WA +104D0; C; 104F8; # OSAGE CAPITAL LETTER KHA +104D1; C; 104F9; # OSAGE CAPITAL LETTER GHA +104D2; C; 104FA; # OSAGE CAPITAL LETTER ZA +104D3; C; 104FB; # OSAGE CAPITAL LETTER ZHA 10C80; C; 10CC0; # OLD HUNGARIAN CAPITAL LETTER A 10C81; C; 10CC1; # OLD HUNGARIAN CAPITAL LETTER AA 10C82; C; 10CC2; # OLD HUNGARIAN CAPITAL LETTER EB 10C83; C; 10CC3; # OLD HUNGARIAN CAPITAL LETTER AMB 10C84; C; 10CC4; # OLD HUNGARIAN CAPITAL LETTER EC 10C85; C; 10CC5; # OLD HUNGARIAN CAPITAL LETTER ENC 10C86; C; 10CC6; # OLD HUNGARIAN CAPITAL LETTER ECS 10C87; C; 10CC7; # OLD HUNGARIAN CAPITAL LETTER ED @@ -1405,10 +1452,44 @@ 118B7; C; 118D7; # WARANG CITI CAPITAL L 118B8; C; 118D8; # WARANG CITI CAPITAL LETTER PU 118B9; C; 118D9; # WARANG CITI CAPITAL LETTER HIYO 118BA; C; 118DA; # WARANG CITI CAPITAL LETTER HOLO 118BB; C; 118DB; # WARANG CITI CAPITAL LETTER HORR 118BC; C; 118DC; # WARANG CITI CAPITAL LETTER HAR 118BD; C; 118DD; # WARANG CITI CAPITAL LETTER SSUU 118BE; C; 118DE; # WARANG CITI CAPITAL LETTER SII 118BF; C; 118DF; # WARANG CITI CAPITAL LETTER VIYO +1E900; C; 1E922; # ADLAM CAPITAL LETTER ALIF +1E901; C; 1E923; # ADLAM CAPITAL LETTER DAALI +1E902; C; 1E924; # ADLAM CAPITAL LETTER LAAM +1E903; C; 1E925; # ADLAM CAPITAL LETTER MIIM +1E904; C; 1E926; # ADLAM CAPITAL LETTER BA +1E905; C; 1E927; # ADLAM CAPITAL LETTER SINNYIIYHE +1E906; C; 1E928; # ADLAM CAPITAL LETTER PE +1E907; C; 1E929; # ADLAM CAPITAL LETTER BHE +1E908; C; 1E92A; # ADLAM CAPITAL LETTER RA +1E909; C; 1E92B; # ADLAM CAPITAL LETTER E +1E90A; C; 1E92C; # ADLAM CAPITAL LETTER FA +1E90B; C; 1E92D; # ADLAM CAPITAL LETTER I +1E90C; C; 1E92E; # ADLAM CAPITAL LETTER O +1E90D; C; 1E92F; # ADLAM CAPITAL LETTER DHA +1E90E; C; 1E930; # ADLAM CAPITAL LETTER YHE +1E90F; C; 1E931; # ADLAM CAPITAL LETTER WAW +1E910; C; 1E932; # ADLAM CAPITAL LETTER NUN +1E911; C; 1E933; # ADLAM CAPITAL LETTER KAF +1E912; C; 1E934; # ADLAM CAPITAL LETTER YA +1E913; C; 1E935; # ADLAM CAPITAL LETTER U +1E914; C; 1E936; # ADLAM CAPITAL LETTER JIIM +1E915; C; 1E937; # ADLAM CAPITAL LETTER CHI +1E916; C; 1E938; # ADLAM CAPITAL LETTER HA +1E917; C; 1E939; # ADLAM CAPITAL LETTER QAAF +1E918; C; 1E93A; # ADLAM CAPITAL LETTER GA +1E919; C; 1E93B; # ADLAM CAPITAL LETTER NYA +1E91A; C; 1E93C; # ADLAM CAPITAL LETTER TU +1E91B; C; 1E93D; # ADLAM CAPITAL LETTER NHA +1E91C; C; 1E93E; # ADLAM CAPITAL LETTER VA +1E91D; C; 1E93F; # ADLAM CAPITAL LETTER KHA +1E91E; C; 1E940; # ADLAM CAPITAL LETTER GBE +1E91F; C; 1E941; # ADLAM CAPITAL LETTER ZAL +1E920; C; 1E942; # ADLAM CAPITAL LETTER KPO +1E921; C; 1E943; # ADLAM CAPITAL LETTER SHA # # EOF
--- a/js/src/vm/Debugger.cpp +++ b/js/src/vm/Debugger.cpp @@ -2777,20 +2777,20 @@ Debugger::updateObservesCoverageOnDebugg void Debugger::updateObservesAsmJSOnDebuggees(IsObserving observing) { for (WeakGlobalObjectSet::Range r = debuggees.all(); !r.empty(); r.popFront()) { GlobalObject* global = r.front(); JSCompartment* comp = global->compartment(); - if (comp->debuggerObservesWasm() == observing) + if (comp->debuggerObservesAsmJS() == observing) continue; - comp->updateDebuggerObservesWasm(); + comp->updateDebuggerObservesAsmJS(); } } /*** Allocations Tracking *************************************************************************/ /* static */ bool Debugger::cannotTrackAllocations(const GlobalObject& global) @@ -3473,17 +3473,17 @@ Debugger::setAllowUnobservedAsmJS(JSCont THIS_DEBUGGER(cx, argc, vp, "set allowUnobservedAsmJS", args, dbg); if (!args.requireAtLeast(cx, "Debugger.set allowUnobservedAsmJS", 1)) return false; dbg->allowUnobservedAsmJS = ToBoolean(args[0]); for (WeakGlobalObjectSet::Range r = dbg->debuggees.all(); !r.empty(); r.popFront()) { GlobalObject* global = r.front(); JSCompartment* comp = global->compartment(); - comp->updateDebuggerObservesWasm(); + comp->updateDebuggerObservesAsmJS(); } args.rval().setUndefined(); return true; } /* static */ bool Debugger::getCollectCoverageInfo(JSContext* cx, unsigned argc, Value* vp) @@ -3925,17 +3925,17 @@ Debugger::addDebuggeeGlobal(JSContext* c auto allocationsTrackingGuard = MakeScopeExit([&] { if (trackingAllocationSites && enabled) Debugger::removeAllocationsTracking(*global); }); // (6) AutoRestoreCompartmentDebugMode debugModeGuard(debuggeeCompartment); debuggeeCompartment->setIsDebuggee(); - debuggeeCompartment->updateDebuggerObservesWasm(); + debuggeeCompartment->updateDebuggerObservesAsmJS(); debuggeeCompartment->updateDebuggerObservesCoverage(); if (observesAllExecution() && !ensureExecutionObservabilityOfCompartment(cx, debuggeeCompartment)) return false; globalDebuggersGuard.release(); debuggeesGuard.release(); zoneDebuggersGuard.release(); debuggeeZonesGuard.release(); @@ -4041,17 +4041,17 @@ Debugger::removeDebuggeeGlobal(FreeOp* f */ if (trackingAllocationSites) Debugger::removeAllocationsTracking(*global); if (global->getDebuggers()->empty()) { global->compartment()->unsetIsDebuggee(); } else { global->compartment()->updateDebuggerObservesAllExecution(); - global->compartment()->updateDebuggerObservesWasm(); + global->compartment()->updateDebuggerObservesAsmJS(); global->compartment()->updateDebuggerObservesCoverage(); } } static inline DebuggerSourceReferent GetSourceReferent(JSObject* obj); /* @@ -8631,16 +8631,32 @@ DebuggerObject::errorMessageNameGetter(J if (result) args.rval().setString(result); else args.rval().setUndefined(); return true; } /* static */ bool +DebuggerObject::errorLineNumberGetter(JSContext *cx, unsigned argc, Value* vp) +{ + THIS_DEBUGOBJECT(cx, argc, vp, "get errorLineNumber", args, object) + + return DebuggerObject::getErrorLineNumber(cx, object, args.rval()); +} + +/* static */ bool +DebuggerObject::errorColumnNumberGetter(JSContext *cx, unsigned argc, Value* vp) +{ + THIS_DEBUGOBJECT(cx, argc, vp, "get errorColumnNumber", args, object) + + return DebuggerObject::getErrorColumnNumber(cx, object, args.rval()); +} + +/* static */ bool DebuggerObject::isProxyGetter(JSContext* cx, unsigned argc, Value* vp) { THIS_DEBUGOBJECT(cx, argc, vp, "get isProxy", args, object) args.rval().setBoolean(object->isScriptedProxy()); return true; } @@ -9273,16 +9289,18 @@ const JSPropertySpec DebuggerObject::pro JS_PSG("script", DebuggerObject::scriptGetter, 0), JS_PSG("environment", DebuggerObject::environmentGetter, 0), JS_PSG("boundTargetFunction", DebuggerObject::boundTargetFunctionGetter, 0), JS_PSG("boundThis", DebuggerObject::boundThisGetter, 0), JS_PSG("boundArguments", DebuggerObject::boundArgumentsGetter, 0), JS_PSG("global", DebuggerObject::globalGetter, 0), JS_PSG("allocationSite", DebuggerObject::allocationSiteGetter, 0), JS_PSG("errorMessageName", DebuggerObject::errorMessageNameGetter, 0), + JS_PSG("errorLineNumber", DebuggerObject::errorLineNumberGetter, 0), + JS_PSG("errorColumnNumber", DebuggerObject::errorColumnNumberGetter, 0), JS_PSG("isProxy", DebuggerObject::isProxyGetter, 0), JS_PSG("proxyTarget", DebuggerObject::proxyTargetGetter, 0), JS_PSG("proxyHandler", DebuggerObject::proxyHandlerGetter, 0), JS_PS_END }; #ifdef SPIDERMONKEY_PROMISE const JSPropertySpec DebuggerObject::promiseProperties_[] = { @@ -9593,46 +9611,97 @@ DebuggerObject::getAllocationSite(JSCont if (!cx->compartment()->wrap(cx, &allocSite)) return false; result.set(allocSite); return true; } /* static */ bool -DebuggerObject::getErrorMessageName(JSContext* cx, HandleDebuggerObject object, - MutableHandleString result) -{ - RootedObject referent(cx, object->referent()); - - JSObject* obj = referent; +DebuggerObject::getErrorReport(JSContext* cx, HandleObject maybeError, JSErrorReport*& report) +{ + JSObject* obj = maybeError; if (IsCrossCompartmentWrapper(obj)) obj = CheckedUnwrap(obj); if (!obj) { JS_ReportErrorASCII(cx, "Permission denied to access object"); return false; } - if (obj->is<ErrorObject>()) { - JSErrorReport* report = obj->as<ErrorObject>().getErrorReport(); - if (report) { - const JSErrorFormatString* efs = GetErrorMessage(nullptr, report->errorNumber); - if (efs) { - RootedString str(cx, JS_NewStringCopyZ(cx, efs->name)); - if (!cx->compartment()->wrap(cx, &str)) - return false; - - result.set(str); - return true; - } - } - } - - result.set(nullptr); + if (!obj->is<ErrorObject>()) { + report = nullptr; + return true; + } + + report = obj->as<ErrorObject>().getErrorReport(); + return true; +} + +/* static */ bool +DebuggerObject::getErrorMessageName(JSContext* cx, HandleDebuggerObject object, + MutableHandleString result) +{ + RootedObject referent(cx, object->referent()); + JSErrorReport* report; + if (!getErrorReport(cx, referent, report)) + return false; + + if (!report) { + result.set(nullptr); + return true; + } + + const JSErrorFormatString* efs = GetErrorMessage(nullptr, report->errorNumber); + if (!efs) { + result.set(nullptr); + return true; + } + + RootedString str(cx, JS_NewStringCopyZ(cx, efs->name)); + if (!cx->compartment()->wrap(cx, &str)) + return false; + + result.set(str); + return true; +} + +/* static */ bool +DebuggerObject::getErrorLineNumber(JSContext* cx, HandleDebuggerObject object, + MutableHandleValue result) +{ + RootedObject referent(cx, object->referent()); + JSErrorReport* report; + if (!getErrorReport(cx, referent, report)) + return false; + + if (!report) { + result.setUndefined(); + return true; + } + + result.setNumber(report->lineno); + return true; +} + +/* static */ bool +DebuggerObject::getErrorColumnNumber(JSContext* cx, HandleDebuggerObject object, + MutableHandleValue result) +{ + RootedObject referent(cx, object->referent()); + JSErrorReport* report; + if (!getErrorReport(cx, referent, report)) + return false; + + if (!report) { + result.setUndefined(); + return true; + } + + result.setNumber(report->column); return true; } #ifdef SPIDERMONKEY_PROMISE /* static */ bool DebuggerObject::getPromiseValue(JSContext* cx, HandleDebuggerObject object, MutableHandleValue result) {
--- a/js/src/vm/Debugger.h +++ b/js/src/vm/Debugger.h @@ -1241,16 +1241,20 @@ class DebuggerObject : public NativeObje static MOZ_MUST_USE bool getBoundThis(JSContext* cx, HandleDebuggerObject object, MutableHandleValue result); static MOZ_MUST_USE bool getBoundArguments(JSContext* cx, HandleDebuggerObject object, MutableHandle<ValueVector> result); static MOZ_MUST_USE bool getAllocationSite(JSContext* cx, HandleDebuggerObject object, MutableHandleObject result); static MOZ_MUST_USE bool getErrorMessageName(JSContext* cx, HandleDebuggerObject object, MutableHandleString result); + static MOZ_MUST_USE bool getErrorLineNumber(JSContext* cx, HandleDebuggerObject object, + MutableHandleValue result); + static MOZ_MUST_USE bool getErrorColumnNumber(JSContext* cx, HandleDebuggerObject object, + MutableHandleValue result); static MOZ_MUST_USE bool getScriptedProxyTarget(JSContext* cx, HandleDebuggerObject object, MutableHandleDebuggerObject result); static MOZ_MUST_USE bool getScriptedProxyHandler(JSContext* cx, HandleDebuggerObject object, MutableHandleDebuggerObject result); #ifdef SPIDERMONKEY_PROMISE static MOZ_MUST_USE bool getPromiseValue(JSContext* cx, HandleDebuggerObject object, MutableHandleValue result); static MOZ_MUST_USE bool getPromiseReason(JSContext* cx, HandleDebuggerObject object, @@ -1362,16 +1366,18 @@ class DebuggerObject : public NativeObje static MOZ_MUST_USE bool scriptGetter(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool environmentGetter(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool boundTargetFunctionGetter(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool boundThisGetter(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool boundArgumentsGetter(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool globalGetter(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool allocationSiteGetter(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool errorMessageNameGetter(JSContext* cx, unsigned argc, Value* vp); + static MOZ_MUST_USE bool errorLineNumberGetter(JSContext* cx, unsigned argc, Value* vp); + static MOZ_MUST_USE bool errorColumnNumberGetter(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool isProxyGetter(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool proxyTargetGetter(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool proxyHandlerGetter(JSContext* cx, unsigned argc, Value* vp); #ifdef SPIDERMONKEY_PROMISE static MOZ_MUST_USE bool isPromiseGetter(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool promiseStateGetter(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool promiseValueGetter(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool promiseReasonGetter(JSContext* cx, unsigned argc, Value* vp); @@ -1400,16 +1406,18 @@ class DebuggerObject : public NativeObje static MOZ_MUST_USE bool applyMethod(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool asEnvironmentMethod(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool forceLexicalInitializationByNameMethod(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool executeInGlobalMethod(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool executeInGlobalWithBindingsMethod(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool makeDebuggeeValueMethod(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool unsafeDereferenceMethod(JSContext* cx, unsigned argc, Value* vp); static MOZ_MUST_USE bool unwrapMethod(JSContext* cx, unsigned argc, Value* vp); + static MOZ_MUST_USE bool getErrorReport(JSContext* cx, HandleObject maybeError, + JSErrorReport*& report); }; class BreakpointSite { friend class Breakpoint; friend struct ::JSCompartment; friend class ::JSScript; friend class Debugger;
--- a/js/src/vm/DerivedCoreProperties.txt +++ b/js/src/vm/DerivedCoreProperties.txt @@ -1,15 +1,16 @@ -# DerivedCoreProperties-6.2.0.txt -# Date: 2012-05-20, 00:42:31 GMT [MD] +# DerivedCoreProperties-9.0.0.txt +# Date: 2016-06-01, 10:34:24 GMT +# © 2016 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html # # Unicode Character Database -# Copyright (c) 1991-2012 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ +# For documentation, see http://www.unicode.org/reports/tr44/ # ================================================ # Derived Property: Math # Generated from: Sm + Other_Math 002B ; Math # Sm PLUS SIGN 003C..003E ; Math # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN @@ -78,17 +79,20 @@ 21CE..21CF ; Math # Sm [2] LEFT RIG 21D0..21D1 ; Math # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW 21D2 ; Math # Sm RIGHTWARDS DOUBLE ARROW 21D3 ; Math # So DOWNWARDS DOUBLE ARROW 21D4 ; Math # Sm LEFT RIGHT DOUBLE ARROW 21D5..21DB ; Math # So [7] UP DOWN DOUBLE ARROW..RIGHTWARDS TRIPLE ARROW 21DD ; Math # So RIGHTWARDS SQUIGGLE ARROW 21E4..21E5 ; Math # So [2] LEFTWARDS ARROW TO BAR..RIGHTWARDS ARROW TO BAR 21F4..22FF ; Math # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP -2308..230B ; Math # Sm [4] LEFT CEILING..RIGHT FLOOR +2308 ; Math # Ps LEFT CEILING +2309 ; Math # Pe RIGHT CEILING +230A ; Math # Ps LEFT FLOOR +230B ; Math # Pe RIGHT FLOOR 2320..2321 ; Math # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL 237C ; Math # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW 239B..23B3 ; Math # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM 23B4..23B5 ; Math # So [2] TOP SQUARE BRACKET..BOTTOM SQUARE BRACKET 23B7 ; Math # So RADICAL SYMBOL BOTTOM 23D0 ; Math # So VERTICAL LINE EXTENSION 23DC..23E1 ; Math # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET 23E2 ; Math # So WHITE TRAPEZIUM @@ -249,17 +253,17 @@ 1EEA5..1EEA9 ; Math # Lo [5] ARABIC M 1EEAB..1EEBB ; Math # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN 1EEF0..1EEF1 ; Math # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL # Total code points: 2310 # ================================================ # Derived Property: Alphabetic -# Generated from: Lu+Ll+Lt+Lm+Lo+Nl + Other_Alphabetic +# Generated from: Uppercase + Lowercase + Lt + Lm + Lo + Nl + Other_Alphabetic 0041..005A ; Alphabetic # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z 0061..007A ; Alphabetic # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z 00AA ; Alphabetic # Lo FEMININE ORDINAL INDICATOR 00B5 ; Alphabetic # L& MICRO SIGN 00BA ; Alphabetic # Lo MASCULINE ORDINAL INDICATOR 00C0..00D6 ; Alphabetic # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS 00D8..00F6 ; Alphabetic # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS @@ -276,23 +280,24 @@ 02E0..02E4 ; Alphabetic # Lm [5] MO 02EC ; Alphabetic # Lm MODIFIER LETTER VOICING 02EE ; Alphabetic # Lm MODIFIER LETTER DOUBLE APOSTROPHE 0345 ; Alphabetic # Mn COMBINING GREEK YPOGEGRAMMENI 0370..0373 ; Alphabetic # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI 0374 ; Alphabetic # Lm GREEK NUMERAL SIGN 0376..0377 ; Alphabetic # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA 037A ; Alphabetic # Lm GREEK YPOGEGRAMMENI 037B..037D ; Alphabetic # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037F ; Alphabetic # L& GREEK CAPITAL LETTER YOT 0386 ; Alphabetic # L& GREEK CAPITAL LETTER ALPHA WITH TONOS 0388..038A ; Alphabetic # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS 038C ; Alphabetic # L& GREEK CAPITAL LETTER OMICRON WITH TONOS 038E..03A1 ; Alphabetic # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO 03A3..03F5 ; Alphabetic # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL 03F7..0481 ; Alphabetic # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA -048A..0527 ; Alphabetic # L& [158] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER SHHA WITH DESCENDER +048A..052F ; Alphabetic # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER 0531..0556 ; Alphabetic # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH 0559 ; Alphabetic # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING 0561..0587 ; Alphabetic # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN 05B0..05BD ; Alphabetic # Mn [14] HEBREW POINT SHEVA..HEBREW POINT METEG 05BF ; Alphabetic # Mn HEBREW POINT RAFE 05C1..05C2 ; Alphabetic # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT 05C4..05C5 ; Alphabetic # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT 05C7 ; Alphabetic # Mn HEBREW POINT QAMATS QATAN @@ -330,37 +335,36 @@ 0800..0815 ; Alphabetic # Lo [22] SA 0816..0817 ; Alphabetic # Mn [2] SAMARITAN MARK IN..SAMARITAN MARK IN-ALAF 081A ; Alphabetic # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT 081B..0823 ; Alphabetic # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A 0824 ; Alphabetic # Lm SAMARITAN MODIFIER LETTER SHORT A 0825..0827 ; Alphabetic # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U 0828 ; Alphabetic # Lm SAMARITAN MODIFIER LETTER I 0829..082C ; Alphabetic # Mn [4] SAMARITAN VOWEL SIGN LONG I..SAMARITAN VOWEL SIGN SUKUN 0840..0858 ; Alphabetic # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN -08A0 ; Alphabetic # Lo ARABIC LETTER BEH WITH SMALL V BELOW -08A2..08AC ; Alphabetic # Lo [11] ARABIC LETTER JEEM WITH TWO DOTS ABOVE..ARABIC LETTER ROHINGYA YEH -08E4..08E9 ; Alphabetic # Mn [6] ARABIC CURLY FATHA..ARABIC CURLY KASRATAN -08F0..08FE ; Alphabetic # Mn [15] ARABIC OPEN FATHATAN..ARABIC DAMMA WITH DOT -0900..0902 ; Alphabetic # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA +08A0..08B4 ; Alphabetic # Lo [21] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER KAF WITH DOT BELOW +08B6..08BD ; Alphabetic # Lo [8] ARABIC LETTER BEH WITH SMALL MEEM ABOVE..ARABIC LETTER AFRICAN NOON +08D4..08DF ; Alphabetic # Mn [12] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH WORD WAQFA +08E3..08E9 ; Alphabetic # Mn [7] ARABIC TURNED DAMMA BELOW..ARABIC CURLY KASRATAN +08F0..0902 ; Alphabetic # Mn [19] ARABIC OPEN FATHATAN..DEVANAGARI SIGN ANUSVARA 0903 ; Alphabetic # Mc DEVANAGARI SIGN VISARGA 0904..0939 ; Alphabetic # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA 093A ; Alphabetic # Mn DEVANAGARI VOWEL SIGN OE 093B ; Alphabetic # Mc DEVANAGARI VOWEL SIGN OOE 093D ; Alphabetic # Lo DEVANAGARI SIGN AVAGRAHA 093E..0940 ; Alphabetic # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II 0941..0948 ; Alphabetic # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI 0949..094C ; Alphabetic # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU 094E..094F ; Alphabetic # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW 0950 ; Alphabetic # Lo DEVANAGARI OM 0955..0957 ; Alphabetic # Mn [3] DEVANAGARI VOWEL SIGN CANDRA LONG E..DEVANAGARI VOWEL SIGN UUE 0958..0961 ; Alphabetic # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL 0962..0963 ; Alphabetic # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL 0971 ; Alphabetic # Lm DEVANAGARI SIGN HIGH SPACING DOT -0972..0977 ; Alphabetic # Lo [6] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER UUE -0979..097F ; Alphabetic # Lo [7] DEVANAGARI LETTER ZHA..DEVANAGARI LETTER BBA +0972..0980 ; Alphabetic # Lo [15] DEVANAGARI LETTER CANDRA A..BENGALI ANJI 0981 ; Alphabetic # Mn BENGALI SIGN CANDRABINDU 0982..0983 ; Alphabetic # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA 0985..098C ; Alphabetic # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L 098F..0990 ; Alphabetic # Lo [2] BENGALI LETTER E..BENGALI LETTER AI 0993..09A8 ; Alphabetic # Lo [22] BENGALI LETTER O..BENGALI LETTER NA 09AA..09B0 ; Alphabetic # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA 09B2 ; Alphabetic # Lo BENGALI LETTER LA 09B6..09B9 ; Alphabetic # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA @@ -406,16 +410,17 @@ 0ABD ; Alphabetic # Lo GU 0ABE..0AC0 ; Alphabetic # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II 0AC1..0AC5 ; Alphabetic # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E 0AC7..0AC8 ; Alphabetic # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI 0AC9 ; Alphabetic # Mc GUJARATI VOWEL SIGN CANDRA O 0ACB..0ACC ; Alphabetic # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU 0AD0 ; Alphabetic # Lo GUJARATI OM 0AE0..0AE1 ; Alphabetic # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL 0AE2..0AE3 ; Alphabetic # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AF9 ; Alphabetic # Lo GUJARATI LETTER ZHA 0B01 ; Alphabetic # Mn ORIYA SIGN CANDRABINDU 0B02..0B03 ; Alphabetic # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA 0B05..0B0C ; Alphabetic # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L 0B0F..0B10 ; Alphabetic # Lo [2] ORIYA LETTER E..ORIYA LETTER AI 0B13..0B28 ; Alphabetic # Lo [22] ORIYA LETTER O..ORIYA LETTER NA 0B2A..0B30 ; Alphabetic # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA 0B32..0B33 ; Alphabetic # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA 0B35..0B39 ; Alphabetic # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA @@ -445,31 +450,33 @@ 0BA8..0BAA ; Alphabetic # Lo [3] TA 0BAE..0BB9 ; Alphabetic # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA 0BBE..0BBF ; Alphabetic # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I 0BC0 ; Alphabetic # Mn TAMIL VOWEL SIGN II 0BC1..0BC2 ; Alphabetic # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU 0BC6..0BC8 ; Alphabetic # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI 0BCA..0BCC ; Alphabetic # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU 0BD0 ; Alphabetic # Lo TAMIL OM 0BD7 ; Alphabetic # Mc TAMIL AU LENGTH MARK +0C00 ; Alphabetic # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE 0C01..0C03 ; Alphabetic # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA 0C05..0C0C ; Alphabetic # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L 0C0E..0C10 ; Alphabetic # Lo [3] TELUGU LETTER E..TELUGU LETTER AI 0C12..0C28 ; Alphabetic # Lo [23] TELUGU LETTER O..TELUGU LETTER NA -0C2A..0C33 ; Alphabetic # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA -0C35..0C39 ; Alphabetic # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA +0C2A..0C39 ; Alphabetic # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA 0C3D ; Alphabetic # Lo TELUGU SIGN AVAGRAHA 0C3E..0C40 ; Alphabetic # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II 0C41..0C44 ; Alphabetic # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR 0C46..0C48 ; Alphabetic # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI 0C4A..0C4C ; Alphabetic # Mn [3] TELUGU VOWEL SIGN O..TELUGU VOWEL SIGN AU 0C55..0C56 ; Alphabetic # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -0C58..0C59 ; Alphabetic # Lo [2] TELUGU LETTER TSA..TELUGU LETTER DZA +0C58..0C5A ; Alphabetic # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA 0C60..0C61 ; Alphabetic # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL 0C62..0C63 ; Alphabetic # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C80 ; Alphabetic # Lo KANNADA SIGN SPACING CANDRABINDU +0C81 ; Alphabetic # Mn KANNADA SIGN CANDRABINDU 0C82..0C83 ; Alphabetic # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA 0C85..0C8C ; Alphabetic # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L 0C8E..0C90 ; Alphabetic # Lo [3] KANNADA LETTER E..KANNADA LETTER AI 0C92..0CA8 ; Alphabetic # Lo [23] KANNADA LETTER O..KANNADA LETTER NA 0CAA..0CB3 ; Alphabetic # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA 0CB5..0CB9 ; Alphabetic # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA 0CBD ; Alphabetic # Lo KANNADA SIGN AVAGRAHA 0CBE ; Alphabetic # Mc KANNADA VOWEL SIGN AA @@ -479,28 +486,30 @@ 0CC6 ; Alphabetic # Mn KA 0CC7..0CC8 ; Alphabetic # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI 0CCA..0CCB ; Alphabetic # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO 0CCC ; Alphabetic # Mn KANNADA VOWEL SIGN AU 0CD5..0CD6 ; Alphabetic # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK 0CDE ; Alphabetic # Lo KANNADA LETTER FA 0CE0..0CE1 ; Alphabetic # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL 0CE2..0CE3 ; Alphabetic # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 0CF1..0CF2 ; Alphabetic # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0D01 ; Alphabetic # Mn MALAYALAM SIGN CANDRABINDU 0D02..0D03 ; Alphabetic # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 0D05..0D0C ; Alphabetic # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L 0D0E..0D10 ; Alphabetic # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI 0D12..0D3A ; Alphabetic # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA 0D3D ; Alphabetic # Lo MALAYALAM SIGN AVAGRAHA 0D3E..0D40 ; Alphabetic # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II 0D41..0D44 ; Alphabetic # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR 0D46..0D48 ; Alphabetic # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI 0D4A..0D4C ; Alphabetic # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU 0D4E ; Alphabetic # Lo MALAYALAM LETTER DOT REPH +0D54..0D56 ; Alphabetic # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL 0D57 ; Alphabetic # Mc MALAYALAM AU LENGTH MARK -0D60..0D61 ; Alphabetic # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL +0D5F..0D61 ; Alphabetic # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL 0D62..0D63 ; Alphabetic # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL 0D7A..0D7F ; Alphabetic # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K 0D82..0D83 ; Alphabetic # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA 0D85..0D96 ; Alphabetic # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA 0D9A..0DB1 ; Alphabetic # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA 0DB3..0DBB ; Alphabetic # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA 0DBD ; Alphabetic # Lo SINHALA LETTER DANTAJA LAYANNA 0DC0..0DC6 ; Alphabetic # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA @@ -591,22 +600,24 @@ 12B8..12BE ; Alphabetic # Lo [7] ET 12C0 ; Alphabetic # Lo ETHIOPIC SYLLABLE KXWA 12C2..12C5 ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE 12C8..12D6 ; Alphabetic # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O 12D8..1310 ; Alphabetic # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA 1312..1315 ; Alphabetic # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE 1318..135A ; Alphabetic # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA 135F ; Alphabetic # Mn ETHIOPIC COMBINING GEMINATION MARK 1380..138F ; Alphabetic # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE -13A0..13F4 ; Alphabetic # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV +13A0..13F5 ; Alphabetic # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; Alphabetic # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV 1401..166C ; Alphabetic # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA 166F..167F ; Alphabetic # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W 1681..169A ; Alphabetic # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH 16A0..16EA ; Alphabetic # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X 16EE..16F0 ; Alphabetic # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; Alphabetic # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC 1700..170C ; Alphabetic # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA 170E..1711 ; Alphabetic # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA 1712..1713 ; Alphabetic # Mn [2] TAGALOG VOWEL SIGN I..TAGALOG VOWEL SIGN U 1720..1731 ; Alphabetic # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA 1732..1733 ; Alphabetic # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U 1740..1751 ; Alphabetic # Lo [18] BUHID LETTER A..BUHID LETTER HA 1752..1753 ; Alphabetic # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U 1760..176C ; Alphabetic # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA @@ -618,37 +629,38 @@ 17B7..17BD ; Alphabetic # Mn [7] KH 17BE..17C5 ; Alphabetic # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU 17C6 ; Alphabetic # Mn KHMER SIGN NIKAHIT 17C7..17C8 ; Alphabetic # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU 17D7 ; Alphabetic # Lm KHMER SIGN LEK TOO 17DC ; Alphabetic # Lo KHMER SIGN AVAKRAHASANYA 1820..1842 ; Alphabetic # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI 1843 ; Alphabetic # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN 1844..1877 ; Alphabetic # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; Alphabetic # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA +1880..1884 ; Alphabetic # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886 ; Alphabetic # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8 ; Alphabetic # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA 18A9 ; Alphabetic # Mn MONGOLIAN LETTER ALI GALI DAGALGA 18AA ; Alphabetic # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA 18B0..18F5 ; Alphabetic # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S -1900..191C ; Alphabetic # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA +1900..191E ; Alphabetic # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA 1920..1922 ; Alphabetic # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U 1923..1926 ; Alphabetic # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU 1927..1928 ; Alphabetic # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O 1929..192B ; Alphabetic # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA 1930..1931 ; Alphabetic # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA 1932 ; Alphabetic # Mn LIMBU SMALL LETTER ANUSVARA 1933..1938 ; Alphabetic # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA 1950..196D ; Alphabetic # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI 1970..1974 ; Alphabetic # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 1980..19AB ; Alphabetic # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA -19B0..19C0 ; Alphabetic # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY -19C1..19C7 ; Alphabetic # Lo [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B -19C8..19C9 ; Alphabetic # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2 +19B0..19C9 ; Alphabetic # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 1A00..1A16 ; Alphabetic # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA 1A17..1A18 ; Alphabetic # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U -1A19..1A1B ; Alphabetic # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE +1A19..1A1A ; Alphabetic # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B ; Alphabetic # Mn BUGINESE VOWEL SIGN AE 1A20..1A54 ; Alphabetic # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA 1A55 ; Alphabetic # Mc TAI THAM CONSONANT SIGN MEDIAL RA 1A56 ; Alphabetic # Mn TAI THAM CONSONANT SIGN MEDIAL LA 1A57 ; Alphabetic # Mc TAI THAM CONSONANT SIGN LA TANG LAI 1A58..1A5E ; Alphabetic # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA 1A61 ; Alphabetic # Mc TAI THAM VOWEL SIGN A 1A62 ; Alphabetic # Mn TAI THAM VOWEL SIGN MAI SAT 1A63..1A64 ; Alphabetic # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA @@ -669,42 +681,44 @@ 1B43 ; Alphabetic # Mc BA